From 9c082ce60fa7404fde77eea46a3a0a84351d061c Mon Sep 17 00:00:00 2001 From: clay <20932067@zju.edu.cn> Date: Wed, 21 Jul 2021 01:27:44 +0800 Subject: [PATCH] =?UTF-8?q?top=E7=BB=B4=E6=8A=A4=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ebts/.gitignore | 44 + ebts/README.md | 14 + ebts/ebts-admin/pom.xml | 125 +++ .../main/java/com/ebts/EBTSApplication.java | 20 + .../java/com/ebts/EBTSServletInitializer.java | 16 + .../controller/common/CaptchaController.java | 89 ++ .../controller/common/CommonController.java | 100 +++ .../monitor/LogininforController.java | 67 ++ .../controller/monitor/OperlogController.java | 66 ++ .../controller/monitor/ServerController.java | 32 + .../monitor/UserOnlineController.java | 89 ++ .../controller/system/ConfigController.java | 125 +++ .../web/controller/system/DeptController.java | 147 +++ .../controller/system/DictDataController.java | 106 +++ .../controller/system/DictTypeController.java | 121 +++ .../web/controller/system/FileController.java | 185 ++++ .../controller/system/LoginController.java | 95 ++ .../web/controller/system/MenuController.java | 140 +++ .../controller/system/NoticeController.java | 87 ++ .../web/controller/system/PostController.java | 117 +++ .../controller/system/ProfileController.java | 117 +++ .../system/RealQueryController.java | 87 ++ .../web/controller/system/RoleController.java | 170 ++++ .../controller/system/SequenceController.java | 36 + .../web/controller/system/UserController.java | 182 ++++ .../controller/tool/SwaggerController.java | 22 + .../web/controller/tool/TestController.java | 151 ++++ .../ebts/web/core/config/SwaggerConfig.java | 127 +++ .../META-INF/spring-devtools.properties | 1 + .../src/main/resources/application-druid.yml | 61 ++ .../src/main/resources/application.yml | 148 +++ ebts/ebts-admin/src/main/resources/banner.txt | 2 + .../src/main/resources/generator.yml | 10 + .../main/resources/i18n/messages.properties | 36 + .../ebts-admin/src/main/resources/logback.xml | 93 ++ .../src/main/resources/logbackpro.xml | 93 ++ .../main/resources/mybatis/mybatis-config.xml | 15 + ebts/ebts-common/pom.xml | 155 ++++ .../com/ebts/common/annotation/DataScope.java | 27 + .../ebts/common/annotation/DataSource.java | 28 + .../com/ebts/common/annotation/Excel.java | 139 +++ .../com/ebts/common/annotation/Excels.java | 17 + .../java/com/ebts/common/annotation/Log.java | 40 + .../ebts/common/annotation/RepeatSubmit.java | 21 + .../com/ebts/common/config/EBTSConfig.java | 113 +++ .../com/ebts/common/constant/Constants.java | 128 +++ .../ebts/common/constant/GenConstants.java | 195 ++++ .../com/ebts/common/constant/HttpStatus.java | 93 ++ .../ebts/common/constant/ReturnConstants.java | 29 + .../common/constant/ScheduleConstants.java | 56 ++ .../ebts/common/constant/UserConstants.java | 89 ++ .../core/controller/BaseController.java | 87 ++ .../core/controller/EBTSController.java | 95 ++ .../ebts/common/core/entity/AjaxResult.java | 152 ++++ .../ebts/common/core/entity/BaseEntity.java | 145 +++ .../ebts/common/core/entity/TreeEntity.java | 78 ++ .../ebts/common/core/entity/TreeSelect.java | 74 ++ .../ebts/common/core/entity/entity/Dept.java | 202 +++++ .../common/core/entity/entity/DictData.java | 175 ++++ .../common/core/entity/entity/DictType.java | 94 ++ .../ebts/common/core/entity/entity/Menu.java | 263 ++++++ .../ebts/common/core/entity/entity/Role.java | 235 +++++ .../ebts/common/core/entity/entity/User.java | 324 +++++++ .../common/core/entity/model/LoginBody.java | 60 ++ .../common/core/entity/model/LoginUser.java | 201 +++++ .../com/ebts/common/core/page/PageDomain.java | 69 ++ .../ebts/common/core/page/TableDataInfo.java | 82 ++ .../ebts/common/core/page/TableSupport.java | 46 + .../ebts/common/core/redis/RedisCache.java | 210 +++++ .../com/ebts/common/core/text/CharsetKit.java | 91 ++ .../com/ebts/common/core/text/Convert.java | 850 ++++++++++++++++++ .../ebts/common/core/text/StrFormatter.java | 76 ++ .../com/ebts/common/enums/BusinessStatus.java | 18 + .../com/ebts/common/enums/BusinessType.java | 58 ++ .../com/ebts/common/enums/DataSourceType.java | 18 + .../com/ebts/common/enums/HttpMethod.java | 32 + .../com/ebts/common/enums/OperatorType.java | 23 + .../com/ebts/common/enums/UserStatus.java | 26 + .../ebts/common/exception/BaseException.java | 84 ++ .../common/exception/CustomException.java | 37 + .../common/exception/DemoModeException.java | 13 + .../ebts/common/exception/EbtsException.java | 32 + .../ebts/common/exception/UtilException.java | 22 + .../common/exception/file/FileException.java | 17 + .../FileNameLengthLimitExceededException.java | 14 + .../file/FileSizeLimitExceededException.java | 14 + .../file/InvalidExtensionException.java | 61 ++ .../common/exception/job/TaskException.java | 29 + .../exception/user/CaptchaException.java | 14 + .../user/CaptchaExpireException.java | 14 + .../common/exception/user/UserException.java | 16 + .../user/UserPasswordNotMatchException.java | 14 + .../ebts/common/filter/RepeatableFilter.java | 45 + .../filter/RepeatedlyRequestWrapper.java | 64 ++ .../com/ebts/common/filter/XssFilter.java | 85 ++ .../filter/XssHttpServletRequestWrapper.java | 92 ++ .../java/com/ebts/common/utils/Arith.java | 113 +++ .../java/com/ebts/common/utils/DateUtils.java | 144 +++ .../java/com/ebts/common/utils/DictUtils.java | 148 +++ .../com/ebts/common/utils/ExceptionUtil.java | 36 + .../java/com/ebts/common/utils/LogUtils.java | 15 + .../com/ebts/common/utils/MapExcelUtil.java | 295 ++++++ .../com/ebts/common/utils/MessageUtils.java | 24 + .../com/ebts/common/utils/SecurityUtils.java | 87 ++ .../com/ebts/common/utils/ServerResult.java | 93 ++ .../com/ebts/common/utils/ServletUtils.java | 119 +++ .../com/ebts/common/utils/StringUtils.java | 419 +++++++++ .../java/com/ebts/common/utils/Threads.java | 77 ++ .../ebts/common/utils/VerifyCodeUtils.java | 206 +++++ .../com/ebts/common/utils/bean/BeanUtils.java | 104 +++ .../common/utils/file/FileUploadUtils.java | 205 +++++ .../com/ebts/common/utils/file/FileUtils.java | 115 +++ .../ebts/common/utils/file/MimeTypeUtils.java | 52 ++ .../ebts/common/utils/html/EscapeUtil.java | 130 +++ .../ebts/common/utils/html/HTMLFilter.java | 501 +++++++++++ .../ebts/common/utils/http/HttpHelper.java | 44 + .../com/ebts/common/utils/http/HttpUtils.java | 208 +++++ .../ebts/common/utils/ip/AddressUtils.java | 48 + .../com/ebts/common/utils/ip/IpUtils.java | 166 ++++ .../com/ebts/common/utils/poi/ExcelUtil.java | 839 +++++++++++++++++ .../common/utils/reflect/ReflectUtils.java | 327 +++++++ .../com/ebts/common/utils/sign/Base64.java | 253 ++++++ .../com/ebts/common/utils/sign/Md5Utils.java | 54 ++ .../ebts/common/utils/spring/SpringUtils.java | 131 +++ .../com/ebts/common/utils/sql/SqlUtil.java | 33 + .../com/ebts/common/utils/uuid/IdUtils.java | 44 + .../java/com/ebts/common/utils/uuid/UUID.java | 441 +++++++++ ebts/ebts-framework/pom.xml | 71 ++ .../framework/aspectj/DataScopeAspect.java | 145 +++ .../framework/aspectj/DataSourceAspect.java | 64 ++ .../com/ebts/framework/aspectj/LogAspect.java | 197 ++++ .../framework/config/ApplicationConfig.java | 29 + .../ebts/framework/config/CaptchaConfig.java | 82 ++ .../ebts/framework/config/DruidConfig.java | 116 +++ .../config/FastJson2JsonRedisSerializer.java | 63 ++ .../ebts/framework/config/FilterConfig.java | 58 ++ .../framework/config/KaptchaTextCreator.java | 61 ++ .../ebts/framework/config/MyBatisConfig.java | 92 ++ .../ebts/framework/config/RedisConfig.java | 41 + .../framework/config/ResourcesConfig.java | 62 ++ .../ebts/framework/config/SecurityConfig.java | 143 +++ .../ebts/framework/config/ServerConfig.java | 30 + .../framework/config/ThreadPoolConfig.java | 58 ++ .../config/properties/DruidProperties.java | 75 ++ .../java/com/ebts/framework/dao/AsyncDao.java | 53 ++ .../com/ebts/framework/dao/ShutdownDao.java | 34 + .../framework/dao/factory/AsyncFactory.java | 92 ++ .../datasource/DynamicDataSource.java | 24 + .../DynamicDataSourceContextHolder.java | 41 + .../interceptor/RepeatSubmitInterceptor.java | 49 + .../impl/SameUrlDataInterceptor.java | 114 +++ .../filter/JwtAuthenticationTokenFilter.java | 43 + .../handle/AuthenticationEntryPointImpl.java | 33 + .../handle/LogoutSuccessHandlerImpl.java | 51 ++ .../com/ebts/framework/web/domain/Server.java | 215 +++++ .../ebts/framework/web/domain/server/Cpu.java | 88 ++ .../ebts/framework/web/domain/server/Jvm.java | 107 +++ .../ebts/framework/web/domain/server/Mem.java | 53 ++ .../ebts/framework/web/domain/server/Sys.java | 73 ++ .../framework/web/domain/server/SysFile.java | 99 ++ .../web/exception/GlobalExceptionHandler.java | 117 +++ .../framework/web/service/LoginService.java | 79 ++ .../web/service/PermissionService.java | 152 ++++ .../web/service/SysPermissionService.java | 58 ++ .../framework/web/service/TokenService.java | 222 +++++ .../web/service/UserDetailsServiceImpl.java | 52 ++ ebts/ebts-generator/pom.xml | 164 ++++ .../com/ebts/generator/config/Config.java | 34 + .../com/ebts/generator/config/GenConfig.java | 72 ++ .../controller/ApiClassController.java | 168 ++++ .../generator/controller/GenController.java | 226 +++++ .../controller/InterTableController.java | 254 ++++++ .../controller/ModuleController.java | 164 ++++ .../generator/controller/QueryController.java | 152 ++++ .../controller/RegularController.java | 197 ++++ .../generator/controller/RelController.java | 89 ++ .../controller/TopSearchTableController.java | 151 ++++ .../controller/UniQueryController.java | 146 +++ .../com/ebts/generator/dao/ApiClassDao.java | 63 ++ .../ebts/generator/dao/GenTableColumnDao.java | 60 ++ .../com/ebts/generator/dao/GenTableDao.java | 86 ++ .../com/ebts/generator/dao/InterTableDao.java | 91 ++ .../com/ebts/generator/dao/ModuleDao.java | 61 ++ .../java/com/ebts/generator/dao/QueryDao.java | 73 ++ .../com/ebts/generator/dao/RegularDao.java | 67 ++ .../java/com/ebts/generator/dao/RelDao.java | 74 ++ .../generator/dao/SearchTableRoleDao.java | 70 ++ .../ebts/generator/dao/TopSearchTableDao.java | 97 ++ .../com/ebts/generator/dao/UniQueryDao.java | 66 ++ .../com/ebts/generator/dto/InterTableDto.java | 40 + .../com/ebts/generator/entity/ApiClass.java | 169 ++++ .../com/ebts/generator/entity/GenTable.java | 429 +++++++++ .../ebts/generator/entity/GenTableColumn.java | 376 ++++++++ .../com/ebts/generator/entity/InterTable.java | 213 +++++ .../com/ebts/generator/entity/Module.java | 82 ++ .../com/ebts/generator/entity/Regular.java | 101 +++ .../com/ebts/generator/entity/RelColumn.java | 151 ++++ .../com/ebts/generator/entity/RelTable.java | 158 ++++ .../generator/entity/SearchTableRole.java | 61 ++ .../generator/entity/TopSearchColumn.java | 111 +++ .../ebts/generator/entity/TopSearchTable.java | 91 ++ .../com/ebts/generator/entity/UniCon.java | 142 +++ .../com/ebts/generator/entity/UniQuery.java | 132 +++ .../generator/service/ApiClassService.java | 62 ++ .../service/GenTableColumnService.java | 44 + .../generator/service/GenTableService.java | 122 +++ .../generator/service/InterTableService.java | 96 ++ .../ebts/generator/service/ModuleService.java | 63 ++ .../ebts/generator/service/QueryService.java | 44 + .../generator/service/RegularService.java | 68 ++ .../ebts/generator/service/RelService.java | 49 + .../service/TopSearchTableService.java | 67 ++ .../generator/service/UniQueryService.java | 62 ++ .../service/impl/ApiClassServiceImpl.java | 157 ++++ .../impl/GenTableColumnServiceImpl.java | 94 ++ .../service/impl/GenTableServiceImpl.java | 648 +++++++++++++ .../service/impl/InterTableServiceImpl.java | 364 ++++++++ .../service/impl/ModuleServiceImpl.java | 157 ++++ .../service/impl/QueryServiceImpl.java | 200 +++++ .../service/impl/RegularServiceImpl.java | 163 ++++ .../service/impl/RelServiceImpl.java | 88 ++ .../impl/TopSearchTableServiceImpl.java | 263 ++++++ .../service/impl/UniQueryServiceImpl.java | 166 ++++ .../generator/utils/GenInterApiUtils.java | 13 + .../com/ebts/generator/utils/GenUtils.java | 222 +++++ .../ebts/generator/utils/InterTableUtils.java | 122 +++ .../com/ebts/generator/utils/RelUtil.java | 77 ++ .../generator/utils/VelocityInitializer.java | 31 + .../ebts/generator/utils/VelocityUtils.java | 374 ++++++++ .../utils/constant/GenConstants.java | 199 ++++ .../ebts/generator/utils/sql/GenSqlUtil.java | 33 + .../mapper/generator/ApiclassMapper.xml | 111 +++ .../mapper/generator/GenTableColumnMapper.xml | 131 +++ .../mapper/generator/GenTableMapper.xml | 226 +++++ .../mapper/generator/InterTableMapper.xml | 183 ++++ .../mapper/generator/ModuleMapper.xml | 76 ++ .../mapper/generator/QueryMapper.xml | 98 ++ .../mapper/generator/RegularMapper.xml | 92 ++ .../resources/mapper/generator/RelMapper.xml | 110 +++ .../generator/SearchTableRoleMapper.xml | 65 ++ .../mapper/generator/TopSearchTableMapper.xml | 127 +++ .../mapper/generator/UniQueryMapper.xml | 82 ++ .../src/main/resources/vm/java/class.java.vm | 66 ++ .../main/resources/vm/java/controller.java.vm | 163 ++++ .../src/main/resources/vm/java/dao.java.vm | 90 ++ .../src/main/resources/vm/java/entity.java.vm | 162 ++++ .../main/resources/vm/java/rel-entity.java.vm | 52 ++ .../main/resources/vm/java/service.java.vm | 63 ++ .../resources/vm/java/serviceImpl.java.vm | 234 +++++ .../main/resources/vm/java/sub-entity.java.vm | 70 ++ .../src/main/resources/vm/js/api.js.vm | 54 ++ .../src/main/resources/vm/sql/class.sql.vm | 18 + .../src/main/resources/vm/sql/table.sql.vm | 35 + .../main/resources/vm/vue/index-tree.vue.vm | 526 +++++++++++ .../src/main/resources/vm/vue/index.vue.vm | 808 +++++++++++++++++ .../src/main/resources/vm/xml/mapper.xml.vm | 247 +++++ ebts/ebts-quartz/pom.xml | 40 + .../ebts/quartz/config/ScheduleConfig.java | 57 ++ .../ebts/quartz/controller/JobController.java | 133 +++ .../quartz/controller/JobLogController.java | 85 ++ .../main/java/com/ebts/quartz/dao/JobDao.java | 67 ++ .../java/com/ebts/quartz/dao/JobLogDao.java | 64 ++ .../main/java/com/ebts/quartz/entity/Job.java | 170 ++++ .../java/com/ebts/quartz/entity/JobLog.java | 155 ++++ .../ebts/quartz/service/JobLogService.java | 56 ++ .../com/ebts/quartz/service/JobService.java | 102 +++ .../service/impl/JobLogServiceImpl.java | 81 ++ .../quartz/service/impl/JobServiceImpl.java | 230 +++++ .../java/com/ebts/quartz/task/RyTask.java | 24 + .../ebts/quartz/util/AbstractQuartzJob.java | 96 ++ .../java/com/ebts/quartz/util/CronUtils.java | 53 ++ .../com/ebts/quartz/util/JobInvokeUtil.java | 159 ++++ .../QuartzDisallowConcurrentExecution.java | 18 + .../ebts/quartz/util/QuartzJobExecution.java | 16 + .../com/ebts/quartz/util/ScheduleUtils.java | 102 +++ .../resources/mapper/quartz/JobLogMapper.xml | 93 ++ .../resources/mapper/quartz/JobMapper.xml | 111 +++ ebts/ebts-system/pom.xml | 28 + .../java/com/ebts/system/dao/ConfigDao.java | 68 ++ .../java/com/ebts/system/dao/DeptDao.java | 118 +++ .../java/com/ebts/system/dao/DictDataDao.java | 95 ++ .../java/com/ebts/system/dao/DictTypeDao.java | 85 ++ .../java/com/ebts/system/dao/FileDao.java | 68 ++ .../com/ebts/system/dao/LogininforDao.java | 42 + .../java/com/ebts/system/dao/MenuDao.java | 117 +++ .../java/com/ebts/system/dao/NoticeDao.java | 60 ++ .../java/com/ebts/system/dao/OperLogDao.java | 48 + .../java/com/ebts/system/dao/PostDao.java | 99 ++ .../ebts/system/dao/RealQueryServiceDao.java | 38 + .../java/com/ebts/system/dao/RoleDao.java | 107 +++ .../java/com/ebts/system/dao/RoleDeptDao.java | 44 + .../java/com/ebts/system/dao/RoleMenuDao.java | 36 + .../java/com/ebts/system/dao/SequenceDao.java | 23 + .../java/com/ebts/system/dao/UserDao.java | 111 +++ .../java/com/ebts/system/dao/UserPostDao.java | 44 + .../java/com/ebts/system/dao/UserRoleDao.java | 62 ++ .../com/ebts/system/dto/FileDownload.java | 29 + .../java/com/ebts/system/entity/Config.java | 111 +++ .../com/ebts/system/entity/Logininfor.java | 144 +++ .../java/com/ebts/system/entity/Notice.java | 100 +++ .../java/com/ebts/system/entity/OperLog.java | 255 ++++++ .../java/com/ebts/system/entity/Post.java | 123 +++ .../com/ebts/system/entity/RealUniCon.java | 141 +++ .../com/ebts/system/entity/RealUniQuery.java | 131 +++ .../java/com/ebts/system/entity/RoleDept.java | 45 + .../java/com/ebts/system/entity/RoleMenu.java | 45 + .../java/com/ebts/system/entity/SysFile.java | 185 ++++ .../com/ebts/system/entity/UserOnline.java | 112 +++ .../java/com/ebts/system/entity/UserPost.java | 45 + .../java/com/ebts/system/entity/UserRole.java | 45 + .../com/ebts/system/entity/vo/MetaVo.java | 61 ++ .../com/ebts/system/entity/vo/RouterVo.java | 117 +++ .../ebts/system/service/ConfigService.java | 73 ++ .../com/ebts/system/service/DeptService.java | 109 +++ .../ebts/system/service/DictDataService.java | 61 ++ .../ebts/system/service/DictTypeService.java | 89 ++ .../com/ebts/system/service/FileService.java | 79 ++ .../system/service/LogininforService.java | 40 + .../com/ebts/system/service/MenuService.java | 136 +++ .../ebts/system/service/NoticeService.java | 60 ++ .../ebts/system/service/OperLogService.java | 48 + .../com/ebts/system/service/PostService.java | 100 +++ .../ebts/system/service/RealQueryService.java | 31 + .../com/ebts/system/service/RoleService.java | 132 +++ .../ebts/system/service/SequenceService.java | 23 + .../system/service/UserOnlineService.java | 47 + .../com/ebts/system/service/UserService.java | 167 ++++ .../service/impl/ConfigServiceImpl.java | 233 +++++ .../system/service/impl/DeptServiceImpl.java | 351 ++++++++ .../service/impl/DictDataServiceImpl.java | 111 +++ .../service/impl/DictTypeServiceImpl.java | 247 +++++ .../system/service/impl/FileServiceImpl.java | 257 ++++++ .../service/impl/LogininforServiceImpl.java | 87 ++ .../system/service/impl/MenuServiceImpl.java | 482 ++++++++++ .../service/impl/NoticeServiceImpl.java | 123 +++ .../service/impl/OperLogServiceImpl.java | 103 +++ .../system/service/impl/PostServiceImpl.java | 225 +++++ .../service/impl/RealQueryServiceImpl.java | 129 +++ .../system/service/impl/RoleServiceImpl.java | 366 ++++++++ .../service/impl/SequenceServiceImpl.java | 31 + .../service/impl/UserOnlineServiceImpl.java | 113 +++ .../system/service/impl/UserServiceImpl.java | 510 +++++++++++ .../java/com/ebts/system/utils/FtpUtils.java | 336 +++++++ .../resources/mapper/system/ConfigMapper.xml | 112 +++ .../resources/mapper/system/DeptMapper.xml | 157 ++++ .../mapper/system/DictDataMapper.xml | 124 +++ .../mapper/system/DictTypeMapper.xml | 105 +++ .../resources/mapper/system/FileMapper.xml | 100 +++ .../mapper/system/LogininforMapper.xml | 57 ++ .../resources/mapper/system/MenuMapper.xml | 191 ++++ .../resources/mapper/system/NoticeMapper.xml | 89 ++ .../resources/mapper/system/OperLogMapper.xml | 83 ++ .../resources/mapper/system/PostMapper.xml | 122 +++ .../mapper/system/RealQueryServiceMapper.xml | 46 + .../mapper/system/RoleDeptMapper.xml | 34 + .../resources/mapper/system/RoleMapper.xml | 157 ++++ .../mapper/system/RoleMenuMapper.xml | 27 + .../resources/mapper/system/SeqMapper.xml | 12 + .../resources/mapper/system/UserMapper.xml | 182 ++++ .../mapper/system/UserPostMapper.xml | 34 + .../mapper/system/UserRoleMapper.xml | 44 + ebts/pom.xml | 261 ++++++ 362 files changed, 41972 insertions(+) create mode 100644 ebts/.gitignore create mode 100644 ebts/README.md create mode 100644 ebts/ebts-admin/pom.xml create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/EBTSApplication.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/EBTSServletInitializer.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/common/CaptchaController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/common/CommonController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/LogininforController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/OperlogController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/ServerController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/UserOnlineController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/ConfigController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DeptController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DictDataController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DictTypeController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/FileController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/LoginController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/MenuController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/NoticeController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/PostController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/ProfileController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/RealQueryController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/RoleController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/SequenceController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/UserController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/tool/SwaggerController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/controller/tool/TestController.java create mode 100644 ebts/ebts-admin/src/main/java/com/ebts/web/core/config/SwaggerConfig.java create mode 100644 ebts/ebts-admin/src/main/resources/META-INF/spring-devtools.properties create mode 100644 ebts/ebts-admin/src/main/resources/application-druid.yml create mode 100644 ebts/ebts-admin/src/main/resources/application.yml create mode 100644 ebts/ebts-admin/src/main/resources/banner.txt create mode 100644 ebts/ebts-admin/src/main/resources/generator.yml create mode 100644 ebts/ebts-admin/src/main/resources/i18n/messages.properties create mode 100644 ebts/ebts-admin/src/main/resources/logback.xml create mode 100644 ebts/ebts-admin/src/main/resources/logbackpro.xml create mode 100644 ebts/ebts-admin/src/main/resources/mybatis/mybatis-config.xml create mode 100644 ebts/ebts-common/pom.xml create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/annotation/DataScope.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/annotation/DataSource.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/annotation/Excel.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/annotation/Excels.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/annotation/Log.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/annotation/RepeatSubmit.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/config/EBTSConfig.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/constant/Constants.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/constant/GenConstants.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/constant/HttpStatus.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/constant/ReturnConstants.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/constant/ScheduleConstants.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/constant/UserConstants.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/controller/BaseController.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/controller/EBTSController.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/AjaxResult.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/BaseEntity.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/TreeEntity.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/TreeSelect.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Dept.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/DictData.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/DictType.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Menu.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Role.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/User.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/model/LoginBody.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/entity/model/LoginUser.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/page/PageDomain.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/page/TableDataInfo.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/page/TableSupport.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/redis/RedisCache.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/text/CharsetKit.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/text/Convert.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/core/text/StrFormatter.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/enums/BusinessStatus.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/enums/BusinessType.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/enums/DataSourceType.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/enums/HttpMethod.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/enums/OperatorType.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/enums/UserStatus.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/BaseException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/CustomException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/DemoModeException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/EbtsException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/UtilException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileNameLengthLimitExceededException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileSizeLimitExceededException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/file/InvalidExtensionException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/job/TaskException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/user/CaptchaException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/user/CaptchaExpireException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/user/UserException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/exception/user/UserPasswordNotMatchException.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/filter/RepeatableFilter.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/filter/RepeatedlyRequestWrapper.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/filter/XssFilter.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/filter/XssHttpServletRequestWrapper.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/Arith.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/DateUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/DictUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/ExceptionUtil.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/LogUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/MapExcelUtil.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/MessageUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/SecurityUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/ServerResult.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/ServletUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/StringUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/Threads.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/VerifyCodeUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/bean/BeanUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/file/FileUploadUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/file/FileUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/file/MimeTypeUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/html/EscapeUtil.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/html/HTMLFilter.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/http/HttpHelper.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/http/HttpUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/ip/AddressUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/ip/IpUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/poi/ExcelUtil.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/reflect/ReflectUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/sign/Base64.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/sign/Md5Utils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/spring/SpringUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/sql/SqlUtil.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/uuid/IdUtils.java create mode 100644 ebts/ebts-common/src/main/java/com/ebts/common/utils/uuid/UUID.java create mode 100644 ebts/ebts-framework/pom.xml create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/DataScopeAspect.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/DataSourceAspect.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/LogAspect.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/ApplicationConfig.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/CaptchaConfig.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/DruidConfig.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/FastJson2JsonRedisSerializer.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/FilterConfig.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/KaptchaTextCreator.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/MyBatisConfig.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/RedisConfig.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/ResourcesConfig.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/SecurityConfig.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/ServerConfig.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/ThreadPoolConfig.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/config/properties/DruidProperties.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/dao/AsyncDao.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/dao/ShutdownDao.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/dao/factory/AsyncFactory.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/datasource/DynamicDataSource.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/datasource/DynamicDataSourceContextHolder.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/interceptor/RepeatSubmitInterceptor.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/interceptor/impl/SameUrlDataInterceptor.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/security/filter/JwtAuthenticationTokenFilter.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/security/handle/AuthenticationEntryPointImpl.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/security/handle/LogoutSuccessHandlerImpl.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/Server.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Cpu.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Jvm.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Mem.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Sys.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/SysFile.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/exception/GlobalExceptionHandler.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/LoginService.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/PermissionService.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/SysPermissionService.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/TokenService.java create mode 100644 ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/UserDetailsServiceImpl.java create mode 100644 ebts/ebts-generator/pom.xml create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/config/Config.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/config/GenConfig.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/controller/ApiClassController.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/controller/GenController.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/controller/InterTableController.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/controller/ModuleController.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/controller/QueryController.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/controller/RegularController.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/controller/RelController.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/controller/TopSearchTableController.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/controller/UniQueryController.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/ApiClassDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/GenTableColumnDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/GenTableDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/InterTableDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/ModuleDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/QueryDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/RegularDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/RelDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/SearchTableRoleDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/TopSearchTableDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dao/UniQueryDao.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/dto/InterTableDto.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/ApiClass.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/GenTable.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/GenTableColumn.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/InterTable.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/Module.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/Regular.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/RelColumn.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/RelTable.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/SearchTableRole.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/TopSearchColumn.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/TopSearchTable.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/UniCon.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/entity/UniQuery.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/ApiClassService.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/GenTableColumnService.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/GenTableService.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/InterTableService.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/ModuleService.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/QueryService.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/RegularService.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/RelService.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/TopSearchTableService.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/UniQueryService.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/ApiClassServiceImpl.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/GenTableColumnServiceImpl.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/GenTableServiceImpl.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/InterTableServiceImpl.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/ModuleServiceImpl.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/QueryServiceImpl.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/RegularServiceImpl.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/RelServiceImpl.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/TopSearchTableServiceImpl.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/UniQueryServiceImpl.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/utils/GenInterApiUtils.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/utils/GenUtils.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/utils/InterTableUtils.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/utils/RelUtil.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/utils/VelocityInitializer.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/utils/VelocityUtils.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/utils/constant/GenConstants.java create mode 100644 ebts/ebts-generator/src/main/java/com/ebts/generator/utils/sql/GenSqlUtil.java create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/ApiclassMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/GenTableMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/InterTableMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/ModuleMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/QueryMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/RegularMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/RelMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/SearchTableRoleMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/TopSearchTableMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/mapper/generator/UniQueryMapper.xml create mode 100644 ebts/ebts-generator/src/main/resources/vm/java/class.java.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/java/controller.java.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/java/dao.java.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/java/entity.java.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/java/rel-entity.java.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/java/service.java.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/java/sub-entity.java.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/js/api.js.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/sql/class.sql.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/sql/table.sql.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/vue/index.vue.vm create mode 100644 ebts/ebts-generator/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 ebts/ebts-quartz/pom.xml create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/config/ScheduleConfig.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/controller/JobController.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/controller/JobLogController.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/dao/JobDao.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/dao/JobLogDao.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/entity/Job.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/entity/JobLog.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/JobLogService.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/JobService.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/impl/JobLogServiceImpl.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/impl/JobServiceImpl.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/task/RyTask.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/AbstractQuartzJob.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/CronUtils.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/JobInvokeUtil.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/QuartzDisallowConcurrentExecution.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/QuartzJobExecution.java create mode 100644 ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/ScheduleUtils.java create mode 100644 ebts/ebts-quartz/src/main/resources/mapper/quartz/JobLogMapper.xml create mode 100644 ebts/ebts-quartz/src/main/resources/mapper/quartz/JobMapper.xml create mode 100644 ebts/ebts-system/pom.xml create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/ConfigDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/DeptDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/DictDataDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/DictTypeDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/FileDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/LogininforDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/MenuDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/NoticeDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/OperLogDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/PostDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/RealQueryServiceDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleDeptDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleMenuDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/SequenceDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/UserDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/UserPostDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dao/UserRoleDao.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/dto/FileDownload.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/Config.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/Logininfor.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/Notice.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/OperLog.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/Post.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/RealUniCon.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/RealUniQuery.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/RoleDept.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/RoleMenu.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/SysFile.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/UserOnline.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/UserPost.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/UserRole.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/vo/MetaVo.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/entity/vo/RouterVo.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/ConfigService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/DeptService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/DictDataService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/DictTypeService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/FileService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/LogininforService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/MenuService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/NoticeService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/OperLogService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/PostService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/RealQueryService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/RoleService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/SequenceService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/UserOnlineService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/UserService.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/ConfigServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DeptServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DictDataServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DictTypeServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/FileServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/LogininforServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/MenuServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/NoticeServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/OperLogServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/PostServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/RealQueryServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/RoleServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/SequenceServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/UserOnlineServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/service/impl/UserServiceImpl.java create mode 100644 ebts/ebts-system/src/main/java/com/ebts/system/utils/FtpUtils.java create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/ConfigMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/DeptMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/DictDataMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/DictTypeMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/FileMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/LogininforMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/MenuMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/NoticeMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/OperLogMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/PostMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/RealQueryServiceMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/RoleDeptMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/RoleMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/RoleMenuMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/SeqMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/UserMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/UserPostMapper.xml create mode 100644 ebts/ebts-system/src/main/resources/mapper/system/UserRoleMapper.xml create mode 100644 ebts/pom.xml diff --git a/ebts/.gitignore b/ebts/.gitignore new file mode 100644 index 0000000..3d3dc3e --- /dev/null +++ b/ebts/.gitignore @@ -0,0 +1,44 @@ +###################################################################### +# Build Tools + +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +*/target/ +!.mvn/wrapper/maven-wrapper.jar + +###################################################################### +# IDE + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/* +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +###################################################################### +# Others +*.log +*.xml.versionsBackup +*.swp + +!*/build/*.java +!*/build/*.html +!*/build/*.xml diff --git a/ebts/README.md b/ebts/README.md new file mode 100644 index 0000000..ba5ccf1 --- /dev/null +++ b/ebts/README.md @@ -0,0 +1,14 @@ +# 改进方案 +1 使用 validation插件可实现判空 +```java + /** 主键id */ + @NotNull(message = "主键id不能为空") + private Long id; +``` +解决方案,将controller层中新增和更新接口中的判空改至实体类层,在controller层只需要添加@Validated注解即可 +```java + @PostMapping({"/login"}) + public AjaxResult test(@Validated EleUser eleUser){ + return AjaxResult.success(eleUser); + } +``` diff --git a/ebts/ebts-admin/pom.xml b/ebts/ebts-admin/pom.xml new file mode 100644 index 0000000..2bd54ef --- /dev/null +++ b/ebts/ebts-admin/pom.xml @@ -0,0 +1,125 @@ + + + + ebts + com.ebts + 1.0.0 + + 4.0.0 + jar + ebts-admin + + + web服务入口 + + + + + + + org.springframework.boot + spring-boot-devtools + true + + + + + io.springfox + springfox-swagger2 + + + + + io.swagger + swagger-annotations + 1.5.21 + + + + io.swagger + swagger-models + 1.5.21 + + + + + io.springfox + springfox-swagger-ui + + + + + mysql + mysql-connector-java + + + + + com.ebts + ebts-framework + + + + + com.ebts + ebts-quartz + + + + com.ebts + ebts-generator + + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-autoconfigure + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.1.1.RELEASE + + true + + + + + repackage + + + + + + org.apache.maven.plugins + maven-war-plugin + 3.1.0 + + false + ${project.artifactId} + + + + ${project.artifactId} + + + \ No newline at end of file diff --git a/ebts/ebts-admin/src/main/java/com/ebts/EBTSApplication.java b/ebts/ebts-admin/src/main/java/com/ebts/EBTSApplication.java new file mode 100644 index 0000000..75e61fe --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/EBTSApplication.java @@ -0,0 +1,20 @@ +package com.ebts; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; + +/** + * 启动程序 + * + * @author binlin + */ +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) +//@EnableSwagger2 +public class EBTSApplication { + public static void main(String[] args) { + // System.setProperty("spring.devtools.restart.enabled", "false"); + SpringApplication.run(EBTSApplication.class, args); + System.out.println("(♥◠‿◠)ノ゙ EBTS启动成功 ლ(´ڡ`ლ)゙ \n"); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/EBTSServletInitializer.java b/ebts/ebts-admin/src/main/java/com/ebts/EBTSServletInitializer.java new file mode 100644 index 0000000..2cbb594 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/EBTSServletInitializer.java @@ -0,0 +1,16 @@ +package com.ebts; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +/** + * web容器中进行部署 + * + * @author binlin + */ +public class EBTSServletInitializer extends SpringBootServletInitializer { + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(EBTSApplication.class); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/common/CaptchaController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/common/CaptchaController.java new file mode 100644 index 0000000..d6017ae --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/common/CaptchaController.java @@ -0,0 +1,89 @@ +package com.ebts.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 com.ebts.common.constant.ReturnConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.ebts.common.constant.Constants; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.redis.RedisCache; +import com.ebts.common.utils.sign.Base64; +import com.ebts.common.utils.uuid.IdUtils; + +/** + * 验证码操作处理 + * + * @author binlin + */ +@RestController +public class CaptchaController { + private Logger logger = LoggerFactory.getLogger(CaptchaController.class); + + @Resource(name = "captchaProducer") + private Producer captchaProducer; + + @Resource(name = "captchaProducerMath") + private Producer captchaProducerMath; + + @Autowired + private RedisCache redisCache; + + // 验证码类型 + @Value("${ebts.captchaType}") + private String captchaType; + + /** + * 生成验证码 + */ + @GetMapping("/captchaImage") + public AjaxResult getCode(HttpServletResponse response) throws IOException { + try { + // 保存验证码信息 + String uuid = IdUtils.simpleUUID(); + String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + + String capStr = null, code = null; + BufferedImage image = null; + + // 生成验证码 + if ("math".equals(captchaType)) { + String capText = captchaProducerMath.createText(); + capStr = capText.substring(0, capText.lastIndexOf("@")); + code = capText.substring(capText.lastIndexOf("@") + 1); + image = captchaProducerMath.createImage(capStr); + } else if ("char".equals(captchaType)) { + capStr = code = captchaProducer.createText(); + image = captchaProducer.createImage(capStr); + } + + redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); + // 转换流信息写出 + FastByteArrayOutputStream os = new FastByteArrayOutputStream(); + try { + ImageIO.write(image, "jpg", os); + } catch (IOException e) { + return AjaxResult.error(e.getMessage()); + } + + AjaxResult ajax = AjaxResult.success(); + ajax.put("uuid", uuid); + ajax.put("img", Base64.encode(os.toByteArray())); + return ajax; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + return AjaxResult.error(ReturnConstants.SYS_ERROR); + } + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/common/CommonController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/common/CommonController.java new file mode 100644 index 0000000..d9de911 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/common/CommonController.java @@ -0,0 +1,100 @@ +package com.ebts.web.controller.common; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ebts.system.utils.FtpUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.RestController; +import org.springframework.web.multipart.MultipartFile; +import com.ebts.common.config.EBTSConfig; +import com.ebts.common.constant.Constants; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.file.FileUploadUtils; +import com.ebts.common.utils.file.FileUtils; +import com.ebts.framework.config.ServerConfig; + +/** + * 通用请求处理 + * + * @author binlin + */ +@RestController +public class CommonController { + private static final Logger logger = LoggerFactory.getLogger(CommonController.class); + + @Autowired + private ServerConfig serverConfig; + + /** + * 通用下载请求 + * + * @param fileName 文件名称 + * @param delete 是否删除 + */ + @GetMapping("common/download") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) { + try { +// if (!FileUtils.isValidFilename(fileName)) { +// throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 " , fileName)); +// } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf(".")); + String filePath = EBTSConfig.getDownloadPath() + fileName; + + response.setCharacterEncoding("utf-8"); + response.setContentType("multipart/form-data"); + response.setHeader("Content-Disposition", + "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName)); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) { + FileUtils.deleteFile(filePath); + } + } catch (Exception e) { + logger.error("下载文件失败", e); + } + } + + /** + * 通用上传请求 + */ + @PostMapping("/common/upload") + public AjaxResult uploadFile(MultipartFile file) throws Exception { + try { + // 上传文件路径 + String filePath = EBTSConfig.getUploadPath(); + // 上传并返回新文件名称 + String fileName = FileUploadUtils.upload(filePath, file); + String url = FtpUtils.getApiurl() + fileName; +// String url = serverConfig.getUrl() + fileName; + AjaxResult ajax = AjaxResult.success(); + ajax.put("fileName", fileName); + ajax.put("url", url); + return ajax; + } catch (Exception e) { + return AjaxResult.error(e.getMessage()); + } + } + + /** + * 本地资源通用下载 + */ + @GetMapping("/common/download/resource") + public void resourceDownload(String name, HttpServletRequest request, HttpServletResponse response) throws Exception { + // 本地资源路径 + String localPath = EBTSConfig.getProfile(); + // 数据库资源地址 + String downloadPath = localPath + StringUtils.substringAfter(name, Constants.RESOURCE_PREFIX); + // 下载名称 + String downloadName = StringUtils.substringAfterLast(downloadPath, "/"); + response.setCharacterEncoding("utf-8"); + response.setContentType("multipart/form-data"); + response.setHeader("Content-Disposition", + "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, downloadName)); + FileUtils.writeBytes(downloadPath, response.getOutputStream()); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/LogininforController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/LogininforController.java new file mode 100644 index 0000000..8393c1c --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/LogininforController.java @@ -0,0 +1,67 @@ +package com.ebts.web.controller.monitor; + +import java.io.Serializable; +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.system.entity.Logininfor; +import com.ebts.system.service.LogininforService; + +/** + * 系统访问记录 + * + * @author binlin + */ +@RestController +@RequestMapping("/monitor/logininfor") +public class LogininforController extends BaseController { + + @Autowired + private LogininforService logininforService; + + @PreAuthorize("@ebts.hasPermi('monitor:logininfor:list')") + @GetMapping("/list") + public Serializable list(Logininfor logininfor) { + startPage(); + List list = logininforService.selectLogininforList(logininfor); + return getDataTable(list); + } + + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ebts.hasPermi('monitor:logininfor:export')") + @GetMapping("/export") + public AjaxResult export(Logininfor logininfor) { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil util = new ExcelUtil(Logininfor.class); + return util.exportExcel(list, "登录日志"); + } + + @PreAuthorize("@ebts.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public AjaxResult remove(@PathVariable Long[] infoIds) { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + @PreAuthorize("@ebts.hasPermi('monitor:logininfor:remove')") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() { + logininforService.cleanLogininfor(); + return AjaxResult.success(); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/OperlogController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/OperlogController.java new file mode 100644 index 0000000..d47a4ae --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/OperlogController.java @@ -0,0 +1,66 @@ +package com.ebts.web.controller.monitor; + +import java.io.Serializable; +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.system.entity.OperLog; +import com.ebts.system.service.OperLogService; + +/** + * 操作日志记录 + * + * @author binlin + */ +@RestController +@RequestMapping("/monitor/operlog") +public class OperlogController extends BaseController { + + @Autowired + private OperLogService operLogService; + + @PreAuthorize("@ebts.hasPermi('monitor:operlog:list')") + @GetMapping("/list") + public Serializable list(OperLog operLog) { + startPage(); + List list = operLogService.selectOperLogList(operLog); + return getDataTable(list); + } + + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ebts.hasPermi('monitor:operlog:export')") + @GetMapping("/export") + public AjaxResult export(OperLog operLog) { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil util = new ExcelUtil(OperLog.class); + return util.exportExcel(list, "操作日志"); + } + + @PreAuthorize("@ebts.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/{operIds}") + public AjaxResult remove(@PathVariable Long[] operIds) { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @PreAuthorize("@ebts.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/clean") + public AjaxResult clean() { + operLogService.cleanOperLog(); + return AjaxResult.success(); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/ServerController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/ServerController.java new file mode 100644 index 0000000..b7d1c53 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/ServerController.java @@ -0,0 +1,32 @@ +package com.ebts.web.controller.monitor; + +import com.ebts.common.constant.ReturnConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.framework.web.domain.Server; + +/** + * 服务器监控 + * + * @author binlin + */ +@RestController +@RequestMapping("/monitor/server") +public class ServerController extends BaseController { + + private Logger logger = LoggerFactory.getLogger(ServerController.class); + + @PreAuthorize("@ebts.hasPermi('monitor:server:list')") + @GetMapping() + public AjaxResult getInfo() throws Exception { + Server server = new Server(); + server.copyTo(); + return AjaxResult.success(server); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/UserOnlineController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/UserOnlineController.java new file mode 100644 index 0000000..9d42c3d --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/monitor/UserOnlineController.java @@ -0,0 +1,89 @@ +package com.ebts.web.controller.monitor; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.ebts.common.annotation.Log; +import com.ebts.common.constant.Constants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.core.redis.RedisCache; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.StringUtils; +import com.ebts.system.entity.UserOnline; +import com.ebts.system.service.UserOnlineService; + +/** + * 在线用户监控 + * + * @author binlin + */ +@RestController +@RequestMapping("/monitor/online") +public class UserOnlineController extends BaseController { + private Logger logger = LoggerFactory.getLogger(UserOnlineController.class); + + @Autowired + private UserOnlineService userOnlineService; + + @Autowired + private RedisCache redisCache; + + @PreAuthorize("@ebts.hasPermi('monitor:online:list')") + @GetMapping("/list") + public Serializable list(String ipaddr, String userName) { + try { + 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)) { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { + userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user)); + } + } else if (StringUtils.isNotEmpty(ipaddr)) { + if (StringUtils.equals(ipaddr, user.getIpaddr())) { + userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user)); + } + } else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser())) { + if (StringUtils.equals(userName, user.getUsername())) { + userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user)); + } + } else { + userOnlineList.add(userOnlineService.loginUserToUserOnline(user)); + } + } + Collections.reverse(userOnlineList); + userOnlineList.removeAll(Collections.singleton(null)); + return getDataTable(userOnlineList); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + return AjaxResult.error(ReturnConstants.SYS_ERROR); + } + } + + /** + * 强退用户 + */ + @PreAuthorize("@ebts.hasPermi('monitor:online:forceLogout')") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public AjaxResult forceLogout(@PathVariable String tokenId) { + redisCache.deleteObject(Constants.LOGIN_TOKEN_KEY + tokenId); + return AjaxResult.success(); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/ConfigController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/ConfigController.java new file mode 100644 index 0000000..d71d2e2 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/ConfigController.java @@ -0,0 +1,125 @@ +package com.ebts.web.controller.system; + +import java.io.Serializable; +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.ebts.common.annotation.Log; +import com.ebts.common.annotation.RepeatSubmit; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.system.entity.Config; +import com.ebts.system.service.ConfigService; + +/** + * 参数配置 信息操作处理 + * + * @author binlin + */ +@RestController +@RequestMapping("/system/config") +public class ConfigController extends BaseController { + @Autowired + private ConfigService configService; + + /** + * 获取参数配置列表 + */ + @PreAuthorize("@ebts.hasPermi('system:config:list')") + @GetMapping("/list") + public Serializable list(Config config) { + startPage(); + List list = configService.selectConfigList(config); + return getDataTable(list); + } + + @Log(title = "参数管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ebts.hasPermi('system:config:export')") + @GetMapping("/export") + public AjaxResult export(Config config) { + List list = configService.selectConfigList(config); + ExcelUtil util = new ExcelUtil(Config.class); + return util.exportExcel(list, "参数数据"); + } + + /** + * 根据参数编号获取详细信息 + */ + @PreAuthorize("@ebts.hasPermi('system:config:query')") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long configId) { + return AjaxResult.success(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + */ + @GetMapping(value = "/configKey/{configKey}") + public AjaxResult getConfigKey(@PathVariable String configKey) { + return AjaxResult.success(configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @PreAuthorize("@ebts.hasPermi('system:config:add')") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + @RepeatSubmit + public AjaxResult add(@Validated @RequestBody Config config) { + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) { + return AjaxResult.error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setCreateBy(SecurityUtils.getUserId()); + return toAjax(configService.insertConfig(config)); + } + + /** + * 修改参数配置 + */ + @PreAuthorize("@ebts.hasPermi('system:config:edit')") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody Config config) { + if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) { + return AjaxResult.error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + config.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(configService.updateConfig(config)); + } + + /** + * 删除参数配置 + */ + @PreAuthorize("@ebts.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public AjaxResult remove(@PathVariable Long[] configIds) { + return toAjax(configService.deleteConfigByIds(configIds)); + } + + /** + * 清空缓存 + */ + @PreAuthorize("@ebts.hasPermi('system:config:remove')") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/clearCache") + public AjaxResult clearCache() { + configService.clearCache(); + return AjaxResult.success(); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DeptController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DeptController.java new file mode 100644 index 0000000..f8dd856 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DeptController.java @@ -0,0 +1,147 @@ +package com.ebts.web.controller.system; + +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; +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.ebts.common.annotation.Log; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.entity.entity.Dept; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.system.service.DeptService; + +/** + * 部门信息 + * + * @author binlin + */ +@RestController +@RequestMapping("/system/dept") +public class DeptController extends BaseController { + @Autowired + private DeptService deptService; + + /** + * 获取部门列表 + */ + @PreAuthorize("@ebts.hasPermi('system:dept:list')") + @GetMapping("/list") + public AjaxResult list(Dept dept) { + List depts = deptService.selectDeptList(dept); + return AjaxResult.success(depts); + + } + + /** + * 查询部门列表(排除节点) + */ + @PreAuthorize("@ebts.hasPermi('system:dept:list')") + @GetMapping("/list/exclude/{deptId}") + public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { + List depts = deptService.selectDeptList(new Dept()); + Iterator it = depts.iterator(); + while (it.hasNext()) { + Dept d = (Dept) it.next(); + if (d.getDeptId().intValue() == deptId + || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + "")) { + it.remove(); + } + } + return AjaxResult.success(depts); + + } + + /** + * 根据部门编号获取详细信息 + */ + @PreAuthorize("@ebts.hasPermi('system:dept:query')") + @GetMapping(value = "/{deptId}") + public AjaxResult getInfo(@PathVariable Long deptId) { + return AjaxResult.success(deptService.selectDeptById(deptId)); + } + + /** + * 获取部门下拉树列表 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(Dept 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 Dept()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); + ajax.put("depts", deptService.buildDeptTreeSelect(depts)); + return ajax; + } + + /** + * 新增部门 + */ + @PreAuthorize("@ebts.hasPermi('system:dept:add')") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody Dept dept) { + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) { + return AjaxResult.error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + dept.setCreateBy(SecurityUtils.getUserId()); + return toAjax(deptService.insertDept(dept)); + } + + /** + * 修改部门 + */ + @PreAuthorize("@ebts.hasPermi('system:dept:edit')") + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody Dept dept) { + if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) { + return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } else if (dept.getParentId().equals(dept.getDeptId())) { + return AjaxResult.error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) + && deptService.selectNormalChildrenDeptById(dept.getDeptId()) > 0) { + return AjaxResult.error("该部门包含未停用的子部门!"); + } + dept.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除部门 + */ + @PreAuthorize("@ebts.hasPermi('system:dept:remove')") + @Log(title = "部门管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public AjaxResult remove(@PathVariable Long deptId) { + if (deptService.hasChildByDeptId(deptId)) { + return AjaxResult.error("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) { + return AjaxResult.error("部门存在用户,不允许删除"); + } + return toAjax(deptService.deleteDeptById(deptId)); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DictDataController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DictDataController.java new file mode 100644 index 0000000..da2037b --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DictDataController.java @@ -0,0 +1,106 @@ +package com.ebts.web.controller.system; + +import java.io.Serializable; +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.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.entity.entity.DictData; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.system.service.DictDataService; +import com.ebts.system.service.DictTypeService; + +/** + * 数据字典信息 + * + * @author binlin + */ +@RestController +@RequestMapping("/system/dict/data") +public class DictDataController extends BaseController { + @Autowired + private DictDataService dictDataService; + + @Autowired + private DictTypeService dictTypeService; + + @PreAuthorize("@ebts.hasPermi('system:dict:list')") + @GetMapping("/list") + public Serializable list(DictData dictData) { + startPage(); + List list = dictDataService.selectDictDataList(dictData); + return getDataTable(list); + } + + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @PreAuthorize("@ebts.hasPermi('system:dict:export')") + @GetMapping("/export") + public AjaxResult export(DictData dictData) { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil util = new ExcelUtil(DictData.class); + return util.exportExcel(list, "字典数据"); + } + + /** + * 查询字典数据详细 + */ + @PreAuthorize("@ebts.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictCode}") + public AjaxResult getInfo(@PathVariable Long dictCode) { + return AjaxResult.success(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + */ + @GetMapping(value = "/type/{dictType}") + public AjaxResult dictType(@PathVariable String dictType) { + return AjaxResult.success(dictTypeService.selectDictDataByType(dictType)); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ebts.hasPermi('system:dict:add')") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody DictData dict) { + dict.setCreateBy(SecurityUtils.getUserId()); + return toAjax(dictDataService.insertDictData(dict)); + } + + /** + * 修改保存字典类型 + */ + @PreAuthorize("@ebts.hasPermi('system:dict:edit')") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody DictData dict) { + dict.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(dictDataService.updateDictData(dict)); + } + + /** + * 删除字典类型 + */ + @PreAuthorize("@ebts.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public AjaxResult remove(@PathVariable Long[] dictCodes) { + return toAjax(dictDataService.deleteDictDataByIds(dictCodes)); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DictTypeController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DictTypeController.java new file mode 100644 index 0000000..23a9194 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/DictTypeController.java @@ -0,0 +1,121 @@ +package com.ebts.web.controller.system; + +import java.io.Serializable; +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.ebts.common.annotation.Log; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.entity.entity.DictType; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.system.service.DictTypeService; + +/** + * 数据字典信息 + * + * @author binlin + */ +@RestController +@RequestMapping("/system/dict/type") +public class DictTypeController extends BaseController { + @Autowired + private DictTypeService dictTypeService; + + @PreAuthorize("@ebts.hasPermi('system:dict:list')") + @GetMapping("/list") + public Serializable list(DictType dictType) { + startPage(); + List list = dictTypeService.selectDictTypeList(dictType); + return getDataTable(list); + } + + @Log(title = "字典类型", businessType = BusinessType.EXPORT) + @PreAuthorize("@ebts.hasPermi('system:dict:export')") + @GetMapping("/export") + public AjaxResult export(DictType dictType) { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil util = new ExcelUtil(DictType.class); + return util.exportExcel(list, "字典类型"); + } + + /** + * 查询字典类型详细 + */ + @PreAuthorize("@ebts.hasPermi('system:dict:query')") + @GetMapping(value = "/{dictId}") + public AjaxResult getInfo(@PathVariable Long dictId) { + return AjaxResult.success(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @PreAuthorize("@ebts.hasPermi('system:dict:add')") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody DictType dict) { + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { + return AjaxResult.error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dict.setCreateBy(SecurityUtils.getUserId()); + return toAjax(dictTypeService.insertDictType(dict)); + } + + /** + * 修改字典类型 + */ + @PreAuthorize("@ebts.hasPermi('system:dict:edit')") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody DictType dict) { + if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { + return AjaxResult.error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dict.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(dictTypeService.updateDictType(dict)); + } + + /** + * 删除字典类型 + */ + @PreAuthorize("@ebts.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public AjaxResult remove(@PathVariable Long[] dictIds) { + return toAjax(dictTypeService.deleteDictTypeByIds(dictIds)); + } + + /** + * 清空缓存 + */ + @PreAuthorize("@ebts.hasPermi('system:dict:remove')") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/clearCache") + public AjaxResult clearCache() { + dictTypeService.clearCache(); + return AjaxResult.success(); + } + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() { + List dictTypes = dictTypeService.selectDictTypeAll(); + return AjaxResult.success(dictTypes); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/FileController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/FileController.java new file mode 100644 index 0000000..f58ecb3 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/FileController.java @@ -0,0 +1,185 @@ +package com.ebts.web.controller.system; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.core.controller.EBTSController; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.utils.ServerResult; +import com.ebts.framework.web.service.TokenService; +import com.ebts.system.entity.SysFile; +import com.ebts.system.utils.FtpUtils; +import io.swagger.annotations.Api; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +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.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ebts.common.annotation.Log; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.system.service.FileService; +import com.ebts.common.utils.poi.ExcelUtil; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 文件信息Controller + * + * @author binlin + * @date 2021-02-17 + */ + +@Api(value = "文件信息管理", tags = "文件信息管理") +@RestController +@RequestMapping("/system/file") +public class FileController extends EBTSController { + protected final Logger logger = LoggerFactory.getLogger(FileController.class); + + @Autowired + private FileService fileService; + + @Autowired + private TokenService tokenService; + + /** + * 查询文件信息列表 + */ + @PreAuthorize("@ebts.hasPermi('system:file:list')") + @PutMapping("/list") + public Serializable list(@Validated @RequestBody SysFile sysFile) { + startPage(sysFile.getParams()); + ServerResult> serverResult = fileService.selectFileList(sysFile); + if (serverResult.isStart()) { + return getDataTable(serverResult.getData()); + } else { + return AjaxResult.info(serverResult.getMsg()); + } + } + + @GetMapping("/folder") + public AjaxResult getFolder() { + ServerResult> serverResult = fileService.selectFileFolder(); + if (serverResult.isStart()) { + return AjaxResult.success(serverResult.getData()); + } else { + return AjaxResult.error(serverResult.getMsg()); + } + } + + /** + * 导出文件信息列表 + */ + @PreAuthorize("@ebts.hasPermi('system:file:export')") + @Log(title = "文件信息", businessType = BusinessType.EXPORT) + @PutMapping("/export") + public AjaxResult export(@Validated @RequestBody SysFile sysFile) { + ServerResult> serverResult = fileService.selectFileList(sysFile); + ExcelUtil util = new ExcelUtil(SysFile.class); + if (serverResult.isStart()) { + return util.exportExcel(serverResult.getData(), "file"); + } else { + return AjaxResult.error(serverResult.getMsg()); + } + } + + /** + * 获取文件信息详细信息 + */ + @PreAuthorize("@ebts.hasPermi('system:file:query')") + @GetMapping(value = "/{fileId}") + public AjaxResult getInfo(@PathVariable("fileId") Long fileId) { + ServerResult serverResult = fileService.selectFileById(fileId); + if (serverResult.isStart()) { + return AjaxResult.success(serverResult.getData()); + } else { + return AjaxResult.info(serverResult.getMsg()); + } + } + + /** + * 新增文件信息 + */ + @PreAuthorize("@ebts.hasPermi('system:file:add')") + @Log(title = "文件信息", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysFile sysFile) { + if (sysFile.getFileAddr() == null || sysFile.getFileAddr().equals("")) { + return AjaxResult.error("上传文件不能为空!"); + } + if (sysFile.getIsPublic().equals("1") || sysFile.getIsPublic().equals("2")) { + Map modeMap = new HashMap<>(); + ServerResult serverResult = fileService.insertFile(sysFile); + if (serverResult.isStart()) { + if (sysFile.getIsPublic().equals("1")) { + String fileUrl = FtpUtils.getResources() + sysFile.getFileAddr().substring(FtpUtils.getPubfiles().length()) + "/" + sysFile.getMapping(); + modeMap.put("url", fileUrl); + } + String fileUri = sysFile.getFileAddr() + "/" + sysFile.getMapping(); + modeMap.put("uri", fileUri); + return AjaxResult.success(modeMap); + } else { + return AjaxResult.error(serverResult.getMsg()); + } + } else { + return AjaxResult.error("isPublic为空或者状态有误!"); + } + } + + /** + * 修改文件信息 + */ + @PreAuthorize("@ebts.hasPermi('system:file:edit')") + @Log(title = "文件信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysFile sysFile) { + ServerResult serverResult = fileService.updateFile(sysFile); + if (serverResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(serverResult.getMsg()); + } + } + + /** + * 删除文件信息 + */ + @PreAuthorize("@ebts.hasPermi('system:file:remove')") + @Log(title = "文件信息", businessType = BusinessType.DELETE) + @DeleteMapping("/{fileIds}") + public AjaxResult remove(@PathVariable Long[] fileIds) { + if (fileIds.length < 0) { + return AjaxResult.error("id不能为空!"); + } + ServerResult serverResult = fileService.deleteFileByIds(fileIds); + if (serverResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(serverResult.getMsg()); + } + } + + @GetMapping("/download/{fileId}") + public AjaxResult download(@PathVariable Long fileId, HttpServletRequest request, HttpServletResponse response) { + LoginUser user = tokenService.getFileUser(request); + ServerResult serverResult = fileService.downloadFile(fileId, user); + if (serverResult.isStart()) { + return AjaxResult.success(serverResult.getData().getFileName()); + } else { + return AjaxResult.error(serverResult.getMsg()); + } + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/LoginController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/LoginController.java new file mode 100644 index 0000000..dbd22ae --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/LoginController.java @@ -0,0 +1,95 @@ +package com.ebts.web.controller.system; + +import java.util.List; +import java.util.Set; + +import com.ebts.system.utils.FtpUtils; +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.ebts.common.constant.Constants; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.entity.entity.Menu; +import com.ebts.common.core.entity.entity.User; +import com.ebts.common.core.entity.model.LoginBody; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.utils.ServletUtils; +import com.ebts.framework.web.service.LoginService; +import com.ebts.framework.web.service.SysPermissionService; +import com.ebts.framework.web.service.TokenService; +import com.ebts.system.service.MenuService; + +/** + * 登录验证 + * + * @author binlin + */ +@RestController +public class LoginController { + @Autowired + private LoginService loginService; + + @Autowired + private MenuService menuService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private TokenService tokenService; + + /** + * 登录方法 + * + * @param loginBody 登录信息 + * @return 结果 + */ + @PostMapping("/login") + public AjaxResult login(@RequestBody LoginBody loginBody) { + AjaxResult ajax = AjaxResult.success(); + // 生成令牌 + String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), + loginBody.getUuid()); + ajax.put(Constants.TOKEN, token); + return ajax; + } + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @GetMapping("getInfo") + public AjaxResult getInfo() { + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + User user = loginUser.getUser(); + + String avatar = FtpUtils.getResources() + user.getAvatar(); + user.setAvatar(avatar); + // 角色集合 + Set roles = permissionService.getRolePermission(user); + // 权限集合 + Set permissions = permissionService.getMenuPermission(user); + AjaxResult ajax = AjaxResult.success(); + ajax.put("user", user); + ajax.put("roles", roles); + ajax.put("permissions", permissions); + return ajax; + } + + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @GetMapping("getRouters") + public AjaxResult getRouters() { + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + // 用户信息 + User user = loginUser.getUser(); + List menus = menuService.selectMenuTreeByUserId(user.getUserId()); + return AjaxResult.success(menuService.buildMenus(menus)); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/MenuController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/MenuController.java new file mode 100644 index 0000000..7261ce5 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/MenuController.java @@ -0,0 +1,140 @@ +package com.ebts.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.ebts.common.annotation.Log; +import com.ebts.common.constant.Constants; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.entity.entity.Menu; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServletUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.framework.web.service.TokenService; +import com.ebts.system.service.MenuService; + +/** + * 菜单信息 + * + * @author binlin + */ +@RestController +@RequestMapping("/system/menu") +public class MenuController extends BaseController { + @Autowired + private MenuService menuService; + + @Autowired + private TokenService tokenService; + + /** + * 获取菜单列表 + */ + @PreAuthorize("@ebts.hasPermi('system:menu:list')") + @GetMapping("/list") + public AjaxResult list(Menu menu) { + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + Long userId = loginUser.getUser().getUserId(); + List menus = menuService.selectMenuList(menu, userId); + return AjaxResult.success(menus); + } + + /** + * 根据菜单编号获取详细信息 + */ + @PreAuthorize("@ebts.hasPermi('system:menu:query')") + @GetMapping(value = "/{menuId}") + public AjaxResult getInfo(@PathVariable Long menuId) { + return AjaxResult.success(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @GetMapping("/treeselect") + public AjaxResult treeselect(Menu menu) { + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + Long userId = loginUser.getUser().getUserId(); + List menus = menuService.selectMenuList(menu, userId); + return AjaxResult.success(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + */ + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) { + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + List menus = menuService.selectMenuList(loginUser.getUser().getUserId()); + AjaxResult ajax = AjaxResult.success(); + ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); + ajax.put("menus", menuService.buildMenuTreeSelect(menus)); + return ajax; + } + + /** + * 新增菜单 + */ + @PreAuthorize("@ebts.hasPermi('system:menu:add')") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody Menu menu) { + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { + return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) + && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS)) { + return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + menu.setCreateBy(SecurityUtils.getUserId()); + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @PreAuthorize("@ebts.hasPermi('system:menu:edit')") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody Menu menu) { + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { + return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) + && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS)) { + return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } else if (menu.getMenuId().equals(menu.getParentId())) { + return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + menu.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 删除菜单 + */ + @PreAuthorize("@ebts.hasPermi('system:menu:remove')") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public AjaxResult remove(@PathVariable("menuId") Long menuId) { + if (menuService.hasChildByMenuId(menuId)) { + return AjaxResult.error("存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) { + return AjaxResult.error("菜单已分配,不允许删除"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } +} \ No newline at end of file diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/NoticeController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/NoticeController.java new file mode 100644 index 0000000..e8a9783 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/NoticeController.java @@ -0,0 +1,87 @@ +package com.ebts.web.controller.system; + +import java.io.Serializable; +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.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.system.entity.Notice; +import com.ebts.system.service.NoticeService; + +/** + * 公告 信息操作处理 + * + * @author binlin + */ +@RestController +@RequestMapping("/system/notice") +public class NoticeController extends BaseController { + @Autowired + private NoticeService noticeService; + + /** + * 获取通知公告列表 + */ + @PreAuthorize("@ebts.hasPermi('system:notice:list')") + @GetMapping("/list") + public Serializable list(Notice notice) { + startPage(); + List list = noticeService.selectNoticeList(notice); + return getDataTable(list); + } + + /** + * 根据通知公告编号获取详细信息 + */ + @PreAuthorize("@ebts.hasPermi('system:notice:query')") + @GetMapping(value = "/{noticeId}") + public AjaxResult getInfo(@PathVariable Long noticeId) { + return AjaxResult.success(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ + @PreAuthorize("@ebts.hasPermi('system:notice:add')") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody Notice notice) { + notice.setCreateBy(SecurityUtils.getUserId()); + return toAjax(noticeService.insertNotice(notice)); + } + + /** + * 修改通知公告 + */ + @PreAuthorize("@ebts.hasPermi('system:notice:edit')") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody Notice notice) { + notice.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + */ + @PreAuthorize("@ebts.hasPermi('system:notice:remove')") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public AjaxResult remove(@PathVariable Long[] noticeIds) { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/PostController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/PostController.java new file mode 100644 index 0000000..9eb04e2 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/PostController.java @@ -0,0 +1,117 @@ +package com.ebts.web.controller.system; + +import java.io.Serializable; +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.ebts.common.annotation.Log; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.system.entity.Post; +import com.ebts.system.service.PostService; + +/** + * 岗位信息操作处理 + * + * @author binlin + */ +@RestController +@RequestMapping("/system/post") +public class PostController extends BaseController { + @Autowired + private PostService postService; + + /** + * 获取岗位列表 + */ + @PreAuthorize("@ebts.hasPermi('system:post:list')") + @GetMapping("/list") + public Serializable list(Post post) { + startPage(); + List list = postService.selectPostList(post); + return getDataTable(list); + } + + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ebts.hasPermi('system:post:export')") + @GetMapping("/export") + public AjaxResult export(Post post) { + List list = postService.selectPostList(post); + ExcelUtil util = new ExcelUtil(Post.class); + return util.exportExcel(list, "岗位数据"); + } + + /** + * 根据岗位编号获取详细信息 + */ + @PreAuthorize("@ebts.hasPermi('system:post:query')") + @GetMapping(value = "/{postId}") + public AjaxResult getInfo(@PathVariable Long postId) { + return AjaxResult.success(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @PreAuthorize("@ebts.hasPermi('system:post:add')") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody Post post) { + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) { + return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) { + return AjaxResult.error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + post.setCreateBy(SecurityUtils.getUserId()); + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @PreAuthorize("@ebts.hasPermi('system:post:edit')") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody Post post) { + if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) { + return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(postService.checkPostCodeUnique(post))) { + return AjaxResult.error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + post.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + */ + @PreAuthorize("@ebts.hasPermi('system:post:remove')") + @Log(title = "岗位管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public AjaxResult remove(@PathVariable Long[] postIds) { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 获取岗位选择框列表 + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() { + List posts = postService.selectPostAll(); + return AjaxResult.success(posts); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/ProfileController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/ProfileController.java new file mode 100644 index 0000000..fa767f0 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/ProfileController.java @@ -0,0 +1,117 @@ +package com.ebts.web.controller.system; + +import java.io.IOException; + +import com.ebts.system.utils.FtpUtils; +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.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.entity.entity.User; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServletUtils; +import com.ebts.framework.web.service.TokenService; +import com.ebts.system.service.UserService; + +/** + * 个人信息 业务处理 + * + * @author binlin + */ +@RestController +@RequestMapping("/system/user/profile") +public class ProfileController extends BaseController { + @Autowired + private UserService userService; + + @Autowired + private TokenService tokenService; + + /** + * 个人信息 + */ + @GetMapping + public AjaxResult profile() { + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + User user = loginUser.getUser(); + AjaxResult ajax = AjaxResult.success(user); + ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername())); + ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername())); + return ajax; + } + + /** + * 修改用户 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult updateProfile(@RequestBody User user) { + if (userService.updateUserProfile(user) > 0) { + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + // 更新缓存用户信息 + loginUser.getUser().setNickName(user.getNickName()); + loginUser.getUser().setPhonenumber(user.getPhonenumber()); + loginUser.getUser().setEmail(user.getEmail()); + loginUser.getUser().setSex(user.getSex()); + tokenService.setLoginUser(loginUser); + return AjaxResult.success(); + } + return AjaxResult.error("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + */ + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public AjaxResult updatePwd(String oldPassword, String newPassword) { + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + String userName = loginUser.getUsername(); + String password = loginUser.getPassword(); + if (!SecurityUtils.matchesPassword(oldPassword, password)) { + return AjaxResult.error("修改密码失败,旧密码错误"); + } + if (SecurityUtils.matchesPassword(newPassword, password)) { + return AjaxResult.error("新密码不能与旧密码相同"); + } + if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0) { + // 更新缓存用户密码 + loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword)); + tokenService.setLoginUser(loginUser); + return AjaxResult.success(); + } + return AjaxResult.error("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + */ + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping("/avatar") + public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws IOException { + if (!file.isEmpty()) { + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + file.getName(); + String avatar = FtpUtils.uploadFtp(file); + if (userService.updateUserAvatar(loginUser.getUsername(), avatar)) { + AjaxResult ajax = AjaxResult.success(); + loginUser.getUser().setAvatar(avatar); + ajax.put("imgUrl", FtpUtils.getResources() + avatar); + // 更新缓存用户头像 + tokenService.setLoginUser(loginUser); + return ajax; + } + } + return AjaxResult.error("上传图片异常,请联系管理员"); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/RealQueryController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/RealQueryController.java new file mode 100644 index 0000000..0306c46 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/RealQueryController.java @@ -0,0 +1,87 @@ +package com.ebts.web.controller.system; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.utils.ServerResult; +import com.ebts.common.utils.MapExcelUtil; +import com.ebts.system.entity.RealUniQuery; +import com.ebts.system.service.RealQueryService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.*; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @Author 18209 + * @Date 2021/2/22 18:02 + * @Version 1.0 + */ +@RestController +@RequestMapping("/data") +public class RealQueryController extends BaseController { + + @Autowired + private RealQueryService realQueryService; + + /** + * 用户导出 + * + * @param realUniQuery + * @return + */ + @PreAuthorize("@ebts.hasAnyPermi('data:real:export')") + @PutMapping("/real/export") + public AjaxResult exportReal(@Validated @RequestBody RealUniQuery realUniQuery) { + ServerResult>> serverResult = realQueryService.RealData(realUniQuery, 1); + if (serverResult.isStart()) { + return new MapExcelUtil().exportExcel(serverResult.getData(), serverResult.getSheetName()); + } else { + return AjaxResult.error(serverResult.getMsg()); + } + } + + /** + * 获取查询基本信息 + * + * @param id + * @return + */ + @PreAuthorize("@ebts.hasPermi('data:real:data')") + @GetMapping("/real/{id}") + public AjaxResult RealInfo(@PathVariable("id") Long id) { + if (id == null) { + return AjaxResult.error("id不能为空!"); + } + ServerResult> serverResult = realQueryService.RealInfo(id); + if (serverResult.isStart()) { + return AjaxResult.success(serverResult.getData()); + } else { + return AjaxResult.error(serverResult.getMsg()); + } + } + + + /** + * 获取查询数据 + * + * @param realUniQuery + * @return + */ + @PreAuthorize("@ebts.hasAnyPermi('data:real:list')") + @PutMapping("/real") + public Serializable RealData(@Validated @RequestBody RealUniQuery realUniQuery) { + ServerResult>> serverResult = realQueryService.RealData(realUniQuery, 2); + if (serverResult.isStart()) { + return getDataTable(serverResult.getData()); + } else { + return AjaxResult.error(serverResult.getMsg()); + } + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/RoleController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/RoleController.java new file mode 100644 index 0000000..4f8587a --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/RoleController.java @@ -0,0 +1,170 @@ +package com.ebts.web.controller.system; + +import java.io.Serializable; +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +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.ebts.common.annotation.Log; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.entity.entity.Role; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServletUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.framework.web.service.SysPermissionService; +import com.ebts.framework.web.service.TokenService; +import com.ebts.system.service.RoleService; +import com.ebts.system.service.UserService; + +/** + * 角色信息 + * + * @author binlin + */ +@RestController +@RequestMapping("/system/role") +public class RoleController extends BaseController { + @Autowired + private RoleService roleService; + + @Autowired + private TokenService tokenService; + + @Autowired + private SysPermissionService permissionService; + + @Autowired + private UserService userService; + + @PreAuthorize("@ebts.hasPermi('system:role:list')") + @GetMapping("/list") + public Serializable list(Role role) { + startPage(); + List list = roleService.selectRoleList(role); + return getDataTable(list); + } + + @Log(title = "角色管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ebts.hasPermi('system:role:export')") + @GetMapping("/export") + public AjaxResult export(Role role) { + List list = roleService.selectRoleList(role); + ExcelUtil util = new ExcelUtil(Role.class); + return util.exportExcel(list, "角色数据"); + } + + /** + * 根据角色编号获取详细信息 + */ + @PreAuthorize("@ebts.hasPermi('system:role:query')") + @GetMapping(value = "/{roleId}") + public AjaxResult getInfo(@PathVariable Long roleId) { + return AjaxResult.success(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @PreAuthorize("@ebts.hasPermi('system:role:add')") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody Role role) { + if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { + return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) { + return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + role.setCreateBy(SecurityUtils.getUserId()); + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @PreAuthorize("@ebts.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody Role role) { + roleService.checkRoleAllowed(role); + if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { + return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role))) { + return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + role.setUpdateBy(SecurityUtils.getUserId()); + + if (roleService.updateRole(role) > 0) { + // 更新缓存用户权限 + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin()) { + loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser())); + loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName())); + tokenService.setLoginUser(loginUser); + } + return AjaxResult.success(); + } + return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @PreAuthorize("@ebts.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public AjaxResult dataScope(@RequestBody Role role) { + roleService.checkRoleAllowed(role); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @PreAuthorize("@ebts.hasPermi('system:role:edit')") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody Role role) { + roleService.checkRoleAllowed(role); + role.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(roleService.updateRoleStatus(role)); + } + + /** + * 删除角色 + */ + @PreAuthorize("@ebts.hasPermi('system:role:remove')") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public AjaxResult remove(@PathVariable Long[] roleIds) { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + */ + @PreAuthorize("@ebts.hasPermi('system:role:query')") + @GetMapping("/optionselect") + public AjaxResult optionselect(Integer type) { + if (type == 1 || type == 2) { + return AjaxResult.success(roleService.selectRoleAll(type)); + } else { + return AjaxResult.error(ReturnConstants.STATE_ERROR); + } + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/SequenceController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/SequenceController.java new file mode 100644 index 0000000..b1d36b1 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/SequenceController.java @@ -0,0 +1,36 @@ +package com.ebts.web.controller.system; + +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.system.service.SequenceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +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; + +/** + * @Author 18209 + * @Date 2021/2/24 17:52 + * @Version 1.0 + */ +@RestController +@RequestMapping("/seq") +public class SequenceController { + + @Autowired + private SequenceService sequenceService; + + @PreAuthorize("@ebts.hasPermi('sequence:curr')") + @GetMapping("/curr/{tableName}") + public AjaxResult currval(@PathVariable String tableName){ + return AjaxResult.success(sequenceService.currval(tableName)); + } + + @PreAuthorize("@ebts.hasPermi('sequence:next')") + @GetMapping("/next/{tableName}") + public AjaxResult nextval(@PathVariable String tableName){ + return AjaxResult.success(sequenceService.nextval(tableName)); + } + +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/UserController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/UserController.java new file mode 100644 index 0000000..5ce1b3e --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/system/UserController.java @@ -0,0 +1,182 @@ +package com.ebts.web.controller.system; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +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 org.springframework.web.multipart.MultipartFile; +import com.ebts.common.annotation.Log; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.entity.entity.Role; +import com.ebts.common.core.entity.entity.User; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServletUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.framework.web.service.TokenService; +import com.ebts.system.service.PostService; +import com.ebts.system.service.RoleService; +import com.ebts.system.service.UserService; + +/** + * 用户信息 + * + * @author binlin + */ +@RestController +@RequestMapping("/system/user") +public class UserController extends BaseController { + @Autowired + private UserService userService; + + @Autowired + private RoleService roleService; + + @Autowired + private PostService postService; + + @Autowired + private TokenService tokenService; + + /** + * 获取用户列表 + */ + @PreAuthorize("@ebts.hasPermi('system:user:list')") + @GetMapping("/list") + public Serializable list(User user) { + startPage(); + List list = userService.selectUserList(user); + return getDataTable(list); + } + + @Log(title = "用户管理", businessType = BusinessType.EXPORT) + @PreAuthorize("@ebts.hasPermi('system:user:export')") + @GetMapping("/export") + public AjaxResult export(User user) { + List list = userService.selectUserList(user); + ExcelUtil util = new ExcelUtil(User.class); + return util.exportExcel(list, "用户数据"); + } + + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @PreAuthorize("@ebts.hasPermi('system:user:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception { + ExcelUtil util = new ExcelUtil(User.class); + List userList = util.importExcel(file.getInputStream()); + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + Long operName = loginUser.getUser().getUserId(); + String message = userService.importUser(userList, updateSupport, operName); + return AjaxResult.success(message); + } + + @GetMapping("/importTemplate") + public AjaxResult importTemplate() { + ExcelUtil util = new ExcelUtil(User.class); + return util.importTemplateExcel("用户数据"); + } + + /** + * 根据用户编号获取详细信息 + */ + @PreAuthorize("@ebts.hasPermi('system:user:query')") + @GetMapping(value = {"/", "/{userId}"}) + public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId) { + AjaxResult ajax = AjaxResult.success(); + List roles = roleService.selectRoleAll(0); + ajax.put("roles", User.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList())); + ajax.put("posts", postService.selectPostAll()); + if (StringUtils.isNotNull(userId)) { + ajax.put(AjaxResult.DATA_TAG, userService.selectUserById(userId)); + ajax.put("postIds", postService.selectPostListByUserId(userId)); + ajax.put("roleIds", roleService.selectRoleListByUserId(userId)); + } + return ajax; + } + + /** + * 新增用户 + */ + @PreAuthorize("@ebts.hasPermi('system:user:add')") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody User user) { + if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) { + return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { + return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { + return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setCreateBy(SecurityUtils.getUserId()); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + return toAjax(userService.insertUser(user)); + } + + /** + * 修改用户 + */ + @PreAuthorize("@ebts.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody User user) { + userService.checkUserAllowed(user); + if (UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) { + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user))) { + return AjaxResult.error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + user.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(userService.updateUser(user)); + } + + /** + * 删除用户 + */ + @PreAuthorize("@ebts.hasPermi('system:user:remove')") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) { + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 重置密码 + */ + @PreAuthorize("@ebts.hasPermi('system:user:resetPwd')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public AjaxResult resetPwd(@RequestBody User user) { + userService.checkUserAllowed(user); + user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); + user.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(userService.resetPwd(user)); + } + + /** + * 状态修改 + */ + @PreAuthorize("@ebts.hasPermi('system:user:edit')") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody User user) { + userService.checkUserAllowed(user); + user.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(userService.updateUserStatus(user)); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/tool/SwaggerController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/tool/SwaggerController.java new file mode 100644 index 0000000..ceab2c0 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/tool/SwaggerController.java @@ -0,0 +1,22 @@ +package com.ebts.web.controller.tool; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import com.ebts.common.core.controller.BaseController; + +/** + * swagger 接口 + * + * @author binlin + */ +@Controller +@RequestMapping("/tool/swagger") +public class SwaggerController extends BaseController { + @PreAuthorize("@ebts.hasPermi('tool:swagger:view')") + @GetMapping() + public String index() { + return redirect("/swagger-ui.html"); + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/controller/tool/TestController.java b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/tool/TestController.java new file mode 100644 index 0000000..5e061e1 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/controller/tool/TestController.java @@ -0,0 +1,151 @@ +package com.ebts.web.controller.tool; + +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; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.utils.StringUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; + +/** + * swagger 用户测试方法 + * + * @author binlin + */ +@Api("用户信息管理") +@RestController +@RequestMapping("/test/user") +public class TestController extends BaseController { + private final static Map users = new LinkedHashMap(); + + { + users.put(1, new UserEntity(1, "admin", "admin123", "15888888888")); + users.put(2, new UserEntity(2, "ry", "admin123", "15666666666")); + } + + @ApiOperation("获取用户列表") + @GetMapping("/list") + public AjaxResult userList() { + List userList = new ArrayList(users.values()); + return AjaxResult.success(userList); + } + + @ApiOperation("获取用户详细") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path") + @GetMapping("/{userId}") + public AjaxResult getUser(@PathVariable Integer userId) { + if (!users.isEmpty() && users.containsKey(userId)) { + return AjaxResult.success(users.get(userId)); + } else { + return AjaxResult.error("用户不存在"); + } + } + + @ApiOperation("新增用户") + @ApiImplicitParam(name = "userEntity", value = "新增用户信息", dataType = "UserEntity") + @PostMapping("/save") + public AjaxResult save(UserEntity user) { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) { + return AjaxResult.error("用户ID不能为空"); + } + return AjaxResult.success(users.put(user.getUserId(), user)); + } + + @ApiOperation("更新用户") + @ApiImplicitParam(name = "userEntity", value = "新增用户信息", dataType = "UserEntity") + @PutMapping("/update") + public AjaxResult update(UserEntity user) { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId())) { + return AjaxResult.error("用户ID不能为空"); + } + if (users.isEmpty() || !users.containsKey(user.getUserId())) { + return AjaxResult.error("用户不存在"); + } + users.remove(user.getUserId()); + return AjaxResult.success(users.put(user.getUserId(), user)); + } + + @ApiOperation("删除用户信息") + @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path") + @DeleteMapping("/{userId}") + public AjaxResult delete(@PathVariable Integer userId) { + if (!users.isEmpty() && users.containsKey(userId)) { + users.remove(userId); + return AjaxResult.success(); + } else { + return AjaxResult.error("用户不存在"); + } + } +} + +@ApiModel("用户实体") +class UserEntity { + @ApiModelProperty("用户ID") + private Integer userId; + + @ApiModelProperty("用户名称") + private String username; + + @ApiModelProperty("用户密码") + private String password; + + @ApiModelProperty("用户手机") + private String mobile; + + public UserEntity() { + + } + + public UserEntity(Integer userId, String username, String password, String mobile) { + this.userId = userId; + this.username = username; + this.password = password; + this.mobile = mobile; + } + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } +} diff --git a/ebts/ebts-admin/src/main/java/com/ebts/web/core/config/SwaggerConfig.java b/ebts/ebts-admin/src/main/java/com/ebts/web/core/config/SwaggerConfig.java new file mode 100644 index 0000000..5b748c4 --- /dev/null +++ b/ebts/ebts-admin/src/main/java/com/ebts/web/core/config/SwaggerConfig.java @@ -0,0 +1,127 @@ +package com.ebts.web.core.config; + +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.ebts.common.config.EBTSConfig; +import io.swagger.annotations.ApiOperation; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.Contact; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * Swagger2的接口配置 + * + * @author binlin + */ +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + /** + * 系统基础配置 + */ + @Autowired + private EBTSConfig ebtsConfig; + + /** + * 是否开启swagger + */ + @Value("${swagger.enabled}") + private boolean enabled; + + /** + * 设置请求的统一前缀 + */ + @Value("${swagger.pathMapping}") + private String pathMapping; + + /** + * 创建API + */ + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + // 是否启用Swagger + .enable(enabled) + // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息) + .apiInfo(apiInfo()) + // 设置哪些接口暴露给Swagger展示 + .select() + // 扫描所有有注解的api,用这种方式更灵活 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) + // 扫描指定包中的swagger注解 + // .apis(RequestHandlerSelectors.basePackage("com.ebts.project.tool.swagger")) + // 扫描所有 + //.apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + /* 设置安全模式,swagger可以设置访问token */ + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()) + .pathMapping(pathMapping); + } + + /** + * 安全模式,这里指定token通过Authorization头请求头传递 + */ + private List securitySchemes() { + List apiKeyList = new ArrayList(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", "header")); + return apiKeyList; + } + + /** + * 安全上下文 + */ + private List securityContexts() { + List securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(PathSelectors.regex("^(?!auth).*$")) + .build()); + return securityContexts; + } + + /** + * 默认的安全上引用 + */ + private List defaultAuth() { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); + return securityReferences; + } + + /** + * 添加摘要信息 + */ + private ApiInfo apiInfo() { + // 用ApiInfoBuilder进行定制 + return new ApiInfoBuilder() + // 设置标题 + .title("标题:EBTS_接口文档") + // 描述 + .description("描述:系统接口模块管理") + // 作者信息 + .contact(new Contact(ebtsConfig.getName(), null, null)) + // 版本 + .version("版本号:" + ebtsConfig.getVersion()) + .build(); + } +} diff --git a/ebts/ebts-admin/src/main/resources/META-INF/spring-devtools.properties b/ebts/ebts-admin/src/main/resources/META-INF/spring-devtools.properties new file mode 100644 index 0000000..2b23f85 --- /dev/null +++ b/ebts/ebts-admin/src/main/resources/META-INF/spring-devtools.properties @@ -0,0 +1 @@ +restart.include.json=/com.alibaba.fastjson.*.jar \ No newline at end of file diff --git a/ebts/ebts-admin/src/main/resources/application-druid.yml b/ebts/ebts-admin/src/main/resources/application-druid.yml new file mode 100644 index 0000000..41b55d8 --- /dev/null +++ b/ebts/ebts-admin/src/main/resources/application-druid.yml @@ -0,0 +1,61 @@ +# 数据源配置 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driverClassName: com.mysql.cj.jdbc.Driver + druid: + # 主库数据源 + master: +# url: jdbc:mysql://114.215.82.135:3306/hcybase?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# username: hcybase +# password: hcybase@2020 + url: jdbc:mysql://13.75.92.40:3306/gen?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# url: jdbc:mysql://10.0.0.4:3306/gen?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: gen + password: zcsbKxPseM8LhFdT + # 从库数据源 + slave: + # 从数据源开关/默认关闭 + enabled: false + url: + username: + password: + # 初始连接数 + initialSize: 5 + # 最小连接池数量 + minIdle: 10 + # 最大连接池数量 + maxActive: 20 + # 配置获取连接等待超时的时间 + maxWait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + timeBetweenEvictionRunsMillis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + minEvictableIdleTimeMillis: 300000 + # 配置一个连接在池中最大生存的时间,单位是毫秒 + maxEvictableIdleTimeMillis: 900000 + # 配置检测连接是否有效 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + webStatFilter: + enabled: true + statViewServlet: + enabled: true + # 设置白名单,不填则允许所有访问 + allow: + url-pattern: /druid/* + # 控制台管理用户名和密码 + login-username: + login-password: + filter: + stat: + enabled: true + # 慢SQL记录 + log-slow-sql: true + slow-sql-millis: 1000 + merge-sql: true + wall: + config: + multi-statement-allow: true \ No newline at end of file diff --git a/ebts/ebts-admin/src/main/resources/application.yml b/ebts/ebts-admin/src/main/resources/application.yml new file mode 100644 index 0000000..b88e984 --- /dev/null +++ b/ebts/ebts-admin/src/main/resources/application.yml @@ -0,0 +1,148 @@ +# 项目相关配置 +ebts: + # 名称 + name: EBTS + # 版本 + version: 1.0.0 + # 版权年份 + copyrightYear: 2020 + # 实例演示开关 + demoEnabled: false + # 文件路径 示例( Windows配置D:/ebts/uploadPath,Linux配置(宝塔) /www/wwwroot/ebts/uploadPath) +# profile: /www/wwwroot/gen/uploadPath + profile: D:/gen/uploadPath + # 获取ip地址开关 + addressEnabled: true + # 验证码类型 math 数组计算 char 字符验证 + captchaType: math +ftp: + # ftp服务器ip地址 +# ftpAddress: 114.215.82.135 + ftpAddress: 13.75.92.40 + # 端口号 + ftpPort: 21 + # 用户名 +# ftpUsername: hcyftp + ftpUsername: genfile + # 密码 +# ftpPassword: hcyftp@2020 + ftpPassword: xanTPWM7jC4XpcWx + # 字符集编码 + encoding: UTF-8 + # 资源域名末尾以/结尾 + resources: https://download.odliken.top + #后端部署域名 + apiurl: https://apig.odliken.top + # 公开目录 + pubfiles: pubfiles + # 保护目录 + prifiles: prifiles + + + +# 开发环境配置 +server: + # 服务器的HTTP端口,默认为8085 + port: 8085 + servlet: + # 应用的访问路径 + context-path: /dev-api + tomcat: + # tomcat的URI编码 + uri-encoding: UTF-8 + # tomcat最大线程数,默认为200 + max-threads: 800 + # Tomcat启动初始化的线程数,默认值25 + min-spare-threads: 30 + +# 日志配置 +logging: + level: + com.ebts: debug + org.springframework: warn +# com.ebts: error +# org.springframework: error + +# Spring配置 +spring: + # 资源信息 + messages: + # 国际化资源文件路径 + basename: i18n/messages + profiles: + active: druid + # 文件上传 + servlet: + multipart: + # 单个文件大小 + max-file-size: 10MB + # 设置总上传的文件大小 + max-request-size: 20MB + # 服务模块 + devtools: + restart: + # 热部署开关 + enabled: true + # redis 配置 + redis: + # 地址 +# host: 114.215.82.135 +# host: 127.0.0.1 + host: 13.70.28.14 + # 端口,默认为6379 + port: 6379 + # 密码 + password: 926425 + # 连接超时时间 + timeout: 10s + lettuce: + pool: + # 连接池中的最小空闲连接 + min-idle: 0 + # 连接池中的最大空闲连接 + max-idle: 8 + # 连接池的最大数据库连接数 + max-active: 8 + # #连接池最大阻塞等待时间(使用负值表示没有限制) + max-wait: -1ms + +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: hcy@2020 + # 令牌有效期(默认30分钟) + expireTime: 30 + +# MyBatis配置 +mybatis: + # 搜索指定包别名 + typeAliasesPackage: com.ebts.**.entity + # 配置mapper的扫描,找到所有的mapper.xml映射文件 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 加载全局的配置文件 + configLocation: classpath:mybatis/mybatis-config.xml + +# PageHelper分页插件 +pagehelper: + helperDialect: mysql + reasonable: true + supportMethodsArguments: true + params: count=countSql + +# Swagger配置 +swagger: + # 是否开启swagger + enabled: true + # 请求前缀 + pathMapping: / + +# 防止XSS攻击 +xss: + # 过滤开关 + enabled: true + # 排除链接(多个用逗号分隔) + excludes: /system/notice/* + # 匹配链接 + urlPatterns: /system/*,/monitor/*,/tool/* diff --git a/ebts/ebts-admin/src/main/resources/banner.txt b/ebts/ebts-admin/src/main/resources/banner.txt new file mode 100644 index 0000000..9da7dee --- /dev/null +++ b/ebts/ebts-admin/src/main/resources/banner.txt @@ -0,0 +1,2 @@ +Application Version: ${ebts.version} +Spring Boot Version: ${spring-boot.version} \ No newline at end of file diff --git a/ebts/ebts-admin/src/main/resources/generator.yml b/ebts/ebts-admin/src/main/resources/generator.yml new file mode 100644 index 0000000..82bc70b --- /dev/null +++ b/ebts/ebts-admin/src/main/resources/generator.yml @@ -0,0 +1,10 @@ +# 代码生成 +gen: + # 作者 + author: clay + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: com.ebts.test + # 自动去除表前缀,默认是false + autoRemovePre: true + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: sys_,test_,gen_ \ No newline at end of file diff --git a/ebts/ebts-admin/src/main/resources/i18n/messages.properties b/ebts/ebts-admin/src/main/resources/i18n/messages.properties new file mode 100644 index 0000000..d63aa1f --- /dev/null +++ b/ebts/ebts-admin/src/main/resources/i18n/messages.properties @@ -0,0 +1,36 @@ +#错误消息 +not.null=* 必须填写 +user.jcaptcha.error=验证码错误 +user.jcaptcha.expire=验证码已失效 +user.not.exists=用户不存在/密码错误 +user.password.not.match=用户不存在/密码错误 +user.password.retry.limit.count=密码输入错误{0}次 +user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定10分钟 +user.password.delete=对不起,您的账号已被删除 +user.blocked=用户已封禁,请联系管理员 +role.blocked=角色已封禁,请联系管理员 +user.logout.success=退出成功 + +length.not.valid=长度必须在{min}到{max}个字符之间 + +user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 +user.password.not.valid=* 5-50个字符 + +user.email.not.valid=邮箱格式错误 +user.mobile.phone.number.not.valid=手机号格式错误 +user.login.success=登录成功 +user.notfound=请重新登录 +user.forcelogout=管理员强制退出,请重新登录 +user.unknown.error=未知错误,请重新登录 + +##文件上传消息 +upload.exceed.maxSize=上传的文件大小超出限制的文件大小!
允许的文件最大大小是:{0}MB! +upload.filename.exceed.length=上传的文件名最长{0}个字符 + +##权限 +no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] +no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] +no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] +no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] +no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] +no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] diff --git a/ebts/ebts-admin/src/main/resources/logback.xml b/ebts/ebts-admin/src/main/resources/logback.xml new file mode 100644 index 0000000..593ddbf --- /dev/null +++ b/ebts/ebts-admin/src/main/resources/logback.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ebts/ebts-admin/src/main/resources/logbackpro.xml b/ebts/ebts-admin/src/main/resources/logbackpro.xml new file mode 100644 index 0000000..e88ad51 --- /dev/null +++ b/ebts/ebts-admin/src/main/resources/logbackpro.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ebts/ebts-admin/src/main/resources/mybatis/mybatis-config.xml b/ebts/ebts-admin/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 0000000..a5241ec --- /dev/null +++ b/ebts/ebts-admin/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/ebts/ebts-common/pom.xml b/ebts/ebts-common/pom.xml new file mode 100644 index 0000000..d300c67 --- /dev/null +++ b/ebts/ebts-common/pom.xml @@ -0,0 +1,155 @@ + + + + ebts + com.ebts + 1.0.0 + + 4.0.0 + + ebts-common + + + common通用工具 + + + + + + + commons-net + commons-net + 3.7 + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.springframework.boot + spring-boot-starter-security + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + + javax.validation + validation-api + + + + + org.apache.commons + commons-lang3 + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.alibaba + fastjson + + + + + commons-io + commons-io + + + + + commons-fileupload + commons-fileupload + + + + + org.apache.poi + poi-ooxml + + + + + org.yaml + snakeyaml + + + + + io.jsonwebtoken + jjwt + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.apache.commons + commons-pool2 + + + + + eu.bitwalker + UserAgentUtils + + + + + javax.servlet + javax.servlet-api + + + + io.springfox + springfox-swagger2 + + + + + io.swagger + swagger-annotations + 1.5.21 + + + + io.swagger + swagger-models + 1.5.21 + + + + + io.springfox + springfox-swagger-ui + + + + + \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/annotation/DataScope.java b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/DataScope.java new file mode 100644 index 0000000..9843e64 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/DataScope.java @@ -0,0 +1,27 @@ +package com.ebts.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 数据权限过滤注解 + * + * @author binlin + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScope { + /** + * 部门表的别名 + */ + public String deptAlias() default ""; + + /** + * 用户表的别名 + */ + public String userAlias() default ""; +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/annotation/DataSource.java b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/DataSource.java new file mode 100644 index 0000000..dc5b6df --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/DataSource.java @@ -0,0 +1,28 @@ +package com.ebts.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import com.ebts.common.enums.DataSourceType; + +/** + * 自定义多数据源切换注解 + *

+ * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准 + * + * @author binlin + */ +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface DataSource { + /** + * 切换数据源名称 + */ + public DataSourceType value() default DataSourceType.MASTER; +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/annotation/Excel.java b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/Excel.java new file mode 100644 index 0000000..53fea21 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/Excel.java @@ -0,0 +1,139 @@ +package com.ebts.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.math.BigDecimal; + +/** + * 自定义导出Excel数据注解 + * + * @author binlin + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel { + /** + * 导出时在excel中排序 + */ +// public int sort() default Integer.MAX_VALUE; + public int sort() default 1; + + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + public String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + public String separator() default ","; + + /** + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) + */ + public int scale() default -1; + + /** + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 导出类型(0数字 1字符串) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出时在excel中每个列的高度 单位为字符 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽 单位为字符 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 是否自动统计数据,在最后追加一行统计数据总和 + */ + public boolean isStatistics() default false; + + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) { + this.value = value; + } + + public int value() { + return this.value; + } + } + + public enum ColumnType { + NUMERIC(0), STRING(1); + private final int value; + + ColumnType(int value) { + this.value = value; + } + + public int value() { + return this.value; + } + } +} \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/annotation/Excels.java b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/Excels.java new file mode 100644 index 0000000..f3e7c9e --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/Excels.java @@ -0,0 +1,17 @@ +package com.ebts.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + * @author binlin + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels { + Excel[] value(); +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/annotation/Log.java b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/Log.java new file mode 100644 index 0000000..0c6d6bd --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/Log.java @@ -0,0 +1,40 @@ +package com.ebts.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import com.ebts.common.enums.BusinessType; +import com.ebts.common.enums.OperatorType; + +/** + * 自定义操作日志记录注解 + * + * @author binlin + */ +@Target({ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log { + /** + * 模块 + */ + public String title() default ""; + + /** + * 功能 + */ + public BusinessType businessType() default BusinessType.OTHER; + + /** + * 操作人类别 + */ + public OperatorType operatorType() default OperatorType.MANAGE; + + /** + * 是否保存请求的参数 + */ + public boolean isSaveRequestData() default true; +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/annotation/RepeatSubmit.java b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/RepeatSubmit.java new file mode 100644 index 0000000..22fcf83 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/annotation/RepeatSubmit.java @@ -0,0 +1,21 @@ +package com.ebts.common.annotation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义注解防止表单重复提交 + * + * @author binlin + */ +@Inherited +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RepeatSubmit { + +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/config/EBTSConfig.java b/ebts/ebts-common/src/main/java/com/ebts/common/config/EBTSConfig.java new file mode 100644 index 0000000..4f7a515 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/config/EBTSConfig.java @@ -0,0 +1,113 @@ +package com.ebts.common.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 读取项目相关配置 + * + * @author binlin + */ +@Component +@ConfigurationProperties(prefix = "ebts") +public class EBTSConfig { + /** + * 项目名称 + */ + 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; + } + + public void setProfile(String profile) { + EBTSConfig.profile = profile; + } + + public static boolean isAddressEnabled() { + return addressEnabled; + } + + public void setAddressEnabled(boolean addressEnabled) { + EBTSConfig.addressEnabled = addressEnabled; + } + + + /** + * 获取头像上传路径 + */ + public static String getAvatarPath() { + return getProfile() + "/avatar"; + } + + /** + * 获取下载路径 + */ + public static String getDownloadPath() { + return getProfile() + "/download/"; + } + + /** + * 获取上传路径 + */ + public static String getUploadPath() { + return getProfile() + "/upload"; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/constant/Constants.java b/ebts/ebts-common/src/main/java/com/ebts/common/constant/Constants.java new file mode 100644 index 0000000..dabfc48 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/constant/Constants.java @@ -0,0 +1,128 @@ +package com.ebts.common.constant; + +/** + * 通用常量信息 + * + * @author binlin + */ +public class Constants { + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + public static final String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + public static final String FAIL = "1"; + + /** + * 登录成功 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + public static final String LOGOUT = "Logout"; + + /** + * 登录失败 + */ + 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:"; + + /** + * 验证码有效期(分钟) + */ + public static final Integer CAPTCHA_EXPIRATION = 2; + + /** + * 令牌 + */ + public static final String TOKEN = "token"; + + /** + * 令牌前缀 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + /** + * 令牌前缀 + */ + public static final String LOGIN_USER_KEY = "login_user_key"; + + /** + * 用户ID + */ + public static final String JWT_USERID = "userid"; + + /** + * 用户名称 + */ + public static final String JWT_USERNAME = "sub"; + + /** + * 用户头像 + */ + public static final String JWT_AVATAR = "avatar"; + + /** + * 创建时间 + */ + public static final String JWT_CREATED = "created"; + + /** + * 用户权限 + */ + public static final String JWT_AUTHORITIES = "authorities"; + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile"; +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/constant/GenConstants.java b/ebts/ebts-common/src/main/java/com/ebts/common/constant/GenConstants.java new file mode 100644 index 0000000..904a378 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/constant/GenConstants.java @@ -0,0 +1,195 @@ +package com.ebts.common.constant; + +/** + * 代码生成通用常量 + * + * @author binlin + */ +public class GenConstants { + /** + * 单表(增删改查) + */ + public static final String TPL_CRUD = "crud"; + + /** + * 树表(增删改查) + */ + public static final String TPL_TREE = "tree"; + + /** + * 主子表(增删改查) + */ + public static final String TPL_SUB = "sub"; + + /** + * 关联查询(增删改查) + */ + public static final String TPL_ASS = "ass"; + + /** + * 树编码字段 + */ + public static final String TREE_CODE = "treeCode"; + + /** + * 树父编码字段 + */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** + * 树名称字段 + */ + public static final String TREE_NAME = "treeName"; + + /** + * 上级菜单ID字段 + */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** + * 上级菜单名称字段 + */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** + * 数据库字符串类型 + */ + public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2", "tinytext", "text", + "mediumtext", "longtext"}; + + /** + * 数据库文本类型 + */ + public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; + + /** + * 数据库时间类型 + */ + public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"}; + + /** + * 数据库数字类型 + */ + public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "float", "double", "decimal"}; + + /** + * 页面不需要编辑字段 + */ + public static final String[] COLUMNNAME_NOT_EDIT = {"id", "create_by", "create_time", "del_flag"}; + + /** + * 页面不需要显示的列表字段 + */ + public static final String[] COLUMNNAME_NOT_LIST = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time"}; + + /** + * 页面不需要查询字段 + */ + public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark"}; + + /** + * Entity基类字段 + */ + public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime", "remark"}; + + /** + * Tree基类字段 + */ + public static final String[] TREE_ENTITY = {"parentName", "parentId", "orderNum", "ancestors", "children"}; + + /** + * 文本框 + */ + public static final String HTML_INPUT = "input"; + + /** + * 文本域 + */ + public static final String HTML_TEXTAREA = "textarea"; + + /** + * 下拉框 + */ + public static final String HTML_SELECT = "select"; + + /** + * 单选框 + */ + public static final String HTML_RADIO = "radio"; + + /** + * 复选框 + */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** + * 日期控件 + */ + public static final String HTML_DATETIME = "datetime"; + + /** + * 图片上传控件 + */ + public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** + * 文件上传控件 + */ + public static final String HTML_FILE_UPLOAD = "fileUpload"; + + /** + * 富文本控件 + */ + public static final String HTML_EDITOR = "editor"; + + /** + * 字符串类型 + */ + public static final String TYPE_STRING = "String"; + + /** + * 整型 + */ + public static final String TYPE_INTEGER = "Integer"; + + /** + * 长整型 + */ + public static final String TYPE_LONG = "Long"; + + /** + * 浮点型 + */ + public static final String TYPE_DOUBLE = "Double"; + + /** + * 高精度计算类型 + */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** + * 时间类型 + */ + public static final String TYPE_DATE = "Date"; + + /** + * 模糊查询 + */ + public static final String QUERY_LIKE = "LIKE"; + /** + * 精确查询 + */ + public static final String QUERY_EQ = "EQ"; + + /** + * 需要 + */ + public static final String REQUIRE = "1"; + /** + * 不需要 + */ + public static final String NO_REQUIRE = "0"; +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/constant/HttpStatus.java b/ebts/ebts-common/src/main/java/com/ebts/common/constant/HttpStatus.java new file mode 100644 index 0000000..edf7482 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/constant/HttpStatus.java @@ -0,0 +1,93 @@ +package com.ebts.common.constant; + +/** + * 返回状态码 + * + * @author binlin + */ +public class HttpStatus { + /** + * 操作成功 + */ + public static final int SUCCESS = 200; + + /** + * 操作成功 + */ + public static final int NO_DATA = 199; + + /** + * 对象创建成功 + */ + public static final int CREATED = 201; + + /** + * 请求已经被接受 + */ + public static final int ACCEPTED = 202; + + /** + * 操作已经执行成功,但是没有返回数据 + */ + public static final int NO_CONTENT = 204; + + /** + * 资源已被移除 + */ + public static final int MOVED_PERM = 301; + + /** + * 重定向 + */ + public static final int SEE_OTHER = 303; + + /** + * 资源没有被修改 + */ + public static final int NOT_MODIFIED = 304; + + /** + * 参数列表错误(缺少,格式不匹配) + */ + public static final int BAD_REQUEST = 400; + + /** + * 未授权 + */ + public static final int UNAUTHORIZED = 401; + + /** + * 访问受限,授权过期 + */ + public static final int FORBIDDEN = 403; + + /** + * 资源,服务未找到 + */ + public static final int NOT_FOUND = 404; + + /** + * 不允许的http方法 + */ + public static final int BAD_METHOD = 405; + + /** + * 资源冲突,或者资源被锁 + */ + public static final int CONFLICT = 409; + + /** + * 不支持的数据,媒体类型 + */ + public static final int UNSUPPORTED_TYPE = 415; + + /** + * 系统内部错误 + */ + public static final int ERROR = 500; + + /** + * 接口未实现 + */ + public static final int NOT_IMPLEMENTED = 501; +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/constant/ReturnConstants.java b/ebts/ebts-common/src/main/java/com/ebts/common/constant/ReturnConstants.java new file mode 100644 index 0000000..93c17cb --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/constant/ReturnConstants.java @@ -0,0 +1,29 @@ +package com.ebts.common.constant; + +public class ReturnConstants { + /** + * 系统错误 + */ + public static final String SYS_ERROR = "系统错误!"; + + /** + * 查询结果为空 + */ + public static final String RESULT_EMPTY = "查询结果为空!"; + /** + * 数据库异常 + */ + public static final String DB_EX = "数据库异常!"; + /** + * 操作失败 + */ + public static final String SYS_FAILL = "数据库异常!"; + /** + * 接口为空 + */ + public static final String INTER_NULL = "该类下接口数据为空,请先添加接口!"; + + public static final String STATE_ERROR = "状态错错误!"; + + public static final String OP_ERROR = "操作失败!"; +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/constant/ScheduleConstants.java b/ebts/ebts-common/src/main/java/com/ebts/common/constant/ScheduleConstants.java new file mode 100644 index 0000000..089c7b7 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/constant/ScheduleConstants.java @@ -0,0 +1,56 @@ +package com.ebts.common.constant; + +/** + * 任务调度通用常量 + * + * @author binlin + */ +public class ScheduleConstants { + public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; + + /** + * 执行目标key + */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + + /** + * 默认 + */ + public static final String MISFIRE_DEFAULT = "0"; + + /** + * 立即触发执行 + */ + public static final String MISFIRE_IGNORE_MISFIRES = "1"; + + /** + * 触发一次执行 + */ + public static final String MISFIRE_FIRE_AND_PROCEED = "2"; + + /** + * 不触发立即执行 + */ + public static final String MISFIRE_DO_NOTHING = "3"; + + public enum Status { + /** + * 正常 + */ + NORMAL("0"), + /** + * 暂停 + */ + PAUSE("1"); + + private String value; + + private Status(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/constant/UserConstants.java b/ebts/ebts-common/src/main/java/com/ebts/common/constant/UserConstants.java new file mode 100644 index 0000000..da627f7 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/constant/UserConstants.java @@ -0,0 +1,89 @@ +package com.ebts.common.constant; + +/** + * 用户常量信息 + * + * @author binlin + */ +public class UserConstants { + /** + * 平台内系统用户的唯一标志 + */ + public static final String SYS_USER = "SYS_USER"; + + /** + * 正常状态 + */ + public static final String NORMAL = "0"; + + /** + * 异常状态 + */ + public static final String EXCEPTION = "1"; + + /** + * 用户封禁状态 + */ + public static final String USER_DISABLE = "1"; + + /** + * 角色封禁状态 + */ + public static final String ROLE_DISABLE = "1"; + + /** + * 部门正常状态 + */ + public static final String DEPT_NORMAL = "0"; + + /** + * 部门停用状态 + */ + public static final String DEPT_DISABLE = "1"; + + /** + * 字典正常状态 + */ + public static final String DICT_NORMAL = "0"; + + /** + * 是否为系统默认(是) + */ + public static final String YES = "Y"; + + /** + * 是否菜单外链(是) + */ + public static final String YES_FRAME = "0"; + + /** + * 是否菜单外链(否) + */ + public static final String NO_FRAME = "1"; + + /** + * 菜单类型(目录) + */ + public static final String TYPE_DIR = "M"; + + /** + * 菜单类型(菜单) + */ + public static final String TYPE_MENU = "C"; + + /** + * 菜单类型(按钮) + */ + public static final String TYPE_BUTTON = "F"; + + /** + * Layout组件标识 + */ + public final static String LAYOUT = "Layout"; + + /** + * 校验返回结果码 + */ + public final static String UNIQUE = "0"; + public final static String NOT_UNIQUE = "1"; +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/controller/BaseController.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/controller/BaseController.java new file mode 100644 index 0000000..5d3f785 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/controller/BaseController.java @@ -0,0 +1,87 @@ +package com.ebts.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.ebts.common.constant.HttpStatus; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.page.PageDomain; +import com.ebts.common.core.page.TableDataInfo; +import com.ebts.common.core.page.TableSupport; +import com.ebts.common.utils.DateUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.sql.SqlUtil; + +/** + * web层通用数据处理 + * + * @author binlin + */ +public class BaseController { + protected final Logger log = LoggerFactory.getLogger(BaseController.class); + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { + @Override + public void setAsText(String text) { + setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 设置请求分页数据 + */ + protected void 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()); + PageHelper.startPage(pageNum, pageSize, orderBy); + } + } + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + protected TableDataInfo getDataTable(List list) { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected AjaxResult toAjax(int rows) { + return rows > 0 ? AjaxResult.success() : AjaxResult.error(); + } + + /** + * 页面跳转 + */ + public String redirect(String url) { + System.out.println(StringUtils.format("redirect:{}", url)); + return StringUtils.format("redirect:{}", url); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/controller/EBTSController.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/controller/EBTSController.java new file mode 100644 index 0000000..f5d897a --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/controller/EBTSController.java @@ -0,0 +1,95 @@ +package com.ebts.common.core.controller; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ebts.common.constant.HttpStatus; +import com.ebts.common.core.page.PageDomain; +import com.ebts.common.core.page.TableDataInfo; +import com.ebts.common.core.page.TableSupport; +import com.ebts.common.utils.DateUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.sql.SqlUtil; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import java.beans.PropertyEditorSupport; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class EBTSController { + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { + @Override + public void setAsText(String text) { + setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 设置请求分页数据 + */ + protected void 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()); + PageHelper.startPage(pageNum, pageSize, orderBy); + } + } + + /** + * 设置请求分页数据 + */ + public void startPage(Map map) { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = (Integer) map.get("pageNum"); + Integer pageSize = (Integer) map.get("pageSize"); + if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + PageHelper.startPage(pageNum, pageSize, orderBy); + } + } + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + protected TableDataInfo getDataTable(List list) { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + + +// /** +// * 响应返回结果 +// * +// * @param rows 影响行数 +// * @return 操作结果 +// */ +// protected AjaxResult toAjax(int rows) +// { +// return rows > 0 ? AjaxResult.success() : AjaxResult.error(); +// } + + /** + * 页面跳转 + */ + public String redirect(String url) { + return StringUtils.format("redirect:{}", url); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/AjaxResult.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/AjaxResult.java new file mode 100644 index 0000000..b101df7 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/AjaxResult.java @@ -0,0 +1,152 @@ +package com.ebts.common.core.entity; + +import java.util.HashMap; + +import com.ebts.common.constant.HttpStatus; +import com.ebts.common.utils.StringUtils; + +/** + * 操作消息提醒 + * + * @author binlin + */ +public class AjaxResult extends HashMap { + + + /** + * 状态码 + */ + public static final String CODE_TAG = "code"; + + /** + * 返回内容 + */ + public static final String MSG_TAG = "msg"; + + /** + * 数据对象 + */ + public static final String DATA_TAG = "data"; + + /** + * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 + */ + public AjaxResult() { + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + */ + public AjaxResult(int code, String msg) { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + } + + /** + * 初始化一个新创建的 AjaxResult 对象 + * + * @param code 状态码 + * @param msg 返回内容 + * @param data 数据对象 + */ + public AjaxResult(int code, String msg, Object data) { + super.put(CODE_TAG, code); + super.put(MSG_TAG, msg); + if (StringUtils.isNotNull(data)) { + super.put(DATA_TAG, data); + } + } + + /** + * 返回成功消息 + * + * @return 成功消息 + */ + public static AjaxResult success() { + return AjaxResult.success("操作成功"); + } + + /** + * 返回成功数据 + * + * @return 成功消息 + */ + public static AjaxResult success(Object data) { + return AjaxResult.success("操作成功", data); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @return 成功消息 + */ + public static AjaxResult success(String msg) { + return AjaxResult.success(msg, null); + } + + /** + * 返回成功消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 成功消息 + */ + public static AjaxResult success(String msg, Object data) { + return new AjaxResult(HttpStatus.SUCCESS, msg, data); + } + + /** + * 返回错误消息 + * + * @return + */ + public static AjaxResult error() { + return AjaxResult.error("操作失败"); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult error(String msg) { + return AjaxResult.error(msg, null); + } + + /** + * 返回错误消息 + * + * @param msg 返回内容 + * @param data 数据对象 + * @return 警告消息 + */ + public static AjaxResult error(String msg, Object data) { + return new AjaxResult(HttpStatus.ERROR, msg, data); + } + + /** + * 返回错误消息 + * + * @param code 状态码 + * @param msg 返回内容 + * @return 警告消息 + */ + public static AjaxResult error(int code, String msg) { + return new AjaxResult(code, msg, null); + } + + /** + * 返回提示信息 + * + * @param msg 返回内容 + * @return 提示消息 + */ + public static AjaxResult info(String msg) { + return new AjaxResult(HttpStatus.NO_DATA, msg, null); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/BaseEntity.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/BaseEntity.java new file mode 100644 index 0000000..1dce213 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/BaseEntity.java @@ -0,0 +1,145 @@ +package com.ebts.common.core.entity; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.ebts.common.annotation.Excel; + +/** + * Entity基类 + * + * @author binlin + */ +public class BaseEntity implements Serializable { + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建时间 + */ + @Excel(name = "创建时间", dateFormat = "yyyy-MM-dd HH:mm:ss", sort = Integer.MAX_VALUE - 1) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新者 + */ + private Long updateBy; + + /** + * 更新时间 + */ + @Excel(name = "更新时间", dateFormat = "yyyy-MM-dd HH:mm:ss", sort = Integer.MAX_VALUE) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 备注 + */ + private String remark; + + /** + * 开始时间 + */ + @JsonIgnore + private String beginTime; + + /** + * 结束时间 + */ + @JsonIgnore + private String endTime; + + + private Map pageInfo; + /** + * 请求参数 + */ + private Map params; + + public Date getCreateTime() { + return createTime; + } + + public Long getCreateBy() { + return createBy; + } + + public void setCreateBy(Long createBy) { + this.createBy = createBy; + } + + public Long getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(Long updateBy) { + this.updateBy = updateBy; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getBeginTime() { + return beginTime; + } + + public void setBeginTime(String beginTime) { + this.beginTime = beginTime; + } + + public String getEndTime() { + return endTime; + } + + public void setEndTime(String endTime) { + this.endTime = endTime; + } + + + public Map getPageInfo() { + if (pageInfo == null){ + pageInfo = new HashMap<>(); + } + return pageInfo; + } + + public void setPageInfo(Map pageInfo) { + this.pageInfo = pageInfo; + } + + public Map getParams() { + if (params == null) { + params = new HashMap<>(); + } + return params; + } + + public void setParams(Map params) { + this.params = params; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/TreeEntity.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/TreeEntity.java new file mode 100644 index 0000000..cd7878a --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/TreeEntity.java @@ -0,0 +1,78 @@ +package com.ebts.common.core.entity; + +import java.util.ArrayList; +import java.util.List; + +/** + * Tree基类 + * + * @author binlin + */ +public class TreeEntity extends BaseEntity { + + + /** + * 父菜单名称 + */ + private String parentName; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 子部门 + */ + private List children = new ArrayList<>(); + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + public String getAncestors() { + return ancestors; + } + + public void setAncestors(String ancestors) { + this.ancestors = ancestors; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/TreeSelect.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/TreeSelect.java new file mode 100644 index 0000000..8cc52b6 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/TreeSelect.java @@ -0,0 +1,74 @@ +package com.ebts.common.core.entity; + +import java.io.Serializable; +import java.util.List; +import java.util.stream.Collectors; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.ebts.common.core.entity.entity.Dept; +import com.ebts.common.core.entity.entity.Menu; + +/** + * Treeselect树结构实体类 + * + * @author binlin + */ +public class TreeSelect implements Serializable { + + + /** + * 节点ID + */ + private Long id; + + /** + * 节点名称 + */ + private String label; + + /** + * 子节点 + */ + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List children; + + public TreeSelect() { + + } + + public TreeSelect(Dept dept) { + this.id = dept.getDeptId(); + this.label = dept.getDeptName(); + this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public TreeSelect(Menu menu) { + this.id = menu.getMenuId(); + this.label = menu.getMenuName(); + this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList()); + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Dept.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Dept.java new file mode 100644 index 0000000..dfdf112 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Dept.java @@ -0,0 +1,202 @@ +package com.ebts.common.core.entity.entity; + +import java.util.ArrayList; +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.ebts.common.core.entity.BaseEntity; + +/** + * 部门表 sys_dept + * + * @author binlin + */ +public class Dept extends BaseEntity { + + + /** + * 部门ID + */ + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 显示顺序 + */ + private String orderNum; + + /** + * 负责人 + */ + private String leader; + + /** + * 联系电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 部门状态:0正常,1停用 + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + private String delFlag; + + /** + * 父部门名称 + */ + private String parentName; + + /** + * 子部门 + */ + private List children = new ArrayList(); + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + public String getAncestors() { + return ancestors; + } + + public void setAncestors(String ancestors) { + this.ancestors = ancestors; + } + + @NotBlank(message = "部门名称不能为空") + @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符") + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + @NotBlank(message = "显示顺序不能为空") + public String getOrderNum() { + return orderNum; + } + + public void setOrderNum(String orderNum) { + this.orderNum = orderNum; + } + + public String getLeader() { + return leader; + } + + public void setLeader(String leader) { + this.leader = leader; + } + + @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符") + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("deptId", getDeptId()) + .append("parentId", getParentId()) + .append("ancestors", getAncestors()) + .append("deptName", getDeptName()) + .append("orderNum", getOrderNum()) + .append("leader", getLeader()) + .append("phone", getPhone()) + .append("email", getEmail()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/DictData.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/DictData.java new file mode 100644 index 0000000..24e1bc5 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/DictData.java @@ -0,0 +1,175 @@ +package com.ebts.common.core.entity.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.ebts.common.annotation.Excel; +import com.ebts.common.annotation.Excel.ColumnType; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.entity.BaseEntity; + +/** + * 字典数据表 sys_dict_data + * + * @author binlin + */ +public class DictData extends BaseEntity { + + + /** + * 字典编码 + */ + @Excel(name = "字典编码", cellType = ColumnType.NUMERIC) + private Long dictCode; + + /** + * 字典排序 + */ + @Excel(name = "字典排序", cellType = ColumnType.NUMERIC) + private Long dictSort; + + /** + * 字典标签 + */ + @Excel(name = "字典标签") + private String dictLabel; + + /** + * 字典键值 + */ + @Excel(name = "字典键值") + private String dictValue; + + /** + * 字典类型 + */ + @Excel(name = "字典类型") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格字典样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + @Excel(name = "是否默认", readConverterExp = "Y=是,N=否") + private String isDefault; + + /** + * 状态(0正常 1停用) + */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + public Long getDictCode() { + return dictCode; + } + + public void setDictCode(Long dictCode) { + this.dictCode = dictCode; + } + + public Long getDictSort() { + return dictSort; + } + + public void setDictSort(Long dictSort) { + this.dictSort = dictSort; + } + + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") + public String getDictLabel() { + return dictLabel; + } + + public void setDictLabel(String dictLabel) { + this.dictLabel = dictLabel; + } + + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") + public String getDictValue() { + return dictValue; + } + + public void setDictValue(String dictValue) { + this.dictValue = dictValue; + } + + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") + public String getDictType() { + return dictType; + } + + public void setDictType(String dictType) { + this.dictType = dictType; + } + + @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") + public String getCssClass() { + return cssClass; + } + + public void setCssClass(String cssClass) { + this.cssClass = cssClass; + } + + public String getListClass() { + return listClass; + } + + public void setListClass(String listClass) { + this.listClass = listClass; + } + + public boolean getDefault() { + return UserConstants.YES.equals(this.isDefault) ? true : false; + } + + public String getIsDefault() { + return isDefault; + } + + public void setIsDefault(String isDefault) { + this.isDefault = isDefault; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("dictCode", getDictCode()) + .append("dictSort", getDictSort()) + .append("dictLabel", getDictLabel()) + .append("dictValue", getDictValue()) + .append("dictType", getDictType()) + .append("cssClass", getCssClass()) + .append("listClass", getListClass()) + .append("isDefault", getIsDefault()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/DictType.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/DictType.java new file mode 100644 index 0000000..5c8c5f5 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/DictType.java @@ -0,0 +1,94 @@ +package com.ebts.common.core.entity.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.ebts.common.annotation.Excel; +import com.ebts.common.annotation.Excel.ColumnType; +import com.ebts.common.core.entity.BaseEntity; + +/** + * 字典类型表 sys_dict_type + * + * @author binlin + */ +public class DictType extends BaseEntity { + + + /** + * 字典主键 + */ + @Excel(name = "字典主键", cellType = ColumnType.NUMERIC) + private Long dictId; + + /** + * 字典名称 + */ + @Excel(name = "字典名称") + private String dictName; + + /** + * 字典类型 + */ + @Excel(name = "字典类型") + private String dictType; + + /** + * 状态(0正常 1停用) + */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + public Long getDictId() { + return dictId; + } + + public void setDictId(Long dictId) { + this.dictId = dictId; + } + + @NotBlank(message = "字典名称不能为空") + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") + public String getDictName() { + return dictName; + } + + public void setDictName(String dictName) { + this.dictName = dictName; + } + + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") + public String getDictType() { + return dictType; + } + + public void setDictType(String dictType) { + this.dictType = dictType; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("dictId", getDictId()) + .append("dictName", getDictName()) + .append("dictType", getDictType()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Menu.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Menu.java new file mode 100644 index 0000000..612fefa --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Menu.java @@ -0,0 +1,263 @@ +package com.ebts.common.core.entity.entity; + +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.ebts.common.core.entity.BaseEntity; + +/** + * 菜单权限表 sys_menu + * + * @author binlin + */ +public class Menu extends BaseEntity { + + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 父菜单名称 + */ + private String parentName; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + private String orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0显示 1隐藏) + */ + private String status; + + /** + * 权限字符串 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 子菜单 + */ + private List

children = new ArrayList(); + + public Menu() { + } + + public Menu(Long uqId, String uqName, Long create) { + parentId = 6L; + menuName = uqName; + orderNum = "0"; + path = "data/" + uqId; + component = "system/query/queryDate"; + isFrame = "1"; + isCache = "0"; + menuType = "C"; + visible = "0"; + status = "0"; + icon = "chart"; + setCreateBy(create); + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") + public String getMenuName() { + return menuName; + } + + public void setMenuName(String menuName) { + this.menuName = menuName; + } + + public String getParentName() { + return parentName; + } + + public void setParentName(String parentName) { + this.parentName = parentName; + } + + public Long getParentId() { + return parentId; + } + + public void setParentId(Long parentId) { + this.parentId = parentId; + } + + @NotBlank(message = "显示顺序不能为空") + public String getOrderNum() { + return orderNum; + } + + public void setOrderNum(String orderNum) { + this.orderNum = orderNum; + } + + @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public String getIsFrame() { + return isFrame; + } + + public void setIsFrame(String isFrame) { + this.isFrame = isFrame; + } + + public String getIsCache() { + return isCache; + } + + public void setIsCache(String isCache) { + this.isCache = isCache; + } + + @NotBlank(message = "菜单类型不能为空") + public String getMenuType() { + return menuType; + } + + public void setMenuType(String menuType) { + this.menuType = menuType; + } + + public String getVisible() { + return visible; + } + + public void setVisible(String visible) { + this.visible = visible; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") + public String getPerms() { + return perms; + } + + public void setPerms(String perms) { + this.perms = perms; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("menuId", getMenuId()) + .append("menuName", getMenuName()) + .append("parentId", getParentId()) + .append("orderNum", getOrderNum()) + .append("path", getPath()) + .append("component", getComponent()) + .append("isFrame", getIsFrame()) + .append("IsCache", getIsCache()) + .append("menuType", getMenuType()) + .append("visible", getVisible()) + .append("status ", getStatus()) + .append("perms", getPerms()) + .append("icon", getIcon()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Role.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Role.java new file mode 100644 index 0000000..f6c0212 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/Role.java @@ -0,0 +1,235 @@ +package com.ebts.common.core.entity.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.ebts.common.annotation.Excel; +import com.ebts.common.annotation.Excel.ColumnType; +import com.ebts.common.core.entity.BaseEntity; + +/** + * 角色表 sys_role + * + * @author binlin + */ +public class Role extends BaseEntity { + + + /** + * 角色ID + */ + @Excel(name = "角色序号", cellType = ColumnType.NUMERIC) + private Long roleId; + + /** + * 角色名称 + */ + @Excel(name = "角色名称") + private String roleName; + + /** + * 角色权限 + */ + @Excel(name = "角色权限") + private String roleKey; + + /** + * 角色排序 + */ + @Excel(name = "角色排序") + private String roleSort; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限) + */ + @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限") + private String dataScope; + + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) + */ + private boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + private String delFlag; + + /** + * 用户是否存在此角色标识 默认不存在 + */ + private boolean flag = false; + + /** + * 菜单组 + */ + private Long[] menuIds; + + /** + * 部门组(数据权限) + */ + private Long[] deptIds; + + private Integer roleType = 0; + + public Role() { + } + + public Role(Integer roleType) { + this.roleType = roleType; + } + + public Integer getRoleType() { + return roleType; + } + + public void setRoleType(Integer roleType) { + this.roleType = roleType; + } + + public Role(Long roleId) { + this.roleId = roleId; + } + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public boolean isAdmin() { + 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() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + @NotBlank(message = "权限字符不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") + public String getRoleKey() { + return roleKey; + } + + public void setRoleKey(String roleKey) { + this.roleKey = roleKey; + } + + @NotBlank(message = "显示顺序不能为空") + public String getRoleSort() { + return roleSort; + } + + public void setRoleSort(String roleSort) { + this.roleSort = roleSort; + } + + public String getDataScope() { + return dataScope; + } + + public void setDataScope(String dataScope) { + this.dataScope = dataScope; + } + + public boolean isMenuCheckStrictly() { + return menuCheckStrictly; + } + + public void setMenuCheckStrictly(boolean menuCheckStrictly) { + this.menuCheckStrictly = menuCheckStrictly; + } + + public boolean isDeptCheckStrictly() { + return deptCheckStrictly; + } + + public void setDeptCheckStrictly(boolean deptCheckStrictly) { + this.deptCheckStrictly = deptCheckStrictly; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public boolean isFlag() { + return flag; + } + + public void setFlag(boolean flag) { + this.flag = flag; + } + + public Long[] getMenuIds() { + return menuIds; + } + + public void setMenuIds(Long[] menuIds) { + this.menuIds = menuIds; + } + + public Long[] getDeptIds() { + return deptIds; + } + + public void setDeptIds(Long[] deptIds) { + this.deptIds = deptIds; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("roleName", getRoleName()) + .append("roleKey", getRoleKey()) + .append("roleSort", getRoleSort()) + .append("dataScope", getDataScope()) + .append("menuCheckStrictly", isMenuCheckStrictly()) + .append("deptCheckStrictly", isDeptCheckStrictly()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/User.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/User.java new file mode 100644 index 0000000..07d44d4 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/entity/User.java @@ -0,0 +1,324 @@ +package com.ebts.common.core.entity.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.ebts.common.annotation.Excel; +import com.ebts.common.annotation.Excel.ColumnType; +import com.ebts.common.annotation.Excel.Type; +import com.ebts.common.annotation.Excels; +import com.ebts.common.core.entity.BaseEntity; + +/** + * 用户对象 sys_user + * + * @author binlin + */ +public class User extends BaseEntity { + + + /** + * 用户ID + */ + @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号") + private Long userId; + + /** + * 部门ID + */ + @Excel(name = "部门编号", type = Type.IMPORT) + private Long deptId; + + /** + * 用户账号 + */ + @Excel(name = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @Excel(name = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @Excel(name = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @Excel(name = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + private String sex; + + /** + * 用户头像 + */ + private String avatar; + + /** + * 密码 + */ + private String password; + + /** + * 盐加密 + */ + private String salt; + + /** + * 帐号状态(0正常 1停用) + */ + @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + private String delFlag; + + /** + * 最后登录IP + */ + @Excel(name = "最后登录IP", type = Type.EXPORT) + private String loginIp; + + /** + * 最后登录时间 + */ + @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) + private Date loginDate; + + /** + * 部门对象 + */ + @Excels({ + @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), + @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) + }) + private Dept dept; + + /** + * 角色对象 + */ + private List roles; + + /** + * 角色组 + */ + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + public User() { + + } + + public User(Long userId) { + this.userId = userId; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public boolean isAdmin() { + return isAdmin(this.userId); + } + + public static boolean isAdmin(Long userId) { + return userId != null && 1L == userId; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") + public String getPhonenumber() { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) { + this.phonenumber = phonenumber; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + @JsonIgnore + @JsonProperty + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getSalt() { + return salt; + } + + public void setSalt(String salt) { + this.salt = salt; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getDelFlag() { + return delFlag; + } + + public void setDelFlag(String delFlag) { + this.delFlag = delFlag; + } + + public String getLoginIp() { + return loginIp; + } + + public void setLoginIp(String loginIp) { + this.loginIp = loginIp; + } + + public Date getLoginDate() { + return loginDate; + } + + public void setLoginDate(Date loginDate) { + this.loginDate = loginDate; + } + + public Dept getDept() { + return dept; + } + + public void setDept(Dept dept) { + this.dept = dept; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public Long[] getRoleIds() { + return roleIds; + } + + public void setRoleIds(Long[] roleIds) { + this.roleIds = roleIds; + } + + public Long[] getPostIds() { + return postIds; + } + + public void setPostIds(Long[] postIds) { + this.postIds = postIds; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("deptId", getDeptId()) + .append("userName", getUserName()) + .append("nickName", getNickName()) + .append("email", getEmail()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("avatar", getAvatar()) + .append("password", getPassword()) + .append("salt", getSalt()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("dept", getDept()) + .toString(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/model/LoginBody.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/model/LoginBody.java new file mode 100644 index 0000000..16ae201 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/model/LoginBody.java @@ -0,0 +1,60 @@ +package com.ebts.common.core.entity.model; + +/** + * 用户登录对象 + * + * @author binlin + */ +public class LoginBody { + /** + * 用户名 + */ + private String username; + + /** + * 用户密码 + */ + private String password; + + /** + * 验证码 + */ + private String code; + + /** + * 唯一标识 + */ + private String uuid = ""; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/model/LoginUser.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/model/LoginUser.java new file mode 100644 index 0000000..1bb117a --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/entity/model/LoginUser.java @@ -0,0 +1,201 @@ +package com.ebts.common.core.entity.model; + +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.ebts.common.core.entity.entity.User; + +/** + * 登录用户身份权限 + * + * @author binlin + */ +public class LoginUser implements UserDetails { + + + /** + * 用户唯一标识 + */ + private String token; + + /** + * 登录时间 + */ + private Long loginTime; + + /** + * 过期时间 + */ + private Long expireTime; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 权限列表 + */ + private Set permissions; + + /** + * 用户信息 + */ + private User user; + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; + } + + public LoginUser() { + } + + public LoginUser(User user, Set permissions) { + this.user = user; + this.permissions = permissions; + } + + @JsonIgnore + @Override + public String getPassword() { + return user.getPassword(); + } + + @Override + public String getUsername() { + return user.getUserName(); + } + + /** + * 账户是否未过期,过期无法验证 + */ + @JsonIgnore + @Override + public boolean isAccountNonExpired() { + return true; + } + + /** + * 指定用户是否解锁,锁定的用户无法进行身份验证 + * + * @return + */ + @JsonIgnore + @Override + public boolean isAccountNonLocked() { + return true; + } + + /** + * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 + * + * @return + */ + @JsonIgnore + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + /** + * 是否可用 ,禁用的用户不能身份验证 + * + * @return + */ + @JsonIgnore + @Override + public boolean isEnabled() { + return true; + } + + public Long getLoginTime() { + return loginTime; + } + + public void setLoginTime(Long loginTime) { + this.loginTime = loginTime; + } + + public String getIpaddr() { + return ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + + public String getBrowser() { + return browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + public Long getExpireTime() { + return expireTime; + } + + public void setExpireTime(Long expireTime) { + this.expireTime = expireTime; + } + + public Set getPermissions() { + return permissions; + } + + public void setPermissions(Set permissions) { + this.permissions = permissions; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } + + @Override + public Collection getAuthorities() { + return null; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/page/PageDomain.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/page/PageDomain.java new file mode 100644 index 0000000..2ff0459 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/page/PageDomain.java @@ -0,0 +1,69 @@ +package com.ebts.common.core.page; + +import com.ebts.common.utils.StringUtils; + +/** + * 分页数据 + * + * @author binlin + */ +public class PageDomain { + /** + * 当前记录起始索引 + */ + private Integer pageNum; + + /** + * 每页显示记录数 + */ + private Integer pageSize; + + /** + * 排序列 + */ + private String orderByColumn; + + /** + * 排序的方向desc或者asc + */ + private String isAsc = "asc"; + + public String getOrderBy() { + if (StringUtils.isEmpty(orderByColumn)) { + return ""; + } + return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String getOrderByColumn() { + return orderByColumn; + } + + public void setOrderByColumn(String orderByColumn) { + this.orderByColumn = orderByColumn; + } + + public String getIsAsc() { + return isAsc; + } + + public void setIsAsc(String isAsc) { + this.isAsc = isAsc; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/page/TableDataInfo.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/page/TableDataInfo.java new file mode 100644 index 0000000..f1bfbc2 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/page/TableDataInfo.java @@ -0,0 +1,82 @@ +package com.ebts.common.core.page; + +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author binlin + */ +public class TableDataInfo implements Serializable { + + + /** + * 总记录数 + */ + private long total; + + /** + * 列表数据 + */ + private List rows; + + /** + * 消息状态码 + */ + private int code; + + /** + * 消息内容 + */ + private String msg; + + /** + * 表格数据对象 + */ + public TableDataInfo() { + } + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, int total) { + this.rows = list; + this.total = total; + } + + public long getTotal() { + return total; + } + + public void setTotal(long total) { + this.total = total; + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/page/TableSupport.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/page/TableSupport.java new file mode 100644 index 0000000..8e1621d --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/page/TableSupport.java @@ -0,0 +1,46 @@ +package com.ebts.common.core.page; + +import com.ebts.common.utils.ServletUtils; + +/** + * 表格数据处理 + * + * @author binlin + */ +public class TableSupport { + /** + * 当前记录起始索引 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 每页显示记录数 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 排序列 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 排序的方向 "desc" 或者 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 封装分页对象 + */ + public static PageDomain getPageDomain() { + PageDomain pageDomain = new PageDomain(); + 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)); + return pageDomain; + } + + public static PageDomain buildPageRequest() { + return getPageDomain(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/redis/RedisCache.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/redis/RedisCache.java new file mode 100644 index 0000000..48e4ca7 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/redis/RedisCache.java @@ -0,0 +1,210 @@ +package com.ebts.common.core.redis; + +import java.util.Collection; +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.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +/** + * spring redis 工具类 + * + * @author binlin + **/ +@SuppressWarnings(value = {"unchecked", "rawtypes"}) +@Component +public class RedisCache { + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public long deleteObject(final Collection collection) { + return redisTemplate.delete(collection); + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public long setCacheSet(final String key, final Set dataSet) { + Long count = redisTemplate.opsForSet().add(key, dataSet); + return count == null ? 0 : count; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) { + return redisTemplate.keys(pattern); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/text/CharsetKit.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/text/CharsetKit.java new file mode 100644 index 0000000..b1b4eb4 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/text/CharsetKit.java @@ -0,0 +1,91 @@ +package com.ebts.common.core.text; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +import com.ebts.common.utils.StringUtils; + +/** + * 字符集工具类 + * + * @author binlin + */ +public class CharsetKit { + /** + * ISO-8859-1 + */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** + * UTF-8 + */ + public static final String UTF_8 = "UTF-8"; + /** + * GBK + */ + public static final String GBK = "GBK"; + + /** + * ISO-8859-1 + */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** + * UTF-8 + */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** + * GBK + */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, String srcCharset, String destCharset) { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) { + if (null == srcCharset) { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) { + srcCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 系统字符集编码 + */ + public static String systemCharset() { + return Charset.defaultCharset().name(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/text/Convert.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/text/Convert.java new file mode 100644 index 0000000..87e7a1a --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/text/Convert.java @@ -0,0 +1,850 @@ +package com.ebts.common.core.text; + +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.ebts.common.utils.StringUtils; + +/** + * 类型转换器 + * + * @author binlin + */ +public class Convert { + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) { + if (null == value) { + return defaultValue; + } + if (value instanceof String) { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) { + return toStr(value, null); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) { + if (null == value) { + return defaultValue; + } + if (value instanceof Character) { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) { + return toChar(value, null); + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Byte) { + return (Byte) value; + } + if (value instanceof Number) { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Byte.parseByte(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Short) { + return (Short) value; + } + if (value instanceof Number) { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Short.parseShort(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Number) { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return NumberFormat.getInstance().parse(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Integer) { + return (Integer) value; + } + if (value instanceof Number) { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Integer.parseInt(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为int
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) { + if (StringUtils.isEmpty(str)) { + return new Integer[]{}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) { + if (StringUtils.isEmpty(str)) { + return new Long[]{}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) { + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Long) { + return (Long) value; + } + if (value instanceof Number) { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为long
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Double) { + return (Double) value; + } + if (value instanceof Number) { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Float) { + return (Float) value; + } + if (value instanceof Number) { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Float.parseFloat(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Boolean) { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) { + case "true": + return true; + case "false": + return false; + case "yes": + return true; + case "ok": + return true; + case "no": + return false; + case "1": + return true; + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) { + if (value == null) { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Enum.valueOf(clazz, valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof BigInteger) { + return (BigInteger) value; + } + if (value instanceof Long) { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return new BigInteger(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof BigDecimal) { + return (BigDecimal) value; + } + if (value instanceof Long) { + return new BigDecimal((Long) value); + } + if (value instanceof Double) { + return new BigDecimal((Double) value); + } + if (value instanceof Integer) { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return new BigDecimal(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) { + if (null == obj) { + return null; + } + + if (obj instanceof String) { + return (String) obj; + } else if (obj instanceof byte[] || obj instanceof Byte[]) { + return str((Byte[]) obj, charset); + } else if (obj instanceof ByteBuffer) { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) { + if (data == null) { + return null; + } + + if (null == charset) { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) { + if (data == null) { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) { + if (null == charset) { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) { + char c[] = input.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { + // 跳过不替换的字符 + continue; + } + + if (c[i] == ' ') { + c[i] = '\u3000'; + } else if (c[i] < '\177') { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) { + char c[] = text.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { + // 跳过不替换的字符 + continue; + } + + if (c[i] == '\u3000') { + c[i] = ' '; + } else if (c[i] > '\uFF00' && c[i] < '\uFF5F') { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) { + String[] fraction = {"角", "分"}; + String[] digit = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; + String[][] unit = {{"元", "万", "亿"}, {"", "拾", "佰", "仟"}}; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) { + s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/core/text/StrFormatter.java b/ebts/ebts-common/src/main/java/com/ebts/common/core/text/StrFormatter.java new file mode 100644 index 0000000..26bdef8 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/core/text/StrFormatter.java @@ -0,0 +1,76 @@ +package com.ebts.common.core.text; + +import com.ebts.common.utils.StringUtils; + +/** + * 字符串格式化 + * + * @author binlin + */ +public class StrFormatter { + public static final String EMPTY_JSON = "{}"; + public static final char C_BACKSLASH = '\\'; + public static final char C_DELIM_START = '{'; + public static final char C_DELIM_END = '}'; + + /** + * 格式化字符串
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param strPattern 字符串模板 + * @param argArray 参数列表 + * @return 结果 + */ + public static String format(final String strPattern, final Object... argArray) { + if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) { + return strPattern; + } + final int strPatternLength = strPattern.length(); + + // 初始化定义好的长度以获得更好的性能 + StringBuilder sbuf = new StringBuilder(strPatternLength + 50); + + int handledPosition = 0; + int delimIndex;// 占位符所在位置 + for (int argIndex = 0; argIndex < argArray.length; argIndex++) { + delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); + if (delimIndex == -1) { + if (handledPosition == 0) { + return strPattern; + } else { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 + sbuf.append(strPattern, handledPosition, strPatternLength); + return sbuf.toString(); + } + } else { + if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) { + if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) { + // 转义符之前还有一个转义符,占位符依旧有效 + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } else { + // 占位符被转义 + argIndex--; + sbuf.append(strPattern, handledPosition, delimIndex - 1); + sbuf.append(C_DELIM_START); + handledPosition = delimIndex + 1; + } + } else { + // 正常占位符 + sbuf.append(strPattern, handledPosition, delimIndex); + sbuf.append(Convert.utf8Str(argArray[argIndex])); + handledPosition = delimIndex + 2; + } + } + } + // 加入最后一个占位符后所有的字符 + sbuf.append(strPattern, handledPosition, strPattern.length()); + + return sbuf.toString(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/enums/BusinessStatus.java b/ebts/ebts-common/src/main/java/com/ebts/common/enums/BusinessStatus.java new file mode 100644 index 0000000..c2e6945 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/enums/BusinessStatus.java @@ -0,0 +1,18 @@ +package com.ebts.common.enums; + +/** + * 操作状态 + * + * @author binlin + */ +public enum BusinessStatus { + /** + * 成功 + */ + SUCCESS, + + /** + * 失败 + */ + FAIL, +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/enums/BusinessType.java b/ebts/ebts-common/src/main/java/com/ebts/common/enums/BusinessType.java new file mode 100644 index 0000000..dbbd671 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/enums/BusinessType.java @@ -0,0 +1,58 @@ +package com.ebts.common.enums; + +/** + * 业务操作类型 + * + * @author binlin + */ +public enum BusinessType { + /** + * 其它 + */ + OTHER, + + /** + * 新增 + */ + INSERT, + + /** + * 修改 + */ + UPDATE, + + /** + * 删除 + */ + DELETE, + + /** + * 授权 + */ + GRANT, + + /** + * 导出 + */ + EXPORT, + + /** + * 导入 + */ + IMPORT, + + /** + * 强退 + */ + FORCE, + + /** + * 生成代码 + */ + GENCODE, + + /** + * 清空数据 + */ + CLEAN, +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/enums/DataSourceType.java b/ebts/ebts-common/src/main/java/com/ebts/common/enums/DataSourceType.java new file mode 100644 index 0000000..a862b84 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/enums/DataSourceType.java @@ -0,0 +1,18 @@ +package com.ebts.common.enums; + +/** + * 数据源 + * + * @author binlin + */ +public enum DataSourceType { + /** + * 主库 + */ + MASTER, + + /** + * 从库 + */ + SLAVE +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/enums/HttpMethod.java b/ebts/ebts-common/src/main/java/com/ebts/common/enums/HttpMethod.java new file mode 100644 index 0000000..39e8d87 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/enums/HttpMethod.java @@ -0,0 +1,32 @@ +package com.ebts.common.enums; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.lang.Nullable; + +/** + * 请求方式 + * + * @author binlin + */ +public enum HttpMethod { + GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; + + private static final Map mappings = new HashMap<>(16); + + static { + for (HttpMethod httpMethod : values()) { + mappings.put(httpMethod.name(), httpMethod); + } + } + + @Nullable + public static HttpMethod resolve(@Nullable String method) { + return (method != null ? mappings.get(method) : null); + } + + public boolean matches(String method) { + return (this == resolve(method)); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/enums/OperatorType.java b/ebts/ebts-common/src/main/java/com/ebts/common/enums/OperatorType.java new file mode 100644 index 0000000..528dddf --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/enums/OperatorType.java @@ -0,0 +1,23 @@ +package com.ebts.common.enums; + +/** + * 操作人类别 + * + * @author binlin + */ +public enum OperatorType { + /** + * 其它 + */ + OTHER, + + /** + * 后台用户 + */ + MANAGE, + + /** + * 手机端用户 + */ + MOBILE +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/enums/UserStatus.java b/ebts/ebts-common/src/main/java/com/ebts/common/enums/UserStatus.java new file mode 100644 index 0000000..a9187d1 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/enums/UserStatus.java @@ -0,0 +1,26 @@ +package com.ebts.common.enums; + +/** + * 用户状态 + * + * @author binlin + */ +public enum UserStatus { + OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除"); + + private final String code; + private final String info; + + UserStatus(String code, String info) { + this.code = code; + this.info = info; + } + + public String getCode() { + return code; + } + + public String getInfo() { + return info; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/BaseException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/BaseException.java new file mode 100644 index 0000000..bdb6e46 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/BaseException.java @@ -0,0 +1,84 @@ +package com.ebts.common.exception; + +import com.ebts.common.utils.MessageUtils; +import com.ebts.common.utils.StringUtils; + +/** + * 基础异常 + * + * @author binlin + */ +public class BaseException extends RuntimeException { + + + /** + * 所属模块 + */ + private String module; + + /** + * 错误码 + */ + private String code; + + /** + * 错误码对应的参数 + */ + private Object[] args; + + /** + * 错误消息 + */ + private String defaultMessage; + + public BaseException(String module, String code, Object[] args, String defaultMessage) { + this.module = module; + this.code = code; + this.args = args; + this.defaultMessage = defaultMessage; + } + + public BaseException(String module, String code, Object[] args) { + this(module, code, args, null); + } + + public BaseException(String module, String defaultMessage) { + this(module, null, null, defaultMessage); + } + + public BaseException(String code, Object[] args) { + this(null, code, args, null); + } + + public BaseException(String defaultMessage) { + this(null, null, null, defaultMessage); + } + + @Override + public String getMessage() { + String message = null; + if (!StringUtils.isEmpty(code)) { + message = MessageUtils.message(code, args); + } + if (message == null) { + message = defaultMessage; + } + return message; + } + + public String getModule() { + return module; + } + + public String getCode() { + return code; + } + + public Object[] getArgs() { + return args; + } + + public String getDefaultMessage() { + return defaultMessage; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/CustomException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/CustomException.java new file mode 100644 index 0000000..3aa8beb --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/CustomException.java @@ -0,0 +1,37 @@ +package com.ebts.common.exception; + +/** + * 自定义异常 + * + * @author binlin + */ +public class CustomException extends RuntimeException { + + + private Integer code; + + private String message; + + public CustomException(String message) { + this.message = message; + } + + public CustomException(String message, Integer code) { + this.message = message; + this.code = code; + } + + public CustomException(String message, Throwable e) { + super(message, e); + this.message = message; + } + + @Override + public String getMessage() { + return message; + } + + public Integer getCode() { + return code; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/DemoModeException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/DemoModeException.java new file mode 100644 index 0000000..3158219 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/DemoModeException.java @@ -0,0 +1,13 @@ +package com.ebts.common.exception; + +/** + * 演示模式异常 + * + * @author binlin + */ +public class DemoModeException extends RuntimeException { + + + public DemoModeException() { + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/EbtsException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/EbtsException.java new file mode 100644 index 0000000..703b9d4 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/EbtsException.java @@ -0,0 +1,32 @@ +package com.ebts.common.exception; + +/** + * @Author 18209 + * @Date 2021/6/7 23:32 + * @Email clay@hchyun.com + * @Version 1.0 + */ +public class EbtsException extends RuntimeException { + + private String msg; + + private RuntimeException exception; + + public EbtsException(String opError, RuntimeException e) { + this.msg = opError; + this.exception = e; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + @Override + public String getMessage() { + return exception.getMessage(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/UtilException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/UtilException.java new file mode 100644 index 0000000..af5b883 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/UtilException.java @@ -0,0 +1,22 @@ +package com.ebts.common.exception; + +/** + * 工具类异常 + * + * @author binlin + */ +public class UtilException extends RuntimeException { + private static final long serialVersionUID = 8247610319171014183L; + + public UtilException(Throwable e) { + super(e.getMessage(), e); + } + + public UtilException(String message) { + super(message); + } + + public UtilException(String message, Throwable throwable) { + super(message, throwable); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileException.java new file mode 100644 index 0000000..6d7bd72 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileException.java @@ -0,0 +1,17 @@ +package com.ebts.common.exception.file; + +import com.ebts.common.exception.BaseException; + +/** + * 文件信息异常类 + * + * @author binlin + */ +public class FileException extends BaseException { + + + public FileException(String code, Object[] args) { + super("file", code, args, null); + } + +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileNameLengthLimitExceededException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileNameLengthLimitExceededException.java new file mode 100644 index 0000000..f52811d --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileNameLengthLimitExceededException.java @@ -0,0 +1,14 @@ +package com.ebts.common.exception.file; + +/** + * 文件名称超长限制异常类 + * + * @author binlin + */ +public class FileNameLengthLimitExceededException extends FileException { + + + public FileNameLengthLimitExceededException(int defaultFileNameLength) { + super("upload.filename.exceed.length", new Object[]{defaultFileNameLength}); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileSizeLimitExceededException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileSizeLimitExceededException.java new file mode 100644 index 0000000..ea474b9 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/FileSizeLimitExceededException.java @@ -0,0 +1,14 @@ +package com.ebts.common.exception.file; + +/** + * 文件名大小限制异常类 + * + * @author binlin + */ +public class FileSizeLimitExceededException extends FileException { + + + public FileSizeLimitExceededException(long defaultMaxSize) { + super("upload.exceed.maxSize", new Object[]{defaultMaxSize}); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/InvalidExtensionException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/InvalidExtensionException.java new file mode 100644 index 0000000..03ff440 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/file/InvalidExtensionException.java @@ -0,0 +1,61 @@ +package com.ebts.common.exception.file; + +import java.util.Arrays; + +import org.apache.commons.fileupload.FileUploadException; + +/** + * 文件上传 误异常类 + * + * @author binlin + */ +public class InvalidExtensionException extends FileUploadException { + + + private String[] allowedExtension; + private String extension; + private String filename; + + public InvalidExtensionException(String[] allowedExtension, String extension, String filename) { + super("filename : [" + filename + "], extension : [" + extension + "], allowed extension : [" + Arrays.toString(allowedExtension) + "]"); + this.allowedExtension = allowedExtension; + this.extension = extension; + this.filename = filename; + } + + public String[] getAllowedExtension() { + return allowedExtension; + } + + public String getExtension() { + return extension; + } + + public String getFilename() { + return filename; + } + + public static class InvalidImageExtensionException extends InvalidExtensionException { + + + public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidFlashExtensionException extends InvalidExtensionException { + + + public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) { + super(allowedExtension, extension, filename); + } + } + + public static class InvalidMediaExtensionException extends InvalidExtensionException { + + + public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) { + super(allowedExtension, extension, filename); + } + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/job/TaskException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/job/TaskException.java new file mode 100644 index 0000000..c5f4f63 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/job/TaskException.java @@ -0,0 +1,29 @@ +package com.ebts.common.exception.job; + +/** + * 计划策略异常 + * + * @author binlin + */ +public class TaskException extends Exception { + + + private Code code; + + public TaskException(String msg, Code code) { + this(msg, code, null); + } + + public TaskException(String msg, Code code, Exception nestedEx) { + super(msg, nestedEx); + this.code = code; + } + + public Code getCode() { + return code; + } + + public enum Code { + TASK_EXISTS, NO_TASK_EXISTS, TASK_ALREADY_STARTED, UNKNOWN, CONFIG_ERROR, TASK_NODE_NOT_AVAILABLE + } +} \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/CaptchaException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/CaptchaException.java new file mode 100644 index 0000000..8fc8dc8 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/CaptchaException.java @@ -0,0 +1,14 @@ +package com.ebts.common.exception.user; + +/** + * 验证码错误异常类 + * + * @author binlin + */ +public class CaptchaException extends UserException { + + + public CaptchaException() { + super("user.jcaptcha.error", null); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/CaptchaExpireException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/CaptchaExpireException.java new file mode 100644 index 0000000..7df5071 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/CaptchaExpireException.java @@ -0,0 +1,14 @@ +package com.ebts.common.exception.user; + +/** + * 验证码失效异常类 + * + * @author binlin + */ +public class CaptchaExpireException extends UserException { + + + public CaptchaExpireException() { + super("user.jcaptcha.expire", null); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/UserException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/UserException.java new file mode 100644 index 0000000..977b0fd --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/UserException.java @@ -0,0 +1,16 @@ +package com.ebts.common.exception.user; + +import com.ebts.common.exception.BaseException; + +/** + * 用户信息异常类 + * + * @author binlin + */ +public class UserException extends BaseException { + + + public UserException(String code, Object[] args) { + super("user", code, args, null); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/UserPasswordNotMatchException.java b/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/UserPasswordNotMatchException.java new file mode 100644 index 0000000..93cdc5e --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/exception/user/UserPasswordNotMatchException.java @@ -0,0 +1,14 @@ +package com.ebts.common.exception.user; + +/** + * 用户密码不正确或不符合规范异常类 + * + * @author binlin + */ +public class UserPasswordNotMatchException extends UserException { + + + public UserPasswordNotMatchException() { + super("user.password.not.match", null); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/filter/RepeatableFilter.java b/ebts/ebts-common/src/main/java/com/ebts/common/filter/RepeatableFilter.java new file mode 100644 index 0000000..8d56e60 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/filter/RepeatableFilter.java @@ -0,0 +1,45 @@ +package com.ebts.common.filter; + +import java.io.IOException; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +import org.springframework.http.MediaType; +import com.ebts.common.utils.StringUtils; + +/** + * Repeatable 过滤器 + * + * @author binlin + */ +public class RepeatableFilter implements Filter { + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + ServletRequest requestWrapper = null; + if (request instanceof HttpServletRequest && StringUtils.equalsAnyIgnoreCase(request.getContentType(), + MediaType.APPLICATION_JSON_VALUE, MediaType.APPLICATION_JSON_UTF8_VALUE)) { + requestWrapper = new RepeatedlyRequestWrapper((HttpServletRequest) request, response); + } + if (null == requestWrapper) { + chain.doFilter(request, response); + } else { + chain.doFilter(requestWrapper, response); + } + } + + @Override + public void destroy() { + + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/filter/RepeatedlyRequestWrapper.java b/ebts/ebts-common/src/main/java/com/ebts/common/filter/RepeatedlyRequestWrapper.java new file mode 100644 index 0000000..4482dc2 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/filter/RepeatedlyRequestWrapper.java @@ -0,0 +1,64 @@ +package com.ebts.common.filter; + +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 com.ebts.common.utils.http.HttpHelper; + +/** + * 构建可重复读取inputStream的request + * + * @author binlin + */ +public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper { + private final byte[] body; + + public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException { + super(request); + request.setCharacterEncoding("UTF-8"); + response.setCharacterEncoding("UTF-8"); + + body = HttpHelper.getBodyString(request).getBytes("UTF-8"); + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(getInputStream())); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + + final ByteArrayInputStream bais = new ByteArrayInputStream(body); + + return new ServletInputStream() { + + @Override + public int read() throws IOException { + return bais.read(); + } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + }; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/filter/XssFilter.java b/ebts/ebts-common/src/main/java/com/ebts/common/filter/XssFilter.java new file mode 100644 index 0000000..13029e9 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/filter/XssFilter.java @@ -0,0 +1,85 @@ +package com.ebts.common.filter; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ebts.common.utils.StringUtils; + +/** + * 防止XSS攻击的过滤器 + * + * @author binlin + */ +public class XssFilter implements Filter { + /** + * 排除链接 + */ + public List excludes = new ArrayList<>(); + + /** + * xss过滤开关 + */ + public boolean enabled = false; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + String tempExcludes = filterConfig.getInitParameter("excludes"); + String tempEnabled = filterConfig.getInitParameter("enabled"); + if (StringUtils.isNotEmpty(tempExcludes)) { + String[] url = tempExcludes.split(","); + for (int i = 0; url != null && i < url.length; i++) { + excludes.add(url[i]); + } + } + if (StringUtils.isNotEmpty(tempEnabled)) { + enabled = Boolean.valueOf(tempEnabled); + } + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) request; + HttpServletResponse resp = (HttpServletResponse) response; + if (handleExcludeURL(req, resp)) { + chain.doFilter(request, response); + return; + } + XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request); + chain.doFilter(xssRequest, response); + } + + private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) { + if (!enabled) { + return true; + } + if (excludes == null || excludes.isEmpty()) { + return false; + } + String url = request.getServletPath(); + for (String pattern : excludes) { + Pattern p = Pattern.compile("^" + pattern); + Matcher m = p.matcher(url); + if (m.find()) { + return true; + } + } + return false; + } + + @Override + public void destroy() { + + } +} \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/filter/XssHttpServletRequestWrapper.java b/ebts/ebts-common/src/main/java/com/ebts/common/filter/XssHttpServletRequestWrapper.java new file mode 100644 index 0000000..bfa2653 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/filter/XssHttpServletRequestWrapper.java @@ -0,0 +1,92 @@ +package com.ebts.common.filter; + +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 org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.html.EscapeUtil; + +/** + * XSS过滤处理 + * + * @author binlin + */ +public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper { + /** + * @param request + */ + public XssHttpServletRequestWrapper(HttpServletRequest request) { + super(request); + } + + @Override + public String[] getParameterValues(String name) { + String[] values = super.getParameterValues(name); + if (values != null) { + int length = values.length; + String[] escapseValues = new String[length]; + for (int i = 0; i < length; i++) { + // 防xss攻击和过滤前后空格 + escapseValues[i] = EscapeUtil.clean(values[i]).trim(); + } + return escapseValues; + } + return super.getParameterValues(name); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + // 非json类型,直接返回 + if (!isJsonRequest()) { + return super.getInputStream(); + } + + // 为空,直接返回 + String json = IOUtils.toString(super.getInputStream(), "utf-8"); + if (StringUtils.isEmpty(json)) { + return super.getInputStream(); + } + + // xss过滤 + json = EscapeUtil.clean(json).trim(); + final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes("utf-8")); + return new ServletInputStream() { + @Override + public boolean isFinished() { + return true; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener readListener) { + } + + @Override + public int read() throws IOException { + return bis.read(); + } + }; + } + + /** + * 是否是Json请求 + * + * @param request + */ + public boolean isJsonRequest() { + String header = super.getHeader(HttpHeaders.CONTENT_TYPE); + return MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(header) + || MediaType.APPLICATION_JSON_UTF8_VALUE.equalsIgnoreCase(header); + } +} \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/Arith.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/Arith.java new file mode 100644 index 0000000..8401dd4 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/Arith.java @@ -0,0 +1,113 @@ +package com.ebts.common.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +/** + * 精确的浮点数运算 + * + * @author binlin + */ +public class Arith { + + /** + * 默认除法运算精度 + */ + private static final int DEF_DIV_SCALE = 10; + + /** + * 这个类不能实例化 + */ + private Arith() { + } + + /** + * 提供精确的加法运算。 + * + * @param v1 被加数 + * @param v2 加数 + * @return 两个参数的和 + */ + public static double add(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.add(b2).doubleValue(); + } + + /** + * 提供精确的减法运算。 + * + * @param v1 被减数 + * @param v2 减数 + * @return 两个参数的差 + */ + public static double sub(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.subtract(b2).doubleValue(); + } + + /** + * 提供精确的乘法运算。 + * + * @param v1 被乘数 + * @param v2 乘数 + * @return 两个参数的积 + */ + public static double mul(double v1, double v2) { + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + return b1.multiply(b2).doubleValue(); + } + + /** + * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 + * 小数点以后10位,以后的数字四舍五入。 + * + * @param v1 被除数 + * @param v2 除数 + * @return 两个参数的商 + */ + public static double div(double v1, double v2) { + return div(v1, v2, DEF_DIV_SCALE); + } + + /** + * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 + * 定精度,以后的数字四舍五入。 + * + * @param v1 被除数 + * @param v2 除数 + * @param scale 表示表示需要精确到小数点以后几位。 + * @return 两个参数的商 + */ + public static double div(double v1, double v2, int scale) { + if (scale < 0) { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b1 = new BigDecimal(Double.toString(v1)); + BigDecimal b2 = new BigDecimal(Double.toString(v2)); + if (b1.compareTo(BigDecimal.ZERO) == 0) { + return BigDecimal.ZERO.doubleValue(); + } + return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue(); + } + + /** + * 提供精确的小数位四舍五入处理。 + * + * @param v 需要四舍五入的数字 + * @param scale 小数点后保留几位 + * @return 四舍五入后的结果 + */ + public static double round(double v, int scale) { + if (scale < 0) { + throw new IllegalArgumentException( + "The scale must be a positive integer or zero"); + } + BigDecimal b = new BigDecimal(Double.toString(v)); + BigDecimal one = new BigDecimal("1"); + return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/DateUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/DateUtils.java new file mode 100644 index 0000000..4811a59 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/DateUtils.java @@ -0,0 +1,144 @@ +package com.ebts.common.utils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import org.apache.commons.lang3.time.DateFormatUtils; + +/** + * 时间工具类 + * + * @author binlin + */ +public class DateUtils extends org.apache.commons.lang3.time.DateUtils { + public static String YYYY = "yyyy"; + + public static String YYYY_MM = "yyyy-MM"; + + public static String YYYY_MM_DD = "yyyy-MM-dd"; + + 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", + "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; + + /** + * 获取当前Date型日期 + * + * @return Date() 当前日期 + */ + public static Date getNowDate() { + return new Date(); + } + + /** + * 获取当前日期, 默认格式为yyyy-MM-dd + * + * @return String + */ + public static String getDate() { + return dateTimeNow(YYYY_MM_DD); + } + + public static String getDate(String time) { + try { + return new SimpleDateFormat(YYYY_MM_DD).parse(time).toString(); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + + public static final String getTime() { + return dateTimeNow(YYYY_MM_DD_HH_MM_SS); + } + + public static final String dateTimeNow() { + return dateTimeNow(YYYYMMDDHHMMSS); + } + + public static final String dateTimeNow(final String format) { + return parseDateToStr(format, new Date()); + } + + public static final String dateTime(final Date date) { + return parseDateToStr(YYYY_MM_DD, date); + } + + public static final String parseDateToStr(final String format, final Date date) { + return new SimpleDateFormat(format).format(date); + } + + public static final Date dateTime(final String format, final String ts) { + try { + return new SimpleDateFormat(format).parse(ts); + } catch (ParseException e) { + throw new RuntimeException(e); + } + } + + /** + * 日期路径 即年/月/日 如2018/08/08 + */ + public static final String datePath() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyy/MM/dd"); + } + + /** + * 日期路径 即年/月/日 如20180808 + */ + public static final String dateTime() { + Date now = new Date(); + return DateFormatUtils.format(now, "yyyyMMdd"); + } + + /** + * 日期型字符串转化为日期 格式 + */ + public static Date parseDate(Object str) { + if (str == null) { + return null; + } + try { + return parseDate(str.toString(), parsePatterns); + } catch (ParseException e) { + return null; + } + } + + /** + * 获取服务器启动时间 + */ + public static Date getServerStartDate() { + long time = ManagementFactory.getRuntimeMXBean().getStartTime(); + return new Date(time); + } + + /** + * 计算两个时间差 + */ + 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() - nowDate.getTime(); + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + // long sec = diff % nd % nh % nm / ns; + return day + "天" + hour + "小时" + min + "分钟"; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/DictUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/DictUtils.java new file mode 100644 index 0000000..b2d30cb --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/DictUtils.java @@ -0,0 +1,148 @@ +package com.ebts.common.utils; + +import java.util.Collection; +import java.util.List; + +import com.ebts.common.constant.Constants; +import com.ebts.common.core.entity.entity.DictData; +import com.ebts.common.core.redis.RedisCache; +import com.ebts.common.utils.spring.SpringUtils; + +/** + * 字典工具类 + * + * @author binlin + */ +public class DictUtils { + /** + * 分隔符 + */ + public static final String SEPARATOR = ","; + + /** + * 设置字典缓存 + * + * @param key 参数键 + * @param dictDatas 字典数据列表 + */ + public static void setDictCache(String key, List dictDatas) { + SpringUtils.getBean(RedisCache.class).setCacheObject(getCacheKey(key), dictDatas); + } + + /** + * 获取字典缓存 + * + * @param key 参数键 + * @return dictDatas 字典数据列表 + */ + public static List getDictCache(String key) { + Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key)); + if (StringUtils.isNotNull(cacheObj)) { + List dictDatas = StringUtils.cast(cacheObj); + return dictDatas; + } + return null; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue) { + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel) { + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String getDictLabel(String dictType, String dictValue, String separator) { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.containsAny(separator, dictValue) && StringUtils.isNotEmpty(datas)) { + for (DictData dict : datas) { + for (String value : dictValue.split(separator)) { + if (value.equals(dict.getDictValue())) { + propertyString.append(dict.getDictLabel() + separator); + break; + } + } + } + } else { + for (DictData dict : datas) { + if (dictValue.equals(dict.getDictValue())) { + return dict.getDictLabel(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + public static String getDictValue(String dictType, String dictLabel, String separator) { + StringBuilder propertyString = new StringBuilder(); + List datas = getDictCache(dictType); + + if (StringUtils.containsAny(separator, dictLabel) && StringUtils.isNotEmpty(datas)) { + for (DictData dict : datas) { + for (String label : dictLabel.split(separator)) { + if (label.equals(dict.getDictLabel())) { + propertyString.append(dict.getDictValue() + separator); + break; + } + } + } + } else { + for (DictData dict : datas) { + if (dictLabel.equals(dict.getDictLabel())) { + return dict.getDictValue(); + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 清空字典缓存 + */ + public static void clearDictCache() { + Collection keys = SpringUtils.getBean(RedisCache.class).keys(Constants.SYS_DICT_KEY + "*"); + SpringUtils.getBean(RedisCache.class).deleteObject(keys); + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + public static String getCacheKey(String configKey) { + return Constants.SYS_DICT_KEY + configKey; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/ExceptionUtil.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/ExceptionUtil.java new file mode 100644 index 0000000..8623242 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/ExceptionUtil.java @@ -0,0 +1,36 @@ +package com.ebts.common.utils; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import org.apache.commons.lang3.exception.ExceptionUtils; + +/** + * 错误信息处理类。 + * + * @author binlin + */ +public class ExceptionUtil { + /** + * 获取exception的详细错误信息。 + */ + public static String getExceptionMessage(Throwable e) { + StringWriter sw = new StringWriter(); + e.printStackTrace(new PrintWriter(sw, true)); + String str = sw.toString(); + return str; + } + + public static String getRootErrorMseeage(Exception e) { + Throwable root = ExceptionUtils.getRootCause(e); + root = (root == null ? e : root); + if (root == null) { + return ""; + } + String msg = root.getMessage(); + if (msg == null) { + return "null"; + } + return StringUtils.defaultString(msg); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/LogUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/LogUtils.java new file mode 100644 index 0000000..d3794aa --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/LogUtils.java @@ -0,0 +1,15 @@ +package com.ebts.common.utils; + +/** + * 处理并记录日志文件 + * + * @author binlin + */ +public class LogUtils { + public static String getBlock(Object msg) { + if (msg == null) { + msg = ""; + } + return "[" + msg.toString() + "]"; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/MapExcelUtil.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/MapExcelUtil.java new file mode 100644 index 0000000..ae1baea --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/MapExcelUtil.java @@ -0,0 +1,295 @@ +package com.ebts.common.utils; + +import com.ebts.common.config.EBTSConfig; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.exception.CustomException; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.*; + +/** + * @Author 18209 + * @Date 2021/2/3 21:09 + * @Version 1.0 + */ +public class MapExcelUtil { + private Logger logger = LoggerFactory.getLogger(MapExcelUtil.class); + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List> list; + + /** + * 注解列表 + */ + private List herders; + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult exportExcel(List> list, String sheetName) { + this.init(list, sheetName); + return exportExcel(); + } + + + public void init(List> list, String sheetName) { + if (list == null) { + list = new ArrayList>(); + } + this.list = list; + this.sheetName = sheetName; + createExcelField(); + createWorkbook(); + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() { + this.wb = new SXSSFWorkbook(500); + } + + /** + * 得到所有定义字段 + */ + private void createExcelField() { + this.herders = new ArrayList(); + Map modeMap = this.list.get(0); + for (String key : modeMap.keySet()) { + this.herders.add(key); + } + + + } + + /** + * 创建表格样式 + * + * @param wb 工作薄对象 + * @return 样式列表 + */ + private Map createStyles(Workbook wb) { + // 写入各条记录,每条记录对应excel表中的一行 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(IndexedColors.WHITE.getIndex()); + style.setFont(headerFont); + styles.put("header", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + return styles; + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(double sheetNo, int index) { + this.sheet = wb.createSheet(); + this.styles = createStyles(wb); + // 设置工作表的名称. + if (sheetNo == 0) { + wb.setSheetName(index, sheetName); + } else { + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 填充excel数据 + * + * @param index 序号 + * @param row 单元格行 + */ + public void fillExcelData(int index, Row row) { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + for (int i = startNo; i < endNo; i++) { + row = sheet.createRow(i + 1 - startNo); + //获取内容 + int k = 0; + for (String key : herders) { + // 填充单元格的值 + this.addCell(row, key, i, k++); + } + } + } + + /** + * 添加单元格 + */ + public Cell addCell(Row row, String key, int column, Integer k) { + Cell cell = null; + try { + // 设置行高 + row.setHeight((short) 280); + // 创建cell + cell = row.createCell(k); + cell.setCellStyle(styles.get("data")); + Object value = this.list.get(column).get(key); + cell.setCellValue(value.toString()); + } catch (Exception e) { + logger.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 创建单元格 + */ + public Cell createCell(Row row, String herder, int column) { + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(herder); + cell.setCellStyle(styles.get("header")); + return cell; + } + + + /** + * 编码文件名 + */ + public String encodingFilename(String filename) { + filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) { + String downloadPath = EBTSConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel() { + OutputStream out = null; + try { + // 取出一共有多少个sheet. + double sheetNo = Math.ceil(list.size() / sheetSize); + for (int index = 0; index <= sheetNo; index++) { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(0); + int column = 0; + // 写入各个字段的列头名称 + for (String herder : herders) { + //设置列名称 + this.createCell(row, herder, column++); + } + fillExcelData(index, row); + } + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } catch (Exception e) { + logger.error("导出Excel异常{}", e.getMessage()); + throw new CustomException("导出Excel失败,请联系网站管理员!"); + } finally { + if (wb != null) { + try { + wb.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + } + } + +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/MessageUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/MessageUtils.java new file mode 100644 index 0000000..2b8e85d --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/MessageUtils.java @@ -0,0 +1,24 @@ +package com.ebts.common.utils; + +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import com.ebts.common.utils.spring.SpringUtils; + +/** + * 获取i18n资源文件 + * + * @author binlin + */ +public class MessageUtils { + /** + * 根据消息键和参数 获取消息 委托给spring messageSource + * + * @param code 消息键 + * @param args 参数 + * @return 获取国际化翻译值 + */ + public static String message(String code, Object... args) { + MessageSource messageSource = SpringUtils.getBean(MessageSource.class); + return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/SecurityUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/SecurityUtils.java new file mode 100644 index 0000000..96884cb --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/SecurityUtils.java @@ -0,0 +1,87 @@ +package com.ebts.common.utils; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import com.ebts.common.constant.HttpStatus; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.exception.CustomException; + +/** + * 安全服务工具类 + * + * @author binlin + */ +public class SecurityUtils { + + public static Long getUserId() { + try { + return getLoginUser().getUser().getUserId(); + } catch (Exception e) { + throw new CustomException("获取用户账户异常", HttpStatus.UNAUTHORIZED); + } + } + + + /** + * 获取用户账户 + **/ + public static String getUsername() { + try { + return getLoginUser().getUsername(); + } catch (Exception e) { + throw new CustomException("获取用户账户异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取用户 + **/ + public static LoginUser getLoginUser() { + try { + return (LoginUser) getAuthentication().getPrincipal(); + } catch (Exception e) { + throw new CustomException("获取用户信息异常", HttpStatus.UNAUTHORIZED); + } + } + + /** + * 获取Authentication + */ + public static Authentication getAuthentication() { + return SecurityContextHolder.getContext().getAuthentication(); + } + + /** + * 生成BCryptPasswordEncoder密码 + * + * @param password 密码 + * @return 加密字符串 + */ + public static String encryptPassword(String password) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.encode(password); + } + + /** + * 判断密码是否相同 + * + * @param rawPassword 真实密码 + * @param encodedPassword 加密后字符 + * @return 结果 + */ + public static boolean matchesPassword(String rawPassword, String encodedPassword) { + BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + return passwordEncoder.matches(rawPassword, encodedPassword); + } + + /** + * 是否为管理员 + * + * @param userId 用户ID + * @return 结果 + */ + public static boolean isAdmin(Long userId) { + return userId != null && 1L == userId; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/ServerResult.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/ServerResult.java new file mode 100644 index 0000000..05332c2 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/ServerResult.java @@ -0,0 +1,93 @@ +package com.ebts.common.utils; + +/** + * @author clay + * @version 1.0 + * @mail 20932067@zju.edu.cn + * @date 2020/12/15 21:34 + */ +public class ServerResult { + private T data;// 成功时返回的数据 + private Integer count; + private boolean start; + private String msg; + + private String sheetName; + + public ServerResult() { + } + + public ServerResult(boolean start, T data, Integer count) { + this.data = data; + this.count = count; + this.start = start; + this.msg = "操作成功"; + } + + public ServerResult(boolean start, T data) { + this.data = data; + this.start = start; + this.msg = "操作成功"; + } + + public ServerResult(boolean start, T data, String sheetName) { + this.data = data; + this.start = start; + this.sheetName = sheetName; + this.msg = "操作成功"; + } + public ServerResult(T data) { + this.data = data; + this.start = true; + this.msg = "操作成功"; + } + + public ServerResult(boolean start, String msg) { + this.start = start; + this.msg = msg; + } + + public String getSheetName() { + return sheetName; + } + + public void setSheetName(String sheetName) { + this.sheetName = sheetName; + } + + public ServerResult(boolean start) { + this.start = start; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + + public boolean isStart() { + return start; + } + + public void setStart(boolean start) { + this.start = start; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/ServletUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/ServletUtils.java new file mode 100644 index 0000000..b29e939 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/ServletUtils.java @@ -0,0 +1,119 @@ +package com.ebts.common.utils; + +import java.io.IOException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; +import com.ebts.common.core.text.Convert; + +/** + * 客户端工具类 + * + * @author binlin + */ +public class ServletUtils { + /** + * 获取String参数 + */ + public static String getParameter(String name) { + return getRequest().getParameter(name); + } + + /** + * 获取String参数 + */ + public static String getParameter(String name, String defaultValue) { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name) { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取request + */ + public static HttpServletRequest getRequest() { + return getRequestAttributes().getRequest(); + } + + /** + * 获取response + */ + public static HttpServletResponse getResponse() { + return getRequestAttributes().getResponse(); + } + + /** + * 获取session + */ + public static HttpSession getSession() { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + + /** + * 将字符串渲染到客户端 + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + * @return null + */ + public static String renderString(HttpServletResponse response, String string) { + try { + response.setStatus(200); + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 是否是Ajax异步请求 + * + * @param request + */ + public static boolean isAjaxRequest(HttpServletRequest request) { + String accept = request.getHeader("accept"); + if (accept != null && accept.indexOf("application/json") != -1) { + return true; + } + + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) { + return true; + } + + String uri = request.getRequestURI(); + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) { + return true; + } + + String ajax = request.getParameter("__ajax"); + if (StringUtils.inStringIgnoreCase(ajax, "json", "xml")) { + return true; + } + return false; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/StringUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/StringUtils.java new file mode 100644 index 0000000..2a25ccb --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/StringUtils.java @@ -0,0 +1,419 @@ +package com.ebts.common.utils; + +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 com.ebts.common.core.text.StrFormatter; + +/** + * 字符串工具类 + * + * @author binlin + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + /** + * 空字符串 + */ + private static final String NULLSTR = ""; + + /** + * 下划线 + */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + * * @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + if (str == null) { + return NULLSTR; + } + + if (start < 0) { + start = str.length() + start; + } + + if (start < 0) { + start = 0; + } + if (start > str.length()) { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + if (str == null) { + return NULLSTR; + } + + if (end < 0) { + end = str.length() + end; + } + if (start < 0) { + start = str.length() + start; + } + + if (end > str.length()) { + end = str.length(); + } + + if (start > end) { + return NULLSTR; + } + + if (start < 0) { + start = 0; + } + if (end < 0) { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) { + if (isEmpty(params) || isEmpty(template)) { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static final Set str2Set(String str, String sep) { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) { + return list; + } + String[] split = str.split(sep); + for (String string : split) { + if (filterBlank && StringUtils.isBlank(string)) { + continue; + } + if (trim) { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 下划线转驼峰命名 + */ + public static String toUnderScoreCase(String str) { + if (str == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (i > 0) { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } else { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) { + sb.append(SEPARATOR); + } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + if (str != null && strs != null) { + for (String s : strs) { + if (str.equalsIgnoreCase(trim(s))) { + return true; + } + } + } + return false; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains("_")) { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 例如:user_name->userName + */ + public static String toCamelCase(String s) { + if (s == null) { + return null; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == SEPARATOR) { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 分割sql字符串 + * + * @param str + * @return + */ + public static String sqlFormat(String str) { + String[] strList = str.split("_"); + String sqlStr = ""; + for (String s : strList) { + sqlStr += s.substring(0, 1); + } + return sqlStr; + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) { + return (T) obj; + } + + public static String toLoad(String str){ + return str.substring(0,1).toLowerCase()+str.substring(1); + } + +} \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/Threads.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/Threads.java new file mode 100644 index 0000000..0760b51 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/Threads.java @@ -0,0 +1,77 @@ +package com.ebts.common.utils; + +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; + +/** + * 线程相关工具类. + * + * @author binlin + */ +public class Threads { + private static final Logger logger = LoggerFactory.getLogger(Threads.class); + + /** + * sleep等待,单位为毫秒 + */ + public static void sleep(long milliseconds) { + try { + Thread.sleep(milliseconds); + } catch (InterruptedException e) { + return; + } + } + + /** + * 停止线程池 + * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务. + * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数. + * 如果仍人超時,則強制退出. + * 另对在shutdown时线程本身被调用中断做了处理. + */ + public static void shutdownAndAwaitTermination(ExecutorService pool) { + if (pool != null && !pool.isShutdown()) { + pool.shutdown(); + try { + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { + pool.shutdownNow(); + if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { + logger.info("Pool did not terminate"); + } + } + } catch (InterruptedException ie) { + pool.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + + /** + * 打印线程异常信息 + */ + public static void printException(Runnable r, Throwable t) { + if (t == null && r instanceof Future) { + try { + Future future = (Future) r; + if (future.isDone()) { + future.get(); + } + } catch (CancellationException ce) { + t = ce; + } catch (ExecutionException ee) { + t = ee.getCause(); + } catch (InterruptedException ie) { + Thread.currentThread().interrupt(); + } + } + if (t != null) { + logger.error(t.getMessage(), t); + } + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/VerifyCodeUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/VerifyCodeUtils.java new file mode 100644 index 0000000..d05a86c --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/VerifyCodeUtils.java @@ -0,0 +1,206 @@ +package com.ebts.common.utils; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.OutputStream; +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.Random; +import javax.imageio.ImageIO; + +/** + * 验证码工具类 + * + * @author binlin + */ +public class VerifyCodeUtils { + // 使用到Algerian字体,系统里没有的话需要安装字体,字体只显示大写,去掉了1,0,i,o几个容易混淆的字符 + public static final String VERIFY_CODES = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ"; + + private static Random random = new SecureRandom(); + + /** + * 使用系统默认字符源生成验证码 + * + * @param verifySize 验证码长度 + * @return + */ + public static String generateVerifyCode(int verifySize) { + return generateVerifyCode(verifySize, VERIFY_CODES); + } + + /** + * 使用指定源生成验证码 + * + * @param verifySize 验证码长度 + * @param sources 验证码字符源 + * @return + */ + public static String generateVerifyCode(int verifySize, String sources) { + if (sources == null || sources.length() == 0) { + sources = VERIFY_CODES; + } + int codesLen = sources.length(); + Random rand = new Random(System.currentTimeMillis()); + StringBuilder verifyCode = new StringBuilder(verifySize); + for (int i = 0; i < verifySize; i++) { + verifyCode.append(sources.charAt(rand.nextInt(codesLen - 1))); + } + return verifyCode.toString(); + } + + /** + * 输出指定验证码图片流 + * + * @param w + * @param h + * @param os + * @param code + * @throws IOException + */ + public static void outputImage(int w, int h, OutputStream os, String code) throws IOException { + int verifySize = code.length(); + BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + Random rand = new Random(); + Graphics2D g2 = image.createGraphics(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + Color[] colors = new Color[5]; + Color[] colorSpaces = new Color[]{Color.WHITE, Color.CYAN, Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, + Color.ORANGE, Color.PINK, Color.YELLOW}; + float[] fractions = new float[colors.length]; + for (int i = 0; i < colors.length; i++) { + colors[i] = colorSpaces[rand.nextInt(colorSpaces.length)]; + fractions[i] = rand.nextFloat(); + } + Arrays.sort(fractions); + + g2.setColor(Color.GRAY);// 设置边框色 + g2.fillRect(0, 0, w, h); + + Color c = getRandColor(200, 250); + g2.setColor(c);// 设置背景色 + g2.fillRect(0, 2, w, h - 4); + + // 绘制干扰线 + Random random = new Random(); + g2.setColor(getRandColor(160, 200));// 设置线条的颜色 + for (int i = 0; i < 20; i++) { + int x = random.nextInt(w - 1); + int y = random.nextInt(h - 1); + int xl = random.nextInt(6) + 1; + int yl = random.nextInt(12) + 1; + g2.drawLine(x, y, x + xl + 40, y + yl + 20); + } + + // 添加噪点 + float yawpRate = 0.05f;// 噪声率 + int area = (int) (yawpRate * w * h); + for (int i = 0; i < area; i++) { + int x = random.nextInt(w); + int y = random.nextInt(h); + int rgb = getRandomIntColor(); + image.setRGB(x, y, rgb); + } + + shear(g2, w, h, c);// 使图片扭曲 + + g2.setColor(getRandColor(100, 160)); + int fontSize = h - 4; + Font font = new Font("Algerian", Font.ITALIC, fontSize); + g2.setFont(font); + char[] chars = code.toCharArray(); + for (int i = 0; i < verifySize; i++) { + AffineTransform affine = new AffineTransform(); + affine.setToRotation(Math.PI / 4 * rand.nextDouble() * (rand.nextBoolean() ? 1 : -1), + (w / verifySize) * i + fontSize / 2, h / 2); + g2.setTransform(affine); + g2.drawChars(chars, i, 1, ((w - 10) / verifySize) * i + 5, h / 2 + fontSize / 2 - 10); + } + + g2.dispose(); + ImageIO.write(image, "jpg", os); + } + + private static Color getRandColor(int fc, int bc) { + if (fc > 255) { + fc = 255; + } + if (bc > 255) { + bc = 255; + } + int r = fc + random.nextInt(bc - fc); + int g = fc + random.nextInt(bc - fc); + int b = fc + random.nextInt(bc - fc); + return new Color(r, g, b); + } + + private static int getRandomIntColor() { + int[] rgb = getRandomRgb(); + int color = 0; + for (int c : rgb) { + color = color << 8; + color = color | c; + } + return color; + } + + private static int[] getRandomRgb() { + int[] rgb = new int[3]; + for (int i = 0; i < 3; i++) { + rgb[i] = random.nextInt(255); + } + return rgb; + } + + private static void shear(Graphics g, int w1, int h1, Color color) { + shearX(g, w1, h1, color); + shearY(g, w1, h1, color); + } + + private static void shearX(Graphics g, int w1, int h1, Color color) { + + int period = random.nextInt(2); + + boolean borderGap = true; + int frames = 1; + int phase = random.nextInt(2); + + for (int i = 0; i < h1; i++) { + double d = (double) (period >> 1) + * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames); + g.copyArea(0, i, w1, 1, (int) d, 0); + if (borderGap) { + g.setColor(color); + g.drawLine((int) d, i, 0, i); + g.drawLine((int) d + w1, i, w1, i); + } + } + + } + + private static void shearY(Graphics g, int w1, int h1, Color color) { + + int period = random.nextInt(40) + 10; // 50; + + boolean borderGap = true; + int frames = 20; + int phase = 7; + for (int i = 0; i < w1; i++) { + double d = (double) (period >> 1) + * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames); + g.copyArea(i, 0, 1, h1, 0, (int) d); + if (borderGap) { + g.setColor(color); + g.drawLine(i, (int) d, i, 0); + g.drawLine(i, (int) d + h1, i, h1); + } + + } + } +} \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/bean/BeanUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/bean/BeanUtils.java new file mode 100644 index 0000000..a0f4eb3 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/bean/BeanUtils.java @@ -0,0 +1,104 @@ +package com.ebts.common.utils.bean; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Bean 工具类 + * + * @author binlin + */ +public class BeanUtils extends org.springframework.beans.BeanUtils { + /** + * Bean方法名中属性名开始的下标 + */ + private static final int BEAN_METHOD_PROP_INDEX = 3; + + /** + * 匹配getter方法的正则表达式 + */ + private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); + + /** + * 匹配setter方法的正则表达式 + */ + private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); + + /** + * Bean属性复制工具方法。 + * + * @param dest 目标对象 + * @param src 源对象 + */ + public static void copyBeanProp(Object dest, Object src) { + try { + copyProperties(src, dest); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 获取对象的setter方法。 + * + * @param obj 对象 + * @return 对象的setter方法列表 + */ + public static List getSetterMethods(Object obj) { + // setter方法列表 + List setterMethods = new ArrayList(); + + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + + // 查找setter方法 + + for (Method method : methods) { + Matcher m = SET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 1)) { + setterMethods.add(method); + } + } + // 返回setter方法列表 + return setterMethods; + } + + /** + * 获取对象的getter方法。 + * + * @param obj 对象 + * @return 对象的getter方法列表 + */ + + public static List getGetterMethods(Object obj) { + // getter方法列表 + List getterMethods = new ArrayList(); + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + // 查找getter方法 + for (Method method : methods) { + Matcher m = GET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 0)) { + getterMethods.add(method); + } + } + // 返回getter方法列表 + return getterMethods; + } + + /** + * 检查Bean方法名中的属性名是否相等。
+ * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 + * + * @param m1 方法名1 + * @param m2 方法名2 + * @return 属性名一样返回true,否则返回false + */ + + public static boolean isMethodPropEquals(String m1, String m2) { + return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/file/FileUploadUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/file/FileUploadUtils.java new file mode 100644 index 0000000..de7787b --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/file/FileUploadUtils.java @@ -0,0 +1,205 @@ +package com.ebts.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.ebts.common.config.EBTSConfig; +import com.ebts.common.constant.Constants; +import com.ebts.common.exception.file.FileNameLengthLimitExceededException; +import com.ebts.common.exception.file.FileSizeLimitExceededException; +import com.ebts.common.exception.file.InvalidExtensionException; +import com.ebts.common.utils.DateUtils; +import com.ebts.common.utils.StringUtils; + +/** + * 文件上传工具类 + * + * @author binlin + */ +public class FileUploadUtils { + /** + * 默认大小 50M + */ + public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024; + + /** + * 默认的文件名最大长度 100 + */ + public static final int DEFAULT_FILE_NAME_LENGTH = 100; + + /** + * 默认上传的地址 + */ + private static String defaultBaseDir = EBTSConfig.getProfile(); + + public static void setDefaultBaseDir(String defaultBaseDir) { + FileUploadUtils.defaultBaseDir = defaultBaseDir; + } + + public static String getDefaultBaseDir() { + return defaultBaseDir; + } + + /** + * 以默认配置进行文件上传 + * + * @param file 上传的文件 + * @return 文件名称 + * @throws Exception + */ + public static final String upload(MultipartFile file) throws IOException { + try { + return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } catch (Exception e) { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 根据文件路径上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @return 文件名称 + * @throws IOException + */ + public static final String upload(String baseDir, MultipartFile file) throws IOException { + try { + return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + } catch (Exception e) { + throw new IOException(e.getMessage(), e); + } + } + + /** + * 文件上传 + * + * @param baseDir 相对应用的基目录 + * @param file 上传的文件 + * @param allowedExtension 上传文件类型 + * @return 返回上传成功的文件名 + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws FileNameLengthLimitExceededException 文件名太长 + * @throws IOException 比如读写文件出错时 + * @throws InvalidExtensionException 文件校验异常 + */ + public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, InvalidExtensionException { + int fileNamelength = file.getOriginalFilename().length(); + if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) { + throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); + } + + assertAllowed(file, allowedExtension); + + String fileName = extractFilename(file); + + File desc = getAbsoluteFile(baseDir, fileName); + // todo 写入到硬盘 + file.transferTo(desc); + String pathFileName = getPathFileName(baseDir, fileName); + return pathFileName; + } + + /** + * 编码文件名 + */ + public static final String extractFilename(MultipartFile file) { + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + + fileName = DateUtils.datePath() + "/" + fileName; + // todo IdUtils.fastUUID() 获取文件映射名 +// fileName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension; + return fileName; + } + + private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException { + File desc = new File(uploadDir + File.separator + fileName); + + if (!desc.getParentFile().exists()) { + desc.getParentFile().mkdirs(); + } + if (!desc.exists()) { + desc.createNewFile(); + } + return desc; + } + + /** + * @param uploadDir + * @param fileName + * @return + * @throws IOException + */ + private static final String getPathFileName(String uploadDir, String fileName) throws IOException { + int dirLastIndex = EBTSConfig.getProfile().length() + 1; + String currentDir = StringUtils.substring(uploadDir, dirLastIndex); + String pathFileName = Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; + return pathFileName; + } + + /** + * 文件大小校验 + * + * @param file 上传的文件 + * @return + * @throws FileSizeLimitExceededException 如果超出最大大小 + * @throws InvalidExtensionException + */ + public static final void assertAllowed(MultipartFile file, String[] allowedExtension) + throws FileSizeLimitExceededException, InvalidExtensionException { + long size = file.getSize(); + if (DEFAULT_MAX_SIZE != -1 && size > DEFAULT_MAX_SIZE) { + throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); + } + + String fileName = file.getOriginalFilename(); + String extension = getExtension(file); + if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) { + if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) { + throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, + fileName); + } else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) { + throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, + fileName); + } else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) { + throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, + fileName); + } else { + throw new InvalidExtensionException(allowedExtension, extension, fileName); + } + } + } + + /** + * 判断MIME类型是否是允许的MIME类型 + * + * @param extension + * @param allowedExtension + * @return + */ + public static final boolean isAllowedExtension(String extension, String[] allowedExtension) { + for (String str : allowedExtension) { + if (str.equalsIgnoreCase(extension)) { + return true; + } + } + return false; + } + + /** + * 获取文件名的后缀 + * + * @param file 表单文件 + * @return 后缀名 + */ + public static final String getExtension(MultipartFile file) { + String extension = FilenameUtils.getExtension(file.getOriginalFilename()); + if (StringUtils.isEmpty(extension)) { + extension = MimeTypeUtils.getExtension(file.getContentType()); + } + return extension; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/file/FileUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/file/FileUtils.java new file mode 100644 index 0000000..281c6a6 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/file/FileUtils.java @@ -0,0 +1,115 @@ +package com.ebts.common.utils.file; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import javax.servlet.http.HttpServletRequest; + +/** + * 文件处理工具类 + * + * @author binlin + */ +public class FileUtils extends org.apache.commons.io.FileUtils { + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; + + /** + * 输出指定文件的byte数组 + * + * @param filePath 文件路径 + * @param os 输出流 + * @return + */ + public static void writeBytes(String filePath, OutputStream os) throws IOException { + FileInputStream fis = null; + try { + File file = new File(filePath); + if (!file.exists()) { + throw new FileNotFoundException(filePath); + } + fis = new FileInputStream(file); + byte[] b = new byte[1024]; + int length; + while ((length = fis.read(b)) > 0) { + os.write(b, 0, length); + } + } catch (IOException e) { + throw e; + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + if (fis != null) { + try { + fis.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + } + } + + /** + * 删除文件 + * + * @param filePath 文件 + * @return + */ + public static boolean deleteFile(String filePath) { + boolean flag = false; + File file = new File(filePath); + // 路径为文件且不为空则进行删除 + if (file.isFile() && file.exists()) { + System.gc(); + file.delete(); + flag = true; + } + return flag; + } + + /** + * 文件名称验证 + * + * @param filename 文件名称 + * @return true 正常 false 非法 + */ + public static boolean isValidFilename(String filename) { + return filename.matches(FILENAME_PATTERN); + } + + /** + * 下载文件名重新编码 + * + * @param request 请求对象 + * @param fileName 文件名 + * @return 编码后的文件名 + */ + public static String setFileDownloadHeader(HttpServletRequest request, String fileName) + throws UnsupportedEncodingException { + final String agent = request.getHeader("USER-AGENT"); + String filename = fileName; + if (agent.contains("MSIE")) { + // IE浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + filename = filename.replace("+", " "); + } else if (agent.contains("Firefox")) { + // 火狐浏览器 + filename = new String(fileName.getBytes(), "ISO8859-1"); + } else if (agent.contains("Chrome")) { + // google浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } else { + // 其它浏览器 + filename = URLEncoder.encode(filename, "utf-8"); + } + return filename; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/file/MimeTypeUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/file/MimeTypeUtils.java new file mode 100644 index 0000000..4d0e93d --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/file/MimeTypeUtils.java @@ -0,0 +1,52 @@ +package com.ebts.common.utils.file; + +/** + * 媒体类型工具类 + * + * @author binlin + */ +public class MimeTypeUtils { + public static final String IMAGE_PNG = "image/png"; + + public static final String IMAGE_JPG = "image/jpg"; + + public static final String IMAGE_JPEG = "image/jpeg"; + + public static final String IMAGE_BMP = "image/bmp"; + + public static final String IMAGE_GIF = "image/gif"; + + public static final String[] IMAGE_EXTENSION = {"bmp", "gif", "jpg", "jpeg", "png"}; + + public static final String[] FLASH_EXTENSION = {"swf", "flv"}; + + public static final String[] MEDIA_EXTENSION = {"swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", + "asf", "rm", "rmvb"}; + + public static final String[] DEFAULT_ALLOWED_EXTENSION = { + // 图片 + "bmp", "gif", "jpg", "jpeg", "png", + // word excel powerpoint + "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", + // 压缩文件 + "rar", "zip", "gz", "bz2", + // pdf + "pdf"}; + + public static String getExtension(String prefix) { + switch (prefix) { + case IMAGE_PNG: + return "png"; + case IMAGE_JPG: + return "jpg"; + case IMAGE_JPEG: + return "jpeg"; + case IMAGE_BMP: + return "bmp"; + case IMAGE_GIF: + return "gif"; + default: + return ""; + } + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/html/EscapeUtil.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/html/EscapeUtil.java new file mode 100644 index 0000000..f4e5c97 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/html/EscapeUtil.java @@ -0,0 +1,130 @@ +package com.ebts.common.utils.html; + +import com.ebts.common.utils.StringUtils; + +/** + * 转义和反转义工具类 + * + * @author binlin + */ +public class EscapeUtil { + public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)"; + + private static final char[][] TEXT = new char[64][]; + + static { + for (int i = 0; i < 64; i++) { + TEXT[i] = new char[]{(char) i}; + } + + // special HTML characters + TEXT['\''] = "'".toCharArray(); // 单引号 + TEXT['"'] = """.toCharArray(); // 单引号 + TEXT['&'] = "&".toCharArray(); // &符 + TEXT['<'] = "<".toCharArray(); // 小于号 + TEXT['>'] = ">".toCharArray(); // 大于号 + } + + /** + * 转义文本中的HTML字符为安全的字符 + * + * @param text 被转义的文本 + * @return 转义后的文本 + */ + public static String escape(String text) { + return encode(text); + } + + /** + * 还原被转义的HTML特殊字符 + * + * @param content 包含转义符的HTML内容 + * @return 转换后的字符串 + */ + public static String unescape(String content) { + return decode(content); + } + + /** + * 清除所有HTML标签,但是不删除标签内的内容 + * + * @param content 文本 + * @return 清除标签后的文本 + */ + public static String clean(String content) { + return new HTMLFilter().filter(content); + } + + /** + * Escape编码 + * + * @param text 被编码的文本 + * @return 编码后的字符 + */ + private static String encode(String text) { + int len; + if ((text == null) || ((len = text.length()) == 0)) { + return StringUtils.EMPTY; + } + StringBuilder buffer = new StringBuilder(len + (len >> 2)); + char c; + for (int i = 0; i < len; i++) { + c = text.charAt(i); + if (c < 64) { + buffer.append(TEXT[c]); + } else { + buffer.append(c); + } + } + return buffer.toString(); + } + + /** + * Escape解码 + * + * @param content 被转义的内容 + * @return 解码后的字符串 + */ + public static String decode(String content) { + if (StringUtils.isEmpty(content)) { + return content; + } + + StringBuilder tmp = new StringBuilder(content.length()); + int lastPos = 0, pos = 0; + char ch; + while (lastPos < content.length()) { + pos = content.indexOf("%", lastPos); + if (pos == lastPos) { + if (content.charAt(pos + 1) == 'u') { + ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16); + tmp.append(ch); + lastPos = pos + 6; + } else { + ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16); + tmp.append(ch); + lastPos = pos + 3; + } + } else { + if (pos == -1) { + tmp.append(content.substring(lastPos)); + lastPos = content.length(); + } else { + tmp.append(content.substring(lastPos, pos)); + lastPos = pos; + } + } + } + return tmp.toString(); + } + + public static void main(String[] args) { + String html = ""; + // String html = "ipt>alert(\"XSS\")ipt>"; + // String html = "<123"; + // String html = "123>"; + System.out.println(EscapeUtil.clean(html)); + System.out.println(EscapeUtil.escape(html)); + System.out.println(EscapeUtil.unescape(html)); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/html/HTMLFilter.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/html/HTMLFilter.java new file mode 100644 index 0000000..56239b9 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/html/HTMLFilter.java @@ -0,0 +1,501 @@ +package com.ebts.common.utils.html; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * HTML过滤器,用于去除XSS漏洞隐患。 + * + * @author binlin + */ +public final class HTMLFilter { + /** + * regex flag union representing /si modifiers in php + **/ + private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL; + private static final Pattern P_COMMENTS = Pattern.compile("", Pattern.DOTALL); + private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI); + private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL); + private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI); + private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI); + private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI); + private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI); + private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI); + private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?"); + private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?"); + private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?"); + private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))"); + private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL); + private static final Pattern P_END_ARROW = Pattern.compile("^>"); + private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)"); + private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)"); + private static final Pattern P_AMP = Pattern.compile("&"); + private static final Pattern P_QUOTE = Pattern.compile("\""); + private static final Pattern P_LEFT_ARROW = Pattern.compile("<"); + private static final Pattern P_RIGHT_ARROW = Pattern.compile(">"); + private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>"); + + // @xxx could grow large... maybe use sesat's ReferenceMap + private static final ConcurrentMap P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>(); + private static final ConcurrentMap P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>(); + + /** + * set of allowed html elements, along with allowed attributes for each element + **/ + private final Map> vAllowed; + /** + * counts of open tags for each (allowable) html element + **/ + private final Map vTagCounts = new HashMap<>(); + + /** + * html elements which must always be self-closing (e.g. "") + **/ + private final String[] vSelfClosingTags; + /** + * html elements which must always have separate opening and closing tags (e.g. "") + **/ + private final String[] vNeedClosingTags; + /** + * set of disallowed html elements + **/ + private final String[] vDisallowed; + /** + * attributes which should be checked for valid protocols + **/ + private final String[] vProtocolAtts; + /** + * allowed protocols + **/ + private final String[] vAllowedProtocols; + /** + * tags which should be removed if they contain no content (e.g. "" or "") + **/ + private final String[] vRemoveBlanks; + /** + * entities allowed within html markup + **/ + private final String[] vAllowedEntities; + /** + * flag determining whether comments are allowed in input String. + */ + private final boolean stripComment; + private final boolean encodeQuotes; + /** + * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "" + * becomes " text "). If set to false, unbalanced angle brackets will be html escaped. + */ + private final boolean alwaysMakeTags; + + /** + * Default constructor. + */ + public HTMLFilter() { + vAllowed = new HashMap<>(); + + final ArrayList a_atts = new ArrayList<>(); + a_atts.add("href"); + a_atts.add("target"); + vAllowed.put("a", a_atts); + + final ArrayList img_atts = new ArrayList<>(); + img_atts.add("src"); + img_atts.add("width"); + img_atts.add("height"); + img_atts.add("alt"); + vAllowed.put("img", img_atts); + + final ArrayList no_atts = new ArrayList<>(); + vAllowed.put("b", no_atts); + vAllowed.put("strong", no_atts); + vAllowed.put("i", no_atts); + vAllowed.put("em", no_atts); + + vSelfClosingTags = new String[]{"img"}; + vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"}; + vDisallowed = new String[]{}; + vAllowedProtocols = new String[]{"http", "mailto", "https"}; // no ftp. + vProtocolAtts = new String[]{"src", "href"}; + vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"}; + vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"}; + stripComment = true; + encodeQuotes = true; + alwaysMakeTags = false; + } + + /** + * Map-parameter configurable constructor. + * + * @param conf map containing configuration. keys match field names. + */ + @SuppressWarnings("unchecked") + public HTMLFilter(final Map conf) { + + assert conf.containsKey("vAllowed") : "configuration requires vAllowed"; + assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags"; + assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags"; + assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed"; + assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols"; + assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts"; + assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks"; + assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities"; + + vAllowed = Collections.unmodifiableMap((HashMap>) conf.get("vAllowed")); + vSelfClosingTags = (String[]) conf.get("vSelfClosingTags"); + vNeedClosingTags = (String[]) conf.get("vNeedClosingTags"); + vDisallowed = (String[]) conf.get("vDisallowed"); + vAllowedProtocols = (String[]) conf.get("vAllowedProtocols"); + vProtocolAtts = (String[]) conf.get("vProtocolAtts"); + vRemoveBlanks = (String[]) conf.get("vRemoveBlanks"); + vAllowedEntities = (String[]) conf.get("vAllowedEntities"); + stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true; + encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true; + 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) { + return String.valueOf((char) decimal); + } + + public static String htmlSpecialChars(final String s) { + String result = s; + result = regexReplace(P_AMP, "&", result); + result = regexReplace(P_QUOTE, """, result); + result = regexReplace(P_LEFT_ARROW, "<", result); + result = regexReplace(P_RIGHT_ARROW, ">", result); + return result; + } + + // --------------------------------------------------------------- + + /** + * given a user submitted input String, filter out any invalid or restricted html. + * + * @param input text (i.e. submitted by a user) than may contain html + * @return "clean" version of input, with only valid, whitelisted html elements allowed + */ + public String filter(final String input) { + reset(); + String s = input; + + s = escapeComments(s); + + s = balanceHTML(s); + + s = checkTags(s); + + s = processRemoveBlanks(s); + + // s = validateEntities(s); + + return s; + } + + public boolean isAlwaysMakeTags() { + return alwaysMakeTags; + } + + public boolean isStripComments() { + return stripComment; + } + + private String escapeComments(final String s) { + final Matcher m = P_COMMENTS.matcher(s); + final StringBuffer buf = new StringBuffer(); + if (m.find()) { + final String match = m.group(1); // (.*?) + m.appendReplacement(buf, Matcher.quoteReplacement("")); + } + m.appendTail(buf); + + return buf.toString(); + } + + private String balanceHTML(String s) { + if (alwaysMakeTags) { + // + // try and form html + // + s = regexReplace(P_END_ARROW, "", s); + // 不追加结束标签 + s = regexReplace(P_BODY_TO_END, "<$1>", s); + s = regexReplace(P_XML_CONTENT, "$1<$2", s); + + } else { + // + // escape stray brackets + // + s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s); + s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s); + + // + // the last regexp causes '<>' entities to appear + // (we need to do a lookahead assertion so that the last bracket can + // be used in the next pass of the regexp) + // + s = regexReplace(P_BOTH_ARROWS, "", s); + } + + return s; + } + + private String checkTags(String s) { + Matcher m = P_TAGS.matcher(s); + + final StringBuffer buf = new StringBuffer(); + while (m.find()) { + String replaceStr = m.group(1); + replaceStr = processTag(replaceStr); + m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr)); + } + m.appendTail(buf); + + // these get tallied in processTag + // (remember to reset before subsequent calls to filter method) + final StringBuilder sBuilder = new StringBuilder(buf.toString()); + for (String key : vTagCounts.keySet()) { + for (int ii = 0; ii < vTagCounts.get(key); ii++) { + sBuilder.append(""); + } + } + s = sBuilder.toString(); + + return s; + } + + private String processRemoveBlanks(final String s) { + String result = s; + for (String tag : vRemoveBlanks) { + if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) { + P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?>")); + } + result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result); + if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) { + P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>")); + } + result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result); + } + + 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 + Matcher m = P_END_TAG.matcher(s); + if (m.find()) { + final String name = m.group(1).toLowerCase(); + if (allowed(name)) { + if (false == inArray(name, vSelfClosingTags)) { + if (vTagCounts.containsKey(name)) { + vTagCounts.put(name, vTagCounts.get(name) - 1); + return ""; + } + } + } + } + + // starting tags + m = P_START_TAG.matcher(s); + if (m.find()) { + final String name = m.group(1).toLowerCase(); + final String body = m.group(2); + String ending = m.group(3); + + // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" ); + if (allowed(name)) { + final StringBuilder params = new StringBuilder(); + + final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body); + final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body); + final List paramNames = new ArrayList<>(); + final List paramValues = new ArrayList<>(); + while (m2.find()) { + paramNames.add(m2.group(1)); // ([a-z0-9]+) + paramValues.add(m2.group(3)); // (.*?) + } + while (m3.find()) { + paramNames.add(m3.group(1)); // ([a-z0-9]+) + paramValues.add(m3.group(3)); // ([^\"\\s']+) + } + + String paramName, paramValue; + for (int ii = 0; ii < paramNames.size(); ii++) { + paramName = paramNames.get(ii).toLowerCase(); + paramValue = paramValues.get(ii); + + // debug( "paramName='" + paramName + "'" ); + // debug( "paramValue='" + paramValue + "'" ); + // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) ); + + if (allowedAttribute(name, paramName)) { + if (inArray(paramName, vProtocolAtts)) { + paramValue = processParamProtocol(paramValue); + } + params.append(' ').append(paramName).append("=\"").append(paramValue).append("\""); + } + } + + if (inArray(name, vSelfClosingTags)) { + ending = " /"; + } + + if (inArray(name, vNeedClosingTags)) { + ending = ""; + } + + if (ending == null || ending.length() < 1) { + if (vTagCounts.containsKey(name)) { + vTagCounts.put(name, vTagCounts.get(name) + 1); + } else { + vTagCounts.put(name, 1); + } + } else { + ending = " /"; + } + return "<" + name + params + ending + ">"; + } else { + return ""; + } + } + + // comments + m = P_COMMENT.matcher(s); + if (!stripComment && m.find()) { + return "<" + m.group() + ">"; + } + + return ""; + } + + private String processParamProtocol(String s) { + s = decodeEntities(s); + final Matcher m = P_PROTOCOL.matcher(s); + if (m.find()) { + final String protocol = m.group(1); + if (!inArray(protocol, vAllowedProtocols)) { + // bad protocol, turn into local anchor link instead + s = "#" + s.substring(protocol.length() + 1); + if (s.startsWith("#//")) { + s = "#" + s.substring(3); + } + } + } + + return s; + } + + private String decodeEntities(String s) { + StringBuffer buf = new StringBuffer(); + + Matcher m = P_ENTITY.matcher(s); + while (m.find()) { + final String match = m.group(1); + final int decimal = Integer.decode(match).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENTITY_UNICODE.matcher(s); + while (m.find()) { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + buf = new StringBuffer(); + m = P_ENCODE.matcher(s); + while (m.find()) { + final String match = m.group(1); + final int decimal = Integer.valueOf(match, 16).intValue(); + m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal))); + } + m.appendTail(buf); + s = buf.toString(); + + s = validateEntities(s); + return s; + } + + private String validateEntities(final String s) { + StringBuffer buf = new StringBuffer(); + + // validate entities throughout the string + Matcher m = P_VALID_ENTITIES.matcher(s); + while (m.find()) { + final String one = m.group(1); // ([^&;]*) + final String two = m.group(2); // (?=(;|&|$)) + m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two))); + } + m.appendTail(buf); + + return encodeQuotes(buf.toString()); + } + + private String encodeQuotes(final String s) { + if (encodeQuotes) { + StringBuffer buf = new StringBuffer(); + Matcher m = P_VALID_QUOTES.matcher(s); + while (m.find()) { + final String one = m.group(1); // (>|^) + final String two = m.group(2); // ([^<]+?) + final String three = m.group(3); // (<|$) + // 不替换双引号为",防止json格式无效 regexReplace(P_QUOTE, """, two) + m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three)); + } + m.appendTail(buf); + return buf.toString(); + } else { + return s; + } + } + + private String checkEntity(final String preamble, final String term) { + + return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble; + } + + private boolean isValidEntity(final String entity) { + 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); + } + + private boolean allowedAttribute(final String name, final String paramName) { + return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName)); + } +} \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/http/HttpHelper.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/http/HttpHelper.java new file mode 100644 index 0000000..a865416 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/http/HttpHelper.java @@ -0,0 +1,44 @@ +package com.ebts.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +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工具封装 + * + * @author binlin + */ +public class HttpHelper { + private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class); + + public static String getBodyString(ServletRequest request) { + StringBuilder sb = new StringBuilder(); + BufferedReader reader = null; + try (InputStream inputStream = request.getInputStream()) { + reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8"))); + String line = ""; + while ((line = reader.readLine()) != null) { + sb.append(line); + } + } catch (IOException e) { + LOGGER.warn("getBodyString出现问题!"); + } finally { + if (reader != null) { + try { + reader.close(); + } catch (IOException e) { + LOGGER.error(ExceptionUtils.getMessage(e)); + } + } + } + return sb.toString(); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/http/HttpUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/http/HttpUtils.java new file mode 100644 index 0000000..ecacc0f --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/http/HttpUtils.java @@ -0,0 +1,208 @@ +package com.ebts.common.utils.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +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.ebts.common.constant.Constants; + +/** + * 通用http发送方法 + * + * @author binlin + */ +public class HttpUtils { + private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param) { + return sendGet(url, param, Constants.UTF8); + } + + /** + * 向指定 URL 发送GET方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @param contentType 编码类型 + * @return 所代表远程资源的响应结果 + */ + public static String sendGet(String url, String param, String contentType) { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + try { + String urlNameString = url + "?" + param; + log.info("sendGet - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + connection.connect(); + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); + String line; + while ((line = in.readLine()) != null) { + result.append(line); + } + log.info("recv - {}", result); + } catch (ConnectException e) { + log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); + } catch (SocketTimeoutException e) { + log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); + } catch (IOException e) { + log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); + } catch (Exception e) { + log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception ex) { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + /** + * 向指定 URL 发送POST方法的请求 + * + * @param url 发送请求的 URL + * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 + * @return 所代表远程资源的响应结果 + */ + public static String sendPost(String url, String param) { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + try { + String urlNameString = url; + log.info("sendPost - {}", urlNameString); + URL realUrl = new URL(urlNameString); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8")); + String line; + while ((line = in.readLine()) != null) { + result.append(line); + } + log.info("recv - {}", result); + } catch (ConnectException e) { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } catch (SocketTimeoutException e) { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } catch (IOException e) { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } catch (Exception e) { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } finally { + try { + if (out != null) { + out.close(); + } + if (in != null) { + in.close(); + } + } catch (IOException ex) { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + } + return result.toString(); + } + + public static String sendSSLPost(String url, String param) { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + try { + log.info("sendSSLPost - {}", urlNameString); + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom()); + URL console = new URL(urlNameString); + HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("contentType", "utf-8"); + conn.setDoOutput(true); + conn.setDoInput(true); + + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String ret = ""; + while ((ret = br.readLine()) != null) { + if (ret != null && !"".equals(ret.trim())) { + result.append(new String(ret.getBytes("ISO-8859-1"), "utf-8")); + } + } + log.info("recv - {}", result); + conn.disconnect(); + br.close(); + } catch (ConnectException e) { + log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); + } catch (SocketTimeoutException e) { + log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } catch (IOException e) { + log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); + } catch (Exception e) { + log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); + } + return result.toString(); + } + + private static class TrustAnyTrustManager implements X509TrustManager { + @Override + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + } +} \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/ip/AddressUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/ip/AddressUtils.java new file mode 100644 index 0000000..98c6de1 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/ip/AddressUtils.java @@ -0,0 +1,48 @@ +package com.ebts.common.utils.ip; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.alibaba.fastjson.JSONObject; +import com.ebts.common.config.EBTSConfig; +import com.ebts.common.constant.Constants; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.http.HttpUtils; + +/** + * 获取地址类 + * + * @author binlin + */ +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"; + + public static String getRealAddressByIP(String ip) { + String address = UNKNOWN; + // 内网不查询 + if (IpUtils.internalIp(ip)) { + return "内网IP"; + } + if (EBTSConfig.isAddressEnabled()) { + try { + String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); + if (StringUtils.isEmpty(rspStr)) { + log.error("获取地理位置异常 {}", ip); + return UNKNOWN; + } + JSONObject obj = JSONObject.parseObject(rspStr); + String region = obj.getString("pro"); + String city = obj.getString("city"); + return String.format("%s %s", region, city); + } catch (Exception e) { + log.error("获取地理位置异常 {}", ip); + } + } + return address; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/ip/IpUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/ip/IpUtils.java new file mode 100644 index 0000000..c11ac86 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/ip/IpUtils.java @@ -0,0 +1,166 @@ +package com.ebts.common.utils.ip; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import javax.servlet.http.HttpServletRequest; + +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.html.EscapeUtil; + +/** + * 获取IP方法 + * + * @author binlin + */ +public class IpUtils { + public static String getIpAddr(HttpServletRequest request) { + if (request == null) { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Real-IP"); + } + + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : EscapeUtil.clean(ip); + } + + public static boolean internalIp(String ip) { + byte[] addr = textToNumericFormatV4(ip); + return internalIp(addr) || "127.0.0.1".equals(ip); + } + + private static boolean internalIp(byte[] addr) { + if (StringUtils.isNull(addr) || addr.length < 2) { + return true; + } + final byte b0 = addr[0]; + final byte b1 = addr[1]; + // 10.x.x.x/8 + final byte SECTION_1 = 0x0A; + // 172.16.x.x/12 + final byte SECTION_2 = (byte) 0xAC; + final byte SECTION_3 = (byte) 0x10; + final byte SECTION_4 = (byte) 0x1F; + // 192.168.x.x/16 + final byte SECTION_5 = (byte) 0xC0; + final byte SECTION_6 = (byte) 0xA8; + switch (b0) { + case SECTION_1: + return true; + case SECTION_2: + if (b1 >= SECTION_3 && b1 <= SECTION_4) { + return true; + } + case SECTION_5: + switch (b1) { + case SECTION_6: + return true; + } + default: + return false; + } + } + + /** + * 将IPv4地址转换成字节 + * + * @param text IPv4地址 + * @return byte 字节 + */ + public static byte[] textToNumericFormatV4(String text) { + if (text.length() == 0) { + return null; + } + + byte[] bytes = new byte[4]; + String[] elements = text.split("\\.", -1); + try { + long l; + int i; + switch (elements.length) { + case 1: + l = Long.parseLong(elements[0]); + if ((l < 0L) || (l > 4294967295L)) { + return null; + } + bytes[0] = (byte) (int) (l >> 24 & 0xFF); + bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 2: + l = Integer.parseInt(elements[0]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[0] = (byte) (int) (l & 0xFF); + l = Integer.parseInt(elements[1]); + if ((l < 0L) || (l > 16777215L)) { + return null; + } + bytes[1] = (byte) (int) (l >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 3: + for (i = 0; i < 2; ++i) { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + l = Integer.parseInt(elements[2]); + if ((l < 0L) || (l > 65535L)) { + return null; + } + bytes[2] = (byte) (int) (l >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 4: + for (i = 0; i < 4; ++i) { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + break; + default: + return null; + } + } catch (NumberFormatException e) { + return null; + } + return bytes; + } + + public static String getHostIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + } + return "127.0.0.1"; + } + + public static String getHostName() { + try { + return InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + } + return "未知"; + } +} \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/poi/ExcelUtil.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/poi/ExcelUtil.java new file mode 100644 index 0000000..ff41896 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/poi/ExcelUtil.java @@ -0,0 +1,839 @@ +package com.ebts.common.utils.poi; + +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 org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.DateUtil; +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.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.CellRangeAddressList; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ebts.common.annotation.Excel; +import com.ebts.common.annotation.Excel.ColumnType; +import com.ebts.common.annotation.Excel.Type; +import com.ebts.common.annotation.Excels; +import com.ebts.common.config.EBTSConfig; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.text.Convert; +import com.ebts.common.exception.CustomException; +import com.ebts.common.utils.DateUtils; +import com.ebts.common.utils.DictUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.reflect.ReflectUtils; + +/** + * Excel相关处理 + * + * @author binlin + */ +public class ExcelUtil { + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表名称 + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数据;IMPORT:导入模板) + */ + private Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * 样式列表 + */ + private Map styles; + + /** + * 导入导出数据列表 + */ + private List list; + + /** + * 注解列表 + */ + private List fields; + + /** + * 统计列表 + */ + private Map statistics = new HashMap(); + + /** + * 数字格式 + */ + private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00"); + + /** + * 实体对象 + */ + public Class clazz; + + public ExcelUtil(Class clazz) { + this.clazz = clazz; + } + + public void init(List list, String sheetName, Type type) { + if (list == null) { + list = new ArrayList(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + createExcelField(); + createWorkbook(); + } + + /** + * 对excel表单默认第一个索引名转换成list + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(InputStream is) throws Exception { + return importExcel(StringUtils.EMPTY, is); + } + + /** + * 对excel表单指定表格索引名转换成list + * + * @param sheetName 表格索引名 + * @param is 输入流 + * @return 转换后集合 + */ + public List importExcel(String sheetName, InputStream is) throws Exception { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List list = new ArrayList(); + Sheet sheet = null; + if (StringUtils.isNotEmpty(sheetName)) { + // 如果指定sheet名,则取指定sheet中的内容. + sheet = wb.getSheet(sheetName); + } else { + // 如果传入的sheet名不存在则默认指向第1个sheet. + sheet = wb.getSheetAt(0); + } + + if (sheet == null) { + throw new IOException("文件sheet不存在"); + } + + int rows = sheet.getPhysicalNumberOfRows(); + + if (rows > 0) { + // 定义一个map用于存放excel列的序号和field. + Map cellMap = new HashMap(); + // 获取表头 + Row heard = sheet.getRow(0); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell)) { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } else { + cellMap.put(null, i); + } + } + // 有数据时才处理 得到类的所有field. + Field[] allFields = clazz.getDeclaredFields(); + // 定义一个map用于存放列的序号和field. + Map fieldsMap = new HashMap(); + for (int col = 0; col < allFields.length; col++) { + Field field = allFields[col]; + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) { + // 设置类的私有字段属性可访问. + field.setAccessible(true); + Integer column = cellMap.get(attr.name()); + if (column != null) { + fieldsMap.put(column, field); + } + } + } + for (int i = 1; i < rows; i++) { + // 从第2行开始取数据,默认第一行是表头. + Row row = sheet.getRow(i); + T entity = null; + for (Map.Entry entry : fieldsMap.entrySet()) { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果不存在实例则新建. + entity = (entity == null ? clazz.newInstance() : entity); + // 从map中得到对应列的field. + Field field = fieldsMap.get(entry.getKey()); + // 取得类型,并根据对象类型设置值. + Class fieldType = field.getType(); + if (String.class == fieldType) { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) { + val = StringUtils.substringBefore(s, ".0"); + } else { + val = Convert.toStr(val); + } + } else if ((Integer.TYPE == fieldType || Integer.class == fieldType) && StringUtils.isNumeric(Convert.toStr(val))) { + val = Convert.toInt(val); + } else if (Long.TYPE == fieldType || Long.class == fieldType) { + val = Convert.toLong(val); + } else if (Double.TYPE == fieldType || Double.class == fieldType) { + val = Convert.toDouble(val); + } else if (Float.TYPE == fieldType || Float.class == fieldType) { + val = Convert.toFloat(val); + } else if (BigDecimal.class == fieldType) { + val = Convert.toBigDecimal(val); + } else if (Date.class == fieldType) { + if (val instanceof String) { + val = DateUtils.parseDate(val); + } else if (val instanceof Double) { + val = DateUtil.getJavaDate((Double) val); + } + } + if (StringUtils.isNotNull(fieldType)) { + Excel attr = field.getAnnotation(Excel.class); + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) { + propertyName = field.getName() + "." + attr.targetAttr(); + } else if (StringUtils.isNotEmpty(attr.readConverterExp())) { + val = reverseByExp(Convert.toStr(val), attr.readConverterExp(), attr.separator()); + } else if (StringUtils.isNotEmpty(attr.dictType())) { + val = reverseDictByExp(Convert.toStr(val), attr.dictType(), attr.separator()); + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult exportExcel(List list, String sheetName) { + this.init(list, sheetName, Type.EXPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @param sheetName 工作表的名称 + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName) { + this.init(null, sheetName, Type.IMPORT); + return exportExcel(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单 + * + * @return 结果 + */ + public AjaxResult exportExcel() { + OutputStream out = null; + try { + // 取出一共有多少个sheet. + double sheetNo = Math.ceil(list.size() / sheetSize); + for (int index = 0; index <= sheetNo; index++) { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(0); + int column = 0; + // 写入各个字段的列头名称 + for (Object[] os : fields) { + Excel excel = (Excel) os[1]; + this.createCell(excel, row, column++); + } + if (Type.EXPORT.equals(type)) { + fillExcelData(index, row); + addStatisticsRow(); + } + } + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } catch (Exception e) { + log.error("导出Excel异常{}", e.getMessage()); + throw new CustomException("导出Excel失败,请联系网站管理员!"); + } finally { + if (wb != null) { + try { + wb.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + if (out != null) { + try { + out.close(); + } catch (IOException e1) { + e1.printStackTrace(); + } + } + } + } + + /** + * 填充excel数据 + * + * @param index 序号 + * @param row 单元格行 + */ + public void fillExcelData(int index, Row row) { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + for (int i = startNo; i < endNo; i++) { + row = sheet.createRow(i + 1 - startNo); + // 得到导出对象. + T vo = (T) list.get(i); + int column = 0; + for (Object[] os : fields) { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + // 设置实体类私有属性可访问 + field.setAccessible(true); + this.addCell(excel, row, vo, field, column++); + } + } + } + + /** + * 创建表格样式 + * + * @param wb 工作薄对象 + * @return 样式列表 + */ + private Map createStyles(Workbook wb) { + // 写入各条记录,每条记录对应excel表中的一行 + Map styles = new HashMap(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(IndexedColors.WHITE.getIndex()); + style.setFont(headerFont); + styles.put("header", style); + + style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + Font totalFont = wb.createFont(); + totalFont.setFontName("Arial"); + totalFont.setFontHeightInPoints((short) 10); + style.setFont(totalFont); + styles.put("total", style); + + return styles; + } + + /** + * 创建单元格 + */ + public Cell createCell(Excel attr, Row row, int column) { + // 创建列 + Cell cell = row.createCell(column); + // 写入列信息 + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get("header")); + return cell; + } + + /** + * 设置单元格信息 + * + * @param value 单元格值 + * @param attr 注解相关 + * @param cell 单元格信息 + */ + public void setCellVo(Object value, Excel attr, Cell cell) { + if (ColumnType.STRING == attr.cellType()) { + cell.setCellType(CellType.STRING); + cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix()); + } else if (ColumnType.NUMERIC == attr.cellType()) { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value)); + } + } + + /** + * 创建表格样式 + */ + public void setDataValidation(Excel attr, Row row, int column) { + String a = attr.name(); + if (attr.name().indexOf("注:") >= 0) { + sheet.setColumnWidth(column, 6000); + } else { + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); + row.setHeight((short) (attr.height() * 20)); + } + // 如果设置了提示信息则鼠标放上去提示. + if (StringUtils.isNotEmpty(attr.prompt())) { + // 这里默认设了2-101列提示. + setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column); + } + // 如果设置了combo属性则本列只能选择不能输入 + if (attr.combo().length > 0) { + // 这里默认设了2-101列只能选择不能输入. + setXSSFValidation(sheet, attr.combo(), 1, 100, column, column); + } + } + + /** + * 添加单元格 + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) { + Cell cell = null; + try { + // 设置行高 + row.setHeight((short) (attr.height() * 20)); + // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列. + if (attr.isExport()) { + // 创建cell + cell = row.createCell(column); + cell.setCellStyle(styles.get("data")); + + // 用于读取对象中的属性 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + String separator = attr.separator(); + String dictType = attr.dictType(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) { + cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); + } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) { + cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + } else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) { + cell.setCellValue(convertDictByExp(Convert.toStr(value), dictType, separator)); + } else if (value instanceof BigDecimal && -1 != attr.scale()) { + cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).toString()); + } else { + // 设置列类型 + setCellVo(value, attr, cell); + } + addStatisticsData(column, Convert.toStr(value), attr); + } + } catch (Exception e) { + log.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 设置 POI XSSFSheet 单元格提示 + * + * @param sheet 表单 + * @param promptTitle 提示标题 + * @param promptContent 提示内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + */ + public void setXSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + dataValidation.createPromptBox(promptTitle, promptContent); + dataValidation.setShowPromptBox(true); + sheet.addValidationData(dataValidation); + } + + /** + * 设置某些列的值只能输入预制的数据,显示下拉框. + * + * @param sheet 要设置的sheet. + * @param textlist 下拉框显示的内容 + * @param firstRow 开始行 + * @param endRow 结束行 + * @param firstCol 开始列 + * @param endCol 结束列 + * @return 设置好的sheet. + */ + public void setXSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) { + DataValidationHelper helper = sheet.getDataValidationHelper(); + // 加载下拉列表内容 + DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist); + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // 数据有效性对象 + DataValidation dataValidation = helper.createValidation(constraint, regions); + // 处理Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } else { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + } + + /** + * 解析导出值 0=男,1=女,2=未知 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String convertByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[0].equals(value)) { + propertyString.append(itemArray[1] + separator); + break; + } + } + } else { + if (itemArray[0].equals(propertyValue)) { + return itemArray[1]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 反向解析值 男=0,女=1,未知=2 + * + * @param propertyValue 参数值 + * @param converterExp 翻译注解 + * @param separator 分隔符 + * @return 解析后值 + */ + public static String reverseByExp(String propertyValue, String converterExp, String separator) { + StringBuilder propertyString = new StringBuilder(); + String[] convertSource = converterExp.split(","); + for (String item : convertSource) { + String[] itemArray = item.split("="); + if (StringUtils.containsAny(separator, propertyValue)) { + for (String value : propertyValue.split(separator)) { + if (itemArray[1].equals(value)) { + propertyString.append(itemArray[0] + separator); + break; + } + } + } else { + if (itemArray[1].equals(propertyValue)) { + return itemArray[0]; + } + } + } + return StringUtils.stripEnd(propertyString.toString(), separator); + } + + /** + * 解析字典值 + * + * @param dictValue 字典值 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典标签 + */ + public static String convertDictByExp(String dictValue, String dictType, String separator) { + return DictUtils.getDictLabel(dictType, dictValue, separator); + } + + /** + * 反向解析值字典值 + * + * @param dictLabel 字典标签 + * @param dictType 字典类型 + * @param separator 分隔符 + * @return 字典值 + */ + public static String reverseDictByExp(String dictLabel, String dictType, String separator) { + return DictUtils.getDictValue(dictType, dictLabel, separator); + } + + /** + * 合计统计信息 + */ + private void addStatisticsData(Integer index, String text, Excel entity) { + if (entity != null && entity.isStatistics()) { + Double temp = 0D; + if (!statistics.containsKey(index)) { + statistics.put(index, temp); + } + try { + temp = Double.valueOf(text); + } catch (NumberFormatException e) { + } + statistics.put(index, statistics.get(index) + temp); + } + } + + /** + * 创建统计行 + */ + public void addStatisticsRow() { + if (statistics.size() > 0) { + Cell cell = null; + Row row = sheet.createRow(sheet.getLastRowNum() + 1); + Set keys = statistics.keySet(); + cell = row.createCell(0); + cell.setCellStyle(styles.get("total")); + cell.setCellValue("合计"); + + for (Integer key : keys) { + cell = row.createCell(key); + cell.setCellStyle(styles.get("total")); + cell.setCellValue(DOUBLE_FORMAT.format(statistics.get(key))); + } + statistics.clear(); + } + } + + /** + * 编码文件名 + */ + public String encodingFilename(String filename) { + filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获取下载路径 + * + * @param filename 文件名称 + */ + public String getAbsoluteFile(String filename) { + String downloadPath = EBTSConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获取bean中的属性值 + * + * @param vo 实体对象 + * @param field 字段 + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) { + String target = excel.targetAttr(); + if (target.indexOf(".") > -1) { + String[] targets = target.split("[.]"); + for (String name : targets) { + o = getValue(o, name); + } + } else { + o = getValue(o, target); + } + } + return o; + } + + /** + * 以类的属性的get方法方法形式获取值 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception { + if (StringUtils.isNotEmpty(name)) { + Class clazz = o.getClass(); + Field field = clazz.getDeclaredField(name); + field.setAccessible(true); + o = field.get(o); + } + return o; + } + + /** + * todo + * 得到所有定义字段 + */ + private void createExcelField() { + this.fields = new ArrayList(); + List tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) { + // 单注解 + if (field.isAnnotationPresent(Excel.class)) { + putToField(field, field.getAnnotation(Excel.class)); + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel excel : excels) { + putToField(field, excel); + } + } + } + this.fields = this.fields.stream().sorted(Comparator.comparing(objects -> ((Excel) objects[1]).sort())).collect(Collectors.toList()); + } + + /** + * 放到字段集合中 + */ + private void putToField(Field field, Excel attr) { + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) { + this.fields.add(new Object[]{field, attr}); + } + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() { + this.wb = new SXSSFWorkbook(500); + } + + /** + * 创建工作表 + * + * @param sheetNo sheet数量 + * @param index 序号 + */ + public void createSheet(double sheetNo, int index) { + this.sheet = wb.createSheet(); + this.styles = createStyles(wb); + // 设置工作表的名称. + if (sheetNo == 0) { + wb.setSheetName(index, sheetName); + } else { + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 获取单元格值 + * + * @param row 获取的行 + * @param column 获取单元格列号 + * @return 单元格值 + */ + public Object getCellValue(Row row, int column) { + if (row == null) { + return row; + } + Object val = ""; + try { + Cell cell = row.getCell(column); + if (StringUtils.isNotNull(cell)) { + if (cell.getCellTypeEnum() == CellType.NUMERIC || cell.getCellTypeEnum() == CellType.FORMULA) { + val = cell.getNumericCellValue(); + if (HSSFDateUtil.isCellDateFormatted(cell)) { + val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换 + } else { + if ((Double) val % 1 > 0) { + val = new BigDecimal(val.toString()); + } else { + val = new DecimalFormat("0").format(val); + } + } + } else if (cell.getCellTypeEnum() == CellType.STRING) { + val = cell.getStringCellValue(); + } else if (cell.getCellTypeEnum() == CellType.BOOLEAN) { + val = cell.getBooleanCellValue(); + } else if (cell.getCellTypeEnum() == CellType.ERROR) { + val = cell.getErrorCellValue(); + } + + } + } catch (Exception e) { + return val; + } + return val; + } +} \ No newline at end of file diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/reflect/ReflectUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/reflect/ReflectUtils.java new file mode 100644 index 0000000..299e0b6 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/reflect/ReflectUtils.java @@ -0,0 +1,327 @@ +package com.ebts.common.utils.reflect; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +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.ebts.common.core.text.Convert; +import com.ebts.common.utils.DateUtils; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + * @author binlin + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils { + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{}); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + */ + public static void invokeSetter(Object obj, String propertyName, E value) { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) { + if (i < names.length - 1) { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{}); + } else { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[]{value}); + } + } + } + + /** + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) { + Field field = getAccessibleField(obj, fieldName); + if (field == null) { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return null; + } + E result = null; + try { + result = (E) field.get(obj); + } catch (IllegalAccessException e) { + logger.error("不可能抛出的异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) { + Field field = getAccessibleField(obj, fieldName); + if (field == null) { + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return; + } + try { + field.set(obj, value); + } catch (IllegalAccessException e) { + logger.error("不可能抛出的异常: {}", e.getMessage()); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符. + * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. + * 同时匹配方法名+参数类型, + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) { + if (obj == null || methodName == null) { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try { + return (E) method.invoke(obj, args); + } catch (Exception e) { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符, + * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. + * 只匹配函数名,如果有多个同名函数调用第一个。 + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) { + // 如果为空不报错,直接返回空。 + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try { + // 类型转换(将参数数据类型转换为目标方法参数类型) + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) { + if (args[i] != null && !args[i].getClass().equals(cs[i])) { + if (cs[i] == String.class) { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } else if (cs[i] == Integer.class) { + args[i] = Convert.toInt(args[i]); + } else if (cs[i] == Long.class) { + args[i] = Convert.toLong(args[i]); + } else if (cs[i] == Double.class) { + args[i] = Convert.toDouble(args[i]); + } else if (cs[i] == Float.class) { + args[i] = Convert.toFloat(args[i]); + } else if (cs[i] == Date.class) { + if (args[i] instanceof String) { + args[i] = DateUtils.parseDate(args[i]); + } else { + args[i] = DateUtil.getJavaDate((Double) args[i]); + } + } + } + } + return (E) method.invoke(obj, args); + } catch (Exception e) { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + */ + public static Field getAccessibleField(final Object obj, final String fieldName) { + // 为空不报错。直接返回 null + if (obj == null) { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) { + try { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } catch (NoSuchFieldException e) { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 匹配函数名+参数类型。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) { + // 为空不报错。直接返回 null + if (obj == null) { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) { + try { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } catch (NoSuchMethodException e) { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 只匹配函数名。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) { + // 为空不报错。直接返回 null + if (obj == null) { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Method method) { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) { + method.setAccessible(true); + } + } + + /** + * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Field field) { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) { + field.setAccessible(true); + } + } + + /** + * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 + * 如无法找到, 返回Object.class. + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) { + return getClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. + * 如无法找到, 返回Object.class. + */ + public static Class getClassGenricType(final Class clazz, final int index) { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + public static Class getUserClass(Object instance) { + if (instance == null) { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) { + return superClass; + } + } + return clazz; + + } + + /** + * 将反射时的checked exception转换为unchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) { + return new IllegalArgumentException(msg, e); + } else if (e instanceof InvocationTargetException) { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/sign/Base64.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/sign/Base64.java new file mode 100644 index 0000000..f2371da --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/sign/Base64.java @@ -0,0 +1,253 @@ +package com.ebts.common.utils.sign; + +/** + * Base64工具类 + * + * @author binlin + */ +public final class Base64 { + static private final int BASELENGTH = 128; + static private final int LOOKUPLENGTH = 64; + static private final int TWENTYFOURBITGROUP = 24; + static private final int EIGHTBIT = 8; + static private final int SIXTEENBIT = 16; + static private final int FOURBYTE = 4; + static private final int SIGN = -128; + static private final char PAD = '='; + static final private byte[] base64Alphabet = new byte[BASELENGTH]; + static final private char[] lookUpBase64Alphabet = new char[LOOKUPLENGTH]; + + static { + for (int i = 0; i < BASELENGTH; ++i) { + base64Alphabet[i] = -1; + } + for (int i = 'Z'; i >= 'A'; i--) { + base64Alphabet[i] = (byte) (i - 'A'); + } + for (int i = 'z'; i >= 'a'; i--) { + base64Alphabet[i] = (byte) (i - 'a' + 26); + } + + for (int i = '9'; i >= '0'; i--) { + base64Alphabet[i] = (byte) (i - '0' + 52); + } + + base64Alphabet['+'] = 62; + base64Alphabet['/'] = 63; + + for (int i = 0; i <= 25; i++) { + lookUpBase64Alphabet[i] = (char) ('A' + i); + } + + for (int i = 26, j = 0; i <= 51; i++, j++) { + lookUpBase64Alphabet[i] = (char) ('a' + j); + } + + for (int i = 52, j = 0; i <= 61; i++, j++) { + lookUpBase64Alphabet[i] = (char) ('0' + j); + } + lookUpBase64Alphabet[62] = (char) '+'; + lookUpBase64Alphabet[63] = (char) '/'; + } + + private static boolean isWhiteSpace(char octect) { + return (octect == 0x20 || octect == 0xd || octect == 0xa || octect == 0x9); + } + + private static boolean isPad(char octect) { + return (octect == PAD); + } + + private static boolean isData(char octect) { + return (octect < BASELENGTH && base64Alphabet[octect] != -1); + } + + /** + * Encodes hex octects into Base64 + * + * @param binaryData Array containing binaryData + * @return Encoded Base64 array + */ + public static String encode(byte[] binaryData) { + if (binaryData == null) { + return null; + } + + int lengthDataBits = binaryData.length * EIGHTBIT; + if (lengthDataBits == 0) { + return ""; + } + + int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; + int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; + int numberQuartet = fewerThan24bits != 0 ? numberTriplets + 1 : numberTriplets; + char encodedData[] = null; + + encodedData = new char[numberQuartet * 4]; + + byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; + + int encodedIndex = 0; + int dataIndex = 0; + + for (int i = 0; i < numberTriplets; i++) { + b1 = binaryData[dataIndex++]; + b2 = binaryData[dataIndex++]; + b3 = binaryData[dataIndex++]; + + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + byte val3 = ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[(l << 2) | val3]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[b3 & 0x3f]; + } + + // form integral number of 6-bit groups + if (fewerThan24bits == EIGHTBIT) { + b1 = binaryData[dataIndex]; + k = (byte) (b1 & 0x03); + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[k << 4]; + encodedData[encodedIndex++] = PAD; + encodedData[encodedIndex++] = PAD; + } else if (fewerThan24bits == SIXTEENBIT) { + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + + encodedData[encodedIndex++] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex++] = lookUpBase64Alphabet[l << 2]; + encodedData[encodedIndex++] = PAD; + } + return new String(encodedData); + } + + /** + * Decodes Base64 data into octects + * + * @param encoded string containing Base64 data + * @return Array containind decoded data. + */ + public static byte[] decode(String encoded) { + if (encoded == null) { + return null; + } + + char[] base64Data = encoded.toCharArray(); + // remove white spaces + int len = removeWhiteSpace(base64Data); + + if (len % FOURBYTE != 0) { + return null;// should be divisible by four + } + + int numberQuadruple = (len / FOURBYTE); + + if (numberQuadruple == 0) { + return new byte[0]; + } + + byte decodedData[] = null; + byte b1 = 0, b2 = 0, b3 = 0, b4 = 0; + char d1 = 0, d2 = 0, d3 = 0, d4 = 0; + + int i = 0; + int encodedIndex = 0; + int dataIndex = 0; + decodedData = new byte[(numberQuadruple) * 3]; + + for (; i < numberQuadruple - 1; i++) { + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++])) + || !isData((d3 = base64Data[dataIndex++])) || !isData((d4 = base64Data[dataIndex++]))) { + return null; + } // if found "no data" just return null + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + } + + if (!isData((d1 = base64Data[dataIndex++])) || !isData((d2 = base64Data[dataIndex++]))) { + return null;// if found "no data" just return null + } + + b1 = base64Alphabet[d1]; + b2 = base64Alphabet[d2]; + + d3 = base64Data[dataIndex++]; + d4 = base64Data[dataIndex++]; + if (!isData((d3)) || !isData((d4))) {// Check if they are PAD characters + if (isPad(d3) && isPad(d4)) { + if ((b2 & 0xf) != 0)// last 4 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 1]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + return tmp; + } else if (!isPad(d3) && isPad(d4)) { + b3 = base64Alphabet[d3]; + if ((b3 & 0x3) != 0)// last 2 bits should be zero + { + return null; + } + byte[] tmp = new byte[i * 3 + 2]; + System.arraycopy(decodedData, 0, tmp, 0, i * 3); + tmp[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + tmp[encodedIndex] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + return tmp; + } else { + return null; + } + } else { // No PAD e.g 3cQl + b3 = base64Alphabet[d3]; + b4 = base64Alphabet[d4]; + decodedData[encodedIndex++] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex++] = (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex++] = (byte) (b3 << 6 | b4); + + } + return decodedData; + } + + /** + * remove WhiteSpace from MIME containing encoded Base64 data. + * + * @param data the byte array of base64 data (with WS) + * @return the new length + */ + private static int removeWhiteSpace(char[] data) { + if (data == null) { + return 0; + } + + // count characters that's not whitespace + int newSize = 0; + int len = data.length; + for (int i = 0; i < len; i++) { + if (!isWhiteSpace(data[i])) { + data[newSize++] = data[i]; + } + } + return newSize; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/sign/Md5Utils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/sign/Md5Utils.java new file mode 100644 index 0000000..c466ded --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/sign/Md5Utils.java @@ -0,0 +1,54 @@ +package com.ebts.common.utils.sign; + +import java.security.MessageDigest; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Md5加密方法 + * + * @author binlin + */ +public class Md5Utils { + private static final Logger log = LoggerFactory.getLogger(Md5Utils.class); + + private static byte[] md5(String s) { + MessageDigest algorithm; + try { + algorithm = MessageDigest.getInstance("MD5"); + algorithm.reset(); + algorithm.update(s.getBytes("UTF-8")); + byte[] messageDigest = algorithm.digest(); + return messageDigest; + } catch (Exception e) { + log.error("MD5 Error...", e); + } + return null; + } + + private static final String toHex(byte hash[]) { + if (hash == null) { + return null; + } + StringBuffer buf = new StringBuffer(hash.length * 2); + int i; + + for (i = 0; i < hash.length; i++) { + if ((hash[i] & 0xff) < 0x10) { + buf.append("0"); + } + buf.append(Long.toString(hash[i] & 0xff, 16)); + } + return buf.toString(); + } + + public static String hash(String s) { + try { + return new String(toHex(md5(s)).getBytes("UTF-8"), "UTF-8"); + } catch (Exception e) { + log.error("not supported charset...{}", e); + return s; + } + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/spring/SpringUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/spring/SpringUtils.java new file mode 100644 index 0000000..e0cfd1c --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/spring/SpringUtils.java @@ -0,0 +1,131 @@ +package com.ebts.common.utils.spring; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; +import com.ebts.common.utils.StringUtils; + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + * @author binlin + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ConfigurableListableBeanFactory beanFactory; + + 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; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws org.springframework.beans.BeansException + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws org.springframework.beans.BeansException + */ + public static T getBean(Class clz) throws BeansException { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) { + return (T) AopContext.currentProxy(); + } + + /** + * 获取当前的环境配置,无配置返回null + * + * @return 当前的环境配置 + */ + public static String[] getActiveProfiles() { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 获取当前的环境配置,当有多个环境配置时,只获取第一个 + * + * @return 当前的环境配置 + */ + public static String getActiveProfile() { + final String[] activeProfiles = getActiveProfiles(); + return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/sql/SqlUtil.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/sql/SqlUtil.java new file mode 100644 index 0000000..3eaae0c --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/sql/SqlUtil.java @@ -0,0 +1,33 @@ +package com.ebts.common.utils.sql; + +import com.ebts.common.exception.BaseException; +import com.ebts.common.utils.StringUtils; + +/** + * sql操作工具类 + * + * @author binlin + */ +public class SqlUtil { + /** + * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 检查字符,防止注入绕过 + */ + public static String escapeOrderBySql(String value) { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { + throw new BaseException("参数不符合规范,不能进行查询"); + } + return value; + } + + /** + * 验证 order by 语法是否符合规范 + */ + public static boolean isValidOrderBySql(String value) { + return value.matches(SQL_PATTERN); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/uuid/IdUtils.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/uuid/IdUtils.java new file mode 100644 index 0000000..1dcecd3 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/uuid/IdUtils.java @@ -0,0 +1,44 @@ +package com.ebts.common.utils.uuid; + +/** + * ID生成器工具类 + * + * @author binlin + */ +public class IdUtils { + /** + * 获取随机UUID + * + * @return 随机UUID + */ + public static String randomUUID() { + return UUID.randomUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线 + * + * @return 简化的UUID,去掉了横线 + */ + public static String simpleUUID() { + return UUID.randomUUID().toString(true); + } + + /** + * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 随机UUID + */ + public static String fastUUID() { + return UUID.fastUUID().toString(); + } + + /** + * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID + * + * @return 简化的UUID,去掉了横线 + */ + public static String fastSimpleUUID() { + return UUID.fastUUID().toString(true); + } +} diff --git a/ebts/ebts-common/src/main/java/com/ebts/common/utils/uuid/UUID.java b/ebts/ebts-common/src/main/java/com/ebts/common/utils/uuid/UUID.java new file mode 100644 index 0000000..be8b9a2 --- /dev/null +++ b/ebts/ebts-common/src/main/java/com/ebts/common/utils/uuid/UUID.java @@ -0,0 +1,441 @@ +package com.ebts.common.utils.uuid; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +import com.ebts.common.exception.UtilException; + +/** + * 提供通用唯一识别码(universally unique identifier)(UUID)实现 + * + * @author binlin + */ +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) { + long msb = 0; + long lsb = 0; + assert data.length == 16 : "data must be 16 bytes in length"; + for (int i = 0; i < 8; i++) { + msb = (msb << 8) | (data[i] & 0xff); + } + for (int i = 8; i < 16; i++) { + lsb = (lsb << 8) | (data[i] & 0xff); + } + this.mostSigBits = msb; + this.leastSigBits = lsb; + } + + /** + * 使用指定的数据构造新的 UUID。 + * + * @param mostSigBits 用于 {@code UUID} 的最高有效 64 位 + * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位 + */ + public UUID(long mostSigBits, long leastSigBits) { + this.mostSigBits = mostSigBits; + this.leastSigBits = leastSigBits; + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的本地线程伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID fastUUID() { + return randomUUID(false); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID() { + return randomUUID(true); + } + + /** + * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。 + * + * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能 + * @return 随机生成的 {@code UUID} + */ + public static UUID randomUUID(boolean isSecure) { + final Random ng = isSecure ? Holder.numberGenerator : getRandom(); + + byte[] randomBytes = new byte[16]; + ng.nextBytes(randomBytes); + randomBytes[6] &= 0x0f; /* clear version */ + randomBytes[6] |= 0x40; /* set to version 4 */ + randomBytes[8] &= 0x3f; /* clear variant */ + randomBytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(randomBytes); + } + + /** + * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。 + * + * @param name 用于构造 UUID 的字节数组。 + * @return 根据指定数组生成的 {@code UUID} + */ + public static UUID nameUUIDFromBytes(byte[] name) { + MessageDigest md; + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException nsae) { + throw new InternalError("MD5 not supported"); + } + byte[] md5Bytes = md.digest(name); + md5Bytes[6] &= 0x0f; /* clear version */ + md5Bytes[6] |= 0x30; /* set to version 3 */ + md5Bytes[8] &= 0x3f; /* clear variant */ + md5Bytes[8] |= 0x80; /* set to IETF variant */ + return new UUID(md5Bytes); + } + + /** + * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。 + * + * @param name 指定 {@code UUID} 字符串 + * @return 具有指定值的 {@code UUID} + * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常 + */ + public static UUID fromString(String name) { + String[] components = name.split("-"); + if (components.length != 5) { + throw new IllegalArgumentException("Invalid UUID string: " + name); + } + for (int i = 0; i < 5; i++) { + components[i] = "0x" + components[i]; + } + + long mostSigBits = Long.decode(components[0]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits <<= 16; + mostSigBits |= Long.decode(components[2]).longValue(); + + long leastSigBits = Long.decode(components[3]).longValue(); + leastSigBits <<= 48; + leastSigBits |= Long.decode(components[4]).longValue(); + + return new UUID(mostSigBits, leastSigBits); + } + + /** + * 返回此 UUID 的 128 位值中的最低有效 64 位。 + * + * @return 此 UUID 的 128 位值中的最低有效 64 位。 + */ + public long getLeastSignificantBits() { + return leastSigBits; + } + + /** + * 返回此 UUID 的 128 位值中的最高有效 64 位。 + * + * @return 此 UUID 的 128 位值中最高有效 64 位。 + */ + public long getMostSignificantBits() { + return mostSigBits; + } + + /** + * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。 + *

+ * 版本号具有以下含意: + *

    + *
  • 1 基于时间的 UUID + *
  • 2 DCE 安全 UUID + *
  • 3 基于名称的 UUID + *
  • 4 随机生成的 UUID + *
+ * + * @return 此 {@code UUID} 的版本号 + */ + public int version() { + // Version is bits masked by 0x000000000000F000 in MS long + return (int) ((mostSigBits >> 12) & 0x0f); + } + + /** + * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。 + *

+ * 变体号具有以下含意: + *

    + *
  • 0 为 NCS 向后兼容保留 + *
  • 2 IETF RFC 4122(Leach-Salz), 用于此类 + *
  • 6 保留,微软向后兼容 + *
  • 7 保留供以后定义使用 + *
+ * + * @return 此 {@code UUID} 相关联的变体号 + */ + public int variant() { + // This field is composed of a varying number of bits. + // 0 - - Reserved for NCS backward compatibility + // 1 0 - The IETF aka Leach-Salz variant (used by this class) + // 1 1 0 Reserved, Microsoft backward compatibility + // 1 1 1 Reserved for future definition. + return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); + } + + /** + * 与此 UUID 相关联的时间戳值。 + * + *

+ * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。
+ * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。 + * + *

+ * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。 + */ + public long timestamp() throws UnsupportedOperationException { + checkTimeBase(); + return (mostSigBits & 0x0FFFL) << 48// + | ((mostSigBits >> 16) & 0x0FFFFL) << 32// + | mostSigBits >>> 32; + } + + /** + * 与此 UUID 相关联的时钟序列值。 + * + *

+ * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。 + *

+ * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出 + * UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的时钟序列 + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public int clockSequence() throws UnsupportedOperationException { + checkTimeBase(); + return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); + } + + /** + * 与此 UUID 相关的节点值。 + * + *

+ * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。 + *

+ * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。
+ * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。 + * + * @return 此 {@code UUID} 的节点值 + * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1 + */ + public long node() throws UnsupportedOperationException { + checkTimeBase(); + return leastSigBits & 0x0000FFFFFFFFFFFFL; + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

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

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @return 此{@code UUID} 的字符串表现形式 + * @see #toString(boolean) + */ + @Override + public String toString() { + return toString(false); + } + + /** + * 返回此{@code UUID} 的字符串表现形式。 + * + *

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

+     * {@code
+     * UUID                   = ----
+     * time_low               = 4*
+     * time_mid               = 2*
+     * time_high_and_version  = 2*
+     * variant_and_sequence   = 2*
+     * node                   = 6*
+     * hexOctet               = 
+     * hexDigit               = [0-9a-fA-F]
+     * }
+     * 
+ * + * + * + * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串 + * @return 此{@code UUID} 的字符串表现形式 + */ + public String toString(boolean isSimple) { + final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); + // time_low + builder.append(digits(mostSigBits >> 32, 8)); + if (false == isSimple) { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (false == isSimple) { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (false == isSimple) { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (false == isSimple) { + builder.append('-'); + } + // node + builder.append(digits(leastSigBits, 12)); + + return builder.toString(); + } + + /** + * 返回此 UUID 的哈希码。 + * + * @return UUID 的哈希码值。 + */ + @Override + public int hashCode() { + long hilo = mostSigBits ^ leastSigBits; + return ((int) (hilo >> 32)) ^ (int) hilo; + } + + /** + * 将此对象与指定对象比较。 + *

+ * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。 + * + * @param obj 要与之比较的对象 + * @return 如果对象相同,则返回 {@code true};否则返回 {@code false} + */ + @Override + public boolean equals(Object obj) { + if ((null == obj) || (obj.getClass() != UUID.class)) { + return false; + } + UUID id = (UUID) obj; + return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); + } + + // Comparison Operations + + /** + * 将此 UUID 与指定的 UUID 比较。 + * + *

+ * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。 + * + * @param val 与此 UUID 比较的 UUID + * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。 + */ + @Override + public int compareTo(UUID val) { + // The ordering is intentionally set up so that the UUIDs + // can simply be numerically compared as two numbers + return (this.mostSigBits < val.mostSigBits ? -1 : // + (this.mostSigBits > val.mostSigBits ? 1 : // + (this.leastSigBits < val.leastSigBits ? -1 : // + (this.leastSigBits > val.leastSigBits ? 1 : // + 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 + */ + private void checkTimeBase() { + if (version() != 1) { + throw new UnsupportedOperationException("Not a time-based UUID"); + } + } + + /** + * 获取{@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(); + } +} diff --git a/ebts/ebts-framework/pom.xml b/ebts/ebts-framework/pom.xml new file mode 100644 index 0000000..92fc480 --- /dev/null +++ b/ebts/ebts-framework/pom.xml @@ -0,0 +1,71 @@ + + + + ebts + com.ebts + 1.0.0 + + 4.0.0 + + ebts-framework + + + framework框架核心 + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + com.alibaba + druid-spring-boot-starter + + + + + com.github.penggle + kaptcha + + + javax.servlet-api + javax.servlet + + + + + + + com.github.oshi + oshi-core + + + + + com.ebts + ebts-system + + + + + + com.ebts + ebts-generator + + + + + \ No newline at end of file diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/DataScopeAspect.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/DataScopeAspect.java new file mode 100644 index 0000000..189f3f7 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/DataScopeAspect.java @@ -0,0 +1,145 @@ +package com.ebts.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.ebts.common.annotation.DataScope; +import com.ebts.common.core.entity.BaseEntity; +import com.ebts.common.core.entity.entity.Role; +import com.ebts.common.core.entity.entity.User; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.utils.ServletUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.spring.SpringUtils; +import com.ebts.framework.web.service.TokenService; + +/** + * 数据过滤处理 + * + * @author binlin + */ +@Aspect +@Component +public class DataScopeAspect { + /** + * 全部数据权限 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 自定数据权限 + */ + public static final String DATA_SCOPE_CUSTOM = "2"; + + /** + * 部门数据权限 + */ + public static final String DATA_SCOPE_DEPT = "3"; + + /** + * 部门及以下数据权限 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + + /** + * 仅本人数据权限 + */ + public static final String DATA_SCOPE_SELF = "5"; + + /** + * 数据权限过滤关键字 + */ + public static final String DATA_SCOPE = "dataScope"; + + // 配置织入点 + @Pointcut("@annotation(com.ebts.common.annotation.DataScope)") + public void dataScopePointCut() { + } + + @Before("dataScopePointCut()") + public void doBefore(JoinPoint point) throws Throwable { + handleDataScope(point); + } + + protected void handleDataScope(final JoinPoint joinPoint) { + // 获得注解 + DataScope controllerDataScope = getAnnotationLog(joinPoint); + if (controllerDataScope == null) { + return; + } + // 获取当前的用户 + LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest()); + if (StringUtils.isNotNull(loginUser)) { + User currentUser = loginUser.getUser(); + // 如果是超级管理员,则不过滤数据 + if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin()) { + dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), + controllerDataScope.userAlias()); + } + } + } + + /** + * 数据范围过滤 + * + * @param joinPoint 切点 + * @param user 用户 + * @param userAlias 别名 + */ + public static void dataScopeFilter(JoinPoint joinPoint, User user, String deptAlias, String userAlias) { + StringBuilder sqlString = new StringBuilder(); + + for (Role role : user.getRoles()) { + String dataScope = role.getDataScope(); + if (DATA_SCOPE_ALL.equals(dataScope)) { + sqlString = new StringBuilder(); + break; + } else if (DATA_SCOPE_CUSTOM.equals(dataScope)) { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias, + role.getRoleId())); + } else if (DATA_SCOPE_DEPT.equals(dataScope)) { + sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId())); + } else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) { + sqlString.append(StringUtils.format( + " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )", + deptAlias, user.getDeptId(), user.getDeptId())); + } else if (DATA_SCOPE_SELF.equals(dataScope)) { + if (StringUtils.isNotBlank(userAlias)) { + sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId())); + } else { + // 数据权限为仅本人且没有userAlias别名不查询任何数据 + sqlString.append(" OR 1=0 "); + } + } + } + + if (StringUtils.isNotBlank(sqlString.toString())) { + Object params = joinPoint.getArgs()[0]; + if (StringUtils.isNotNull(params) && params instanceof BaseEntity) { + BaseEntity baseEntity = (BaseEntity) params; + baseEntity.getParams().put(DATA_SCOPE, " AND (" + sqlString.substring(4) + ")"); + } + } + } + + /** + * 是否存在注解,如果存在就获取 + */ + private DataScope getAnnotationLog(JoinPoint joinPoint) { + Signature signature = joinPoint.getSignature(); + MethodSignature methodSignature = (MethodSignature) signature; + Method method = methodSignature.getMethod(); + + if (method != null) { + return method.getAnnotation(DataScope.class); + } + return null; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/DataSourceAspect.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/DataSourceAspect.java new file mode 100644 index 0000000..782ce50 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/DataSourceAspect.java @@ -0,0 +1,64 @@ +package com.ebts.framework.aspectj; + +import java.util.Objects; + +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +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.core.annotation.AnnotationUtils; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import com.ebts.common.annotation.DataSource; +import com.ebts.common.utils.StringUtils; +import com.ebts.framework.datasource.DynamicDataSourceContextHolder; + +/** + * 多数据源处理 + * + * @author binlin + */ +@Aspect +@Order(1) +@Component +public class DataSourceAspect { + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Pointcut("@annotation(com.ebts.common.annotation.DataSource)" + + "|| @within(com.ebts.common.annotation.DataSource)") + public void dsPointCut() { + + } + + @Around("dsPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable { + DataSource dataSource = getDataSource(point); + + if (StringUtils.isNotNull(dataSource)) { + DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name()); + } + + try { + return point.proceed(); + } finally { + // 销毁数据源 在执行方法之后 + DynamicDataSourceContextHolder.clearDataSourceType(); + } + } + + /** + * 获取需要切换的数据源 + */ + public DataSource getDataSource(ProceedingJoinPoint point) { + MethodSignature signature = (MethodSignature) point.getSignature(); + DataSource dataSource = AnnotationUtils.findAnnotation(signature.getMethod(), DataSource.class); + if (Objects.nonNull(dataSource)) { + return dataSource; + } + + return AnnotationUtils.findAnnotation(signature.getDeclaringType(), DataSource.class); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/LogAspect.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/LogAspect.java new file mode 100644 index 0000000..2cdfe53 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/aspectj/LogAspect.java @@ -0,0 +1,197 @@ +package com.ebts.framework.aspectj; + +import java.lang.reflect.Method; +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.web.multipart.MultipartFile; +import org.springframework.web.servlet.HandlerMapping; +import com.alibaba.fastjson.JSON; +import com.ebts.common.annotation.Log; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.enums.BusinessStatus; +import com.ebts.common.enums.HttpMethod; +import com.ebts.common.utils.ServletUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.ip.IpUtils; +import com.ebts.common.utils.spring.SpringUtils; +import com.ebts.framework.dao.AsyncDao; +import com.ebts.framework.dao.factory.AsyncFactory; +import com.ebts.framework.web.service.TokenService; +import com.ebts.system.entity.OperLog; + +/** + * 操作日志记录处理 + * + * @author binlin + */ +@Aspect +@Component +public class LogAspect { + private static final Logger log = LoggerFactory.getLogger(LogAspect.class); + + // 配置织入点 + @Pointcut("@annotation(com.ebts.common.annotation.Log)") + public void logPointCut() { + } + + /** + * 处理完请求后执行 + * + * @param joinPoint 切点 + */ + @AfterReturning(pointcut = "logPointCut()", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) { + handleLog(joinPoint, null, jsonResult); + } + + /** + * 拦截异常操作 + * + * @param joinPoint 切点 + * @param e 异常 + */ + @AfterThrowing(value = "logPointCut()", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Exception e) { + handleLog(joinPoint, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult) { + try { + // 获得注解 + Log controllerLog = getAnnotationLog(joinPoint); + if (controllerLog == null) { + return; + } + + // 获取当前的用户 + LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest()); + + // *========数据库日志=========*// + OperLog operLog = new OperLog(); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + operLog.setOperIp(ip); + // 返回参数 + operLog.setJsonResult(JSON.toJSONString(jsonResult)); + + operLog.setOperUrl(ServletUtils.getRequest().getRequestURI()); + if (loginUser != null) { + operLog.setOperName(loginUser.getUsername()); + } + + if (e != null) { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); + } + // 设置方法名称 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setMethod(className + "." + methodName + "()"); + // 设置请求方式 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); + // 处理设置注解上的参数 + getControllerMethodDescription(joinPoint, controllerLog, operLog); + // 保存数据库 + AsyncDao.me().execute(AsyncFactory.recordOper(operLog)); + } catch (Exception exp) { + // 记录本地异常日志 + log.error("==前置通知异常=="); + log.error("异常信息:{}", exp.getMessage()); + exp.printStackTrace(); + } + } + + /** + * 获取注解中对方法的描述信息 用于Controller层注解 + * + * @param log 日志 + * @param operLog 操作日志 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, OperLog operLog) throws Exception { + // 设置action动作 + operLog.setBusinessType(log.businessType().ordinal()); + if (!operLog.getJsonResult().contains(":200")){ + operLog.setStatus(1); + } + // 设置标题 + operLog.setTitle(log.title()); + // 设置操作人类别 + operLog.setOperatorType(log.operatorType().ordinal()); + // 是否需要保存request,参数和值 + if (log.isSaveRequestData()) { + // 获取参数的信息,传入到数据库中。 + setRequestValue(joinPoint, operLog); + } + } + + /** + * 获取请求的参数,放到log中 + * + * @param operLog 操作日志 + * @throws Exception 异常 + */ + private void setRequestValue(JoinPoint joinPoint, OperLog operLog) throws Exception { + String requestMethod = operLog.getRequestMethod(); + if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) { + String params = argsArrayToString(joinPoint.getArgs()); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } else { + 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 params = ""; + if (paramsArray != null && paramsArray.length > 0) { + for (int i = 0; i < paramsArray.length; i++) { + if (!isFilterObject(paramsArray[i])) { + Object jsonObj = JSON.toJSON(paramsArray[i]); + params += jsonObj.toString() + " "; + } + } + } + return params.trim(); + } + + /** + * 判断是否需要过滤的对象。 + * + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + public boolean isFilterObject(final Object o) { + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ApplicationConfig.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ApplicationConfig.java new file mode 100644 index 0000000..634a2c6 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ApplicationConfig.java @@ -0,0 +1,29 @@ +package com.ebts.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; + +/** + * 程序注解配置 + * + * @author binlin + */ +@Configuration +// 表示通过aop框架暴露该代理对象,AopContext能够访问 +@EnableAspectJAutoProxy(exposeProxy = true) +// 指定要扫描的dao类的包的路径 +@MapperScan("com.ebts.**.dao") +public class ApplicationConfig { + /** + * 时区配置 + */ + @Bean + public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() { + return jacksonObjectMapperBuilder -> jacksonObjectMapperBuilder.timeZone(TimeZone.getDefault()); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/CaptchaConfig.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/CaptchaConfig.java new file mode 100644 index 0000000..0368f73 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/CaptchaConfig.java @@ -0,0 +1,82 @@ +package com.ebts.framework.config; + +import java.util.Properties; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; + +import static com.google.code.kaptcha.Constants.*; + +/** + * 验证码配置 + * + * @author binlin + */ +@Configuration +public class CaptchaConfig { + @Bean(name = "captchaProducer") + public DefaultKaptcha getKaptchaBean() { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } + + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() { + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + properties.setProperty(KAPTCHA_BORDER, "yes"); + // 边框颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); + // 验证码文本字符颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + // 验证码图片宽度 默认为200 + properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); + // 验证码图片高度 默认为50 + properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); + // 验证码文本字符大小 默认为40 + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); + // KAPTCHA_SESSION_KEY + properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); + // 验证码文本生成器 + properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ebts.framework.config.KaptchaTextCreator"); + // 验证码文本字符间距 默认为2 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); + // 验证码文本字符长度 默认为5 + properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); + // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) + properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); + // 验证码噪点颜色 默认为Color.BLACK + properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); + // 干扰实现类 + properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); + // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy + properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); + Config config = new Config(properties); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/DruidConfig.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/DruidConfig.java new file mode 100644 index 0000000..87a3036 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/DruidConfig.java @@ -0,0 +1,116 @@ +package com.ebts.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; +import com.alibaba.druid.util.Utils; +import com.ebts.common.enums.DataSourceType; +import com.ebts.common.utils.spring.SpringUtils; +import com.ebts.framework.config.properties.DruidProperties; +import com.ebts.framework.datasource.DynamicDataSource; + +/** + * druid 配置多数据源 + * + * @author binlin + */ +@Configuration +public class DruidConfig { + @Bean + @ConfigurationProperties("spring.datasource.druid.master") + public DataSource masterDataSource(DruidProperties druidProperties) { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean + @ConfigurationProperties("spring.datasource.druid.slave") + @ConditionalOnProperty(prefix = "spring.datasource.druid.slave", name = "enabled", havingValue = "true") + public DataSource slaveDataSource(DruidProperties druidProperties) { + DruidDataSource dataSource = DruidDataSourceBuilder.create().build(); + return druidProperties.dataSource(dataSource); + } + + @Bean(name = "dynamicDataSource") + @Primary + public DynamicDataSource dataSource(DataSource masterDataSource) { + Map targetDataSources = new HashMap<>(); + targetDataSources.put(DataSourceType.MASTER.name(), masterDataSource); + setDataSource(targetDataSources, DataSourceType.SLAVE.name(), "slaveDataSource"); + return new DynamicDataSource(masterDataSource, targetDataSources); + } + + /** + * 设置数据源 + * + * @param targetDataSources 备选数据源集合 + * @param sourceName 数据源名称 + * @param beanName bean名称 + */ + public void setDataSource(Map targetDataSources, String sourceName, String beanName) { + try { + DataSource dataSource = SpringUtils.getBean(beanName); + targetDataSources.put(sourceName, dataSource); + } catch (Exception e) { + } + } + + /** + * 去除监控页面底部的广告 + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + @Bean + @ConditionalOnProperty(name = "spring.datasource.druid.statViewServlet.enabled", havingValue = "true") + public FilterRegistrationBean removeDruidFilterRegistrationBean(DruidStatProperties properties) { + // 获取web监控页面的参数 + DruidStatProperties.StatViewServlet config = properties.getStatViewServlet(); + // 提取common.js的配置路径 + String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"; + String commonJsPattern = pattern.replaceAll("\\*", "js/common.js"); + final String filePath = "support/http/resources/js/common.js"; + // 创建filter进行过滤 + Filter filter = new Filter() { + @Override + public void init(javax.servlet.FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + chain.doFilter(request, response); + // 重置缓冲区,响应头不会被重置 + response.resetBuffer(); + // 获取common.js + String text = Utils.readFromResource(filePath); + // 正则替换banner, 除去底部的广告信息 + text = text.replaceAll("
", ""); + text = text.replaceAll("powered.*?shrek.wang", ""); + response.getWriter().write(text); + } + + @Override + public void destroy() { + } + }; + FilterRegistrationBean registrationBean = new FilterRegistrationBean(); + registrationBean.setFilter(filter); + registrationBean.addUrlPatterns(commonJsPattern); + return registrationBean; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/FastJson2JsonRedisSerializer.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/FastJson2JsonRedisSerializer.java new file mode 100644 index 0000000..fa8b04e --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/FastJson2JsonRedisSerializer.java @@ -0,0 +1,63 @@ +package com.ebts.framework.config; + +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; + +/** + * Redis使用FastJson序列化 + * + * @author binlin + */ +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(); + this.clazz = clazz; + } + + @Override + public byte[] serialize(T t) throws SerializationException { + if (t == null) { + return new byte[0]; + } + return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); + } + + @Override + public T deserialize(byte[] bytes) throws SerializationException { + if (bytes == null || bytes.length <= 0) { + return null; + } + String str = new String(bytes, DEFAULT_CHARSET); + + 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/ebts/ebts-framework/src/main/java/com/ebts/framework/config/FilterConfig.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/FilterConfig.java new file mode 100644 index 0000000..0204c14 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/FilterConfig.java @@ -0,0 +1,58 @@ +package com.ebts.framework.config; + +import java.util.HashMap; +import java.util.Map; +import javax.servlet.DispatcherType; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import com.ebts.common.filter.RepeatableFilter; +import com.ebts.common.filter.XssFilter; +import com.ebts.common.utils.StringUtils; + +/** + * Filter配置 + * + * @author binlin + */ +@Configuration +public class FilterConfig { + @Value("${xss.enabled}") + private String enabled; + + @Value("${xss.excludes}") + private String excludes; + + @Value("${xss.urlPatterns}") + private String urlPatterns; + + @SuppressWarnings({"rawtypes", "unchecked"}) + @Bean + public FilterRegistrationBean xssFilterRegistration() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new XssFilter()); + registration.addUrlPatterns(StringUtils.split(urlPatterns, ",")); + registration.setName("xssFilter"); + registration.setOrder(FilterRegistrationBean.HIGHEST_PRECEDENCE); + Map initParameters = new HashMap(); + initParameters.put("excludes", excludes); + initParameters.put("enabled", enabled); + registration.setInitParameters(initParameters); + return registration; + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + @Bean + public FilterRegistrationBean someFilterRegistration() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new RepeatableFilter()); + registration.addUrlPatterns("/*"); + registration.setName("repeatableFilter"); + registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); + return registration; + } + +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/KaptchaTextCreator.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/KaptchaTextCreator.java new file mode 100644 index 0000000..2e4d447 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/KaptchaTextCreator.java @@ -0,0 +1,61 @@ +package com.ebts.framework.config; + +import java.util.Random; + +import com.google.code.kaptcha.text.impl.DefaultTextCreator; + +/** + * 验证码文本生成器 + * + * @author binlin + */ +public class KaptchaTextCreator extends DefaultTextCreator { + private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); + + @Override + public String getText() { + Integer result = 0; + Random random = new Random(); + int x = random.nextInt(10); + int y = random.nextInt(10); + StringBuilder suChinese = new StringBuilder(); + int randomoperands = (int) Math.round(Math.random() * 2); + if (randomoperands == 0) { + result = x * y; + suChinese.append(CNUMBERS[x]); + suChinese.append("*"); + suChinese.append(CNUMBERS[y]); + } else if (randomoperands == 1) { + if (!(x == 0) && y % x == 0) { + result = y / x; + suChinese.append(CNUMBERS[y]); + suChinese.append("/"); + suChinese.append(CNUMBERS[x]); + } else { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + } else if (randomoperands == 2) { + if (x >= y) { + result = x - y; + suChinese.append(CNUMBERS[x]); + suChinese.append("-"); + suChinese.append(CNUMBERS[y]); + } else { + result = y - x; + suChinese.append(CNUMBERS[y]); + suChinese.append("-"); + suChinese.append(CNUMBERS[x]); + } + } else { + result = x + y; + suChinese.append(CNUMBERS[x]); + suChinese.append("+"); + suChinese.append(CNUMBERS[y]); + } + suChinese.append("=?@" + result); + return suChinese.toString(); + } +} \ No newline at end of file diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/MyBatisConfig.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/MyBatisConfig.java new file mode 100644 index 0000000..6278e78 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/MyBatisConfig.java @@ -0,0 +1,92 @@ +package com.ebts.framework.config; + +import java.io.IOException; +import java.util.ArrayList; +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; +import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +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; + +/** + * Mybatis支持*匹配扫描包 + * + * @author binlin + */ +@Configuration +public class MyBatisConfig { + @Autowired + private Environment env; + + static final String DEFAULT_RESOURCE_PATTERN = "**/*.class"; + + public static String setTypeAliasesPackage(String typeAliasesPackage) { + ResourcePatternResolver resolver = (ResourcePatternResolver) new PathMatchingResourcePatternResolver(); + MetadataReaderFactory metadataReaderFactory = new CachingMetadataReaderFactory(resolver); + List allResult = new ArrayList(); + try { + for (String aliasesPackage : typeAliasesPackage.split(",")) { + List result = new ArrayList(); + aliasesPackage = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + + ClassUtils.convertClassNameToResourcePath(aliasesPackage.trim()) + "/" + DEFAULT_RESOURCE_PATTERN; + Resource[] resources = resolver.getResources(aliasesPackage); + if (resources != null && resources.length > 0) { + MetadataReader metadataReader = null; + for (Resource resource : resources) { + if (resource.isReadable()) { + metadataReader = metadataReaderFactory.getMetadataReader(resource); + try { + result.add(Class.forName(metadataReader.getClassMetadata().getClassName()).getPackage().getName()); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + } + } + if (result.size() > 0) { + HashSet hashResult = new HashSet(result); + allResult.addAll(hashResult); + } + } + if (allResult.size() > 0) { + typeAliasesPackage = String.join(",", (String[]) allResult.toArray(new String[0])); + } else { + throw new RuntimeException("mybatis typeAliasesPackage 路径扫描错误,参数typeAliasesPackage:" + typeAliasesPackage + "未找到任何包"); + } + } catch (IOException e) { + e.printStackTrace(); + } + return typeAliasesPackage; + } + + @Bean + public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { + String typeAliasesPackage = env.getProperty("mybatis.typeAliasesPackage"); + String mapperLocations = env.getProperty("mybatis.mapperLocations"); + String configLocation = env.getProperty("mybatis.configLocation"); + typeAliasesPackage = setTypeAliasesPackage(typeAliasesPackage); + VFS.addImplClass(SpringBootVFS.class); + + final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); + sessionFactory.setDataSource(dataSource); + sessionFactory.setTypeAliasesPackage(typeAliasesPackage); + sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations)); + sessionFactory.setConfigLocation(new DefaultResourceLoader().getResource(configLocation)); + return sessionFactory.getObject(); + } +} \ No newline at end of file diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/RedisConfig.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/RedisConfig.java new file mode 100644 index 0000000..fcb9dc6 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/RedisConfig.java @@ -0,0 +1,41 @@ +package com.ebts.framework.config; + +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * redis配置 + * + * @author binlin + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport { + @Bean + @SuppressWarnings(value = {"unchecked", "rawtypes"}) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + serializer.setObjectMapper(mapper); + + template.setValueSerializer(serializer); + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.afterPropertiesSet(); + return template; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ResourcesConfig.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ResourcesConfig.java new file mode 100644 index 0000000..0072f7d --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ResourcesConfig.java @@ -0,0 +1,62 @@ +package com.ebts.framework.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +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 com.ebts.common.config.EBTSConfig; +import com.ebts.common.constant.Constants; +import com.ebts.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 通用配置 + * + * @author binlin + */ +@Configuration +public class ResourcesConfig implements WebMvcConfigurer { + @Autowired + private RepeatSubmitInterceptor repeatSubmitInterceptor; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + /** 本地文件上传路径 */ + registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**").addResourceLocations("file:" + EBTSConfig.getProfile() + "/"); + + /** swagger配置 */ + registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/"); + } + + /** + * 自定义拦截规则 + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**"); + } + + /** + * 跨域配置 + */ + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration config = new CorsConfiguration(); + config.setAllowCredentials(true); + // 设置访问源地址 + config.addAllowedOrigin("*"); + // 设置访问源请求头 + config.addAllowedHeader("*"); + // 设置访问源请求方法 + config.addAllowedMethod("*"); + // 对接口配置跨域设置 + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } +} \ No newline at end of file diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/SecurityConfig.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/SecurityConfig.java new file mode 100644 index 0000000..120dd35 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/SecurityConfig.java @@ -0,0 +1,143 @@ +package com.ebts.framework.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.http.HttpMethod; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +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.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.ebts.framework.security.filter.JwtAuthenticationTokenFilter; +import com.ebts.framework.security.handle.AuthenticationEntryPointImpl; +import com.ebts.framework.security.handle.LogoutSuccessHandlerImpl; + +/** + * spring security配置 + * + * @author binlin + */ +@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) +public class SecurityConfig extends WebSecurityConfigurerAdapter { + /** + * 自定义用户认证逻辑 + */ + @Autowired + private UserDetailsService userDetailsService; + + /** + * 认证失败处理类 + */ + @Autowired + private AuthenticationEntryPointImpl unauthorizedHandler; + + /** + * 退出处理类 + */ + @Autowired + private LogoutSuccessHandlerImpl logoutSuccessHandler; + + /** + * token认证过滤器 + */ + @Autowired + private JwtAuthenticationTokenFilter authenticationTokenFilter; + + /** + * 跨域过滤器 + */ + @Autowired + private CorsFilter corsFilter; + + /** + * 解决 无法直接注入 AuthenticationManager + * + * @return + * @throws Exception + */ + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + + /** + * anyRequest | 匹配所有请求路径 + * access | SpringEl表达式结果为true时可以访问 + * anonymous | 匿名可以访问 + * denyAll | 用户不能访问 + * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录) + * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问 + * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问 + * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问 + * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问 + * hasRole | 如果有参数,参数表示角色,则其角色可以访问 + * permitAll | 用户可以任意访问 + * rememberMe | 允许通过remember-me登录的用户访问 + * authenticated | 用户登录后可访问 + */ + @Override + protected void configure(HttpSecurity httpSecurity) throws Exception { + httpSecurity + // CSRF禁用,因为不使用session + .csrf().disable() + // 认证失败处理类 + .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() + // 基于token,所以不需要session + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() + // 过滤请求 + .authorizeRequests() + // 对于登录login 验证码captchaImage 允许匿名访问 + .antMatchers("/login", "/captchaImage").anonymous() + .antMatchers( + HttpMethod.GET, + "/*.html", + "/**/*.html", + "/**/*.css", + "/**/*.js" + ).permitAll() + .antMatchers("/profile/**").anonymous() + .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() + .antMatchers("/tests/**").anonymous() + .antMatchers("/system/file/download/**").anonymous() + // 除上面外的所有请求全部需要鉴权认证 + .anyRequest().authenticated() + .and() + .headers().frameOptions().disable(); + httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); + // 添加JWT filter + httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); + // 添加CORS filter + httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); + httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); + } + + + /** + * 强散列哈希加密实现 + */ + @Bean + public BCryptPasswordEncoder bCryptPasswordEncoder() { + return new BCryptPasswordEncoder(); + } + + /** + * 身份认证接口 + */ + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ServerConfig.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ServerConfig.java new file mode 100644 index 0000000..71e978a --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ServerConfig.java @@ -0,0 +1,30 @@ +package com.ebts.framework.config; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Component; +import com.ebts.common.utils.ServletUtils; + +/** + * 服务相关配置 + * + * @author binlin + */ +@Component +public class ServerConfig { + /** + * 获取完整的请求路径,包括:域名,端口,上下文访问路径 + * + * @return 服务地址 + */ + public String getUrl() { + 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/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ThreadPoolConfig.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ThreadPoolConfig.java new file mode 100644 index 0000000..473b985 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/ThreadPoolConfig.java @@ -0,0 +1,58 @@ +package com.ebts.framework.config; + +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 com.ebts.common.utils.Threads; + +/** + * 线程池配置 + * + * @author binlin + **/ +@Configuration +public class ThreadPoolConfig { + // 核心线程池大小 + private int corePoolSize = 50; + + // 最大可创建的线程数 + private int maxPoolSize = 200; + + // 队列最大长度 + private int queueCapacity = 1000; + + // 线程池维护线程所允许的空闲时间 + private int keepAliveSeconds = 300; + + @Bean(name = "threadPoolTaskExecutor") + public ThreadPoolTaskExecutor threadPoolTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setMaxPoolSize(maxPoolSize); + executor.setCorePoolSize(corePoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setKeepAliveSeconds(keepAliveSeconds); + // 线程池对拒绝任务(无线程可用)的处理策略 + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + return executor; + } + + /** + * 执行周期性或定时任务 + */ + @Bean(name = "scheduledExecutorService") + protected ScheduledExecutorService scheduledExecutorService() { + return new ScheduledThreadPoolExecutor(corePoolSize, + new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build()) { + @Override + protected void afterExecute(Runnable r, Throwable t) { + super.afterExecute(r, t); + Threads.printException(r, t); + } + }; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/config/properties/DruidProperties.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/properties/DruidProperties.java new file mode 100644 index 0000000..3477d35 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/config/properties/DruidProperties.java @@ -0,0 +1,75 @@ +package com.ebts.framework.config.properties; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import com.alibaba.druid.pool.DruidDataSource; + +/** + * druid 配置属性 + * + * @author binlin + */ +@Configuration +public class DruidProperties { + @Value("${spring.datasource.druid.initialSize}") + private int initialSize; + + @Value("${spring.datasource.druid.minIdle}") + private int minIdle; + + @Value("${spring.datasource.druid.maxActive}") + private int maxActive; + + @Value("${spring.datasource.druid.maxWait}") + private int maxWait; + + @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") + private int timeBetweenEvictionRunsMillis; + + @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") + private int minEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") + private int maxEvictableIdleTimeMillis; + + @Value("${spring.datasource.druid.validationQuery}") + private String validationQuery; + + @Value("${spring.datasource.druid.testWhileIdle}") + private boolean testWhileIdle; + + @Value("${spring.datasource.druid.testOnBorrow}") + private boolean testOnBorrow; + + @Value("${spring.datasource.druid.testOnReturn}") + private boolean testOnReturn; + + public DruidDataSource dataSource(DruidDataSource datasource) { + /** 配置初始化大小、最小、最大 */ + datasource.setInitialSize(initialSize); + datasource.setMaxActive(maxActive); + datasource.setMinIdle(minIdle); + + /** 配置获取连接等待超时的时间 */ + datasource.setMaxWait(maxWait); + + /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ + datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + + /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ + datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); + + /** + * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 + */ + datasource.setValidationQuery(validationQuery); + /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ + datasource.setTestWhileIdle(testWhileIdle); + /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnBorrow(testOnBorrow); + /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ + datasource.setTestOnReturn(testOnReturn); + return datasource; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/dao/AsyncDao.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/dao/AsyncDao.java new file mode 100644 index 0000000..5a15212 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/dao/AsyncDao.java @@ -0,0 +1,53 @@ +package com.ebts.framework.dao; + +import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import com.ebts.common.utils.Threads; +import com.ebts.common.utils.spring.SpringUtils; + +/** + * 异步任务管理器 + * + * @author binlin + */ +public class AsyncDao { + /** + * 操作延迟10毫秒 + */ + private final int OPERATE_DELAY_TIME = 10; + + /** + * 异步操作任务调度线程池 + */ + private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService"); + + /** + * 单例模式 + */ + private AsyncDao() { + } + + private static AsyncDao me = new AsyncDao(); + + public static AsyncDao me() { + return me; + } + + /** + * 执行任务 + * + * @param task 任务 + */ + public void execute(TimerTask task) { + executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS); + } + + /** + * 停止任务线程池 + */ + public void shutdown() { + Threads.shutdownAndAwaitTermination(executor); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/dao/ShutdownDao.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/dao/ShutdownDao.java new file mode 100644 index 0000000..fc59be7 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/dao/ShutdownDao.java @@ -0,0 +1,34 @@ +package com.ebts.framework.dao; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.annotation.PreDestroy; + +/** + * 确保应用退出时能关闭后台线程 + * + * @author binlin + */ +@Component +public class ShutdownDao { + private static final Logger logger = LoggerFactory.getLogger("sys-user"); + + @PreDestroy + public void destroy() { + shutdownAsyncManager(); + } + + /** + * 停止异步执行任务 + */ + private void shutdownAsyncManager() { + try { + logger.info("====关闭后台任务任务线程池===="); + AsyncDao.me().shutdown(); + } catch (Exception e) { + logger.error(e.getMessage(), e); + } + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/dao/factory/AsyncFactory.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/dao/factory/AsyncFactory.java new file mode 100644 index 0000000..3d82c4d --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/dao/factory/AsyncFactory.java @@ -0,0 +1,92 @@ +package com.ebts.framework.dao.factory; + +import java.util.TimerTask; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ebts.common.constant.Constants; +import com.ebts.common.utils.LogUtils; +import com.ebts.common.utils.ServletUtils; +import com.ebts.common.utils.ip.AddressUtils; +import com.ebts.common.utils.ip.IpUtils; +import com.ebts.common.utils.spring.SpringUtils; +import com.ebts.system.entity.Logininfor; +import com.ebts.system.entity.OperLog; +import com.ebts.system.service.LogininforService; +import com.ebts.system.service.OperLogService; +import eu.bitwalker.useragentutils.UserAgent; + +/** + * 异步工厂(产生任务用) + * + * @author binlin + */ +public class AsyncFactory { + private static final Logger sys_user_logger = LoggerFactory.getLogger("sys-user"); + + /** + * 记录登录信息 + * + * @param username 用户名 + * @param status 状态 + * @param message 消息 + * @param args 列表 + * @return 任务task + */ + public static TimerTask recordLogininfor(final String username, final String status, final String message, + final Object... args) { + final UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + final String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + return new TimerTask() { + @Override + public void run() { + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(LogUtils.getBlock(ip)); + s.append(address); + s.append(LogUtils.getBlock(username)); + s.append(LogUtils.getBlock(status)); + s.append(LogUtils.getBlock(message)); + // 打印信息到日志 + sys_user_logger.info(s.toString(), args); + // 获取客户端操作系统 + String os = userAgent.getOperatingSystem().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + Logininfor logininfor = new Logininfor(); + logininfor.setUserName(username); + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(message); + // 日志状态 + if (Constants.LOGIN_SUCCESS.equals(status) || Constants.LOGOUT.equals(status)) { + logininfor.setStatus(Constants.SUCCESS); + } else if (Constants.LOGIN_FAIL.equals(status)) { + logininfor.setStatus(Constants.FAIL); + } + // 插入数据 + SpringUtils.getBean(LogininforService.class).insertLogininfor(logininfor); + } + }; + } + + /** + * 操作日志记录 + * + * @param operLog 操作日志信息 + * @return 任务task + */ + public static TimerTask recordOper(final OperLog operLog) { + return new TimerTask() { + @Override + public void run() { + // 远程查询操作地点 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + SpringUtils.getBean(OperLogService.class).insertOperlog(operLog); + } + }; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/datasource/DynamicDataSource.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/datasource/DynamicDataSource.java new file mode 100644 index 0000000..55231cf --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/datasource/DynamicDataSource.java @@ -0,0 +1,24 @@ +package com.ebts.framework.datasource; + +import java.util.Map; +import javax.sql.DataSource; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * 动态数据源 + * + * @author binlin + */ +public class DynamicDataSource extends AbstractRoutingDataSource { + public DynamicDataSource(DataSource defaultTargetDataSource, Map targetDataSources) { + super.setDefaultTargetDataSource(defaultTargetDataSource); + super.setTargetDataSources(targetDataSources); + super.afterPropertiesSet(); + } + + @Override + protected Object determineCurrentLookupKey() { + return DynamicDataSourceContextHolder.getDataSourceType(); + } +} \ No newline at end of file diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/datasource/DynamicDataSourceContextHolder.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/datasource/DynamicDataSourceContextHolder.java new file mode 100644 index 0000000..7060598 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/datasource/DynamicDataSourceContextHolder.java @@ -0,0 +1,41 @@ +package com.ebts.framework.datasource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 数据源切换处理 + * + * @author binlin + */ +public class DynamicDataSourceContextHolder { + public static final Logger log = LoggerFactory.getLogger(DynamicDataSourceContextHolder.class); + + /** + * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本, + * 所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 + */ + private static final ThreadLocal CONTEXT_HOLDER = new ThreadLocal<>(); + + /** + * 设置数据源的变量 + */ + public static void setDataSourceType(String dsType) { + log.info("切换到{}数据源", dsType); + CONTEXT_HOLDER.set(dsType); + } + + /** + * 获得数据源的变量 + */ + public static String getDataSourceType() { + return CONTEXT_HOLDER.get(); + } + + /** + * 清空数据源变量 + */ + public static void clearDataSourceType() { + CONTEXT_HOLDER.remove(); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/interceptor/RepeatSubmitInterceptor.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/interceptor/RepeatSubmitInterceptor.java new file mode 100644 index 0000000..63373d6 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/interceptor/RepeatSubmitInterceptor.java @@ -0,0 +1,49 @@ +package com.ebts.framework.interceptor; + +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.ebts.common.annotation.RepeatSubmit; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.utils.ServletUtils; + +/** + * 防止重复提交拦截器 + * + * @author binlin + */ +@Component +public abstract class RepeatSubmitInterceptor extends HandlerInterceptorAdapter { + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + if (handler instanceof HandlerMethod) { + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + RepeatSubmit annotation = method.getAnnotation(RepeatSubmit.class); + if (annotation != null) { + if (this.isRepeatSubmit(request)) { + AjaxResult ajaxResult = AjaxResult.error("不允许重复提交,请稍后再试"); + ServletUtils.renderString(response, JSONObject.toJSONString(ajaxResult)); + return false; + } + } + return true; + } else { + return super.preHandle(request, response, handler); + } + } + + /** + * 验证是否重复提交由子类实现具体的防重复提交的规则 + * + * @param request + * @return + * @throws Exception + */ + public abstract boolean isRepeatSubmit(HttpServletRequest request); +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/interceptor/impl/SameUrlDataInterceptor.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/interceptor/impl/SameUrlDataInterceptor.java new file mode 100644 index 0000000..ab49baa --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/interceptor/impl/SameUrlDataInterceptor.java @@ -0,0 +1,114 @@ +package com.ebts.framework.interceptor.impl; + +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.ebts.common.constant.Constants; +import com.ebts.common.core.redis.RedisCache; +import com.ebts.common.filter.RepeatedlyRequestWrapper; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.http.HttpHelper; +import com.ebts.framework.interceptor.RepeatSubmitInterceptor; + +/** + * 判断请求url和数据是否和上一次相同, + * 如果和上次相同,则是重复提交表单。 有效时间为10秒内。 + * + * @author binlin + */ +@Component +public class SameUrlDataInterceptor extends RepeatSubmitInterceptor { + public final String REPEAT_PARAMS = "repeatParams"; + + public final String REPEAT_TIME = "repeatTime"; + + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + @Autowired + private RedisCache redisCache; + + /** + * 间隔时间,单位:秒 默认10秒 + *

+ * 两次相同参数的请求,如果间隔时间大于该参数,系统不会认定为重复提交的数据 + */ + private int intervalTime = 10; + + public void setIntervalTime(int intervalTime) { + this.intervalTime = intervalTime; + } + + @SuppressWarnings("unchecked") + @Override + public boolean isRepeatSubmit(HttpServletRequest request) { + String nowParams = ""; + if (request instanceof RepeatedlyRequestWrapper) { + RepeatedlyRequestWrapper repeatedlyRequest = (RepeatedlyRequestWrapper) request; + nowParams = HttpHelper.getBodyString(repeatedlyRequest); + } + + // body参数为空,获取Parameter的数据 + if (StringUtils.isEmpty(nowParams)) { + nowParams = JSONObject.toJSONString(request.getParameterMap()); + } + Map nowDataMap = new HashMap(); + nowDataMap.put(REPEAT_PARAMS, nowParams); + nowDataMap.put(REPEAT_TIME, System.currentTimeMillis()); + + // 请求地址(作为存放cache的key值) + String url = request.getRequestURI(); + + // 唯一值(没有消息头则使用请求地址) + String submitKey = request.getHeader(header); + if (StringUtils.isEmpty(submitKey)) { + submitKey = url; + } + + // 唯一标识(指定key + 消息头) + String cache_repeat_key = Constants.REPEAT_SUBMIT_KEY + submitKey; + + Object sessionObj = redisCache.getCacheObject(cache_repeat_key); + if (sessionObj != null) { + Map sessionMap = (Map) sessionObj; + if (sessionMap.containsKey(url)) { + Map preDataMap = (Map) sessionMap.get(url); + if (compareParams(nowDataMap, preDataMap) && compareTime(nowDataMap, preDataMap)) { + return true; + } + } + } + Map cacheMap = new HashMap(); + cacheMap.put(url, nowDataMap); + redisCache.setCacheObject(cache_repeat_key, cacheMap, intervalTime, TimeUnit.SECONDS); + return false; + } + + /** + * 判断参数是否相同 + */ + private boolean compareParams(Map nowMap, Map preMap) { + String nowParams = (String) nowMap.get(REPEAT_PARAMS); + String preParams = (String) preMap.get(REPEAT_PARAMS); + return nowParams.equals(preParams); + } + + /** + * 判断两次间隔时间 + */ + private boolean compareTime(Map nowMap, Map preMap) { + long time1 = (Long) nowMap.get(REPEAT_TIME); + long time2 = (Long) preMap.get(REPEAT_TIME); + if ((time1 - time2) < (this.intervalTime * 1000)) { + return true; + } + return false; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/security/filter/JwtAuthenticationTokenFilter.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/security/filter/JwtAuthenticationTokenFilter.java new file mode 100644 index 0000000..7d25891 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/security/filter/JwtAuthenticationTokenFilter.java @@ -0,0 +1,43 @@ +package com.ebts.framework.security.filter; + +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 com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.framework.web.service.TokenService; + +/** + * todo token 拦截器 + * token过滤器 验证token有效性 + * + * @author binlin + */ +@Component +public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { + @Autowired + private TokenService tokenService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) + throws ServletException, IOException { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) { + tokenService.verifyToken(loginUser); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); + authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); + SecurityContextHolder.getContext().setAuthentication(authenticationToken); + } + chain.doFilter(request, response); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/security/handle/AuthenticationEntryPointImpl.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/security/handle/AuthenticationEntryPointImpl.java new file mode 100644 index 0000000..2215d45 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/security/handle/AuthenticationEntryPointImpl.java @@ -0,0 +1,33 @@ +package com.ebts.framework.security.handle; + +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.ebts.common.constant.HttpStatus; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.utils.ServletUtils; +import com.ebts.common.utils.StringUtils; + +/** + * 认证失败处理类 返回未授权 + * + * @author binlin + */ +@Component +public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable { + private static final long serialVersionUID = -8970718410437077606L; + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) + throws IOException { + int code = HttpStatus.UNAUTHORIZED; + String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI()); + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(code, msg))); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/security/handle/LogoutSuccessHandlerImpl.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/security/handle/LogoutSuccessHandlerImpl.java new file mode 100644 index 0000000..410854a --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/security/handle/LogoutSuccessHandlerImpl.java @@ -0,0 +1,51 @@ +package com.ebts.framework.security.handle; + +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.ebts.common.constant.Constants; +import com.ebts.common.constant.HttpStatus; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.utils.ServletUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.framework.dao.AsyncDao; +import com.ebts.framework.dao.factory.AsyncFactory; +import com.ebts.framework.web.service.TokenService; + +/** + * 自定义退出处理类 返回成功 + * + * @author binlin + */ +@Configuration +public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler { + @Autowired + private TokenService tokenService; + + /** + * 退出处理 + * + * @return + */ + @Override + public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) + throws IOException, ServletException { + LoginUser loginUser = tokenService.getLoginUser(request); + if (StringUtils.isNotNull(loginUser)) { + String userName = loginUser.getUsername(); + // 删除用户缓存记录 + tokenService.delLoginUser(loginUser.getToken()); + // 记录用户退出日志 + AsyncDao.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功")); + } + ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.SUCCESS, "退出成功"))); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/Server.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/Server.java new file mode 100644 index 0000000..d53baa3 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/Server.java @@ -0,0 +1,215 @@ +package com.ebts.framework.web.domain; + +import java.net.UnknownHostException; +import java.util.LinkedList; +import java.util.List; +import java.util.Properties; + +import com.ebts.common.utils.Arith; +import com.ebts.common.utils.ip.IpUtils; +import com.ebts.framework.web.domain.server.Cpu; +import com.ebts.framework.web.domain.server.Jvm; +import com.ebts.framework.web.domain.server.Mem; +import com.ebts.framework.web.domain.server.Sys; +import com.ebts.framework.web.domain.server.SysFile; +import oshi.SystemInfo; +import oshi.hardware.CentralProcessor; +import oshi.hardware.CentralProcessor.TickType; +import oshi.hardware.GlobalMemory; +import oshi.hardware.HardwareAbstractionLayer; +import oshi.software.os.FileSystem; +import oshi.software.os.OSFileStore; +import oshi.software.os.OperatingSystem; +import oshi.util.Util; + +/** + * 服务器相关信息 + * + * @author binlin + */ +public class Server { + private static final int OSHI_WAIT_SECOND = 1000; + + /** + * CPU相关信息 + */ + private Cpu cpu = new Cpu(); + + /** + * 內存相关信息 + */ + private Mem mem = new Mem(); + + /** + * JVM相关信息 + */ + private Jvm jvm = new Jvm(); + + /** + * 服务器相关信息 + */ + private Sys sys = new Sys(); + + /** + * 磁盘相关信息 + */ + private List sysFiles = new LinkedList(); + + public Cpu getCpu() { + return cpu; + } + + public void setCpu(Cpu cpu) { + this.cpu = cpu; + } + + public Mem getMem() { + return mem; + } + + public void setMem(Mem mem) { + this.mem = mem; + } + + public Jvm getJvm() { + return jvm; + } + + public void setJvm(Jvm jvm) { + this.jvm = jvm; + } + + public Sys getSys() { + return sys; + } + + public void setSys(Sys sys) { + this.sys = sys; + } + + public List getSysFiles() { + return sysFiles; + } + + public void setSysFiles(List sysFiles) { + this.sysFiles = sysFiles; + } + + public void copyTo() throws Exception { + SystemInfo si = new SystemInfo(); + HardwareAbstractionLayer hal = si.getHardware(); + + setCpuInfo(hal.getProcessor()); + + setMemInfo(hal.getMemory()); + + setSysInfo(); + + setJvmInfo(); + + setSysFiles(si.getOperatingSystem()); + } + + /** + * 设置CPU信息 + */ + private void setCpuInfo(CentralProcessor processor) { + // CPU信息 + long[] prevTicks = processor.getSystemCpuLoadTicks(); + Util.sleep(OSHI_WAIT_SECOND); + long[] ticks = processor.getSystemCpuLoadTicks(); + long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()]; + long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()]; + long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()]; + long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()]; + long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()]; + long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()]; + long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()]; + long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()]; + long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal; + cpu.setCpuNum(processor.getLogicalProcessorCount()); + cpu.setTotal(totalCpu); + cpu.setSys(cSys); + cpu.setUsed(user); + cpu.setWait(iowait); + cpu.setFree(idle); + } + + /** + * 设置内存信息 + */ + private void setMemInfo(GlobalMemory memory) { + mem.setTotal(memory.getTotal()); + mem.setUsed(memory.getTotal() - memory.getAvailable()); + mem.setFree(memory.getAvailable()); + } + + /** + * 设置服务器信息 + */ + private void setSysInfo() { + Properties props = System.getProperties(); + sys.setComputerName(IpUtils.getHostName()); + sys.setComputerIp(IpUtils.getHostIp()); + sys.setOsName(props.getProperty("os.name")); + sys.setOsArch(props.getProperty("os.arch")); + sys.setUserDir(props.getProperty("user.dir")); + } + + /** + * 设置Java虚拟机 + */ + private void setJvmInfo() throws UnknownHostException { + Properties props = System.getProperties(); + jvm.setTotal(Runtime.getRuntime().totalMemory()); + jvm.setMax(Runtime.getRuntime().maxMemory()); + jvm.setFree(Runtime.getRuntime().freeMemory()); + jvm.setVersion(props.getProperty("java.version")); + 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); + } + } + + /** + * 字节转换 + * + * @param size 字节大小 + * @return 转换后值 + */ + public String convertFileSize(long size) { + long kb = 1024; + long mb = kb * 1024; + long gb = mb * 1024; + if (size >= gb) { + return String.format("%.1f GB", (float) size / gb); + } else if (size >= mb) { + float f = (float) size / mb; + return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f); + } else if (size >= kb) { + float f = (float) size / kb; + return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f); + } else { + return String.format("%d B", size); + } + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Cpu.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Cpu.java new file mode 100644 index 0000000..aaad9e4 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Cpu.java @@ -0,0 +1,88 @@ +package com.ebts.framework.web.domain.server; + +import com.ebts.common.utils.Arith; + +/** + * CPU相关信息 + * + * @author binlin + */ +public class Cpu { + /** + * 核心数 + */ + private int cpuNum; + + /** + * CPU总的使用率 + */ + private double total; + + /** + * CPU系统使用率 + */ + private double sys; + + /** + * CPU用户使用率 + */ + private double used; + + /** + * CPU当前等待率 + */ + private double wait; + + /** + * CPU当前空闲率 + */ + private double free; + + public int getCpuNum() { + return cpuNum; + } + + public void setCpuNum(int cpuNum) { + this.cpuNum = cpuNum; + } + + public double getTotal() { + return Arith.round(Arith.mul(total, 100), 2); + } + + public void setTotal(double total) { + this.total = total; + } + + public double getSys() { + return Arith.round(Arith.mul(sys / total, 100), 2); + } + + public void setSys(double sys) { + this.sys = sys; + } + + public double getUsed() { + return Arith.round(Arith.mul(used / total, 100), 2); + } + + public void setUsed(double used) { + this.used = used; + } + + public double getWait() { + return Arith.round(Arith.mul(wait / total, 100), 2); + } + + public void setWait(double wait) { + this.wait = wait; + } + + public double getFree() { + return Arith.round(Arith.mul(free / total, 100), 2); + } + + public void setFree(double free) { + this.free = free; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Jvm.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Jvm.java new file mode 100644 index 0000000..e2e4b06 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Jvm.java @@ -0,0 +1,107 @@ +package com.ebts.framework.web.domain.server; + +import java.lang.management.ManagementFactory; + +import com.ebts.common.utils.Arith; +import com.ebts.common.utils.DateUtils; + +/** + * JVM相关信息 + * + * @author binlin + */ +public class Jvm { + /** + * 当前JVM占用的内存总数(M) + */ + private double total; + + /** + * JVM最大可用内存总数(M) + */ + private double max; + + /** + * JVM空闲内存(M) + */ + private double free; + + /** + * JDK版本 + */ + private String version; + + /** + * JDK路径 + */ + private String home; + + public double getTotal() { + return Arith.div(total, (1024 * 1024), 2); + } + + public void setTotal(double total) { + this.total = total; + } + + public double getMax() { + return Arith.div(max, (1024 * 1024), 2); + } + + public void setMax(double max) { + this.max = max; + } + + public double getFree() { + return Arith.div(free, (1024 * 1024), 2); + } + + public void setFree(double free) { + this.free = free; + } + + public double getUsed() { + return Arith.div(total - free, (1024 * 1024), 2); + } + + public double getUsage() { + return Arith.mul(Arith.div(total - free, total, 4), 100); + } + + /** + * 获取JDK名称 + */ + public String getName() { + return ManagementFactory.getRuntimeMXBean().getVmName(); + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getHome() { + return home; + } + + public void setHome(String home) { + this.home = home; + } + + /** + * JDK启动时间 + */ + public String getStartTime() { + return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate()); + } + + /** + * JDK运行时间 + */ + public String getRunTime() { + return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate()); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Mem.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Mem.java new file mode 100644 index 0000000..45ede98 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Mem.java @@ -0,0 +1,53 @@ +package com.ebts.framework.web.domain.server; + +import com.ebts.common.utils.Arith; + +/** + * 內存相关信息 + * + * @author binlin + */ +public class Mem { + /** + * 内存总量 + */ + private double total; + + /** + * 已用内存 + */ + private double used; + + /** + * 剩余内存 + */ + private double free; + + public double getTotal() { + return Arith.div(total, (1024 * 1024 * 1024), 2); + } + + public void setTotal(long total) { + this.total = total; + } + + public double getUsed() { + return Arith.div(used, (1024 * 1024 * 1024), 2); + } + + public void setUsed(long used) { + this.used = used; + } + + public double getFree() { + return Arith.div(free, (1024 * 1024 * 1024), 2); + } + + public void setFree(long free) { + this.free = free; + } + + public double getUsage() { + return Arith.mul(Arith.div(used, total, 4), 100); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Sys.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Sys.java new file mode 100644 index 0000000..1c6df47 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/Sys.java @@ -0,0 +1,73 @@ +package com.ebts.framework.web.domain.server; + +/** + * 系统相关信息 + * + * @author binlin + */ +public class Sys { + /** + * 服务器名称 + */ + private String computerName; + + /** + * 服务器Ip + */ + private String computerIp; + + /** + * 项目路径 + */ + private String userDir; + + /** + * 操作系统 + */ + private String osName; + + /** + * 系统架构 + */ + private String osArch; + + public String getComputerName() { + return computerName; + } + + public void setComputerName(String computerName) { + this.computerName = computerName; + } + + public String getComputerIp() { + return computerIp; + } + + public void setComputerIp(String computerIp) { + this.computerIp = computerIp; + } + + public String getUserDir() { + return userDir; + } + + public void setUserDir(String userDir) { + this.userDir = userDir; + } + + public String getOsName() { + return osName; + } + + public void setOsName(String osName) { + this.osName = osName; + } + + public String getOsArch() { + return osArch; + } + + public void setOsArch(String osArch) { + this.osArch = osArch; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/SysFile.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/SysFile.java new file mode 100644 index 0000000..37119ce --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/domain/server/SysFile.java @@ -0,0 +1,99 @@ +package com.ebts.framework.web.domain.server; + +/** + * 系统文件相关信息 + * + * @author binlin + */ +public class SysFile { + /** + * 盘符路径 + */ + private String dirName; + + /** + * 盘符类型 + */ + private String sysTypeName; + + /** + * 文件类型 + */ + private String typeName; + + /** + * 总大小 + */ + private String total; + + /** + * 剩余大小 + */ + private String free; + + /** + * 已经使用量 + */ + private String used; + + /** + * 资源的使用率 + */ + private double usage; + + public String getDirName() { + return dirName; + } + + public void setDirName(String dirName) { + this.dirName = dirName; + } + + public String getSysTypeName() { + return sysTypeName; + } + + public void setSysTypeName(String sysTypeName) { + this.sysTypeName = sysTypeName; + } + + public String getTypeName() { + return typeName; + } + + public void setTypeName(String typeName) { + this.typeName = typeName; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public String getFree() { + return free; + } + + public void setFree(String free) { + this.free = free; + } + + public String getUsed() { + return used; + } + + public void setUsed(String used) { + this.used = used; + } + + public double getUsage() { + return usage; + } + + public void setUsage(double usage) { + this.usage = usage; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/exception/GlobalExceptionHandler.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..1bff90d --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/exception/GlobalExceptionHandler.java @@ -0,0 +1,117 @@ +package com.ebts.framework.web.exception; + +import com.ebts.common.constant.HttpStatus; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.exception.BaseException; +import com.ebts.common.exception.CustomException; +import com.ebts.common.exception.DemoModeException; +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.authentication.AccountExpiredException; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.NoHandlerFoundException; + +/** + * 全局异常处理器 + * + * @author binlin + */ +@RestControllerAdvice +public class GlobalExceptionHandler { + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + /** + * 基础异常 + */ + @ExceptionHandler(BaseException.class) + public AjaxResult baseException(BaseException e) { + return AjaxResult.error(e.getMessage()); + } + + + + + + /** + * EBTS基础异常 + */ + @ExceptionHandler(EbtsException.class) + public AjaxResult ebtsException(EbtsException e) { + return AjaxResult.error(e.getMsg()); + } + /** + * 业务异常 + */ + @ExceptionHandler(CustomException.class) + public AjaxResult businessException(CustomException e) { + if (StringUtils.isNull(e.getCode())) { + return AjaxResult.error(e.getMessage()); + } + return AjaxResult.error(e.getCode(), e.getMessage()); + } + + @ExceptionHandler(NoHandlerFoundException.class) + public AjaxResult handlerNoFoundException(Exception e) { + log.error(e.getMessage(), e); + return AjaxResult.error(HttpStatus.NOT_FOUND, "路径不存在,请检查路径是否正确"); + } + + @ExceptionHandler(AccessDeniedException.class) + public AjaxResult handleAuthorizationException(AccessDeniedException e) { + log.error(e.getMessage()); + return AjaxResult.error(HttpStatus.FORBIDDEN, "没有权限,请联系管理员授权"); + } + + @ExceptionHandler(AccountExpiredException.class) + public AjaxResult handleAccountExpiredException(AccountExpiredException e) { + log.error(e.getMessage(), e); + return AjaxResult.error(e.getMessage()); + } + + @ExceptionHandler(UsernameNotFoundException.class) + public AjaxResult handleUsernameNotFoundException(UsernameNotFoundException e) { + log.error(e.getMessage(), e); + return AjaxResult.error(e.getMessage()); + } + + @ExceptionHandler(Exception.class) + public AjaxResult handleException(Exception e) { + log.error(e.getMessage(), e); + return AjaxResult.error(e.getMessage()); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(BindException.class) + public AjaxResult validatedBindException(BindException e) { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object validExceptionHandler(MethodArgumentNotValidException e) { + log.error(e.getMessage(), e); + String message = e.getBindingResult().getFieldError().getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 演示模式异常 + */ + @ExceptionHandler(DemoModeException.class) + public AjaxResult demoModeException(DemoModeException e) { + return AjaxResult.error("演示模式,不允许操作"); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/LoginService.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/LoginService.java new file mode 100644 index 0000000..2cc1230 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/LoginService.java @@ -0,0 +1,79 @@ +package com.ebts.framework.web.service; + +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.ebts.common.constant.Constants; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.core.redis.RedisCache; +import com.ebts.common.exception.CustomException; +import com.ebts.common.exception.user.CaptchaException; +import com.ebts.common.exception.user.CaptchaExpireException; +import com.ebts.common.exception.user.UserPasswordNotMatchException; +import com.ebts.common.utils.MessageUtils; +import com.ebts.framework.dao.AsyncDao; +import com.ebts.framework.dao.factory.AsyncFactory; + +/** + * 登录校验方法 + * + * @author binlin + */ +@Component +public class LoginService { + @Autowired + private TokenService tokenService; + + @Resource + private AuthenticationManager authenticationManager; + + @Autowired + private RedisCache redisCache; + + /** + * 登录验证 + * + * @param username 用户名 + * @param password 密码 + * @param code 验证码 + * @param uuid 唯一标识 + * @return 结果 + */ + public String login(String username, String password, String code, String uuid) { + String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; + String captcha = redisCache.getCacheObject(verifyKey); + redisCache.deleteObject(verifyKey); + if (captcha == null) { + AsyncDao.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire"))); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + AsyncDao.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error"))); + throw new CaptchaException(); + } + // 用户验证 + Authentication authentication = null; + try { + // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername + authentication = authenticationManager + .authenticate(new UsernamePasswordAuthenticationToken(username, password)); + } catch (Exception e) { + if (e instanceof BadCredentialsException) { + AsyncDao.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); + throw new UserPasswordNotMatchException(); + } else { + AsyncDao.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); + throw new CustomException(e.getMessage()); + } + } + AsyncDao.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + // 生成token + return tokenService.createToken(loginUser); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/PermissionService.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/PermissionService.java new file mode 100644 index 0000000..9d60745 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/PermissionService.java @@ -0,0 +1,152 @@ +package com.ebts.framework.web.service; + +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import com.ebts.common.core.entity.entity.Role; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.utils.ServletUtils; +import com.ebts.common.utils.StringUtils; + +/** + * todo 自定义权限实现,ss取自SpringSecurity首字母 + * + * @author binlin + */ +@Service("ebts") +public class PermissionService { + /** + * 所有权限标识 + */ + private static final String ALL_PERMISSION = "*:*:*"; + + /** + * 管理员角色权限标识 + */ + private static final String SUPER_ADMIN = "admin"; + + private static final String ROLE_DELIMETER = ","; + + private static final String PERMISSION_DELIMETER = ","; + + @Autowired + private TokenService tokenService; + + /** + * 验证用户是否具备某权限 + * + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + public boolean hasPermi(String permission) { + if (StringUtils.isEmpty(permission)) { + return false; + } + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) { + return false; + } + return hasPermissions(loginUser.getPermissions(), permission); + } + + /** + * 验证用户是否不具备某权限,与 hasPermi逻辑相反 + * + * @param permission 权限字符串 + * @return 用户是否不具备某权限 + */ + public boolean lacksPermi(String permission) { + return hasPermi(permission) != true; + } + + /** + * 验证用户是否具有以下任意一个权限 + * + * @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表 + * @return 用户是否具有以下任意一个权限 + */ + public boolean hasAnyPermi(String permissions) { + if (StringUtils.isEmpty(permissions)) { + return false; + } + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())) { + return false; + } + Set authorities = loginUser.getPermissions(); + for (String permission : permissions.split(PERMISSION_DELIMETER)) { + if (permission != null && hasPermissions(authorities, permission)) { + return true; + } + } + return false; + } + + /** + * 判断用户是否拥有某个角色 + * + * @param role 角色字符串 + * @return 用户是否具备某角色 + */ + public boolean hasRole(String role) { + if (StringUtils.isEmpty(role)) { + return false; + } + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) { + return false; + } + for (Role sysRole : loginUser.getUser().getRoles()) { + String roleKey = sysRole.getRoleKey(); + if (SUPER_ADMIN.contains(roleKey) || roleKey.contains(StringUtils.trim(role))) { + return true; + } + } + return false; + } + + /** + * 验证用户是否不具备某角色,与 isRole逻辑相反。 + * + * @param role 角色名称 + * @return 用户是否不具备某角色 + */ + public boolean lacksRole(String role) { + return hasRole(role) != true; + } + + /** + * 验证用户是否具有以下任意一个角色 + * + * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表 + * @return 用户是否具有以下任意一个角色 + */ + public boolean hasAnyRoles(String roles) { + if (StringUtils.isEmpty(roles)) { + return false; + } + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles())) { + return false; + } + for (String role : roles.split(ROLE_DELIMETER)) { + if (hasRole(role)) { + return true; + } + } + return false; + } + + /** + * 判断是否包含权限 + * + * @param permissions 权限列表 + * @param permission 权限字符串 + * @return 用户是否具备某权限 + */ + private boolean hasPermissions(Set permissions, String permission) { + return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission)); + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/SysPermissionService.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/SysPermissionService.java new file mode 100644 index 0000000..eaeedb3 --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/SysPermissionService.java @@ -0,0 +1,58 @@ +package com.ebts.framework.web.service; + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.ebts.common.core.entity.entity.User; +import com.ebts.system.service.MenuService; +import com.ebts.system.service.RoleService; + +/** + * 用户权限处理 + * + * @author binlin + */ +@Component +public class SysPermissionService { + @Autowired + private RoleService roleService; + + @Autowired + private MenuService menuService; + + /** + * 获取角色数据权限 + * + * @param user 用户信息 + * @return 角色权限信息 + */ + public Set getRolePermission(User user) { + Set roles = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) { + roles.add("admin"); + } else { + roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId())); + } + return roles; + } + + /** + * 获取菜单数据权限 + * + * @param user 用户信息 + * @return 菜单权限信息 + */ + public Set getMenuPermission(User user) { + Set perms = new HashSet(); + // 管理员拥有所有权限 + if (user.isAdmin()) { + perms.add("*:*:*"); + } else { + perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); + } + return perms; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/TokenService.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/TokenService.java new file mode 100644 index 0000000..7bf933b --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/TokenService.java @@ -0,0 +1,222 @@ +package com.ebts.framework.web.service; + +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.ebts.common.constant.Constants; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.core.redis.RedisCache; +import com.ebts.common.utils.ServletUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.ip.AddressUtils; +import com.ebts.common.utils.ip.IpUtils; +import com.ebts.common.utils.uuid.IdUtils; +import eu.bitwalker.useragentutils.UserAgent; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +/** + * token验证处理 + * + * @author binlin + */ +@Component +public class TokenService { + // 令牌自定义标识 + @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; + + /** + * 获取用户身份信息 + * + * @return 用户信息 + */ + public LoginUser getLoginUser(HttpServletRequest request) { + // 获取请求携带的令牌 + String token = getToken(request); + if (StringUtils.isNotEmpty(token)) { + Claims claims = parseToken(token); + // 解析对应的权限以及用户信息 + String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String userKey = getTokenKey(uuid); + LoginUser user = redisCache.getCacheObject(userKey); + return user; + } + return null; + } + + /** + * 文件获取用户信息 + */ + public LoginUser getFileUser(HttpServletRequest request){ + String token = request.getHeader("token"); + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)){ + token = token.replace(Constants.TOKEN_PREFIX,""); + } + if (StringUtils.isNotEmpty(token)){ + Claims claims = parseToken(token); + + String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); + String userKey = getTokenKey(uuid); + return redisCache.getCacheObject(userKey); + }else { + return null; + } + } + + + /** + * 设置用户身份信息 + */ + public void setLoginUser(LoginUser loginUser) { + if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { + refreshToken(loginUser); + } + } + + /** + * 删除用户身份信息 + */ + public void delLoginUser(String token) { + if (StringUtils.isNotEmpty(token)) { + String userKey = getTokenKey(token); + redisCache.deleteObject(userKey); + } + } + + /** + * 创建令牌 + * + * @param loginUser 用户信息 + * @return 令牌 + */ + public String createToken(LoginUser loginUser) { + String token = IdUtils.fastUUID(); + loginUser.setToken(token); + setUserAgent(loginUser); + refreshToken(loginUser); + + Map claims = new HashMap<>(); + claims.put(Constants.LOGIN_USER_KEY, token); + return createToken(claims); + } + + /** + * 验证令牌有效期,相差不足20分钟,自动刷新缓存 + * + * @param loginUser + * @return 令牌 + */ + public void verifyToken(LoginUser loginUser) { + long expireTime = loginUser.getExpireTime(); + long currentTime = System.currentTimeMillis(); + if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { + refreshToken(loginUser); + } + } + + /** + * 刷新令牌有效期 + * + * @param loginUser 登录信息 + */ + public void refreshToken(LoginUser loginUser) { + loginUser.setLoginTime(System.currentTimeMillis()); + loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // 根据uuid将loginUser缓存 + String userKey = getTokenKey(loginUser.getToken()); + redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); + } + + /** + * 设置用户代理信息 + * + * @param loginUser 登录信息 + */ + public void setUserAgent(LoginUser loginUser) { + UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); + String ip = IpUtils.getIpAddr(ServletUtils.getRequest()); + loginUser.setIpaddr(ip); + loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); + loginUser.setBrowser(userAgent.getBrowser().getName()); + loginUser.setOs(userAgent.getOperatingSystem().getName()); + } + + /** + * 从数据声明生成令牌 + * + * @param claims 数据声明 + * @return 令牌 + */ + private String createToken(Map claims) { + String token = Jwts.builder() + .setClaims(claims) + .signWith(SignatureAlgorithm.HS512, secret).compact(); + return token; + } + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + private Claims parseToken(String token) { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(token) + .getBody(); + } + + /** + * 从令牌中获取用户名 + * + * @param token 令牌 + * @return 用户名 + */ + public String getUsernameFromToken(String token) { + Claims claims = parseToken(token); + return claims.getSubject(); + } + + /** + * 获取请求token + * + * @param request + * @return token + */ + private String getToken(HttpServletRequest request) { + String token = request.getHeader(header); + if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { + token = token.replace(Constants.TOKEN_PREFIX, ""); + } + return token; + } + + private String getTokenKey(String uuid) { + return Constants.LOGIN_TOKEN_KEY + uuid; + } +} diff --git a/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/UserDetailsServiceImpl.java b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/UserDetailsServiceImpl.java new file mode 100644 index 0000000..cf2397d --- /dev/null +++ b/ebts/ebts-framework/src/main/java/com/ebts/framework/web/service/UserDetailsServiceImpl.java @@ -0,0 +1,52 @@ +package com.ebts.framework.web.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +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.ebts.common.core.entity.entity.User; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.enums.UserStatus; +import com.ebts.common.exception.BaseException; +import com.ebts.common.utils.StringUtils; +import com.ebts.system.service.UserService; + +/** + * 用户验证处理 + * + * @author binlin + */ +@Service +public class UserDetailsServiceImpl implements UserDetailsService { + private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); + + @Autowired + private UserService userService; + + @Autowired + private SysPermissionService permissionService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userService.selectUserByUserName(username); + if (StringUtils.isNull(user)) { + log.info("登录用户:{} 不存在.", username); + throw new UsernameNotFoundException("登录用户:" + username + " 不存在"); + } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) { + log.info("登录用户:{} 已被删除.", username); + throw new BaseException("对不起,您的账号:" + username + " 已被删除"); + } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", username); + throw new BaseException("对不起,您的账号:" + username + " 已停用"); + } + + return createLoginUser(user); + } + + public UserDetails createLoginUser(User user) { + return new LoginUser(user, permissionService.getMenuPermission(user)); + } +} diff --git a/ebts/ebts-generator/pom.xml b/ebts/ebts-generator/pom.xml new file mode 100644 index 0000000..fae7848 --- /dev/null +++ b/ebts/ebts-generator/pom.xml @@ -0,0 +1,164 @@ + + + + ebts + com.ebts + 1.0.0 + + 4.0.0 + + ebts-generator + + + generator代码生成 + + + + + + org.apache.velocity + velocity + + + + commons-net + commons-net + 3.7 + + + + + org.springframework + spring-context-support + + + + + org.springframework + spring-web + + + + + org.springframework.boot + spring-boot-starter-security + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + + javax.validation + validation-api + + + + + org.apache.commons + commons-lang3 + + + + + com.fasterxml.jackson.core + jackson-databind + + + + + com.alibaba + fastjson + + + + + commons-io + commons-io + + + + + commons-fileupload + commons-fileupload + + + + + org.apache.poi + poi-ooxml + + + + + org.yaml + snakeyaml + + + + + io.jsonwebtoken + jjwt + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.apache.commons + commons-pool2 + + + + + eu.bitwalker + UserAgentUtils + + + + + javax.servlet + javax.servlet-api + + + + io.springfox + springfox-swagger2 + + + + + io.swagger + swagger-annotations + 1.5.21 + + + + io.swagger + swagger-models + 1.5.21 + + + + + io.springfox + springfox-swagger-ui + + + + com.ebts + ebts-common + + + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/config/Config.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/config/Config.java new file mode 100644 index 0000000..7d28c77 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/config/Config.java @@ -0,0 +1,34 @@ +package com.ebts.generator.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @Author 18209 + * @Date 2021/2/23 15:48 + * @Version 1.0 + */ + +@Component +@ConfigurationProperties(prefix = "ebts") +public class Config { + + + + /** + * 上传路径 + */ + private static String profile; + + + public static String getProfile() { + return profile; + } + + /** + * 获取下载路径 + */ + public static String getDownloadPath() { + return getProfile() + "/download/"; + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/config/GenConfig.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/config/GenConfig.java new file mode 100644 index 0000000..eb8dc3c --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/config/GenConfig.java @@ -0,0 +1,72 @@ +package com.ebts.generator.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Component; + +/** + * 读取代码生成相关配置 + * + * @author binlin + */ +@Component +@ConfigurationProperties(prefix = "gen") +@PropertySource(value = {"classpath:generator.yml"}) +public class GenConfig { + /** + * 作者 + */ + public static String author; + + /** + * 生成包路径 + */ + public static String packageName; + + /** + * 自动去除表前缀,默认是false + */ + public static boolean autoRemovePre; + + /** + * 表前缀(类名不会包含表前缀) + */ + public static String tablePrefix; + + public static String getAuthor() { + return author; + } + + @Value("${author}") + public void setAuthor(String author) { + GenConfig.author = author; + } + + public static String getPackageName() { + return packageName; + } + + @Value("${packageName}") + public void setPackageName(String packageName) { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() { + return autoRemovePre; + } + + @Value("${autoRemovePre}") + public void setAutoRemovePre(boolean autoRemovePre) { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() { + return tablePrefix; + } + + @Value("${tablePrefix}") + public void setTablePrefix(String tablePrefix) { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/ApiClassController.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/ApiClassController.java new file mode 100644 index 0000000..ce5d4b7 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/ApiClassController.java @@ -0,0 +1,168 @@ +package com.ebts.generator.controller; + +import java.io.Serializable; +import java.util.List; + +import com.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.ServerResult; +import com.ebts.common.utils.poi.ExcelUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.prepost.PreAuthorize; +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.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ebts.generator.entity.ApiClass; +import com.ebts.generator.service.ApiClassService; + +/** + * 接口类名Controller + * + * @author binlin + * @date 2021-01-24 + */ +@RestController +@RequestMapping("/tool/apiclass") +public class ApiClassController extends BaseController { + protected final Logger logger = LoggerFactory.getLogger(ApiClassController.class); + + @Autowired + private ApiClassService apiClassService; + + + /** + * 获取到api类的select选项 + * + * @return + */ + @PreAuthorize("@ebts.hasAnyPermi('tool:apiclass:querylist')") + @GetMapping("querylist") + public AjaxResult queryList() { + ServerResult> ServerResult = apiClassService.selectApiclassList(new ApiClass()); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 查询接口类名列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:apiclass:list')") + @GetMapping("/list") + public Serializable list(ApiClass apiclass) { + startPage(); + ServerResult> ServerResult = apiClassService.selectApiclassList(apiclass); + if (ServerResult.isStart()) { + return getDataTable(ServerResult.getData()); + } else { + return AjaxResult.info(ServerResult.getMsg()); + } + } + + /** + * 导出接口类名列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:apiclass:export')") + @Log(title = "接口类名", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public AjaxResult export(ApiClass apiclass) { + ServerResult> ServerResult = apiClassService.selectApiclassList(apiclass); + ExcelUtil util = new ExcelUtil<>(ApiClass.class); + if (ServerResult.isStart()) { + return util.exportExcel(ServerResult.getData(), "apiclass"); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 获取接口类名详细信息 + */ + @PreAuthorize("@ebts.hasPermi('tool:apiclass:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + ServerResult ServerResult = apiClassService.selectApiclassById(id); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.info(ServerResult.getMsg()); + } + } + + /** + * 新增接口类名 + */ + @PreAuthorize("@ebts.hasPermi('tool:apiclass:add')") + @Log(title = "接口类名", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ApiClass apiclass) { + if (apiclass.getmId() == null || apiclass.getmId() < 0) { + return AjaxResult.error("模块id不能为空!"); + } + if (apiclass.getcName() == null || apiclass.getcName().equals("")) { + return AjaxResult.error("类名不能为空!"); + } + if (apiclass.getcDescribe() == null || apiclass.getcDescribe().equals("")) { + return AjaxResult.error("类描述不能为空!"); + } + ServerResult ServerResult = apiClassService.insertApiclass(apiclass); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 修改接口类名 + */ + @PreAuthorize("@ebts.hasPermi('tool:apiclass:edit')") + @Log(title = "接口类名", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ApiClass apiclass) { + if (apiclass.getmId() == null || apiclass.getmId() < 0) { + return AjaxResult.error("模块id不能为空!"); + } + if (apiclass.getcName() == null || apiclass.getcName().equals("")) { + return AjaxResult.error("类名不能为空!"); + } + if (apiclass.getcDescribe() == null || apiclass.getcDescribe().equals("")) { + return AjaxResult.error("类描述不能为空!"); + } + ServerResult ServerResult = apiClassService.updateApiclass(apiclass); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 删除接口类名 + */ + @PreAuthorize("@ebts.hasPermi('tool:apiclass:remove')") + @Log(title = "接口类名", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + if (ids.length < 0) { + return AjaxResult.error("id不能为空!"); + } + ServerResult ServerResult = apiClassService.deleteApiclassByIds(ids); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/GenController.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/GenController.java new file mode 100644 index 0000000..d9960df --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/GenController.java @@ -0,0 +1,226 @@ +package com.ebts.generator.controller; + +import java.io.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; + +import com.ebts.common.annotation.Log; +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.core.page.TableDataInfo; +import com.ebts.common.core.text.Convert; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.ServerResult; +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.ebts.generator.entity.GenTable; +import com.ebts.generator.entity.GenTableColumn; +import com.ebts.generator.service.GenTableColumnService; +import com.ebts.generator.service.GenTableService; + +/** + * 代码生成 操作处理 + * + * @author binlin + */ +@RestController +@RequestMapping("/tool/gen") +public class GenController extends BaseController { + private Logger logger = LoggerFactory.getLogger(GenController.class); + + @Autowired + private GenTableService genTableService; + + @Autowired + private GenTableColumnService genTableColumnService; + + /** + * 查询代码生成列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:list')") + @GetMapping("/list") + public Serializable genList(GenTable genTable) { + startPage(); + List list = genTableService.selectGenTableList(genTable); + return getDataTable(list); + } + + /** + * 修改代码生成业务 + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:query')") + @GetMapping(value = "/{talbleId}") + public AjaxResult getInfo(@PathVariable Long talbleId) { + GenTable table = genTableService.selectGenTableById(talbleId); + List tables = genTableService.selectGenTableAll(); + List list = genTableColumnService.selectGenTableColumnListByTableId(talbleId); + Map map = new HashMap(); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return AjaxResult.success(map); + } + + /** + * 查询数据库列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:list')") + @GetMapping("/db/list") + public Serializable dataList(GenTable genTable) { + startPage(); + List list = genTableService.selectDbTableList(genTable); + return getDataTable(list); + } + + /** + * 查询数据表字段列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:list')") + @GetMapping(value = "/column/{talbleId}") + public Serializable columnList(Long tableId) { + TableDataInfo dataInfo = new TableDataInfo(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return dataInfo; + } + + /** + * 导入表结构(保存) + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:list')") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + public AjaxResult importTableSave(String tables) { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames); + genTableService.importGenTable(tableList); + return AjaxResult.success(); + } + + /** + * todo + * 修改保存代码生成业务 + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult editSave(@Validated @RequestBody GenTable genTable) { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return AjaxResult.success(); + } + + /** + * 删除代码生成 + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:remove')") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public AjaxResult remove(@PathVariable Long[] tableIds) { + try { + ServerResult ServerResult = genTableService.deleteGenTableByIds(tableIds); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + return AjaxResult.error(ReturnConstants.SYS_ERROR); + } + } + + /** + * 预览代码 + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:preview')") + @GetMapping("/preview/{tableId}") + public AjaxResult preview(@PathVariable("tableId") Long tableId) throws IOException { + Map dataMap = genTableService.previewCode(tableId); + return AjaxResult.success(dataMap); + } + + /** + * 生成代码(下载方式) + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableName}") + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { + byte[] data = genTableService.downloadCode(tableName); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableName}") + public AjaxResult genCode(@PathVariable("tableName") String tableName) { + boolean start = genTableService.generatorCode(tableName); + if (start) { + return AjaxResult.success(); + } else { + return AjaxResult.error("模板渲染失败!"); + } + } + + /** + * 同步数据库 + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:edit')") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableName}") + public AjaxResult synchDb(@PathVariable("tableName") String tableName) { + genTableService.synchDb(tableName); + return AjaxResult.success(); + } + + /** + * 批量生成代码 + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:code')") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tables) throws IOException { + String[] tableNames = Convert.toStrArray(tables); + byte[] data = genTableService.downloadCode(tableNames); + genCode(response, data); +// if (compress(data)){ +// return AjaxResult.success("ebts.zip"); +// }else { +// return AjaxResult.error(); +// } + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"ebts.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/InterTableController.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/InterTableController.java new file mode 100644 index 0000000..9b09804 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/InterTableController.java @@ -0,0 +1,254 @@ +package com.ebts.generator.controller; + +import java.io.IOException; +import java.io.Serializable; +import java.util.Map; + + +import com.ebts.common.annotation.Log; +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.dto.InterTableDto; +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ebts.generator.entity.InterTable; +import com.ebts.generator.service.InterTableService; + +import javax.servlet.http.HttpServletResponse; + +/** + * 接口信息Controller + * + * @author binlin + * @date 2021-01-25 + */ + +@RestController +@RequestMapping("/generator/intertable") +public class InterTableController extends BaseController { + protected final Logger logger = LoggerFactory.getLogger(InterTableController.class); + + @Autowired + private InterTableService interTableService; + + /** + * 查询接口信息列表 + */ + @PreAuthorize("@ebts.hasPermi('generator:intertable:list')") + @GetMapping("/list") + public Serializable list(InterTable interTable) { + ServerResult> ServerResult = interTableService.selectInterTableList(interTable); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.info(ServerResult.getMsg()); + } + } + + /** + * 预览代码(工作流) + */ + + @PreAuthorize("@ebts.hasPermi('generator:intertable:classpreview')") + @Log(title = "预览代码(工作流)", businessType = BusinessType.GENCODE) + @GetMapping("/classpreview/{id}") + public AjaxResult classPreview(@PathVariable("id") Long id) { + ServerResult> ServerResult = interTableService.previewCodeCalss(id); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 预览代码(工作台) + */ + @PreAuthorize("@ebts.hasPermi('generator:intertable:modulepreview')") + @Log(title = "预览代码(工作台)", businessType = BusinessType.GENCODE) + @GetMapping("/modulepreview/{id}") + public AjaxResult modulePreview(@PathVariable("id") Long id) { + ServerResult> ServerResult = interTableService.previewCodeMoudle(id); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + + /** + * 生成代码(工作流) + * + * @param id + * @return + */ + @PreAuthorize("@ebts.hasPermi('generator:intertable:classgen')") + @Log(title = "生成代码(工作流)", businessType = BusinessType.GENCODE) + @GetMapping("/classgen/{id}") + public AjaxResult classGenerator(@PathVariable("id") Long id, HttpServletResponse response) { + try { + ServerResult ServerResult = interTableService.generatorCodeClass(id); + if (ServerResult.isStart()) { + genCode(response, ServerResult.getData()); + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } catch (IOException e) { + e.printStackTrace(); + return AjaxResult.error(); + } + } + + /** + * 生成代码(工作台) + * + * @param id + * @param response + * @return + */ + @PreAuthorize("@ebts.hasPermi('generator:intertable:moudlegen')") + @Log(title = "生成代码(工作台)", businessType = BusinessType.GENCODE) + @GetMapping("/moudlegen/{id}") + public AjaxResult moudleGenerator(@PathVariable("id") Long id, HttpServletResponse response) { + try { + ServerResult ServerResult = interTableService.generatorCodeMoudle(id); + if (ServerResult.isStart()) { + genCode(response, ServerResult.getData()); + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } catch (RuntimeException | IOException e) { + logger.error(e.getMessage()); + return AjaxResult.error(ReturnConstants.SYS_ERROR); + } + } + + + /** + * 修改接口信息 + */ + @PreAuthorize("@ebts.hasPermi('generator:intertable:edit')") + @Log(title = "接口信息", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody InterTableDto interTableDto) { + ServerResult ServerResult = interTableService.updateInterTable(interTableDto); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + response.addHeader("Access-Control-Allow-Origin", "*"); + response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); + response.setHeader("Content-Disposition", "attachment; filename=\"ebts.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } + + +// /** +// * 导出接口信息列表 +// */ +// @PreAuthorize("@ebts.hasPermi('generator:intertable:export')") +// @Log(title = "接口信息", businessType = BusinessType.EXPORT) +// @GetMapping("/export") +// public GenResult export(InterTable interTable) { +// try { +// ServerResult> serverResult = interTableService.selectInterTableList(interTable); +// GenExcelUtil util = new GenExcelUtil(InterTable. class); +// if (serverResult.isStart()) { +// return util.exportExcel(serverResult.getData(), "intertable"); +// } else { +// return GenResult.error(serverResult.getMsg()); +// } +// } catch (RuntimeException e) { +// logger.error(e.getMessage()); +// return GenResult.error(ReturnConstants.SYS_ERROR); +// } +// } + +// /** +// * 获取接口信息详细信息 +// */ +// @PreAuthorize("@ebts.hasPermi('generator:intertable:query')") +// @GetMapping(value = "/{id}") +// public GenResult Info(@PathVariable("id") Long id) { +// try { +// ServerResult serverResult = interTableService.selectInterTableById(id); +// if (serverResult.isStart()) { +// return GenResult.success(serverResult.getData()); +// } else { +// return GenResult.info(serverResult.getMsg()); +// } +// } catch (RuntimeException e) { +// logger.error(e.getMessage()); +// return GenResult.error(ReturnConstants.SYS_ERROR); +// } +// } +// +// /** +// * 新增接口信息 +// */ +// @PreAuthorize("@ebts.hasPermi('generator:intertable:add')") +// @Log(title = "接口信息", businessType = BusinessType.INSERT) +// @PostMapping +// public GenResult add(@RequestBody InterTable interTable) { +// try { +// ServerResult serverResult = interTableService.insertInterTable(interTable); +// if (serverResult.isStart()) { +// return GenResult.success(); +// } else { +// return GenResult.error(serverResult.getMsg()); +// } +// } catch (RuntimeException e) { +// logger.error(e.getMessage()); +// return GenResult.error(ReturnConstants.SYS_ERROR); +// } +// } +// +// /** +// * 删除接口信息 +// */ +// @PreAuthorize("@ebts.hasPermi('generator:intertable:remove')") +// @Log(title = "接口信息", businessType = BusinessType.DELETE) +// @DeleteMapping("/{ids}") +// public GenResult remove(@PathVariable Long[] ids) { +// try { +// if (ids.length<0){ +// return GenResult.error("id不能为空!"); +// } +// ServerResult serverResult = interTableService.deleteInterTableByIds(ids); +// if (serverResult.isStart()) { +// return GenResult.success(); +// } else { +// return GenResult.error(serverResult.getMsg()); +// } +// }catch (RuntimeException e){ +// logger.error(e.getMessage()); +// return GenResult.error(ReturnConstants.SYS_ERROR); +// } +// } +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/ModuleController.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/ModuleController.java new file mode 100644 index 0000000..f766adb --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/ModuleController.java @@ -0,0 +1,164 @@ +package com.ebts.generator.controller; + +import java.io.Serializable; +import java.util.List; + + +import com.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.ServerResult; +import com.ebts.common.utils.poi.ExcelUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.prepost.PreAuthorize; +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.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ebts.generator.entity.Module; +import com.ebts.generator.service.ModuleService; + +/** + * 模块管理Controller + * + * @author binlin + * @date 2021-01-24 + */ +@RestController +@RequestMapping("/tool/module") +public class ModuleController extends BaseController { + protected final Logger logger = LoggerFactory.getLogger(ModuleController.class); + + @Autowired + private ModuleService moduleService; + + + /** + * 获取到api类的select选项 + * + * @return + */ + @PreAuthorize("@ebts.hasAnyPermi('tool:module:querylist')") + @GetMapping("querylist") + public AjaxResult queryList() { + ServerResult> ServerResult = moduleService.selectModuleList(new Module()); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + + /** + * 查询模块管理列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:module:list')") + @GetMapping("/list") + public Serializable list(Module module) { + startPage(); + ServerResult> ServerResult = moduleService.selectModuleList(module); + if (ServerResult.isStart()) { + return getDataTable(ServerResult.getData()); + } else { + return AjaxResult.info(ServerResult.getMsg()); + } + } + + /** + * 导出模块管理列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:module:export')") + @Log(title = "模块管理", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public AjaxResult export(Module module) { + ServerResult> ServerResult = moduleService.selectModuleList(module); + ExcelUtil util = new ExcelUtil(Module.class); + if (ServerResult.isStart()) { + return util.exportExcel(ServerResult.getData(), "module"); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 获取模块管理详细信息 + */ + @PreAuthorize("@ebts.hasPermi('tool:module:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + ServerResult ServerResult = moduleService.selectModuleById(id); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.info(ServerResult.getMsg()); + } + } + + /** + * 新增模块管理 + */ + @PreAuthorize("@ebts.hasPermi('tool:module:add')") + @Log(title = "模块管理", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody Module module) { + if (module.getmName() == null || module.getmName().equals("")) { + return AjaxResult.error("模块名称不能为空!"); + } + if (module.getmDescribe() == null || module.getmDescribe().equals("")) { + return AjaxResult.error("模块描述不能为空!"); + } + ServerResult ServerResult = moduleService.insertModule(module); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 修改模块管理 + */ + @PreAuthorize("@ebts.hasPermi('tool:module:edit')") + @Log(title = "模块管理", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody Module module) { + if (module.getmName() == null || module.getmName().equals("")) { + return AjaxResult.error("模块名称不能为空!"); + } + if (module.getmDescribe() == null || module.getmDescribe().equals("")) { + return AjaxResult.error("模块描述不能为空!"); + } + ServerResult ServerResult = moduleService.updateModule(module); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 删除模块管理 + */ + @PreAuthorize("@ebts.hasPermi('tool:module:remove')") + @Log(title = "模块管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + if (ids.length < 0) { + return AjaxResult.error("id不能为空!"); + } + ServerResult ServerResult = moduleService.deleteModuleByIds(ids); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/QueryController.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/QueryController.java new file mode 100644 index 0000000..b3ae279 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/QueryController.java @@ -0,0 +1,152 @@ +package com.ebts.generator.controller; + +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.utils.MapExcelUtil; +import com.ebts.common.utils.ServerResult; +import com.ebts.common.utils.StringUtils; +import com.ebts.generator.utils.sql.GenSqlUtil; +import com.github.pagehelper.PageHelper; +import com.ebts.generator.entity.UniCon; +import com.ebts.generator.entity.UniQuery; +import com.ebts.generator.service.QueryService; +import com.ebts.generator.utils.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +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.*; + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +/** + * Author 18209 + * Date 2021/1/30 18:25 + * Version 1.0 + */ +@RestController +@RequestMapping("/query") +public class QueryController extends BaseController { + private Logger logger = LoggerFactory.getLogger(QueryController.class); + + + @Autowired + private QueryService queryService; + + /** + * 获取编辑sql的基本信息 + * + * @param id + * @return + */ + @PreAuthorize("@ebts.hasPermi('query:list')") + @GetMapping("/{id}") + public AjaxResult Info(@PathVariable("id") Long id) { + ServerResult ServerResult = queryService.selectQueryById(id); + if (ServerResult.isStart()) { + UniQuery uniQuery = ServerResult.getData(); + Map modeMap = new HashMap<>(); + List uniCons = uniQuery.getUniCons(); + uniQuery.setUniCons(null); + modeMap.put("info", uniQuery); + modeMap.put("list", uniCons); + return AjaxResult.success(modeMap); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 更新万能查询编辑信息 info 和查询信息 + * + * @param uniQuery + * @return + */ + @PreAuthorize("@ebts.hasPermi('query:edit')") + @PutMapping + public AjaxResult edit(@Validated @RequestBody UniQuery uniQuery) { + ServerResult ServerResult = queryService.updateQueryInfo(uniQuery); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 导出预览数据 + * + * @param uniQuery + * @return + */ + @PreAuthorize("@ebts.hasAnyPermi('query:export')") + @PutMapping("export") + public AjaxResult export(@Validated @RequestBody UniQuery uniQuery) { + ServerResult>> ServerResult = queryService.previewQuery(uniQuery); + if (ServerResult.isStart()) { + return new MapExcelUtil().exportExcel(ServerResult.getData(), uniQuery.getUqName()); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 返回预览信息 + * + * @param uniQuery + * @return + */ + @PreAuthorize("@ebts.hasPermi('query:preview')") + @PutMapping("preview") + public Serializable Preview(@Validated @RequestBody UniQuery uniQuery) { + startPage(uniQuery); + ServerResult>> ServerResult = queryService.previewQuery(uniQuery); + if (ServerResult.isStart()) { + return getDataTable(ServerResult.getData()); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 发布上线 + * + * @param uniQuery + * @return + */ + @PreAuthorize("@ebts.hasPermi('query:release')") + @PutMapping("/release") + public AjaxResult Release(@RequestBody UniQuery uniQuery) { + if (uniQuery.getId() == null) { + return AjaxResult.error("id不能为空!"); + } else { + if (uniQuery.getIsRelease() == 1 || uniQuery.getIsRelease() == 2) { + ServerResult ServerResult = queryService.Release(uniQuery); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } else { + return AjaxResult.error("状态输入错误!"); + } + } + } + + /** + * 设置请求分页数据 + */ + protected void startPage(UniQuery uniQuery) { + Integer pageNum = uniQuery.getPageNum(); + Integer pageSize = uniQuery.getPageSize(); + if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) { + String orderBy = GenSqlUtil.escapeOrderBySql(""); + PageHelper.startPage(pageNum, pageSize, orderBy); + } + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/RegularController.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/RegularController.java new file mode 100644 index 0000000..ee26f3c --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/RegularController.java @@ -0,0 +1,197 @@ +package com.ebts.generator.controller; + +import java.io.Serializable; +import java.util.List; +import java.util.regex.Pattern; + +import com.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.ServerResult; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.generator.entity.Regular; +import com.ebts.generator.service.RegularService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.prepost.PreAuthorize; +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.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 校验规则Controller + * + * @author binlin + * @date 2021-01-18 + */ +@RestController +@RequestMapping("/tool/regular") +public class RegularController extends BaseController { + protected final Logger logger = LoggerFactory.getLogger(RegularController.class); + + @Autowired + private RegularService regularService; + + /** + * 查询校验规则列表 + * + * @param regular + * @return + */ + @PreAuthorize("@ebts.hasPermi('tool:regular:list')") + @GetMapping("/list") + public Serializable list(Regular regular) { + startPage(); + ServerResult> ServerResult = regularService.selectRegularList(regular); + if (ServerResult.isStart()) { + return getDataTable(ServerResult.getData()); + } else { + return AjaxResult.info(ServerResult.getMsg()); + } + } + + /** + * 查询校验规则列表 + * + * @return + */ + @PreAuthorize("@ebts.hasPermi('tool:regular:option')") + @GetMapping("/option") + public Serializable option() { + startPage(); + ServerResult> ServerResult = regularService.selectRegularOption(); + if (ServerResult.isStart()) { + return getDataTable(ServerResult.getData()); + } else { + return AjaxResult.info(ServerResult.getMsg()); + } + } + + /** + * 导出校验规则列表 + * + * @param regular + * @return + */ + @PreAuthorize("@ebts.hasPermi('tool:regular:export')") + @Log(title = "校验规则", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public AjaxResult export(Regular regular) { + ServerResult> ServerResult = regularService.selectRegularList(regular); + ExcelUtil util = new ExcelUtil(Regular.class); + if (ServerResult.isStart()) { + return util.exportExcel(ServerResult.getData(), "regular"); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 获取校验规则详细信息 + * + * @param id + * @return + */ + @PreAuthorize("@ebts.hasPermi('tool:regular:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + ServerResult ServerResult = regularService.selectRegularById(id); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.info(ServerResult.getMsg()); + } + } + + /** + * 新增校验规则 + * + * @param regular + * @return + */ + @PreAuthorize("@ebts.hasPermi('tool:regular:add')") + @Log(title = "校验规则", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody Regular regular) { + if (regular.getName() == null || regular.getName().equals("")) { + return AjaxResult.error("正则名称不能为空!"); + } + if (regular.getRegular() == null || regular.getRegular().equals("")) { + return AjaxResult.error("正则内容不能为空!"); + } + if (regular.getEnable() == null || regular.getEnable() < 0) { + return AjaxResult.error("是否启用不能为空!"); + } + if (!verifyRegular(regular)) { + return AjaxResult.error("正则表达式校验不通过!"); + } + ServerResult ServerResult = regularService.insertRegular(regular); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 修改校验规则 + * + * @param regular + * @return + */ + @PreAuthorize("@ebts.hasPermi('tool:regular:edit')") + @Log(title = "校验规则", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody Regular regular) { + if (regular.getName() == null || regular.getName().equals("")) { + return AjaxResult.error("正则名称不能为空!"); + } + if (regular.getRegular() == null || regular.getRegular().equals("")) { + return AjaxResult.error("正则内容不能为空!"); + } + if (regular.getEnable() == null || regular.getEnable() < 0) { + return AjaxResult.error("是否启用不能为空!"); + } + if (!verifyRegular(regular)) { + return AjaxResult.error("正则表达式校验不通过!"); + } + ServerResult ServerResult = regularService.updateRegular(regular); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 删除校验规则 + * + * @param ids + * @return + */ + @PreAuthorize("@ebts.hasPermi('tool:regular:remove')") + @Log(title = "校验规则", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + if (ids.length == 0) { + return AjaxResult.error("需要删除id数不能为空!"); + } + ServerResult ServerResult = regularService.deleteRegularByIds(ids); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + public boolean verifyRegular(Regular regular) { + return Pattern.matches(regular.getRegular(), regular.getValidation()); + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/RelController.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/RelController.java new file mode 100644 index 0000000..b63bd66 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/RelController.java @@ -0,0 +1,89 @@ +package com.ebts.generator.controller; + +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.entity.RelColumn; +import com.ebts.generator.entity.RelTable; +import com.ebts.generator.service.RelService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +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.List; +import java.util.Map; + +/** + * @Author 18209 + * @Date 2021/2/24 16:22 + * @Version 1.0 + */ +@RestController +@RequestMapping("/rel") +public class RelController { + private Logger logger = LoggerFactory.getLogger(RelController.class); + @Autowired + private RelService relService; + + /** + * 获取表的基础信息 + * + * @return + */ + @PreAuthorize("@ebts.hasAnyPermi('rel:tableinfo')") + @GetMapping("/tableinfo") + public AjaxResult tableinfos() { + ServerResult>> ServerResult = relService.tableInfos(); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 获取表的字段信息 + * + * @param tableName + * @param relId + * @return + */ + @PreAuthorize("@ebts.hasAnyPermi('rel:tableinfo')") + @GetMapping("/{tableName}/{relId}") + public AjaxResult relColumns(@PathVariable("tableName") String tableName, @PathVariable("relId") Long relId) { + ServerResult> ServerResult = relService.relColumns(tableName, relId); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + @PreAuthorize("@ebts.hasAnyPermi('rel:colums')") + @GetMapping("/{tableName}") + public AjaxResult tableColumns(@PathVariable("tableName") String tableName) { + ServerResult>> ServerResult = relService.tableColumns(tableName); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + @PreAuthorize("@ebts.hasAnyPermi('rel:colums')") + @GetMapping("/colums/{tableId}") + public AjaxResult relTableByTableId(@PathVariable("tableId") Long tableId) { + ServerResult> ServerResult = relService.relTableByTableId(tableId); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/TopSearchTableController.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/TopSearchTableController.java new file mode 100644 index 0000000..7312dfd --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/TopSearchTableController.java @@ -0,0 +1,151 @@ +package com.ebts.generator.controller; + +import java.io.Serializable; +import java.util.List; + + +import com.ebts.common.core.controller.EBTSController; +import com.ebts.common.core.text.Convert; +import com.ebts.common.utils.ServerResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +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.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ebts.common.annotation.Log; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.generator.entity.TopSearchTable; +import com.ebts.generator.service.TopSearchTableService; +import com.ebts.common.utils.poi.ExcelUtil; + +/** + * top万能查询主Controller + * + * @author clay + * @date 2021-07-20 + */ + +@RestController +@RequestMapping("/tool/table") +public class TopSearchTableController extends EBTSController { + protected final Logger logger = LoggerFactory.getLogger(TopSearchTableController.class); + + @Autowired + private TopSearchTableService topSearchTableService; + + /** + * 查询top万能查询主列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:table:list')") + @PostMapping("/list") + public Serializable list(@Validated @RequestBody TopSearchTable topSearchTable) { + startPage(topSearchTable.getPageInfo()); + ServerResult> genServerResult = topSearchTableService.selectTopSearchTableList(topSearchTable); + if (genServerResult.isStart()) { + return getDataTable(genServerResult.getData()); + } else { + return AjaxResult.info(genServerResult.getMsg()); + } + } + + /** + * 导出top万能查询主列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:table:export')") + @Log(title = "top万能查询主", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public AjaxResult export(@Validated @RequestBody TopSearchTable topSearchTable) { + ServerResult> genServerResult = topSearchTableService.selectTopSearchTableList(topSearchTable); + ExcelUtil util = new ExcelUtil(TopSearchTable. class); + if (genServerResult.isStart()) { + return util.exportExcel(genServerResult.getData(), "table"); + } else { + return AjaxResult.error(genServerResult.getMsg()); + } + } + + /** + * 获取top万能查询主详细信息 + */ + @PreAuthorize("@ebts.hasPermi('tool:table:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + ServerResult genServerResult = topSearchTableService.selectTopSearchTableById(id); + if (genServerResult.isStart()) { + return AjaxResult.success(genServerResult.getData()); + } else { + return AjaxResult.info(genServerResult.getMsg()); + } + } + + /** + * 新增top万能查询主 + */ + @PreAuthorize("@ebts.hasPermi('tool:table:add')") + @Log(title = "top万能查询主", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody TopSearchTable topSearchTable) { + ServerResult genServerResult = topSearchTableService.insertTopSearchTable(topSearchTable); + if (genServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(genServerResult.getMsg()); + } + } + + /** + * 修改top万能查询主 + */ + @PreAuthorize("@ebts.hasPermi('tool:table:edit')") + @Log(title = "top万能查询主", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody TopSearchTable topSearchTable) { + ServerResult genServerResult = topSearchTableService.updateTopSearchTable(topSearchTable); + if (genServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(genServerResult.getMsg()); + } + } + + /** + * 删除top万能查询主 + */ + @PreAuthorize("@ebts.hasPermi('tool:table:remove')") + @Log(title = "top万能查询主", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + if (ids.length<0){ + return AjaxResult.error("id不能为空!"); + } + ServerResult genServerResult = topSearchTableService.deleteTopSearchTableByIds(ids); + if (genServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(genServerResult.getMsg()); + } + } + /** + * 导入表结构(保存) + */ + @PreAuthorize("@ebts.hasPermi('tool:gen:list')") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTopTable") + public AjaxResult importTableSave(String tables) { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + + List tableList = topSearchTableService.selectDbTableListByNames(tableNames); + topSearchTableService.importGenTable(tableList); + return AjaxResult.success(); + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/UniQueryController.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/UniQueryController.java new file mode 100644 index 0000000..734f3c3 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/controller/UniQueryController.java @@ -0,0 +1,146 @@ +package com.ebts.generator.controller; + +import java.io.Serializable; +import java.util.List; + + +import com.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.ServerResult; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.generator.entity.UniQuery; +import com.ebts.generator.service.UniQueryService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.prepost.PreAuthorize; +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.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 万能查询Controller + * + * @author binlin + * @date 2021-01-30 + */ +@RestController +@RequestMapping("/tool/query") +public class UniQueryController extends BaseController { + protected final Logger logger = LoggerFactory.getLogger(UniQueryController.class); + + @Autowired + private UniQueryService uniQueryService; + + /** + * 查询万能查询列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:query:list')") + @GetMapping("/list") + public Serializable list(UniQuery uniQuery) { + startPage(); + ServerResult> ServerResult = uniQueryService.selectUniQueryList(uniQuery); + if (ServerResult.isStart()) { + return getDataTable(ServerResult.getData()); + } else { + return AjaxResult.info(ServerResult.getMsg()); + } + } + + /** + * 导出万能查询列表 + */ + @PreAuthorize("@ebts.hasPermi('tool:query:export')") + @Log(title = "万能查询", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public AjaxResult export(UniQuery uniQuery) { + ServerResult> ServerResult = uniQueryService.selectUniQueryList(uniQuery); + ExcelUtil util = new ExcelUtil(UniQuery.class); + if (ServerResult.isStart()) { + return util.exportExcel(ServerResult.getData(), "query"); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 获取万能查询详细信息 + */ + @PreAuthorize("@ebts.hasPermi('tool:query:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) { + ServerResult ServerResult = uniQueryService.selectUniQueryById(id); + if (ServerResult.isStart()) { + return AjaxResult.success(ServerResult.getData()); + } else { + return AjaxResult.info(ServerResult.getMsg()); + } + } + + /** + * 新增万能查询 + */ + @PreAuthorize("@ebts.hasPermi('tool:query:add')") + @Log(title = "万能查询", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody UniQuery uniQuery) { + if (uniQuery.getUqName() == null || uniQuery.getUqName().equals("")) { + return AjaxResult.error("名称不能为空!"); + } + if (uniQuery.getUqDescribe() == null || uniQuery.getUqDescribe().equals("")) { + return AjaxResult.error("描述不能为空!"); + } + ServerResult ServerResult = uniQueryService.insertUniQuery(uniQuery); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 简单修改万能能查询 + */ + @PreAuthorize("@ebts.hasPermi('tool:query:edit')") + @Log(title = "万能查询", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody UniQuery uniQuery) { + if (uniQuery.getUqName() == null || uniQuery.getUqName().equals("")) { + return AjaxResult.error("名称不能为空!"); + } + if (uniQuery.getUqDescribe() == null || uniQuery.getUqDescribe().equals("")) { + return AjaxResult.error("描述不能为空!"); + } + ServerResult ServerResult = uniQueryService.updateUniQuery(uniQuery); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } + + /** + * 删除万能查询 + */ + @PreAuthorize("@ebts.hasPermi('tool:query:remove')") + @Log(title = "万能查询", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + if (ids.length < 0) { + return AjaxResult.error("id不能为空!"); + } + ServerResult ServerResult = uniQueryService.deleteUniQueryByIds(ids); + if (ServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(ServerResult.getMsg()); + } + } +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/ApiClassDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/ApiClassDao.java new file mode 100644 index 0000000..396c151 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/ApiClassDao.java @@ -0,0 +1,63 @@ +package com.ebts.generator.dao; + +import com.ebts.generator.entity.ApiClass; + +import java.util.List; + + +/** + * 接口类名Mapper接口 + * + * @author binlin + * @date 2021-01-24 + */ +public interface ApiClassDao { + + /** + * 查询接口类名 + * + * @param id 接口类名ID + * @return 接口类名 + */ + ApiClass selectApiclassById(Long id); + + /** + * 查询接口类名列表 + * + * @param apiclass 接口类名 + * @return 接口类名集合 + */ + List selectApiclassList(ApiClass apiclass); + + /** + * 新增接口类名 + * + * @param apiclass 接口类名 + * @return 结果 + */ + int insertApiclass(ApiClass apiclass); + + /** + * 修改接口类名 + * + * @param apiclass 接口类名 + * @return 结果 + */ + int updateApiclass(ApiClass apiclass); + + /** + * 删除接口类名 + * + * @param id 接口类名ID + * @return 结果 + */ + int deleteApiclassById(Long id); + + /** + * 批量删除接口类名 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + int deleteApiclassByIds(Long[] ids); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/GenTableColumnDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/GenTableColumnDao.java new file mode 100644 index 0000000..1b7ae69 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/GenTableColumnDao.java @@ -0,0 +1,60 @@ +package com.ebts.generator.dao; + +import java.util.List; + +import com.ebts.generator.entity.GenTableColumn; + +/** + * 业务字段 数据层 + * + * @author binlin + */ +public interface GenTableColumnDao { + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @return 列信息 + */ + public List selectDbTableColumnsByName(String tableName); + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumns 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(List genTableColumns); + + /** + * 删除业务字段 + * + * @param genTableColumns 列数据 + * @return 结果 + */ + public int deleteGenTableColumns(List genTableColumns); + + /** + * 批量删除业务字段 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(Long[] ids); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/GenTableDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/GenTableDao.java new file mode 100644 index 0000000..8504978 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/GenTableDao.java @@ -0,0 +1,86 @@ +package com.ebts.generator.dao; + +import java.util.List; + +import com.ebts.generator.entity.GenTable; +import org.apache.ibatis.annotations.Param; + +/** + * 业务 数据层 + * + * @author binlin + */ +public interface GenTableDao { + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + public GenTable selectGenTableByName(String tableName); + + /** + * 新增业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int insertGenTable(GenTable genTable); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int updateGenTable(GenTable genTable); + + /** + * 批量删除业务 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableByIds(Long[] ids); + + int insertMenu(@Param("paramSQL") String sql); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/InterTableDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/InterTableDao.java new file mode 100644 index 0000000..e36bb16 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/InterTableDao.java @@ -0,0 +1,91 @@ +package com.ebts.generator.dao; + +import java.util.List; + +import com.ebts.generator.entity.ApiClass; +import com.ebts.generator.entity.InterTable; + +/** + * 接口信息Mapper接口 + * + * @author binlin + * @date 2021-01-25 + */ +public interface InterTableDao { + /** + * 查询接口信息 + * + * @param id 接口信息ID + * @return 接口信息 + */ + InterTable selectInterTableById(Long id); + + /** + * 查询接口信息列表 + * + * @param interTable 接口信息 + * @return 接口信息集合 + */ + List selectInterTableList(InterTable interTable); + + /** + * 新增接口信息 + * + * @param interTable 接口信息 + * @return 结果 + */ + int insertInterTable(InterTable interTable); + + /** + * 批量新增接口信息 + * + * @param interTables + * @return + */ + int insertInterTables(List interTables); + + /** + * 通过类id删除接口 + * + * @param cId + * @return + */ + int deleteInterTableByClassId(Long cId); + + /** + * 通过模块id删除接口 + * + * @param mId + * @return + */ + int deleteInterTableByModuleId(Long mId); + + /** + * 修改接口信息 + * + * @param interTable 接口信息 + * @return 结果 + */ + int updateInterTable(InterTable interTable); + + + /** + * 删除接口信息 + * + * @param id 接口信息ID + * @return 结果 + */ + int deleteInterTableById(Long id); + + /** + * 批量删除接口信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteInterTableByIds(Long[] ids); + + ApiClass selectInterTableClass(Long id); + + List selectInterTableModule(Long id); +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/ModuleDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/ModuleDao.java new file mode 100644 index 0000000..769fa56 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/ModuleDao.java @@ -0,0 +1,61 @@ +package com.ebts.generator.dao; + +import com.ebts.generator.entity.Module; + +import java.util.List; + +/** + * 模块管理Mapper接口 + * + * @author binlin + * @date 2021-01-24 + */ +public interface ModuleDao { + /** + * 查询模块管理 + * + * @param id 模块管理ID + * @return 模块管理 + */ + Module selectModuleById(Long id); + + /** + * 查询模块管理列表 + * + * @param module 模块管理 + * @return 模块管理集合 + */ + List selectModuleList(Module module); + + /** + * 新增模块管理 + * + * @param module 模块管理 + * @return 结果 + */ + int insertModule(Module module); + + /** + * 修改模块管理 + * + * @param module 模块管理 + * @return 结果 + */ + int updateModule(Module module); + + /** + * 删除模块管理 + * + * @param id 模块管理ID + * @return 结果 + */ + int deleteModuleById(Long id); + + /** + * 批量删除模块管理 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteModuleByIds(Long[] ids); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/QueryDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/QueryDao.java new file mode 100644 index 0000000..64c0e21 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/QueryDao.java @@ -0,0 +1,73 @@ +package com.ebts.generator.dao; + +import com.ebts.common.core.entity.entity.Menu; +import com.ebts.generator.entity.UniCon; +import com.ebts.generator.entity.UniQuery; + +import java.util.List; +import java.util.Map; + +/** + * @Author 18209 + * @Date 2021/1/30 18:52 + * @Version 1.0 + */ +public interface QueryDao { + + /** + * 通过id获取到万能查询的基本信息 + * @param id + * @return + */ + UniQuery selectQueryInfo(Long id); + + /** + * 删除万能查询 + * @param uqId + * @return + */ + Integer deleteUniCon(Long uqId); + + /** + * 新增万能查询 + * @param uniCons + * @return + */ + Integer insertUniCon(List uniCons); + + /** + * 获取查询信息 + * @param paramSQL + * @return + */ + List> UniQuery(String paramSQL); + + /** + * 查询是否发布 + * @param id + * @return + */ + Integer Release(Long id); + + /** + * 改变发布状态 + * @param uniQuery + * @return + */ + Integer changeRelease(UniQuery uniQuery); + + /** + * 插入到菜单 + * @param menu + * @return + */ + Integer insertMenu(Menu menu); + + /** + * 删除菜单 + * @param path + * @return + */ + Integer deleteMenu(String path); + +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/RegularDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/RegularDao.java new file mode 100644 index 0000000..c946d81 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/RegularDao.java @@ -0,0 +1,67 @@ +package com.ebts.generator.dao; + +import java.util.List; + +import com.ebts.generator.entity.Regular; + +/** + * 校验规则Dao接口 + * + * @author binlin + * @date 2021-01-18 + */ +public interface RegularDao { + /** + * 查询校验规则 + * + * @param id 校验规则ID + * @return 校验规则 + */ + Regular selectRegularById(Long id); + + /** + * 查询校验规则列表 + * + * @param regular 校验规则 + * @return 校验规则集合 + */ + List selectRegularList(Regular regular); + /** + * 查询校验规则下拉框列表 + * + * @return 校验规则集合 + */ + List selectRegularOption(); + + /** + * 新增校验规则 + * + * @param regular 校验规则 + * @return 结果 + */ + int insertRegular(Regular regular); + + /** + * 修改校验规则 + * + * @param regular 校验规则 + * @return 结果 + */ + int updateRegular(Regular regular); + + /** + * 删除校验规则 + * + * @param id 校验规则ID + * @return 结果 + */ + int deleteRegularById(Long id); + + /** + * 批量删除校验规则 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + int deleteRegularByIds(Long[] ids); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/RelDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/RelDao.java new file mode 100644 index 0000000..1225d8f --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/RelDao.java @@ -0,0 +1,74 @@ +package com.ebts.generator.dao; + +import com.ebts.generator.entity.RelColumn; +import com.ebts.generator.entity.RelTable; + +import java.util.List; +import java.util.Map; + +/** + * @Author 18209 + * @Date 2021/2/24 16:21 + * @Version 1.0 + */ +public interface RelDao { + /** + * 获取表信息 + * + * @return + */ + List> tableInfos(); + + /** + * 获取表字段信息 + * + * @param tableName + * @return + */ + List selectTableColumn(String tableName); + + /** + * 批量增加字段信息 + * + * @param relColumns + * @return + */ + Integer insertRelColumns(List relColumns); + + /** + * 批量增加子表字段 + * @param relTables + * @return + */ + Integer insertRelTables(List relTables); + + /** + * 通过tableName获取到column信息 + * + * @param tableName + * @return + */ + List> tableColumns(String tableName); + + /** + * 通过主表id查询子表信息 + * @param tableId + * @return + */ + List relTableByTableId(Long tableId); + + /** + * 通过relId删除RelColumn信息 + * @param relId + * @return + */ + Integer deleteRelColumnByRelId(Long relId); + + /** + * 通过tableid删除RelTable信息 + * @param tableId + * @return + */ + Integer deleteRelTableByTableId(Long tableId); + +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/SearchTableRoleDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/SearchTableRoleDao.java new file mode 100644 index 0000000..aef75d4 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/SearchTableRoleDao.java @@ -0,0 +1,70 @@ +package com.ebts.generator.dao; + +/** + * @author: Clay + * @date: 2021/7/21 0:44 + * @description:SearchTableRoleDao + * @email: clay@hchyun.com + */ + +import java.util.List; + +import com.ebts.generator.entity.SearchTableRole; + +/** + * top万能查询角色关系Mapper接口 + * + * @author clay + * @date 2021-07-21 + */ +public interface SearchTableRoleDao { + /** + * 查询top万能查询角色关系 + * + * @param searchTableId top万能查询角色关系ID + * @return top万能查询角色关系 + */ + SearchTableRole selectSearchTableRoleById(Long searchTableId); + + /** + * 查询top万能查询角色关系列表 + * + * @param searchTableRole top万能查询角色关系 + * @return top万能查询角色关系集合 + */ + List selectSearchTableRoleList(SearchTableRole searchTableRole); + + /** + * 新增top万能查询角色关系 + * + * @param searchTableRole top万能查询角色关系 + * @return 结果 + */ + int insertSearchTableRole(SearchTableRole searchTableRole); + + /** + * 修改top万能查询角色关系 + * + * @param searchTableRole top万能查询角色关系 + * @return 结果 + */ + int updateSearchTableRole(SearchTableRole searchTableRole); + + /** + * 删除top万能查询角色关系 + * + * @param searchTableId top万能查询角色关系ID + * @return 结果 + */ + int deleteSearchTableRoleById(Long searchTableId); + + /** + * 批量删除top万能查询角色关系 + * + * @param searchTableIds 需要删除的数据ID + * @return 结果 + */ + int deleteSearchTableRoleByIds(Long[] searchTableIds); + + int batchSearchTableRole(List roleList); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/TopSearchTableDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/TopSearchTableDao.java new file mode 100644 index 0000000..a4b2492 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/TopSearchTableDao.java @@ -0,0 +1,97 @@ +package com.ebts.generator.dao; + +import java.util.List; +import com.ebts.generator.entity.TopSearchTable; +import com.ebts.generator.entity.TopSearchColumn; + +/** + * top万能查询主Mapper接口 + * + * @author clay + * @date 2021-07-20 + */ +public interface TopSearchTableDao { + /** + * 查询top万能查询主 + * + * @param id top万能查询主ID + * @return top万能查询主 + */ + TopSearchTable selectTopSearchTableById(Long id); + + /** + * 查询top万能查询主列表 + * + * @param topSearchTable top万能查询主 + * @return top万能查询主集合 + */ + List selectTopSearchTableList(TopSearchTable topSearchTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + List selectDbTableListByNames(String[] tableNames); + List selectDbTableColumnsByName(String tableName); + + + + /** + * 新增top万能查询主 + * + * @param topSearchTable top万能查询主 + * @return 结果 + */ + int insertTopSearchTable(TopSearchTable topSearchTable); + + /** + * 修改top万能查询主 + * + * @param topSearchTable top万能查询主 + * @return 结果 + */ + int updateTopSearchTable(TopSearchTable topSearchTable); + + /** + * 删除top万能查询主 + * + * @param id top万能查询主ID + * @return 结果 + */ + int deleteTopSearchTableById(Long id); + + /** + * 批量删除top万能查询主 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + int deleteTopSearchTableByIds(Long[] ids); + + /** + * 批量删除top万能查询字段 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + int deleteTopSearchColumnBySearchTableIds(Long[] ids); + + /** + * 批量新增top万能查询字段 + * + * @param topSearchColumnList top万能查询字段列表 + * @return 结果 + */ + int batchTopSearchColumn(List topSearchColumnList); + + + /** + * 通过top万能查询主ID删除top万能查询字段信息 + * + * @param id top万能查询主ID + * @return 结果 + */ + int deleteTopSearchColumnBySearchTableId(Long id); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/UniQueryDao.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/UniQueryDao.java new file mode 100644 index 0000000..6f2a56c --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dao/UniQueryDao.java @@ -0,0 +1,66 @@ +package com.ebts.generator.dao; + + +import com.ebts.generator.entity.UniQuery; + +import java.util.List; + +/** + * 万能查询Mapper接口 + * + * @author binlin + * @date 2021-01-30 + */ +public interface UniQueryDao { + /** + * 查询万能查询 + * + * @param id 万能查询ID + * @return 万能查询 + */ + UniQuery selectUniQueryById(Long id); + + /** + * 查询万能查询列表 + * + * @param uniQuery 万能查询 + * @return 万能查询集合 + */ + List selectUniQueryList(UniQuery uniQuery); + + /** + * 新增万能查询 + * + * @param uniQuery 万能查询 + * @return 结果 + */ + int insertUniQuery(UniQuery uniQuery); + + /** + * 修改万能查询 + * + * @param uniQuery 万能查询 + * @return 结果 + */ + int updateUniQuery(UniQuery uniQuery); + + /** + * 删除万能查询 + * + * @param id 万能查询ID + * @return 结果 + */ + int deleteUniQueryById(Long id); + + /** + * 批量删除万能查询 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteUniQueryByIds(Long[] ids); + + int deleteUniQueryByUqId(Long id); + + +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/dto/InterTableDto.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/dto/InterTableDto.java new file mode 100644 index 0000000..7de735d --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/dto/InterTableDto.java @@ -0,0 +1,40 @@ +package com.ebts.generator.dto; + +import com.ebts.generator.entity.ApiClass; +import com.ebts.generator.entity.InterTable; +import com.ebts.generator.entity.Module; + +import java.util.List; + +public class InterTableDto { + + private ApiClass apiclass; + + private Module module; + + private List interTables; + + public Module getModule() { + return module; + } + + public void setModule(Module module) { + this.module = module; + } + + public ApiClass getApiclass() { + return apiclass; + } + + public void setApiclass(ApiClass apiclass) { + this.apiclass = apiclass; + } + + public List getInterTables() { + return interTables; + } + + public void setInterTables(List interTables) { + this.interTables = interTables; + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/ApiClass.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/ApiClass.java new file mode 100644 index 0000000..61a29fb --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/ApiClass.java @@ -0,0 +1,169 @@ +package com.ebts.generator.entity; + +import com.ebts.common.annotation.Excel; +import com.ebts.common.core.entity.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.ArrayList; +import java.util.List; + +/** + * 接口类名对象 sys_apiclass + * + * @author binlin + * @date 2021-01-24 + */ +public class ApiClass extends BaseEntity { + + + /** + * 类id + */ + private Long id; + + /** + * 模块id + */ + @Excel(name = "模块id") + private Long mId; + + /** + * 类名 + */ + @Excel(name = "类名") + private String cName; + + /** + * 类描述 + */ + @Excel(name = "类描述") + private String cDescribe; + + /** + * 包名 + */ + @Excel(name = "包名") + private String packageName; + + /** + * 前缀 + */ + @Excel(name = "前缀") + private String prefix; + /** + * 作者 + */ + @Excel(name = "作者") + private String author; + + /** + * 电子邮件 + */ + @Excel(name = "电子邮件") + private String email; + + /** + * 模块类 + */ + private Module module; + + private List interTables; + + public List getInterTables() { + return interTables; + } + + public void setInterTables(List interTables) { + if (interTables == null) { + interTables = new ArrayList(); + } + this.interTables = interTables; + } + + public String getPrefix() { + return prefix; + } + + public void setPrefix(String prefix) { + this.prefix = prefix; + } + + public Module getModule() { + return module; + } + + public void setModule(Module module) { + this.module = module; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setmId(Long mId) { + this.mId = mId; + } + + public Long getmId() { + return mId; + } + + public void setcName(String cName) { + this.cName = cName; + } + + public String getcName() { + return cName; + } + + public void setcDescribe(String cDescribe) { + this.cDescribe = cDescribe; + } + + public String getcDescribe() { + return cDescribe; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("mId", getmId()) + .append("cName", getcName()) + .append("cDescribe", getcDescribe()) + .append("createTime", getCreateTime()) + .append("createBy", getCreateBy()) + .append("updateTime", getUpdateTime()) + .append("updateBy", getUpdateBy()) + .toString(); + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/GenTable.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/GenTable.java new file mode 100644 index 0000000..610a634 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/GenTable.java @@ -0,0 +1,429 @@ +package com.ebts.generator.entity; + +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; + +import com.ebts.common.core.entity.BaseEntity; +import com.ebts.common.utils.StringUtils; +import com.ebts.generator.utils.constant.GenConstants; +import org.apache.commons.lang3.ArrayUtils; + +/** + * 业务表 gen_table + * + * @author binlin + */ +public class GenTable extends BaseEntity { + + + /** + * 编号 + */ + private Long tableId; + + /** + * 表名称 + */ + @NotBlank(message = "表名称不能为空") + private String tableName; + + /** + * 表描述 + */ + @NotBlank(message = "表描述不能为空") + private String tableComment; + + /** + * 关联父表的表名 + */ + private String subTableName; + + /** + * 本表关联父表的外键名 + */ + private String subTableFkName; + + /** + * 实体类名称(首字母大写) + */ + @NotBlank(message = "实体类名称不能为空") + private String className; + + /** + * 使用的模板(crud单表操作 tree树表操作 sub主子表操作 ass关联表操作) + */ + private String tplCategory; + + /** + * 生成包路径 + */ + @NotBlank(message = "生成包路径不能为空") + private String packageName; + + /** + * 生成模块名 + */ + @NotBlank(message = "生成模块名不能为空") + private String moduleName; + + /** + * 生成业务名 + */ + @NotBlank(message = "生成业务名不能为空") + private String businessName; + + /** + * 生成功能名 + */ + @NotBlank(message = "生成功能名不能为空") + private String functionName; + + /** + * 生成作者 + */ + @NotBlank(message = "作者不能为空") + private String functionAuthor; + + /** + * 生成代码方式(0zip压缩包 1自定义路径) + */ + private String genType; + + /** + * 生成路径(不填默认项目路径) + */ + private String genPath; + + /** + * 主键信息 + */ + private GenTableColumn pkColumn; + + /** + * 子表信息 + */ + private GenTable subTable; + + /** + * 表列信息 + */ + @Valid + private List columns; + + @Valid + private List relTables; + + + + + /** + * 其它生成选项 + */ + private String options; + + /** + * 树编码字段 + */ + private String treeCode; + + /** + * 树父编码字段 + */ + private String treeParentCode; + + /** + * 树名称字段 + */ + private String treeName; + + /** + * 上级菜单ID字段 + */ + private String parentMenuId; + + /** + * 上级菜单名称字段 + */ + private String parentMenuName; + + /** + * 关联表名 + */ + private String assTableName; + + /** + * 主表字段 + */ + private String assTableColumn; + + /** + * 关联表key + */ + private String assTableFkColumn; + + /** + * 关联查询方式 + */ + private String assQueryType; + + public List getRelTables() { + return relTables; + } + + public void setRelTables(List relTables) { + this.relTables = relTables; + } + + public String getAssQueryType() { + return assQueryType; + } + + public void setAssQueryType(String assQueryType) { + this.assQueryType = assQueryType; + } + + public String getAssTableName() { + return assTableName; + } + + public void setAssTableName(String assTableName) { + this.assTableName = assTableName; + } + + public String getAssTableColumn() { + return assTableColumn; + } + + public void setAssTableColumn(String assTableColumn) { + this.assTableColumn = assTableColumn; + } + + public String getAssTableFkColumn() { + return assTableFkColumn; + } + + public void setAssTableFkColumn(String assTableFkColumn) { + this.assTableFkColumn = assTableFkColumn; + } + + public Long getTableId() { + return tableId; + } + + public void setTableId(Long tableId) { + this.tableId = tableId; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getTableComment() { + return tableComment; + } + + public void setTableComment(String tableComment) { + this.tableComment = tableComment; + } + + public String getSubTableName() { + return subTableName; + } + + public void setSubTableName(String subTableName) { + this.subTableName = subTableName; + } + + public String getSubTableFkName() { + return subTableFkName; + } + + public void setSubTableFkName(String subTableFkName) { + this.subTableFkName = subTableFkName; + } + + public String getClassName() { + return className; + } + + public void setClassName(String className) { + this.className = className; + } + + public String getTplCategory() { + return tplCategory; + } + + public void setTplCategory(String tplCategory) { + this.tplCategory = tplCategory; + } + + public String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + this.packageName = packageName; + } + + public String getModuleName() { + return moduleName; + } + + public void setModuleName(String moduleName) { + this.moduleName = moduleName; + } + + public String getBusinessName() { + return businessName; + } + + public void setBusinessName(String businessName) { + this.businessName = businessName; + } + + public String getFunctionName() { + return functionName; + } + + public void setFunctionName(String functionName) { + this.functionName = functionName; + } + + public String getFunctionAuthor() { + return functionAuthor; + } + + public void setFunctionAuthor(String functionAuthor) { + this.functionAuthor = functionAuthor; + } + + public String getGenType() { + return genType; + } + + public void setGenType(String genType) { + this.genType = genType; + } + + public String getGenPath() { + return genPath; + } + + public void setGenPath(String genPath) { + this.genPath = genPath; + } + + public GenTableColumn getPkColumn() { + return pkColumn; + } + + public void setPkColumn(GenTableColumn pkColumn) { + this.pkColumn = pkColumn; + } + + public GenTable getSubTable() { + return subTable; + } + + public void setSubTable(GenTable subTable) { + this.subTable = subTable; + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + + public String getOptions() { + return options; + } + + public void setOptions(String options) { + this.options = options; + } + + public String getTreeCode() { + return treeCode; + } + + public void setTreeCode(String treeCode) { + this.treeCode = treeCode; + } + + public String getTreeParentCode() { + return treeParentCode; + } + + public void setTreeParentCode(String treeParentCode) { + this.treeParentCode = treeParentCode; + } + + public String getTreeName() { + return treeName; + } + + public void setTreeName(String treeName) { + this.treeName = treeName; + } + + public String getParentMenuId() { + return parentMenuId; + } + + public void setParentMenuId(String parentMenuId) { + this.parentMenuId = parentMenuId; + } + + public String getParentMenuName() { + return parentMenuName; + } + + public void setParentMenuName(String parentMenuName) { + this.parentMenuName = parentMenuName; + } + + public boolean isSub() { + 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/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/GenTableColumn.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/GenTableColumn.java new file mode 100644 index 0000000..0b9f8cb --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/GenTableColumn.java @@ -0,0 +1,376 @@ +package com.ebts.generator.entity; + +import com.ebts.common.core.entity.BaseEntity; +import com.ebts.common.utils.StringUtils; + +import javax.validation.constraints.NotBlank; + + +/** + * 代码生成业务字段表 gen_table_column + * + * @author binlin + */ +public class GenTableColumn extends BaseEntity { + + + /** + * 编号 + */ + private Long columnId; + + /** + * 归属表编号 + */ + private Long tableId; + + /** + * 列名称 + */ + private String columnName; + + /** + * 列描述 + */ + private String columnComment; + + /** + * 列类型 + */ + private String columnType; + + /** + * JAVA类型 + */ + private String javaType; + + /** + * JAVA字段名 + */ + @NotBlank(message = "Java属性不能为空") + private String javaField; + + /** + * 是否主键(1是) + */ + private String isPk; + + /** + * 是否自增(1是) + */ + private String isIncrement; + + /** + * 是否必填(1是) + */ + private String isRequired; + + /** + * 是否为插入字段(1是) + */ + private String isInsert; + + /** + * 是否编辑字段(1是) + */ + private String isEdit; + + /** + * 是否列表字段(1是) + */ + private String isList; + + /** + * 是否查询字段(1是) + */ + private String isQuery; + + /** + * 是否正则(1否) + */ + private Long isRegular; + + /** + * 正则表达式内容 + */ + private String regular; + + /** + * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) + */ + private String queryType; + + /** + * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) + */ + private String htmlType; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 排序 + */ + private Integer sort; + + + public Long getIsRegular() { + return isRegular; + } + + public void setIsRegular(Long isRegular) { + this.isRegular = isRegular; + } + + public String getRegular() { + return regular; + } + + public void setRegular(String regular) { + this.regular = regular; + } + + public void setColumnId(Long columnId) { + this.columnId = columnId; + } + + public Long getColumnId() { + return columnId; + } + + public void setTableId(Long tableId) { + this.tableId = tableId; + } + + public Long getTableId() { + return tableId; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public String getColumnName() { + return columnName; + } + + public void setColumnComment(String columnComment) { + this.columnComment = columnComment; + } + + public String getColumnComment() { + return columnComment; + } + + public void setColumnType(String columnType) { + this.columnType = columnType; + } + + public String getColumnType() { + return columnType; + } + + public void setJavaType(String javaType) { + this.javaType = javaType; + } + + public String getJavaType() { + return javaType; + } + + public void setJavaField(String javaField) { + this.javaField = javaField; + } + + public String getJavaField() { + return javaField; + } + + public String getCapJavaField() { + return StringUtils.capitalize(javaField); + } + + public void setIsPk(String isPk) { + this.isPk = isPk; + } + + public String getIsPk() { + return isPk; + } + + public boolean isPk() { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) { + return isPk != null && StringUtils.equals("1", isPk); + } + + public String getIsIncrement() { + return isIncrement; + } + + public void setIsIncrement(String isIncrement) { + this.isIncrement = isIncrement; + } + + public boolean isIncrement() { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public void setIsRequired(String isRequired) { + this.isRequired = isRequired; + } + + public String getIsRequired() { + return isRequired; + } + + public boolean isRequired() { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public void setIsInsert(String isInsert) { + this.isInsert = isInsert; + } + + public String getIsInsert() { + return isInsert; + } + + public boolean isInsert() { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public void setIsEdit(String isEdit) { + this.isEdit = isEdit; + } + + public String getIsEdit() { + return isEdit; + } + + public boolean isEdit() { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public void setIsList(String isList) { + this.isList = isList; + } + + public String getIsList() { + return isList; + } + + public boolean isList() { + return isList(this.isList); + } + + public boolean isList(String isList) { + return isList != null && StringUtils.equals("1", isList); + } + + public void setIsQuery(String isQuery) { + this.isQuery = isQuery; + } + + public String getIsQuery() { + return isQuery; + } + + public boolean isQuery() { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public void setQueryType(String queryType) { + this.queryType = queryType; + } + + public String getQueryType() { + return queryType; + } + + public String getHtmlType() { + return htmlType; + } + + public void setHtmlType(String htmlType) { + this.htmlType = htmlType; + } + + public void setDictType(String dictType) { + this.dictType = dictType; + } + + public String getDictType() { + return dictType; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public Integer getSort() { + return sort; + } + + public boolean isSuperColumn() { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); + } + + public boolean isUsableColumn() { + 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, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) { + for (String value : remarks.split(" ")) { + if (StringUtils.isNotEmpty(value)) { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append("").append(startStr).append("=").append(endStr).append(","); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } else { + return this.columnComment; + } + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/InterTable.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/InterTable.java new file mode 100644 index 0000000..68d7a6e --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/InterTable.java @@ -0,0 +1,213 @@ +package com.ebts.generator.entity; + +import com.ebts.common.annotation.Excel; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.Date; + +/** + * 接口信息对象 sys_inter_table + * + * @author binlin + * @date 2021-01-25 + */ +@ApiModel("接口信息") +public class InterTable { + + /** + * id + */ + private Long id; + + /** + * 模块id + */ + @Excel(name = "模块id") + private Long mId; + + /** + * 类id + */ + @Excel(name = "类id") + private Long cId; + + /** + * 接口名称 + */ + @Excel(name = "接口名称") + private String itName; + + /** + * 描述 + */ + @Excel(name = "描述") + private String itDescribe; + + /** + * 是否设置许可 + */ + @Excel(name = "是否设置许可") + private String isPermission; + + /** + * 请求路径 + */ + @Excel(name = "请求路径") + private String requrl; + + /** + * 请求方式 + */ + @Excel(name = "请求方式") + private String method; + + /** + * 是否生成 + */ + @Excel(name = "是否生成") + private String isGenerate; + /** + * 类型 + */ + private Integer type; + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 创建者 + */ + private Long createBy; + + private String mName; + private ApiClass apiclass; + + public ApiClass getApiclass() { + return apiclass; + } + + public void setApiclass(ApiClass apiclass) { + this.apiclass = apiclass; + } + + public String getmName() { + return mName; + } + + public void setmName(String mName) { + this.mName = mName; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Long getCreateBy() { + return createBy; + } + + public void setCreateBy(Long createBy) { + this.createBy = createBy; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public String getItName() { + return itName; + } + + public void setItName(String itName) { + this.itName = itName; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setmId(Long mId) { + this.mId = mId; + } + + public Long getmId() { + return mId; + } + + public void setcId(Long cId) { + this.cId = cId; + } + + public Long getcId() { + return cId; + } + + public void setItDescribe(String itDescribe) { + this.itDescribe = itDescribe; + } + + public String getItDescribe() { + return itDescribe; + } + + public void setRequrl(String requrl) { + this.requrl = requrl; + } + + public String getRequrl() { + return requrl; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getIsPermission() { + return isPermission; + } + + public void setIsPermission(String isPermission) { + this.isPermission = isPermission; + } + + public String getIsGenerate() { + return isGenerate; + } + + public void setIsGenerate(String isGenerate) { + this.isGenerate = isGenerate; + } + + public String getMethod() { + return method; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("mId", getmId()) + .append("cId", getcId()) + .append("itDescribe", getItDescribe()) + .append("requrl", getRequrl()) + .append("method", getMethod()) + .toString(); + } +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/Module.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/Module.java new file mode 100644 index 0000000..5f1b3a1 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/Module.java @@ -0,0 +1,82 @@ +package com.ebts.generator.entity; + +import com.ebts.common.annotation.Excel; +import com.ebts.common.core.entity.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.List; + +/** + * 模块管理对象 sys_module + * + * @author binlin + * @date 2021-01-24 + */ +public class Module extends BaseEntity { + + + /** + * 模块id + */ + private Long id; + + /** + * 模块名称 + */ + @Excel(name = "模块名称") + private String mName; + + /** + * 模块描述 + */ + @Excel(name = "模块描述") + private String mDescribe; + + private List apiClassList; + + public List getApiclassList() { + return apiClassList; + } + + public void setApiclassList(List apiClassList) { + this.apiClassList = apiClassList; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setmName(String mName) { + this.mName = mName; + } + + public String getmName() { + return mName; + } + + public void setmDescribe(String mDescribe) { + this.mDescribe = mDescribe; + } + + public String getmDescribe() { + return mDescribe; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("mName", getmName()) + .append("mDescribe", getmDescribe()) + .append("createTime", getCreateTime()) + .append("createBy", getCreateBy()) + .append("updateTime", getUpdateTime()) + .append("updateBy", getUpdateBy()) + .toString(); + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/Regular.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/Regular.java new file mode 100644 index 0000000..68dda9a --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/Regular.java @@ -0,0 +1,101 @@ +package com.ebts.generator.entity; + +import com.ebts.common.annotation.Excel; +import com.ebts.common.core.entity.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 校验规则对象 sys_regular + * + * @author binlin + * @date 2021-01-18 + */ +public class Regular extends BaseEntity { + + + /** + * id + */ + private Long id; + + /** + * 正则名称 + */ + @Excel(name = "正则名称") + private String name; + + /** + * 正则内容 + */ + @Excel(name = "正则内容") + private String regular; + + /** + * 验证内容 + */ + @Excel(name = "验证内容") + private String validation; + + /** + * 是否启用 1:启动 2:关闭 + */ + @Excel(name = "是否启用 1:启动 2:关闭") + private Integer enable; + + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setRegular(String regular) { + this.regular = regular; + } + + public String getRegular() { + return regular; + } + + public void setValidation(String validation) { + this.validation = validation; + } + + public String getValidation() { + return validation; + } + + public void setEnable(Integer enable) { + this.enable = enable; + } + + public Integer getEnable() { + return enable; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("name", getName()) + .append("regular", getRegular()) + .append("validation", getValidation()) + .append("enable", getEnable()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/RelColumn.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/RelColumn.java new file mode 100644 index 0000000..262a304 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/RelColumn.java @@ -0,0 +1,151 @@ +package com.ebts.generator.entity; + +public class RelColumn { + + //表id + private long id; + //父表id + private long relId; + //列名称 + private String columnName; + //列描述 + private String columnComment; + //列类型 + private String columnType; + //java类型 + private String javaType; + //java字段名 + private String javaField; + //是否列表显示(1是) + private String isList; + //是否可查询(1可) + private String isQuery; + //查询方式(等于,不等于,小于,大于,区间) + private String queryType; + //控件显示类型 + private String htmlType; + //字典类型 + private String dictType; + //排序 + private Integer sort; + //创建时间 + private long createBy; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getRelId() { + return relId; + } + + public void setRelId(long relId) { + this.relId = relId; + } + + public String getColumnName() { + return columnName; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public String getColumnComment() { + return columnComment; + } + + public void setColumnComment(String columnComment) { + this.columnComment = columnComment; + } + + public String getColumnType() { + return columnType; + } + + public void setColumnType(String columnType) { + this.columnType = columnType; + } + + public String getJavaType() { + return javaType; + } + + public void setJavaType(String javaType) { + this.javaType = javaType; + } + + public String getJavaField() { + return javaField; + } + + public void setJavaField(String javaField) { + this.javaField = javaField; + } + + public String getIsList() { + return isList; + } + + public void setIsList(String isList) { + this.isList = isList; + } + + public String getIsQuery() { + return isQuery; + } + + public void setIsQuery(String isQuery) { + this.isQuery = isQuery; + } + + public String getQueryType() { + return queryType; + } + + public void setQueryType(String queryType) { + this.queryType = queryType; + } + + public String getHtmlType() { + return htmlType; + } + + public void setHtmlType(String htmlType) { + this.htmlType = htmlType; + } + + public String getDictType() { + if (dictType == null) { + dictType = ""; + } + return dictType; + } + + public void setDictType(String dictType) { + if (dictType == null) { + dictType = ""; + } + this.dictType = dictType; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public long getCreateBy() { + return createBy; + } + + public void setCreateBy(long createBy) { + this.createBy = createBy; + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/RelTable.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/RelTable.java new file mode 100644 index 0000000..67d09f6 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/RelTable.java @@ -0,0 +1,158 @@ +package com.ebts.generator.entity; + +import java.util.List; + +public class RelTable { + + + //表id + private long id; + //主表id + private long tableId; + //关联子表表名 + private String relName; + //子表表名称简写 + private String relAs; + //父表名称 + private String tableName; + //父表名称简写 + private String tableAs; + //关联子表描述 + private String relComment; + //关联子表的字段 + private String relColumn; + //关联父表字段 + private String tableColumn; + //实体类名称(子表) + private String relClass; + //实体小写类名称(子表) + private String relclass; + //查询方式 + private String queryType; + //排序 + private Integer sort; + //创建者 + private long createBy; + + private List relColumns; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getTableId() { + return tableId; + } + + public void setTableId(long tableId) { + this.tableId = tableId; + } + + public String getRelName() { + return relName; + } + + public void setRelName(String relName) { + this.relName = relName; + } + + public String getRelAs() { + return relAs; + } + + public void setRelAs(String relAs) { + this.relAs = relAs; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getTableAs() { + return tableAs; + } + + public void setTableAs(String tableAs) { + this.tableAs = tableAs; + } + + public String getRelComment() { + return relComment; + } + + public void setRelComment(String relComment) { + this.relComment = relComment; + } + + public String getRelColumn() { + return relColumn; + } + + public void setRelColumn(String relColumn) { + this.relColumn = relColumn; + } + + public String getTableColumn() { + return tableColumn; + } + + public void setTableColumn(String tableColumn) { + this.tableColumn = tableColumn; + } + + public String getRelClass() { + return relClass; + } + + public void setRelClass(String relClass) { + this.relClass = relClass; + } + + public String getRelclass() { + return relclass; + } + + public void setRelclass(String relclass) { + this.relclass = relclass; + } + + public String getQueryType() { + return queryType; + } + + public void setQueryType(String queryType) { + this.queryType = queryType; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public long getCreateBy() { + return createBy; + } + + public void setCreateBy(long createBy) { + this.createBy = createBy; + } + + public List getRelColumns() { + return relColumns; + } + + public void setRelColumns(List relColumns) { + this.relColumns = relColumns; + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/SearchTableRole.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/SearchTableRole.java new file mode 100644 index 0000000..e1dc22c --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/SearchTableRole.java @@ -0,0 +1,61 @@ +package com.ebts.generator.entity; + +/** + * @author: Clay + * @date: 2021/7/21 0:43 + * @description:SearchTableRole + * @email: clay@hchyun.com + */ +import com.ebts.common.core.entity.BaseEntity; +import com.ebts.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * top万能查询角色关系对象 gen_search_table_role + * + * @author clay + * @date 2021-07-21 + */ +public class SearchTableRole extends BaseEntity{ + + /** 表格id */ + private Long searchTableId; + + /** 角色id */ + private Long roleId; + + public SearchTableRole(Long searchTableId, Long roleId) { + this.searchTableId = searchTableId; + this.roleId = roleId; + } + + public SearchTableRole() { + + } + + public void setSearchTableId(Long searchTableId){ + this.searchTableId = searchTableId; + } + + public Long getSearchTableId(){ + return searchTableId; + } + public void setRoleId(Long roleId){ + this.roleId = roleId; + } + + public Long getRoleId(){ + return roleId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("searchTableId", getSearchTableId()) + .append("roleId", getRoleId()) + .toString(); + } +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/TopSearchColumn.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/TopSearchColumn.java new file mode 100644 index 0000000..66979eb --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/TopSearchColumn.java @@ -0,0 +1,111 @@ +package com.ebts.generator.entity; + +import com.ebts.common.annotation.Excel; +import com.ebts.common.core.entity.BaseEntity; +import org.apache.commons.lang.builder.ToStringBuilder; +import org.apache.commons.lang.builder.ToStringStyle; + +/** + * top万能查询字段对象 gen_top_search_column + * + * @author clay + * @date 2021-07-20 + */ +public class TopSearchColumn extends BaseEntity{ + + /** 主键id */ + private Long id; + + /** top万能查询表格主键id */ + @Excel(name = "top万能查询表格主键id") + private Long searchTableId; + + /** 列名称 */ + @Excel(name = "列名称") + private String columnName; + + /** 列描述 */ + @Excel(name = "列描述") + private String columnComment; + + /** 列类型 */ + @Excel(name = "列类型") + private String columnType; + + /** 是否使用 */ + @Excel(name = "是否使用") + private Integer isUse; + private Integer isPk; + private Integer sort; + + public Integer getSort() { + return sort; + } + + public Integer getIsPk() { + return isPk; + } + + public void setIsPk(Integer isPk) { + this.isPk = isPk; + } + + public void setId(Long id){ + this.id = id; + } + + public Long getId(){ + return id; + } + public void setSearchTableId(Long searchTableId){ + this.searchTableId = searchTableId; + } + + public Long getSearchTableId(){ + return searchTableId; + } + public void setColumnName(String columnName){ + this.columnName = columnName; + } + + public String getColumnName(){ + return columnName; + } + public void setColumnComment(String columnComment){ + this.columnComment = columnComment; + } + + public String getColumnComment(){ + return columnComment; + } + public void setColumnType(String columnType){ + this.columnType = columnType; + } + + public String getColumnType(){ + return columnType; + } + public void setIsUse(Integer isUse){ + this.isUse = isUse; + } + + public Integer getIsUse(){ + return isUse; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("searchTableId", getSearchTableId()) + .append("columnName", getColumnName()) + .append("columnComment", getColumnComment()) + .append("columnType", getColumnType()) + .append("isUse", getIsUse()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/TopSearchTable.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/TopSearchTable.java new file mode 100644 index 0000000..48d48b8 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/TopSearchTable.java @@ -0,0 +1,91 @@ +package com.ebts.generator.entity; + +import java.util.List; +import com.ebts.common.core.entity.BaseEntity; +import com.ebts.common.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * top万能查询主对象 gen_top_search_table + * + * @author clay + * @date 2021-07-20 + */ +@ApiModel("top万能查询主") +public class TopSearchTable extends BaseEntity{ + + /** 主键id */ + @ApiModelProperty("主键id") + private Long id; + + /** 表名 */ + @Excel(name = "表名") + @ApiModelProperty("表名") + private String tableName; + + /** 表描述 */ + @Excel(name = "表描述") + @ApiModelProperty("表描述") + private String tableComment; + + /** top万能查询字段信息 */ + @ApiModelProperty("top万能查询字段信息") + private List topSearchColumnList; + + private Long[] roleIds; + + public Long[] getRoleIds() { + return roleIds; + } + + public void setRoleIds(Long[] roleIds) { + this.roleIds = roleIds; + } + + public void setId(Long id){ + this.id = id; + } + + public Long getId(){ + return id; + } + public void setTableName(String tableName){ + this.tableName = tableName; + } + + public String getTableName(){ + return tableName; + } + public void setTableComment(String tableComment){ + this.tableComment = tableComment; + } + + public String getTableComment(){ + return tableComment; + } + + public List getTopSearchColumnList(){ + return topSearchColumnList; + } + + public void setTopSearchColumnList(List topSearchColumnList){ + this.topSearchColumnList = topSearchColumnList; + } + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("tableName", getTableName()) + .append("tableComment", getTableComment()) + .append("remark", getRemark()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("topSearchColumnList", getTopSearchColumnList()) + .toString(); + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/UniCon.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/UniCon.java new file mode 100644 index 0000000..e050d0b --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/UniCon.java @@ -0,0 +1,142 @@ +package com.ebts.generator.entity; + + +/** + * 万能查询条件对象 sys_uni_con + * + * @author binlin + * @date 2021-01-30 + */ +public class UniCon { + + + /** + * id + */ + private Long id; + + /** + * 万能查询tableid + */ + private Long uqId; + + /** + * 名称(lable) + */ + private String ucName; + + /** + * 关键字 + */ + private String ucKey; + + /** + * 查询条件 + */ + private String ucCon; + + /** + * 模拟数据 + */ + private String ucMock; + + /** + * 真实数据 + */ + private Object ucReal; + + /** + * 描述 + */ + private String ucDescribe; + + /** + * 输入类型 + */ + private String ucType; + + /** + * 显示类型 + */ + private Integer type; + + public String getUcType() { + return ucType; + } + + public void setUcType(String ucType) { + this.ucType = ucType; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setUqId(Long uqId) { + this.uqId = uqId; + } + + public Long getUqId() { + return uqId; + } + + public void setUcName(String ucName) { + this.ucName = ucName; + } + + public String getUcName() { + return ucName; + } + + public void setUcKey(String ucKey) { + this.ucKey = ucKey; + } + + public String getUcKey() { + return ucKey; + } + + public void setUcCon(String ucCon) { + this.ucCon = ucCon; + } + + public String getUcCon() { + return ucCon; + } + + public String getUcMock() { + return ucMock; + } + + public void setUcMock(String ucMock) { + this.ucMock = ucMock; + } + + public String getUcDescribe() { + return ucDescribe; + } + + public void setUcDescribe(String ucDescribe) { + this.ucDescribe = ucDescribe; + } + + public Object getUcReal() { + return ucReal; + } + + public void setUcReal(Object ucReal) { + this.ucReal = ucReal; + } +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/UniQuery.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/UniQuery.java new file mode 100644 index 0000000..57324bc --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/entity/UniQuery.java @@ -0,0 +1,132 @@ +package com.ebts.generator.entity; + +import com.ebts.common.core.entity.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.ArrayList; +import java.util.List; + +/** + * 万能查询对象 sys_uni_query + * + * @author binlin + * @date 2021-01-30 + */ +public class UniQuery extends BaseEntity { + + /** + * id + */ + private Long id; + + /** + * 名称 + */ + private String uqName; + + /** + * sql语句 + */ + private String uqSql; + + /** + * 描述 + */ + private String uqDescribe; + + /** + * 是否发布(0:否,1:发布) + */ + private Integer isRelease; + + private List uniCons; + + private Integer pageNum; + + private Integer pageSize; + + + + public Integer getIsRelease() { + return isRelease; + } + + public void setIsRelease(Integer isRelease) { + this.isRelease = isRelease; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public List getUniCons() { + if (uniCons == null) { + return uniCons = new ArrayList(); + } else { + return uniCons; + } + } + + public void setUniCons(List uniCons) { + this.uniCons = uniCons; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setUqName(String uqName) { + this.uqName = uqName; + } + + public String getUqName() { + return uqName; + } + + public void setUqSql(String uqSql) { + this.uqSql = uqSql; + } + + public String getUqSql() { + return uqSql; + } + + public void setUqDescribe(String uqDescribe) { + this.uqDescribe = uqDescribe; + } + + public String getUqDescribe() { + return uqDescribe; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("uqName", getUqName()) + .append("uqSql", getUqSql()) + .append("uqDescribe", getUqDescribe()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/ApiClassService.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/ApiClassService.java new file mode 100644 index 0000000..7e9f95b --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/ApiClassService.java @@ -0,0 +1,62 @@ +package com.ebts.generator.service; + +import java.util.List; + +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.entity.ApiClass; + +/** + * 接口类名Service接口 + * + * @author binlin + * @date 2021-01-24 + */ +public interface ApiClassService { + /** + * 查询接口类名 + * + * @param id 接口类名ID + * @return 接口类名 + */ + ServerResult selectApiclassById(Long id); + + /** + * 查询接口类名列表 + * + * @param apiclass 接口类名 + * @return 接口类名集合 + */ + ServerResult> selectApiclassList(ApiClass apiclass); + + /** + * 新增接口类名 + * + * @param apiclass 接口类名 + * @return 结果 + */ + ServerResult insertApiclass(ApiClass apiclass); + + /** + * 修改接口类名 + * + * @param apiclass 接口类名 + * @return 结果 + */ + ServerResult updateApiclass(ApiClass apiclass); + + /** + * 批量删除接口类名 + * + * @param ids 需要删除的接口类名ID + * @return 结果 + */ + ServerResult deleteApiclassByIds(Long[] ids); + + /** + * 删除接口类名信息 + * + * @param id 接口类名ID + * @return 结果 + */ + ServerResult deleteApiclassById(Long id); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/GenTableColumnService.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/GenTableColumnService.java new file mode 100644 index 0000000..3af770f --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/GenTableColumnService.java @@ -0,0 +1,44 @@ +package com.ebts.generator.service; + +import java.util.List; + +import com.ebts.generator.entity.GenTableColumn; + +/** + * 业务字段 服务层 + * + * @author binlin + */ +public interface GenTableColumnService { + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + int deleteGenTableColumnByIds(String ids); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/GenTableService.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/GenTableService.java new file mode 100644 index 0000000..a930764 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/GenTableService.java @@ -0,0 +1,122 @@ +package com.ebts.generator.service; + +import java.util.List; +import java.util.Map; + +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.entity.GenTable; + +/** + * 业务 服务层 + * + * @author binlin + */ +public interface GenTableService { + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public void updateGenTable(GenTable genTable); + + /** + * 删除业务信息 + * + * @param tableIds 需要删除的表数据ID + * @return 结果 + */ + public ServerResult deleteGenTableByIds(Long[] tableIds); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + public void importGenTable(List tableList); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + public Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + public byte[] downloadCode(String tableName); + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + * @return 数据 + */ + public boolean generatorCode(String tableName); + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + public void synchDb(String tableName); + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + public byte[] downloadCode(String[] tableNames); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + public void validateEdit(GenTable genTable); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/InterTableService.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/InterTableService.java new file mode 100644 index 0000000..702d450 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/InterTableService.java @@ -0,0 +1,96 @@ +package com.ebts.generator.service; + +import java.util.Map; + +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.dto.InterTableDto; +import com.ebts.generator.entity.InterTable; + +/** + * 接口信息Service接口 + * + * @author binlin + * @date 2021-01-25 + */ +public interface InterTableService { + /** + * 查询接口信息 + * + * @param id 接口信息ID + * @return 接口信息 + */ + ServerResult selectInterTableById(Long id); + + /** + * 查询接口信息列表 + * + * @param interTable 接口信息 + * @return 接口信息集合 + */ + ServerResult> selectInterTableList(InterTable interTable); + + /** + * 新增接口信息 + * + * @param interTable 接口信息 + * @return 结果 + */ + ServerResult insertInterTable(InterTable interTable); + + /** + * 修改接口信息 + * + * @param interTableDto 接口信息 + * @return 结果 + */ + ServerResult updateInterTable(InterTableDto interTableDto); + + /** + * 批量删除接口信息 + * + * @param ids 需要删除的接口信息ID + * @return 结果 + */ + ServerResult deleteInterTableByIds(Long[] ids); + + /** + * 删除接口信息信息 + * + * @param id 接口信息ID + * @return 结果 + */ + ServerResult deleteInterTableById(Long id); + + /** + * 预览代码(工作流) + * + * @param cid + * @return + */ + ServerResult> previewCodeCalss(Long cid); + + /** + * 预览代码()工作台 + * + * @param mid + * @return + */ + ServerResult> previewCodeMoudle(Long mid); + + /** + * 生成代码(工作流) + * + * @param cid + * @return + */ + ServerResult generatorCodeClass(Long cid); + + /** + * 生成代码(工作台) + * + * @param mid + * @return + */ + ServerResult generatorCodeMoudle(Long mid); + +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/ModuleService.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/ModuleService.java new file mode 100644 index 0000000..6eb8dcc --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/ModuleService.java @@ -0,0 +1,63 @@ +package com.ebts.generator.service; + + +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.entity.Module; + +import java.util.List; + +/** + * 模块管理Service接口 + * + * @author binlin + * @date 2021-01-24 + */ +public interface ModuleService { + /** + * 查询模块管理 + * + * @param id 模块管理ID + * @return 模块管理 + */ + ServerResult selectModuleById(Long id); + + /** + * 查询模块管理列表 + * + * @param module 模块管理 + * @return 模块管理集合 + */ + ServerResult> selectModuleList(Module module); + + /** + * 新增模块管理 + * + * @param module 模块管理 + * @return 结果 + */ + ServerResult insertModule(Module module); + + /** + * 修改模块管理 + * + * @param module 模块管理 + * @return 结果 + */ + ServerResult updateModule(Module module); + + /** + * 批量删除模块管理 + * + * @param ids 需要删除的模块管理ID + * @return 结果 + */ + ServerResult deleteModuleByIds(Long[] ids); + + /** + * 删除模块管理信息 + * + * @param id 模块管理ID + * @return 结果 + */ + ServerResult deleteModuleById(Long id); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/QueryService.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/QueryService.java new file mode 100644 index 0000000..d728160 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/QueryService.java @@ -0,0 +1,44 @@ +package com.ebts.generator.service; + +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.entity.UniQuery; + +import java.util.List; +import java.util.Map; + +/** + * @Author 18209 + * @Date 2021/1/30 18:54 + * @Version 1.0 + */ +public interface QueryService { + /** + * 通过id查询基础信息 + * + * @param id + * @return + */ + ServerResult selectQueryById(Long id); + + /** + * 修改基础信息 + * + * @param uniQuery + * @return + */ + ServerResult updateQueryInfo(UniQuery uniQuery); + + /** + * 预览万能查询数据 + * + * @param uniQuery + * @return + */ + ServerResult>> previewQuery(UniQuery uniQuery); + + /** + * @param uniQuery + * @return + */ + ServerResult Release(UniQuery uniQuery); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/RegularService.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/RegularService.java new file mode 100644 index 0000000..2f06173 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/RegularService.java @@ -0,0 +1,68 @@ +package com.ebts.generator.service; + +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.entity.Regular; + +import java.util.List; + +/** + * 校验规则Service接口 + * + * @author binlin + * @date 2021-01-18 + */ +public interface RegularService { + /** + * 查询校验规则 + * + * @param id 校验规则ID + * @return 校验规则 + */ + ServerResult selectRegularById(Long id); + + /** + * 查询校验规则列表 + * + * @param regular 校验规则 + * @return 校验规则集合 + */ + ServerResult> selectRegularList(Regular regular); + /** + * 查询校验规则下拉框列表 + * + * @return 校验规则集合 + */ + ServerResult> selectRegularOption(); + + /** + * 新增校验规则 + * + * @param regular 校验规则 + * @return 结果 + */ + ServerResult insertRegular(Regular regular); + + /** + * 修改校验规则 + * + * @param regular 校验规则 + * @return 结果 + */ + ServerResult updateRegular(Regular regular); + + /** + * 批量删除校验规则 + * + * @param ids 需要删除的校验规则ID + * @return 结果 + */ + ServerResult deleteRegularByIds(Long[] ids); + + /** + * 删除校验规则信息 + * + * @param id 校验规则ID + * @return 结果 + */ + ServerResult deleteRegularById(Long id); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/RelService.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/RelService.java new file mode 100644 index 0000000..002cfce --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/RelService.java @@ -0,0 +1,49 @@ +package com.ebts.generator.service; + +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.entity.RelColumn; +import com.ebts.generator.entity.RelTable; + +import java.util.List; +import java.util.Map; + +/** + * @Author 18209 + * @Date 2021/2/24 16:21 + * @Version 1.0 + */ +public interface RelService { + + /** + * 获取到数据库表信息 + * + * @return + */ + ServerResult>> tableInfos(); + + /** + * 获取到关联边字段信息 + * + * @param tableName 关联表表名 + * @param relId 关联关系id + * @return + */ + ServerResult> relColumns(String tableName, Long relId); + + /** + * 通过tableName获取到字段信息 + * + * @param tableName + * @return + */ + ServerResult>> tableColumns(String tableName); + + /** + * 通过主表id查询子表信息 + * + * @param tableId + * @return + */ + ServerResult> relTableByTableId(Long tableId); + +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/TopSearchTableService.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/TopSearchTableService.java new file mode 100644 index 0000000..1923f1e --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/TopSearchTableService.java @@ -0,0 +1,67 @@ +package com.ebts.generator.service; + +import java.util.List; + +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.entity.TopSearchTable; + +/** + * top万能查询主Service接口 + * + * @author clay + * @date 2021-07-20 + */ +public interface TopSearchTableService +{ + /** + * 查询top万能查询主 + * + * @param id top万能查询主ID + * @return top万能查询主 + */ + ServerResult selectTopSearchTableById(Long id); + + /** + * 查询top万能查询主列表 + * + * @param topSearchTable top万能查询主 + * @return top万能查询主集合 + */ + ServerResult> selectTopSearchTableList(TopSearchTable topSearchTable); + + /** + * 新增top万能查询主 + * + * @param topSearchTable top万能查询主 + * @return 结果 + */ + ServerResult insertTopSearchTable(TopSearchTable topSearchTable); + + /** + * 修改top万能查询主 + * + * @param topSearchTable top万能查询主 + * @return 结果 + */ + ServerResult updateTopSearchTable(TopSearchTable topSearchTable); + + List selectDbTableListByNames(String[] tableNames); + + void importGenTable(List tableList); + + /** + * 批量删除top万能查询主 + * + * @param ids 需要删除的top万能查询主ID + * @return 结果 + */ + ServerResult deleteTopSearchTableByIds(Long[] ids); + + /** + * 删除top万能查询主信息 + * + * @param id top万能查询主ID + * @return 结果 + */ + ServerResult deleteTopSearchTableById(Long id); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/UniQueryService.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/UniQueryService.java new file mode 100644 index 0000000..64618c8 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/UniQueryService.java @@ -0,0 +1,62 @@ +package com.ebts.generator.service; + +import java.util.List; + +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.entity.UniQuery; + +/** + * 万能查询Service接口 + * + * @author binlin + * @date 2021-01-30 + */ +public interface UniQueryService { + /** + * 查询万能查询 + * + * @param id 万能查询ID + * @return 万能查询 + */ + ServerResult selectUniQueryById(Long id); + + /** + * 查询万能查询列表 + * + * @param uniQuery 万能查询 + * @return 万能查询集合 + */ + ServerResult> selectUniQueryList(UniQuery uniQuery); + + /** + * 新增万能查询 + * + * @param uniQuery 万能查询 + * @return 结果 + */ + ServerResult insertUniQuery(UniQuery uniQuery); + + /** + * 修改万能查询 + * + * @param uniQuery 万能查询 + * @return 结果 + */ + ServerResult updateUniQuery(UniQuery uniQuery); + + /** + * 批量删除万能查询 + * + * @param ids 需要删除的万能查询ID + * @return 结果 + */ + ServerResult deleteUniQueryByIds(Long[] ids); + + /** + * 删除万能查询信息 + * + * @param id 万能查询ID + * @return 结果 + */ + ServerResult deleteUniQueryById(Long id); +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/ApiClassServiceImpl.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/ApiClassServiceImpl.java new file mode 100644 index 0000000..2412728 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/ApiClassServiceImpl.java @@ -0,0 +1,157 @@ +package com.ebts.generator.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.dao.ApiClassDao; +import com.ebts.generator.entity.ApiClass; +import com.ebts.generator.service.ApiClassService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 接口类名Service业务层处理 + * + * @author binlin + * @date 2021-01-24 + */ +@Service +public class ApiClassServiceImpl implements ApiClassService { + private Logger logger = LoggerFactory.getLogger(ApiClassServiceImpl.class); + + @Autowired + private ApiClassDao apiclassDao; + + /** + * 查询接口类名 + * + * @param id 接口类名ID + * @return 接口类名 + */ + @Override + public ServerResult selectApiclassById(Long id) { + try { + ApiClass apiclass = apiclassDao.selectApiclassById(id); + if (apiclass != null) { + return new ServerResult<>(true, apiclass); + } else { + return new ServerResult<>(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询接口类名列表 + * + * @param apiclass 接口类名 + * @return 接口类名 + */ + @Override + public ServerResult> selectApiclassList(ApiClass apiclass) { + try { + List apiClassList = apiclassDao.selectApiclassList(apiclass); + if (apiClassList.size() > 0) { + return new ServerResult<>(true, apiClassList); + } else { + return new ServerResult<>(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增接口类名 + * + * @param apiclass 接口类名 + * @return 结果 + */ + @Override + public ServerResult insertApiclass(ApiClass apiclass) { + try { + apiclass.setCreateBy(SecurityUtils.getUserId()); + Integer renewal = apiclassDao.insertApiclass(apiclass); + if (renewal > 0) { + return new ServerResult(true, renewal); + } else { + return new ServerResult(false, ReturnConstants.OP_ERROR); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改接口类名 + * + * @param apiclass 接口类名 + * @return 结果 + */ + @Override + public ServerResult updateApiclass(ApiClass apiclass) { + try { + apiclass.setUpdateBy(SecurityUtils.getUserId()); + Integer renewal = apiclassDao.updateApiclass(apiclass); + if (renewal > 0) { + return new ServerResult<>(true, renewal); + } else { + return new ServerResult<>(false, ReturnConstants.OP_ERROR); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除接口类名 + * + * @param ids 需要删除的接口类名ID + * @return 结果 + */ + @Override + public ServerResult deleteApiclassByIds(Long[] ids) { + try { + Integer renewal = apiclassDao.deleteApiclassByIds(ids); + if (renewal > 0) { + return new ServerResult<>(true, renewal); + } else { + return new ServerResult<>(false, ReturnConstants.OP_ERROR); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除接口类名信息 + * + * @param id 接口类名ID + * @return 结果 + */ + @Override + public ServerResult deleteApiclassById(Long id) { + try { + Integer renewal = apiclassDao.deleteApiclassById(id); + if (renewal > 0) { + return new ServerResult<>(true, renewal); + } else { + return new ServerResult<>(false, ReturnConstants.OP_ERROR); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/GenTableColumnServiceImpl.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/GenTableColumnServiceImpl.java new file mode 100644 index 0000000..cbdd9a8 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/GenTableColumnServiceImpl.java @@ -0,0 +1,94 @@ +package com.ebts.generator.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.core.text.Convert; +import com.ebts.common.exception.EbtsException; +import com.ebts.generator.service.GenTableColumnService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.generator.entity.GenTableColumn; +import com.ebts.generator.dao.GenTableColumnDao; + +/** + * 业务字段 服务层实现 + * + * @author binlin + */ +@Service +public class GenTableColumnServiceImpl implements GenTableColumnService { + private Logger logger = LoggerFactory.getLogger(GenTableColumnServiceImpl.class); + + @Autowired + private GenTableColumnDao genTableColumnDao; + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + try { + return genTableColumnDao.selectGenTableColumnListByTableId(tableId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) { + try { + return genTableColumnDao.insertGenTableColumn(genTableColumn); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) { + try { + List genTableColumns = new ArrayList(); + genTableColumns.add(genTableColumn); + return genTableColumnDao.updateGenTableColumn(genTableColumns); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除业务字段对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteGenTableColumnByIds(String ids) { + try { + return genTableColumnDao.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/GenTableServiceImpl.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/GenTableServiceImpl.java new file mode 100644 index 0000000..e85b523 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/GenTableServiceImpl.java @@ -0,0 +1,648 @@ +package com.ebts.generator.service.impl; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.Comparator; +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 com.ebts.common.constant.Constants; +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.core.text.CharsetKit; +import com.ebts.common.exception.CustomException; +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServerResult; +import com.ebts.common.utils.StringUtils; +import com.ebts.generator.dao.RelDao; +import com.ebts.generator.entity.*; +import com.ebts.generator.service.GenTableService; +import com.ebts.generator.utils.*; +import com.ebts.generator.utils.constant.GenConstants; +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.ebts.generator.dao.GenTableColumnDao; +import com.ebts.generator.dao.GenTableDao; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +/** + * 业务 服务层实现 + * + * @author binlin + */ +@Service +public class GenTableServiceImpl implements GenTableService { + private static final Logger logger = LoggerFactory.getLogger(GenTableServiceImpl.class); + + @Autowired + private GenTableDao genTableDao; + + @Autowired + private GenTableColumnDao genTableColumnDao; + + + @Autowired + private RelDao relDao; + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + @Override + public GenTable selectGenTableById(Long id) { + try { + GenTable genTable = genTableDao.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + @Override + public List selectGenTableList(GenTable genTable) { + try { + return genTableDao.selectGenTableList(genTable); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + @Override + public List selectDbTableList(GenTable genTable) { + try { + return genTableDao.selectDbTableList(genTable); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + @Override + public List selectDbTableListByNames(String[] tableNames) { + try { + return genTableDao.selectDbTableListByNames(tableNames); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Override + public List selectGenTableAll() { + try { + return genTableDao.selectGenTableAll(); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * todo 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void updateGenTable(GenTable genTable) { + try { + String options = JSON.toJSONString(genTable.getParams()); + genTable.setOptions(options); + int row = genTableDao.updateGenTable(genTable); + if (row > 0) { + genTableColumnDao.updateGenTableColumn(genTable.getColumns()); + if (genTable.getTplCategory().equals("rel")){ + List relTables = relDao.relTableByTableId(genTable.getTableId()); + for (RelTable relTable : relTables) { + relDao.deleteRelColumnByRelId(relTable.getId()); + } + relDao.deleteRelTableByTableId(genTable.getTableId()); + relTables = genTable.getRelTables(); + for (int i = 0; i < relTables.size(); i++) { + RelTable relTable = relTables.get(i); + relTable.setTableAs(StringUtils.sqlFormat(relTable.getTableName())); + relTable.setRelAs(StringUtils.sqlFormat(relTable.getRelName())); + relTable.setRelClass(GenUtils.convertClassName(relTable.getRelName())); + relTable.setCreateBy(SecurityUtils.getUserId()); + relTable.setRelclass(StringUtils.uncapitalize(relTable.getRelClass())); + relTables.set(i,relTable); + } + if (relTables != null) { + relDao.insertRelTables(relTables); + for (RelTable relTable : relTables) { + relDao.insertRelColumns(relTable.getRelColumns()); + } + } + } + } + } catch (CustomException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + * @return 结果 + */ + @Override + @Transactional + public ServerResult deleteGenTableByIds(Long[] tableIds) { + try { + genTableDao.deleteGenTableByIds(tableIds); + genTableColumnDao.deleteGenTableColumnByIds(tableIds); + for (Long tableId : tableIds) { + List relTables = relDao.relTableByTableId(tableId); + if (relTables.size()>0){ + relDao.deleteRelTableByTableId(tableId); + for (RelTable relTable : relTables) { + relDao.deleteRelColumnByRelId(relTable.getId()); + } + } + } + return new ServerResult<>(true); + } catch (RuntimeException e) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void importGenTable(List tableList) { + Long operName = SecurityUtils.getUserId(); + try { + for (GenTable table : tableList) { + String tableName = table.getTableName(); + GenUtils.initTable(table, operName); + int row = genTableDao.insertGenTable(table); + if (row > 0) { + // 保存列信息 + List genTableColumns = genTableColumnDao.selectDbTableColumnsByName(tableName); + for (GenTableColumn column : genTableColumns) { + GenUtils.initColumnField(column, table); + genTableColumnDao.insertGenTableColumn(column); + } + } + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException("导入失败:" + e.getMessage(),e); + } + } + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + @Override + public Map previewCode(Long tableId) { + try { + Map dataMap = new LinkedHashMap<>(); + // 查询表信息 + GenTable table = genTableDao.selectGenTableById(tableId); + if (table.getTplCategory().equals(GenConstants.TPL_SUB)) { + // 设置主子表信息 + setSubTable(table); + } + if (table.getTplCategory().equals(GenConstants.TPL_REL)) { + List relTables = relDao.relTableByTableId(tableId); + relTables = relTables.stream().sorted(Comparator.comparing(RelTable::getSort)).collect(Collectors.toList()); + table.setRelTables(relTables); + } + // 设置主键列信息 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + if (template.equals("vm/java/rel-entity.java.vm")){ + List relTables = table.getRelTables(); + for (RelTable relTable : relTables) { + List relColumns = relTable.getRelColumns(); + relColumns = relColumns.stream().sorted(Comparator.comparing(RelColumn::getSort)).collect(Collectors.toList()); + relTable.setRelColumns(relColumns); + context.put("relTable",relTable); + StringWriter stringWriter = new StringWriter(); + Template temp = Velocity.getTemplate(template,Constants.UTF8); + temp.merge(context,stringWriter); + dataMap.put(VelocityUtils.getPreviewName(template,relTable.getRelClass()),stringWriter.toString()); + } + continue; + } + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(VelocityUtils.getPreviewName(template,table.getClassName()), sw.toString()); + } + return dataMap; + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(String tableName) { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableName, zip); + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + * @return + */ + @Override + public boolean generatorCode(String tableName) { + try { + // 查询表信息 + GenTable table = genTableDao.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + if (!StringUtils.containsAny(template, "table.sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) { + // 渲染模板 + if (template.equals("vm/java/rel-entity.java.vm")){ + List relTables = table.getRelTables(); + for (RelTable relTable : relTables) { + List relColumns = relTable.getRelColumns(); + relColumns = relColumns.stream().sorted(Comparator.comparing(RelColumn::getSort)).collect(Collectors.toList()); + relTable.setRelColumns(relColumns); + context.put("relTable",relTable); + StringWriter stringWriter = new StringWriter(); + Template temp = Velocity.getTemplate(template,Constants.UTF8); + temp.merge(context,stringWriter); + try { + String path = getGenPath(table, template); + FileUtils.writeStringToFile(new File(path), stringWriter.toString(), CharsetKit.UTF_8); + } catch (IOException e) { + logger.error("渲染模板失败,表名:" + table.getTableName()); + return false; + } + } + continue; + } + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + if (template.equals("vm/sql/table.sql.vm")) { + Boolean start = insertMenuItem(sw); + if (start) { + return false; + } + } else { + try { + String path = getGenPath(table, template); + FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); + } catch (IOException e) { + logger.error("渲染模板失败,表名:" + table.getTableName()); + return false; + } + } + } + } + return true; + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void synchDb(String tableName) { + try { + GenTable table = genTableDao.selectGenTableByName(tableName); + List tableColumns = table.getColumns(); + List tableColumnNames = tableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + List dbTableColumns = genTableColumnDao.selectDbTableColumnsByName(tableName); + if (StringUtils.isEmpty(dbTableColumns)) { + throw new CustomException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + dbTableColumns.forEach(column -> { + if (!tableColumnNames.contains(column.getColumnName())) { + GenUtils.initColumnField(column, table); + genTableColumnDao.insertGenTableColumn(column); + } + }); + + List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); + if (StringUtils.isNotEmpty(delColumns)) { + genTableColumnDao.deleteGenTableColumns(delColumns); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableNames) { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) { + zip = generatorCode(tableName, zip); +// generatorCode(tableName, zip); + if (zip == null) { + return null; + } + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + @Transactional(rollbackFor = Exception.class) + boolean insertMenuItem(StringWriter stringWriter) { + try { + String sql = stringWriter.toString(); + int start = genTableDao.insertMenu(sql); + if (start > 0) { + return false; + } else { + return true; + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * todo 查询表信息并生成代码 + */ + private ZipOutputStream generatorCode(String tableName, ZipOutputStream zip) { + // 查询表信息 + GenTable table = genTableDao.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + if (table.getTplCategory().equals(GenConstants.TPL_REL)) { + List relTables = relDao.relTableByTableId(table.getTableId()); + relTables = relTables.stream().sorted(Comparator.comparing(RelTable::getSort)).collect(Collectors.toList()); + table.setRelTables(relTables); + } + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + + // 渲染模板 + if (template.equals("vm/java/rel-entity.java.vm")){ + List relTables = table.getRelTables(); + for (RelTable relTable : relTables) { + List relColumns = relTable.getRelColumns(); + relColumns = relColumns.stream().sorted(Comparator.comparing(RelColumn::getSort)).collect(Collectors.toList()); + relTable.setRelColumns(relColumns); + context.put("relTable",relTable); + StringWriter stringWriter = new StringWriter(); + Template temp = Velocity.getTemplate(template,Constants.UTF8); + temp.merge(context,stringWriter); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getRelFileName(template, table,relTable))); + IOUtils.write(stringWriter.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(stringWriter); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + logger.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + continue; + } + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + + if (template.equals("vm/sql/table.sql.vm")) { + Boolean start = insertMenuItem(sw); + if (start) { + return null; + } + } + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + logger.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + return zip; + } + + /** + * todo 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { + String options = JSON.toJSONString(genTable.getParams()); + JSONObject paramsObj = JSONObject.parseObject(options); + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { + throw new CustomException("树编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) { + throw new CustomException("树父编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) { + throw new CustomException("树名称字段不能为空"); + } else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) { + if (StringUtils.isEmpty(genTable.getSubTableName())) { + throw new CustomException("关联子表的表名不能为空"); + } else if (StringUtils.isEmpty(genTable.getSubTableFkName())) { + throw new CustomException("子表关联的外键名不能为空"); + } + } else if (GenConstants.TPL_ASS.equals(genTable.getTplCategory())) { +// todo 规则校验 + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) { + for (GenTableColumn column : table.getColumns()) { + if (column.isPk()) { + table.setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getPkColumn())) { + table.setPkColumn(table.getColumns().get(0)); + } + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) { + for (GenTableColumn column : table.getSubTable().getColumns()) { + if (column.isPk()) { + table.getSubTable().setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getSubTable().getPkColumn())) { + table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); + } + } + } + + /** + * 设置主子表信息 + * + * @param table 业务表信息 + */ + public void setSubTable(GenTable table) { + String subTableName = table.getSubTableName(); + if (StringUtils.isNotEmpty(subTableName)) { + table.setSubTable(genTableDao.selectGenTableByName(subTableName)); + } + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) { + JSONObject paramsObj = JSONObject.parseObject(genTable.getOptions()); + if (StringUtils.isNotNull(paramsObj)) { + String treeCode = paramsObj.getString(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); + 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); + genTable.setParentMenuId(parentMenuId); + 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/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/InterTableServiceImpl.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/InterTableServiceImpl.java new file mode 100644 index 0000000..3a9ea0b --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/InterTableServiceImpl.java @@ -0,0 +1,364 @@ +package com.ebts.generator.service.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.StringWriter; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import com.ebts.common.constant.Constants; +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.dao.ApiClassDao; +import com.ebts.generator.dao.GenTableDao; +import com.ebts.generator.dao.ModuleDao; +import com.ebts.generator.dto.InterTableDto; +import com.ebts.generator.entity.ApiClass; +import com.ebts.generator.entity.Module; +import com.ebts.generator.utils.*; +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 com.ebts.generator.dao.InterTableDao; +import com.ebts.generator.entity.InterTable; +import com.ebts.generator.service.InterTableService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +/** + * 接口信息Service业务层处理 + * + * @author binlin + * @date 2021-01-25 + */ +@Service +public class InterTableServiceImpl implements InterTableService { + private Logger logger = LoggerFactory.getLogger(InterTableServiceImpl.class); + + @Autowired + private InterTableDao interTableDao; + @Autowired + private ApiClassDao apiclassDao; + @Autowired + private ModuleDao moduleDao; + @Autowired + private GenTableDao genTableDao; + + /** + * 查询接口信息 + * + * @param id 接口信息ID + * @return 接口信息 + */ + @Override + public ServerResult selectInterTableById(Long id) { + try { + InterTable interTable = interTableDao.selectInterTableById(id); + if (interTable != null) { + return new ServerResult(true, interTable); + } else { + return new ServerResult(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询接口信息列表 + * + * @param interTable 接口信息 + * @return 接口信息 + */ + @Override + public ServerResult> selectInterTableList(InterTable interTable) { + try { + Map modeMap = new HashMap(); + if (interTable.getType() == 1) { + Module module = moduleDao.selectModuleById(interTable.getmId()); + modeMap.put("info", module); + } else if (interTable.getType() == 2) { + ApiClass apiclass = apiclassDao.selectApiclassById(interTable.getcId()); + modeMap.put("info", apiclass); + } + List interTableList = interTableDao.selectInterTableList(interTable); + modeMap.put("rows", interTableList); + return new ServerResult>(true, modeMap); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增接口信息 + * + * @param interTable 接口信息 + * @return 结果 + */ + @Override + public ServerResult insertInterTable(InterTable interTable) { + try { + interTable.setCreateBy(SecurityUtils.getUserId()); + Integer renewal = interTableDao.insertInterTable(interTable); + if (renewal > 0) { + return new ServerResult(true, renewal); + } else { + return new ServerResult(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改接口信息 + * + * @param interTableDto 接口信息 + * @return 结果 + */ + @Override + @Transactional + public ServerResult updateInterTable(InterTableDto interTableDto) { + try { + List interTables = interTableDto.getInterTables(); + Integer renewal = 0; + if (interTableDto.getModule() == null) { + ApiClass apiclass = interTableDto.getApiclass(); + renewal = apiclassDao.updateApiclass(apiclass); + interTableDao.deleteInterTableByClassId(apiclass.getId()); + } else if (interTableDto.getApiclass() == null) { + Module module = interTableDto.getModule(); + renewal = moduleDao.updateModule(module); + interTableDao.deleteInterTableByModuleId(module.getId()); + } + Integer renewalTables = 0; + if (interTables.size() > 0) { + for (int i = 0; i < interTables.size(); i++) { + interTables.get(i).setCreateBy(SecurityUtils.getUserId()); + } + renewalTables = interTableDao.insertInterTables(interTables); + } + if (renewalTables > 0 || renewal > 0) { + return new ServerResult(true, renewalTables); + } else { + return new ServerResult(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除接口信息 + * + * @param ids 需要删除的接口信息ID + * @return 结果 + */ + @Override + public ServerResult deleteInterTableByIds(Long[] ids) { + try { + Integer renewal = interTableDao.deleteInterTableByIds(ids); + if (renewal > 0) { + return new ServerResult(true, renewal); + } else { + return new ServerResult(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除接口信息信息 + * + * @param id 接口信息ID + * @return 结果 + */ + @Override + public ServerResult deleteInterTableById(Long id) { + try { + Integer renewal = interTableDao.deleteInterTableById(id); + if (renewal > 0) { + return new ServerResult(true, renewal); + } else { + return new ServerResult(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + @Override + public ServerResult> previewCodeCalss(Long cid) { + try { + Map dataMap = new LinkedHashMap(); + ApiClass apiclass = interTableDao.selectInterTableClass(cid); + if (apiclass == null) { + return new ServerResult>(false, ReturnConstants.INTER_NULL); + } + VelocityInitializer.initVelocity(); + VelocityContext context = InterTableUtils.prepareClassContext(apiclass); + Map templates = InterTableUtils.getTemplateList(2); + StringWriter sw = new StringWriter(); + Template template = Velocity.getTemplate(templates.get("java"), Constants.UTF8); + template.merge(context, sw); + dataMap.put(getJavaClassName(apiclass.getcName()), sw.toString()); + + sw = new StringWriter(); + template = Velocity.getTemplate(templates.get("sql"), Constants.UTF8); + template.merge(context, sw); + dataMap.put(getSqlName(apiclass.getcName()), sw.toString()); + return new ServerResult>(true, dataMap); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + @Override + public ServerResult> previewCodeMoudle(Long mid) { + try { + Map dataMap = new LinkedHashMap(); + List interTableList = interTableDao.selectInterTableModule(mid); + if (interTableList.size() == 0) { + return new ServerResult>(false, "该模块下接口为空,请先创建接口!"); + } + VelocityInitializer.initVelocity(); + List contextList = InterTableUtils.prepareMoudleContext(interTableList); + Map templates = InterTableUtils.getTemplateList(2); + StringWriter sqlsw = new StringWriter(); + Template sqltemplate = Velocity.getTemplate(templates.get("sql"), Constants.UTF8); + for (VelocityContext context : contextList) { + StringWriter sw = new StringWriter(); + Template template = Velocity.getTemplate(templates.get("java"), Constants.UTF8); + template.merge(context, sw); + sqltemplate.merge(context, sqlsw); + dataMap.put(getJavaClassName((String) context.get("ClassName")), sw.toString()); + } + dataMap.put(getSqlName("module"), sqlsw.toString()); + return new ServerResult>(true, dataMap); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + @Override + @Transactional + public ServerResult generatorCodeClass(Long cid) { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + ApiClass apiclass = interTableDao.selectInterTableClass(cid); + VelocityInitializer.initVelocity(); + VelocityContext context = InterTableUtils.prepareClassContext(apiclass); + Map templates = InterTableUtils.getTemplateList(2); + StringWriter sw = new StringWriter(); + Template template = Velocity.getTemplate(templates.get("java"), Constants.UTF8); + template.merge(context, sw); + zip = genCode(getJavaClassName(apiclass.getcName()), zip, sw); + if (zip == null) { + return new ServerResult(false, "代码生成失败!"); + } + sw = new StringWriter(); + template = Velocity.getTemplate(templates.get("sql"), Constants.UTF8); + template.merge(context, sw); + + zip = genCode(getSqlName(apiclass.getcName()), zip, sw); + if (zip == null) { + return new ServerResult(false, "代码生成失败!"); + } + int start = genTableDao.insertMenu(sw.toString()); + if (!(start > 0)) { + return new ServerResult(false, ReturnConstants.DB_EX); + } + IOUtils.closeQuietly(zip); + return new ServerResult(true, outputStream.toByteArray()); + + } catch (RuntimeException e) { + logger.error(e.getMessage()); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw new EbtsException("代码生成失败!",e); + } + } + + @Override + @Transactional + public ServerResult generatorCodeMoudle(Long mid) { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + List interTableList = interTableDao.selectInterTableModule(mid); + if (interTableList.size() == 0) { + return new ServerResult(false, "该模块下接口为空,请先创建接口!"); + } + VelocityInitializer.initVelocity(); + List contextList = InterTableUtils.prepareMoudleContext(interTableList); + Map templates = InterTableUtils.getTemplateList(2); + StringWriter sqlsw = new StringWriter(); + Template sqltemplate = Velocity.getTemplate(templates.get("sql"), Constants.UTF8); + for (VelocityContext context : contextList) { + StringWriter sw = new StringWriter(); + Template template = Velocity.getTemplate(templates.get("java"), Constants.UTF8); + template.merge(context, sw); + sqltemplate.merge(context, sqlsw); + zip = genCode(getJavaClassName((String) context.get("ClassName")), zip, sw); + } + zip = genCode(getSqlName("module"), zip, sqlsw); + if (zip != null) { + int start = genTableDao.insertMenu(sqlsw.toString()); + if (!(start > 0)) { + return new ServerResult(false, ReturnConstants.DB_EX); + } + } + IOUtils.closeQuietly(zip); + return new ServerResult(true, outputStream.toByteArray()); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw new EbtsException("代码生成失败!",e); + } + } + + + public ZipOutputStream genCode(String className, ZipOutputStream zip, StringWriter sw) { + try { + zip.putNextEntry(new ZipEntry(className)); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + return zip; + } catch (IOException e) { + logger.error(e.getMessage()); + return null; + } + } + + + public String getJavaClassName(String cName) { + return InterTableUtils.getUpperCase(cName) + "Controller.java"; + } + + public String getSqlName(String cName) { + return InterTableUtils.getUpperCase(cName) + ".sql"; + } +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/ModuleServiceImpl.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/ModuleServiceImpl.java new file mode 100644 index 0000000..89ff70a --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/ModuleServiceImpl.java @@ -0,0 +1,157 @@ +package com.ebts.generator.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.dao.ModuleDao; +import com.ebts.generator.entity.Module; +import com.ebts.generator.service.ModuleService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 模块管理Service业务层处理 + * + * @author binlin + * @date 2021-01-24 + */ +@Service +public class ModuleServiceImpl implements ModuleService { + private Logger logger = LoggerFactory.getLogger(ModuleServiceImpl.class); + + @Autowired + private ModuleDao moduleDao; + + /** + * 查询模块管理 + * + * @param id 模块管理ID + * @return 模块管理 + */ + @Override + public ServerResult selectModuleById(Long id) { + try { + Module module = moduleDao.selectModuleById(id); + if (module != null) { + return new ServerResult(true, module); + } else { + return new ServerResult(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询模块管理列表 + * + * @param module 模块管理 + * @return 模块管理 + */ + @Override + public ServerResult> selectModuleList(Module module) { + try { + List moduleList = moduleDao.selectModuleList(module); + if (moduleList.size() > 0) { + return new ServerResult>(true, moduleList); + } else { + return new ServerResult>(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增模块管理 + * + * @param module 模块管理 + * @return 结果 + */ + @Override + public ServerResult insertModule(Module module) { + try { + module.setCreateBy(SecurityUtils.getUserId()); + Integer renewal = moduleDao.insertModule(module); + if (renewal > 0) { + return new ServerResult(true, renewal); + } else { + return new ServerResult(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改模块管理 + * + * @param module 模块管理 + * @return 结果 + */ + @Override + public ServerResult updateModule(Module module) { + try { + module.setUpdateBy(SecurityUtils.getUserId()); + Integer renewal = moduleDao.updateModule(module); + if (renewal > 0) { + return new ServerResult(true, renewal); + } else { + return new ServerResult(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除模块管理 + * + * @param ids 需要删除的模块管理ID + * @return 结果 + */ + @Override + public ServerResult deleteModuleByIds(Long[] ids) { + try { + Integer renewal = moduleDao.deleteModuleByIds(ids); + if (renewal > 0) { + return new ServerResult(true, renewal); + } else { + return new ServerResult(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除模块管理信息 + * + * @param id 模块管理ID + * @return 结果 + */ + @Override + public ServerResult deleteModuleById(Long id) { + try { + Integer renewal = moduleDao.deleteModuleById(id); + if (renewal > 0) { + return new ServerResult(true, renewal); + } else { + return new ServerResult(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/QueryServiceImpl.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/QueryServiceImpl.java new file mode 100644 index 0000000..3d70346 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/QueryServiceImpl.java @@ -0,0 +1,200 @@ +package com.ebts.generator.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.core.entity.entity.Menu; +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.dao.QueryDao; +import com.ebts.generator.dao.UniQueryDao; +import com.ebts.generator.entity.UniCon; +import com.ebts.generator.entity.UniQuery; +import com.ebts.generator.service.QueryService; +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 org.springframework.transaction.interceptor.TransactionAspectSupport; + +import java.util.List; +import java.util.Map; + +/** + * Author 18209 + * Date 2021/1/30 18:54 + * Version 1.0 + */ +@Service +public class QueryServiceImpl implements QueryService { + private final Logger logger = LoggerFactory.getLogger(QueryServiceImpl.class); + + @Autowired + private QueryDao queryDao; + + @Autowired + private UniQueryDao uniQueryDao; + + + /** + * 查询万能查询的基本信息和条件信息 + */ + @Override + public ServerResult selectQueryById(Long id) { + try { + UniQuery uniQuery = queryDao.selectQueryInfo(id); + if (uniQuery != null) { + return new ServerResult<>(true, uniQuery); + } else { + return new ServerResult<>(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResult Release(UniQuery uniQuery) { + try { + Integer isRelease = queryDao.Release(uniQuery.getId()); + if ((isRelease == 1 && uniQuery.getIsRelease() == 2) || (isRelease == 2 && uniQuery.getIsRelease() == 1)) { + if (uniQuery.getIsRelease() == 1) { + UniQuery query = uniQueryDao.selectUniQueryById(uniQuery.getId()); + Menu Menu = new Menu(query.getId(), query.getUqName(), SecurityUtils.getUserId()); + Integer insermenu = queryDao.insertMenu(Menu); + if (insermenu == 0) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return new ServerResult<>(false, ReturnConstants.OP_ERROR); + } + } else { + Integer deleteMenu = queryDao.deleteMenu("data/" + uniQuery.getId()); + if (deleteMenu == 0) { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return new ServerResult<>(false, ReturnConstants.OP_ERROR); + } + } + Integer release = queryDao.changeRelease(uniQuery); + if (release > 0) { + return new ServerResult<>(true); + } else { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return new ServerResult<>(false, ReturnConstants.OP_ERROR); + } + } else { + return new ServerResult<>(false, ReturnConstants.STATE_ERROR); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 更新万能查询基本信息和条件 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResult updateQueryInfo(UniQuery uniQuery) { + try { + int uqrenewal = uniQueryDao.updateUniQuery(uniQuery); + if (uqrenewal > 0) { + if (uniQuery.getUniCons() != null && uniQuery.getUniCons().size() > 0) { + queryDao.deleteUniCon(uniQuery.getId()); + Integer ucrenewal = queryDao.insertUniCon(uniQuery.getUniCons()); + if (ucrenewal == 0) { + return new ServerResult<>(false, ReturnConstants.OP_ERROR); + } + } + return new ServerResult<>(true); + } + return new ServerResult<>(false, ReturnConstants.OP_ERROR); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + @Override + public ServerResult>> previewQuery(UniQuery uniQuery) { + try { + StringBuilder sql = new StringBuilder(uniQuery.getUqSql().toLowerCase()); + List uniConList = uniQuery.getUniCons(); + if (sql.toString().contains("insert") || sql.toString().contains("delete ") || sql.toString().contains("update ") || + sql.toString().contains("drop ") || sql.toString().contains("database ") || sql.toString().contains("create ") || + sql.toString().contains("view ") || sql.toString().contains("alter ") || sql.toString().contains("gen_")) { + return new ServerResult<>(false, "sql语句含有insert,delete,update,drop,database,view,alter,gen_等特殊字符!"); + } + if (uniConList.size() > 0) { + sql.append(" where 1 = 1"); + for (UniCon uniCon : uniConList) { + if (!uniCon.getUcMock().equals("") && uniCon.getUcMock() != null) { + sql.append(conversionPreview(uniCon)); + } + } + } + List> dataMap = queryDao.UniQuery(sql.toString()); + return new ServerResult<>(true, dataMap); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 预览模式下拼接sql + * + * @param uniCon + * @return + */ + public String conversionPreview(UniCon uniCon) { + String sql = " and "; + switch (uniCon.getUcCon()) { + case "EQ": + sql += uniCon.getUcKey() + " = '" + uniCon.getUcMock() + "'"; + break; + case "NE": + sql += uniCon.getUcKey() + " != '" + uniCon.getUcMock() + "'"; + break; + case "GT": + sql += uniCon.getUcKey() + " > '" + uniCon.getUcMock() + "'"; + break; + case "GTE": + sql += uniCon.getUcKey() + " >= '" + uniCon.getUcMock() + "'"; + break; + case "LT": + sql += uniCon.getUcKey() + " < '" + uniCon.getUcMock() + "'"; + break; + case "LTE": + sql += uniCon.getUcKey() + " <= '" + uniCon.getUcMock() + "'"; + break; + case "LIKE": + sql += uniCon.getUcKey() + " like '%" + uniCon.getUcMock() + "%'"; + break; + case "BETWEEN": + try { + JSONObject jsonObject = JSONObject.parseObject(uniCon.getUcMock()); + if (uniCon.getUcType().equals("input")) { + Object begin = jsonObject.get("begin"); + Object end = jsonObject.get("end"); + if (begin != null && end != null) { + sql += uniCon.getUcKey() + " between '" + begin + "' AND '" + end + "'"; + } else { + sql = ""; + } + } else if (uniCon.getUcType().equals("datetime")) { + Object startTime = jsonObject.get("startTime"); + Object endTime = jsonObject.get("endTime"); + sql += uniCon.getUcKey() + " between '" + startTime + "' AND '" + endTime + "'"; + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + sql = ""; + } + break; + } + return sql; + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/RegularServiceImpl.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/RegularServiceImpl.java new file mode 100644 index 0000000..ba21db1 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/RegularServiceImpl.java @@ -0,0 +1,163 @@ +package com.ebts.generator.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.DateUtils; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.dao.RegularDao; +import com.ebts.generator.entity.Regular; +import com.ebts.generator.service.RegularService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 校验规则Service业务层处理 + * + * @author binlin + * @date 2021-01-18 + */ +@Service +public class RegularServiceImpl implements RegularService { + private Logger logger = LoggerFactory.getLogger(RegularServiceImpl.class); + + @Autowired + private RegularDao regularDao; + + /** + * 查询校验规则 + * + * @param id 校验规则ID + * @return 校验规则 + */ + @Override + public ServerResult selectRegularById(Long id) { + try { + Regular regular = regularDao.selectRegularById(id); + if (regular != null) { + return new ServerResult<>(true, regular); + } else { + return new ServerResult<>(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询校验规则列表 + * + * @param regular 校验规则 + * @return 校验规则 + */ + @Override + public ServerResult> selectRegularList(Regular regular) { + try { + List regulars = regularDao.selectRegularList(regular); + if (regulars.size() > 0) { + return new ServerResult<>(true, regulars); + } else { + return new ServerResult<>(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + /** + * 查询校验规则下拉框列表 + * + * @return 校验规则 + */ + @Override + public ServerResult> selectRegularOption() { + try { + List regulars = regularDao.selectRegularOption(); + if (regulars.size() > 0) { + return new ServerResult<>(true, regulars); + } else { + return new ServerResult<>(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增校验规则 + * + * @param regular 校验规则 + * @return 结果 + */ + @Override + public ServerResult insertRegular(Regular regular) { + try { + regular.setCreateTime(DateUtils.getNowDate()); + regular.setCreateBy(SecurityUtils.getUserId()); + int renewal = regularDao.insertRegular(regular); + return new ServerResult<>(true, renewal); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改校验规则 + * + * @param regular 校验规则 + * @return 结果 + */ + @Override + public ServerResult updateRegular(Regular regular) { + try { + regular.setUpdateTime(DateUtils.getNowDate()); + regular.setUpdateBy(SecurityUtils.getUserId()); + int renewal = regularDao.updateRegular(regular); + return new ServerResult<>(true, renewal); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除校验规则 + * + * @param ids 需要删除的校验规则ID + * @return 结果 + */ + @Override + public ServerResult deleteRegularByIds(Long[] ids) { + try { + Integer renewals = regularDao.deleteRegularByIds(ids); + return new ServerResult<>(true, renewals); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除校验规则信息 + * + * @param id 校验规则ID + * @return 结果 + */ + @Override + public ServerResult deleteRegularById(Long id) { + try { + Integer renewal = regularDao.deleteRegularById(id); + return new ServerResult<>(true, renewal); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/RelServiceImpl.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/RelServiceImpl.java new file mode 100644 index 0000000..c269c3b --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/RelServiceImpl.java @@ -0,0 +1,88 @@ +package com.ebts.generator.service.impl; + +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.dao.RelDao; +import com.ebts.generator.entity.RelColumn; +import com.ebts.generator.entity.RelTable; +import com.ebts.generator.service.RelService; +import com.ebts.generator.utils.RelUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @Author 18209 + * @Date 2021/2/24 16:21 + * @Version 1.0 + */ +@Service +public class RelServiceImpl implements RelService { + private Logger logger = LoggerFactory.getLogger(RelServiceImpl.class); + + @Autowired + private RelDao relDao; + + /** + * 获取到数据库表信息 + * + * @return + */ + @Override + public ServerResult>> tableInfos() { + try { + List> dataMap = relDao.tableInfos(); + return new ServerResult<>(dataMap); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException("获取数据库表信息错误",e); + } + } + + /** + * 获取到关联边字段信息 + * + * @param tableName 关联表表名 + * @param relId 关联关系id + * @return + */ + @Override + public ServerResult> relColumns(String tableName, Long relId) { + try { + List relColumns = relDao.selectTableColumn(tableName); + for (RelColumn relColumn : relColumns) { + RelUtil.initRelColumn(relColumn, relId); + } + return new ServerResult<>(relColumns); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException("获取关联边字段信息错误",e); + } + } + + @Override + public ServerResult>> tableColumns(String tableName) { + try { + List> columns = relDao.tableColumns(tableName); + return new ServerResult<>(columns); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException("获取字段信息错误",e); + } + } + + @Override + public ServerResult> relTableByTableId(Long tableId) { + try { + List relTables = relDao.relTableByTableId(tableId); + return new ServerResult<>(relTables); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException("获取关联数据错误",e); + } + } +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/TopSearchTableServiceImpl.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/TopSearchTableServiceImpl.java new file mode 100644 index 0000000..c0fe3a7 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/TopSearchTableServiceImpl.java @@ -0,0 +1,263 @@ +package com.ebts.generator.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.DateUtils; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.DateUtils; +import com.ebts.common.utils.ServerResult; +import com.ebts.generator.dao.SearchTableRoleDao; +import com.ebts.generator.entity.SearchTableRole; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.util.ArrayList; +import com.ebts.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import com.ebts.generator.entity.TopSearchColumn; +import com.ebts.generator.dao.TopSearchTableDao; +import com.ebts.generator.entity.TopSearchTable; +import com.ebts.generator.service.TopSearchTableService; + +/** + * top万能查询主Service业务层处理 + * + * @author clay + * @date 2021-07-20 + */ +@Service +public class TopSearchTableServiceImpl implements TopSearchTableService { + private Logger logger = LoggerFactory.getLogger(TopSearchTableServiceImpl.class); + + @Autowired + private TopSearchTableDao topSearchTableDao; + @Autowired + private SearchTableRoleDao searchTableRoleDao; + + /** + * 查询top万能查询主 + * + * @param id top万能查询主ID + * @return top万能查询主 + */ + @Override + public ServerResult selectTopSearchTableById(Long id) { + try { + TopSearchTable topSearchTable = topSearchTableDao.selectTopSearchTableById(id); + List roleList = searchTableRoleDao.selectSearchTableRoleList(new SearchTableRole()); + Long[] roles = new Long[roleList.size()] ; + for (int i = 0; i < roleList.size(); i++) { + roles[i] = roleList.get(i).getRoleId(); + } + topSearchTable.setRoleIds(roles); + if (topSearchTable != null){ + return new ServerResult<>(true,topSearchTable); + }else { + return new ServerResult<>(false, ReturnConstants.RESULT_EMPTY); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询top万能查询主列表 + * + * @param topSearchTable top万能查询主 + * @return top万能查询主 + */ + @Override + public ServerResult> selectTopSearchTableList(TopSearchTable topSearchTable) { + try { + List topSearchTableList = topSearchTableDao.selectTopSearchTableList(topSearchTable); + if (topSearchTableList.size()>0){ + return new ServerResult<>(true,topSearchTableList); + }else { + return new ServerResult<>(false,ReturnConstants.RESULT_EMPTY); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增top万能查询主 + * + * @param topSearchTable top万能查询主 + * @return 结果 + */ + @Transactional + @Override + public ServerResult insertTopSearchTable(TopSearchTable topSearchTable) { + try { + topSearchTable.setCreateBy(SecurityUtils.getUserId()); + int renewal = topSearchTableDao.insertTopSearchTable(topSearchTable); + if (insertTopSearchColumn(topSearchTable)){ + return new ServerResult<>(false,ReturnConstants.DB_EX); + } + if (renewal >0){ + return new ServerResult<>(true,renewal); + }else { + return new ServerResult<>(false,ReturnConstants.SYS_FAILL); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改top万能查询主 + * + * @param topSearchTable top万能查询主 + * @return 结果 + */ + @Transactional + @Override + public ServerResult updateTopSearchTable(TopSearchTable topSearchTable) { + try { + topSearchTable.setUpdateBy(SecurityUtils.getUserId()); + topSearchTableDao.deleteTopSearchColumnBySearchTableId(topSearchTable.getId()); + if (insertTopSearchColumn(topSearchTable)){ + return new ServerResult<>(false,ReturnConstants.DB_EX); + } + List searchTableRoles = new ArrayList<>(); + for (Long roleId : topSearchTable.getRoleIds()) { + searchTableRoles.add(new SearchTableRole(topSearchTable.getId(),roleId)); + } + boolean renewalRole = inserTopTableRole(searchTableRoles); + + Integer renewal = topSearchTableDao.updateTopSearchTable(topSearchTable); + if (renewal >0 && renewalRole){ + return new ServerResult<>(true,renewal); + }else { + return new ServerResult<>(false,ReturnConstants.OP_ERROR); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + @Override + public List selectDbTableListByNames(String[] tableNames) { + try { + return topSearchTableDao.selectDbTableListByNames(tableNames); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void importGenTable(List tableList) { + try { + Long createBy = SecurityUtils.getUserId(); + for (TopSearchTable table : tableList) { + String tableName = table.getTableName(); + table.setCreateBy(createBy); + int row = topSearchTableDao.insertTopSearchTable(table); + if (row>0){ + List searchColumns = topSearchTableDao.selectDbTableColumnsByName(tableName); + for (TopSearchColumn searchColumn : searchColumns) { + searchColumn.setSearchTableId(table.getId()); + } + if (searchColumns.size() > 0) { + topSearchTableDao.batchTopSearchColumn(searchColumns); + } + } + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException("导入失败:" + e.getMessage(),e); + } + + } + + /** + * 批量删除top万能查询主 + * + * @param ids 需要删除的top万能查询主ID + * @return 结果 + */ + @Transactional + @Override + public ServerResult deleteTopSearchTableByIds(Long[] ids) { + try { + //批量删除子表数据 + topSearchTableDao.deleteTopSearchColumnBySearchTableIds(ids); + Integer renewal = topSearchTableDao.deleteTopSearchTableByIds(ids); + if (renewal >0){ + return new ServerResult<>(true,renewal); + }else { + return new ServerResult<>(false,ReturnConstants.SYS_FAILL); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除top万能查询主信息 + * + * @param id top万能查询主ID + * @return 结果 + */ + @Override + public ServerResult deleteTopSearchTableById(Long id) { + try { + //删除子表数据 + topSearchTableDao.deleteTopSearchColumnBySearchTableId(id); + Integer renewal = topSearchTableDao.deleteTopSearchTableById(id); + if (renewal >0){ + return new ServerResult<>(true,renewal); + }else { + return new ServerResult<>(false,ReturnConstants.SYS_FAILL); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + public boolean inserTopTableRole(List roleList){ + if (StringUtils.isNotNull(roleList)){ + Integer renewal = searchTableRoleDao.batchSearchTableRole(roleList); + if (renewal>0){ + return true; + } + } + return false; + } + + /** + * 新增top万能查询字段信息 + * + * @param topSearchTable top万能查询主对象 + */ + public boolean insertTopSearchColumn(TopSearchTable topSearchTable) { + List topSearchColumnList = topSearchTable.getTopSearchColumnList(); + Long id = topSearchTable.getId(); + if (StringUtils.isNotNull(topSearchColumnList)) { + List list = new ArrayList(); + for (TopSearchColumn topSearchColumn : topSearchColumnList){ + topSearchColumn.setSearchTableId(id); + list.add(topSearchColumn); + } + if (list.size() > 0) { + Integer renewal = topSearchTableDao.batchTopSearchColumn(list); + if (renewal>0){ + return false; + } + } + } + return true; + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/UniQueryServiceImpl.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/UniQueryServiceImpl.java new file mode 100644 index 0000000..4db111e --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/service/impl/UniQueryServiceImpl.java @@ -0,0 +1,166 @@ +package com.ebts.generator.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServerResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.generator.dao.UniQueryDao; +import com.ebts.generator.entity.UniQuery; +import com.ebts.generator.service.UniQueryService; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +/** + * 万能查询Service业务层处理 + * + * @author binlin + * @date 2021-01-30 + */ +@Service +public class UniQueryServiceImpl implements UniQueryService { + private Logger logger = LoggerFactory.getLogger(UniQueryServiceImpl.class); + + @Autowired + private UniQueryDao uniQueryDao; + + /** + * 查询万能查询 + * + * @param id 万能查询ID + * @return 万能查询 + */ + @Override + public ServerResult selectUniQueryById(Long id) { + try { + UniQuery uniQuery = uniQueryDao.selectUniQueryById(id); + if (uniQuery != null) { + return new ServerResult(true, uniQuery); + } else { + return new ServerResult(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询万能查询列表 + * + * @param uniQuery 万能查询 + * @return 万能查询 + */ + @Override + public ServerResult> selectUniQueryList(UniQuery uniQuery) { + try { + List uniQueryList = uniQueryDao.selectUniQueryList(uniQuery); + if (uniQueryList.size() > 0) { + return new ServerResult>(true, uniQueryList); + } else { + return new ServerResult>(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增万能查询 + * + * @param uniQuery 万能查询 + * @return 结果 + */ + @Override + public ServerResult insertUniQuery(UniQuery uniQuery) { + try { + uniQuery.setCreateBy(SecurityUtils.getUserId()); + Integer renewal = uniQueryDao.insertUniQuery(uniQuery); + if (renewal > 0) { + return new ServerResult(true, renewal); + } else { + return new ServerResult(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改万能查询 + * + * @param uniQuery 万能查询 + * @return 结果 + */ + @Override + public ServerResult updateUniQuery(UniQuery uniQuery) { + try { + uniQuery.setUpdateBy(SecurityUtils.getUserId()); + Integer renewal = uniQueryDao.updateUniQuery(uniQuery); + if (renewal > 0) { + return new ServerResult(true, renewal); + } else { + return new ServerResult(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除万能查询 + * + * @param ids 需要删除的万能查询ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResult deleteUniQueryByIds(Long[] ids) { + try { + Integer renewal = uniQueryDao.deleteUniQueryByIds(ids); + for (Long id : ids) { + uniQueryDao.deleteUniQueryByUqId(id); + } + if (renewal > 0) { + return new ServerResult<>(true, renewal); + } else { + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return new ServerResult<>(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除万能查询信息 + * + * @param id 万能查询ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public ServerResult deleteUniQueryById(Long id) { + try { + Integer renewal = uniQueryDao.deleteUniQueryById(id); + uniQueryDao.deleteUniQueryByUqId(id); + if (renewal > 0) { + return new ServerResult<>(true, renewal); + } else { + return new ServerResult<>(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/GenInterApiUtils.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/GenInterApiUtils.java new file mode 100644 index 0000000..3401e51 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/GenInterApiUtils.java @@ -0,0 +1,13 @@ +package com.ebts.generator.utils; + +import com.ebts.generator.dto.InterTableDto; +import org.apache.velocity.VelocityContext; + +public class GenInterApiUtils { + + + public static VelocityContext prepareContext(InterTableDto interTableDto) { + return new VelocityContext(); + } + +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/GenUtils.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/GenUtils.java new file mode 100644 index 0000000..f2dbaa0 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/GenUtils.java @@ -0,0 +1,222 @@ +package com.ebts.generator.utils; + +import java.util.Arrays; + +import com.ebts.common.utils.StringUtils; +import com.ebts.generator.utils.constant.GenConstants; +import org.apache.commons.lang3.RegExUtils; +import com.ebts.generator.config.GenConfig; +import com.ebts.generator.entity.GenTable; +import com.ebts.generator.entity.GenTableColumn; + +/** + * 代码生成器 工具类 + * + * @author binlin + */ +public class GenUtils { + /** + * 初始化表信息 + */ + public static void initTable(GenTable genTable, Long operName) { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateBy(operName); + } + + /** + * 初始化列属性字段 + */ + public static void initColumnField(GenTableColumn column, GenTable table) { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 设置java字段名 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // 插入字段(默认所有字段都需要插入) + column.setIsInsert(GenConstants.REQUIRE); + + // 编辑字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) { + column.setIsEdit(GenConstants.REQUIRE); + } + // 列表字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) { + column.setIsList(GenConstants.REQUIRE); + } + // 查询字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); + return moduleName; + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength); + return businessName; + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + * @return + */ + public static String replaceFirst(String replacementm, String[] searchList) { + String text = replacementm; + for (String searchString : searchList) { + if (replacementm.startsWith(searchString)) { + text = replacementm.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) { + return RegExUtils.replaceAll(text, "(?:表|若依)", ""); + } + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + return StringUtils.substringBefore(columnType, "("); + } else { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } else { + return 0; + } + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/InterTableUtils.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/InterTableUtils.java new file mode 100644 index 0000000..cf7c35c --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/InterTableUtils.java @@ -0,0 +1,122 @@ +package com.ebts.generator.utils; + +import com.ebts.common.utils.DateUtils; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.generator.entity.ApiClass; +import com.ebts.generator.entity.InterTable; +import org.apache.velocity.VelocityContext; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author 18209 + */ +public class InterTableUtils { + public static List prepareMoudleContext(List interTableList) { + List apiClassList = new ArrayList(); + for (int i = 0; i < interTableList.size(); i++) { + InterTable interTable = interTableList.get(i); + if (apiClassList.size() == 0) { + ApiClass apiclass = interTable.getApiclass(); + List interTables = new ArrayList(); + interTable.setApiclass(null); + interTables.add(interTable); + apiclass.setInterTables(interTables); + apiClassList.add(apiclass); + } else { + boolean start = true; + for (int j = 0; j < apiClassList.size(); j++) { + ApiClass api = apiClassList.get(j); + if (interTable.getcId() == api.getId()) { + List interTableList1 = api.getInterTables(); + interTable.setApiclass(null); + interTableList1.add(interTable); + api.setInterTables(interTableList1); + apiClassList.set(j, api); + start = false; + break; + } + } + if (start) { + ApiClass apiclass = interTable.getApiclass(); + List interTables = new ArrayList(); + interTable.setApiclass(null); + interTables.add(interTable); + apiclass.setInterTables(interTables); + apiClassList.add(apiclass); + } + } + } + List contextList = new ArrayList(); + for (int i = 0; i < apiClassList.size(); i++) { + ApiClass apiclass = apiClassList.get(i); + VelocityContext velocityContext = new VelocityContext(); + String module = apiclass.getInterTables().get(0).getmName(); + String className = apiclass.getcName(); + boolean permission = false; + for (InterTable interTable : apiclass.getInterTables()) { + if (interTable.getIsPermission().equals("1")) { + permission = true; + } + } + velocityContext.put("createBy", SecurityUtils.getUserId()); + velocityContext.put("Permission", permission); + velocityContext.put("packageName", "com.huhyun." + module); + velocityContext.put("prefix", module + ":" + getLowerCase(className)); + velocityContext.put("ClassName", getUpperCase(className)); + velocityContext.put("columns", apiclass.getInterTables()); + velocityContext.put("reqMapping", "/" + module + "/" + getLowerCase(className)); + velocityContext.put("functionName", apiclass.getcDescribe()); + velocityContext.put("author", apiclass.getAuthor()); + velocityContext.put("emali", apiclass.getEmail()); + velocityContext.put("time", DateUtils.getTime()); + contextList.add(velocityContext); + + } + return contextList; + } + + public static VelocityContext prepareClassContext(ApiClass apiclass) { + VelocityContext velocityContext = new VelocityContext(); + boolean permission = false; + for (InterTable interTable : apiclass.getInterTables()) { + if (interTable.getIsPermission().equals("1")) { + permission = true; + } + } + velocityContext.put("createBy", SecurityUtils.getUserId()); + velocityContext.put("Permission", permission); + velocityContext.put("packageName", apiclass.getPackageName()); + velocityContext.put("ClassName", getUpperCase(apiclass.getcName())); + velocityContext.put("columns", apiclass.getInterTables()); + velocityContext.put("prefix", apiclass.getPrefix()); + velocityContext.put("reqMapping", getClassUrl(apiclass.getcName(), apiclass.getModule().getmName())); + velocityContext.put("functionName", apiclass.getcDescribe()); + velocityContext.put("author", apiclass.getAuthor()); + velocityContext.put("emali", apiclass.getEmail()); + velocityContext.put("time", DateUtils.getTime()); + return velocityContext; + } + + public static String getClassUrl(String cname, String mname) { + return "/" + getLowerCase(mname) + "/" + getLowerCase(cname); + } + + public static Map getTemplateList(Integer type) { + Map templates = new HashMap(); + templates.put("java", "vm/java/class.java.vm"); + templates.put("sql", "vm/sql/class.sql.vm"); + return templates; + } + + public static String getUpperCase(String str) { + return str.substring(0, 1).toUpperCase() + str.substring(1); + } + + public static String getLowerCase(String str) { + return str.toLowerCase(); + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/RelUtil.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/RelUtil.java new file mode 100644 index 0000000..f3a6fd7 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/RelUtil.java @@ -0,0 +1,77 @@ +package com.ebts.generator.utils; + +import com.ebts.common.utils.StringUtils; +import com.ebts.generator.entity.RelColumn; +import com.ebts.generator.utils.constant.GenConstants; + +/** + * @Author 18209 + * @Date 2021/2/24 22:46 + * @Version 1.0 + */ +public class RelUtil { + + + public static void initRelColumn(RelColumn relColumn, Long relId) { + //获取数据库数据类型 + String dataType = GenUtils.getDbType(relColumn.getColumnType()); + //获取字段名称 + String columnName = relColumn.getColumnName(); + //设置tableid + relColumn.setRelId(relId); + //设置创建者id + relColumn.setCreateBy(1); + //转为设置java字段名称 + relColumn.setJavaField(StringUtils.toCamelCase(columnName)); + //默认类型 + relColumn.setJavaType(GenConstants.TYPE_STRING); + //默认查询条件 精确查询 + relColumn.setQueryType(GenConstants.QUERY_EQ); + + if (GenUtils.arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || GenUtils.arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { + //字符串长度超500设置htmlType为文本域 + Integer columnLength = GenUtils.getColumnLength(relColumn.getColumnType()); + String htmlType = columnLength >= 500 || GenUtils.arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + relColumn.setHtmlType(htmlType); + } else if (GenUtils.arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { + relColumn.setJavaType(GenConstants.TYPE_DATE); + relColumn.setHtmlType(GenConstants.HTML_DATETIME); + } else if (GenUtils.arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { + relColumn.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(relColumn.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { + relColumn.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) { + relColumn.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else { + relColumn.setJavaType(GenConstants.TYPE_LONG); + } + } + // 列表字段 + relColumn.setIsList(GenConstants.REQUIRE); + // 查询字段 + relColumn.setIsQuery(GenConstants.NO_REQUIRE); + //初始化字典 + relColumn.setDictType(""); + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) { + relColumn.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) { + relColumn.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) { + relColumn.setHtmlType(GenConstants.HTML_SELECT); + } + } + +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/VelocityInitializer.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/VelocityInitializer.java new file mode 100644 index 0000000..eb4c58d --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/VelocityInitializer.java @@ -0,0 +1,31 @@ +package com.ebts.generator.utils; + +import java.util.Properties; + +import com.ebts.common.constant.Constants; +import org.apache.velocity.app.Velocity; + +/** + * VelocityEngine工厂 + * + * @author binlin + */ +public class VelocityInitializer { + /** + * 初始化vm方法 + */ + public static void initVelocity() { + Properties p = new Properties(); + try { + // 加载classpath目录下的vm文件 + p.setProperty("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.ENCODING_DEFAULT, Constants.UTF8); + p.setProperty(Velocity.OUTPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/VelocityUtils.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/VelocityUtils.java new file mode 100644 index 0000000..fc12a6f --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/VelocityUtils.java @@ -0,0 +1,374 @@ +package com.ebts.generator.utils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +import com.ebts.common.utils.DateUtils; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.generator.entity.RelTable; +import com.ebts.generator.utils.constant.GenConstants; +import org.apache.velocity.VelocityContext; +import com.alibaba.fastjson.JSONObject; +import com.ebts.generator.entity.GenTable; +import com.ebts.generator.entity.GenTableColumn; + +/** + * 模板处理工具类 + * + * @author binlin + */ +public class VelocityUtils { + /** + * 项目空间路径 + */ + private static final String PROJECT_PATH = "main/java"; + + /** + * mybatis空间路径 + */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** + * 默认上级菜单,系统工具 + */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("createBy", SecurityUtils.getUserId()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) { + setTreeVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_SUB.equals(tplCategory)) { + setSubVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_REL.equals(tplCategory)) { + setRelVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setRelVelocityContext(VelocityContext context, GenTable genTable) { + context.put("relTables", genTable.getRelTables()); + context.put("tableMapping", StringUtils.sqlFormat(genTable.getTableName())); + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); + } + } + + public static void setSubVelocityContext(VelocityContext context, GenTable genTable) { + GenTable subTable = genTable.getSubTable(); + String subTableName = genTable.getSubTableName(); + String subTableFkName = genTable.getSubTableFkName(); + String subClassName = genTable.getSubTable().getClassName(); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); + + context.put("tableMapping", StringUtils.sqlFormat(genTable.getTableName())); + context.put("subMapping", StringUtils.sqlFormat(subTable.getTableName())); + context.put("subTable", subTable); + context.put("subTableName", subTableName); + context.put("subTableFkName", subTableFkName); + context.put("subTableFkClassName", subTableFkClassName); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); + context.put("subClassName", subClassName); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); + context.put("subImportList", getImportList(genTable.getSubTable())); + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) { + List templates = new ArrayList(); + templates.add("vm/java/entity.java.vm"); + templates.add("vm/java/dao.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + templates.add("vm/sql/table.sql.vm"); + templates.add("vm/js/api.js.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { + templates.add("vm/vue/index-tree.vue.vm"); + } else if (GenConstants.TPL_SUB.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + templates.add("vm/java/sub-entity.java.vm"); + } else if (GenConstants.TPL_REL.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + templates.add("vm/java/rel-entity.java.vm"); + } + return templates; + } + public static String getRelFileName(String template, GenTable genTable, RelTable relTable){ + + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + fileName = StringUtils.format("{}/entity/{}.java", javaPath, relTable.getRelClass()); + return fileName; + } + + public static String getPreviewName(String template, String ClassName) { + String fileName = ""; + if (template.contains("entity.java.vm")) { + fileName = StringUtils.format("{}.java", ClassName); + } + if (template.contains("sub-entity.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, ClassName)) { + fileName = StringUtils.format("{}.java", ClassName); + } else if (template.contains("rel-entity.java.vm")) { + fileName = StringUtils.format("{}.java", ClassName); + } else if (template.contains("dao.java.vm")) { + fileName = StringUtils.format("{}Dao.java", ClassName); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}Service.java", ClassName); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}ServiceImpl.java", ClassName); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}Controller.java",ClassName); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}Mapper.xml",ClassName); + } else if (template.contains("table.sql.vm")) { + fileName = ClassName + "menu.sql"; + } else if (template.contains("api.js.vm")) { + fileName = StringUtils.format("{}.js", StringUtils.toLoad(ClassName)); + } else if (template.contains("index.vue.vm")) { + fileName = "index.vue"; + } else if (template.contains("index-tree.vue.vm")) { + fileName = "index.vue"; + } + return fileName; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("entity.java.vm")) { + fileName = StringUtils.format("{}/entity/{}.java", javaPath, className); + } + if (template.contains("sub-entity.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) { + fileName = StringUtils.format("{}/entity/{}.java", javaPath, genTable.getSubTable().getClassName()); + } else if (template.contains("ass-entity.java.vm")) { + fileName = StringUtils.format("{}/entity/{}.java", javaPath, GenUtils.convertClassName(genTable.getAssTableName())); + } else if (template.contains("dao.java.vm")) { + fileName = StringUtils.format("{}/dao/{}Dao.java", javaPath, className); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}/service/{}Service.java", javaPath, className); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } else if (template.contains("table.sql.vm")) { + fileName = businessName + "menu.sql"; + } else if (template.contains("api.js.vm")) { + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + } else if (template.contains("index.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } else if (template.contains("index-tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + String basePackage = StringUtils.substring(packageName, 0, lastIndex); + return basePackage; + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) { + List columns = genTable.getColumns(); + GenTable subGenTable = genTable.getSubTable(); + HashSet importList = new HashSet(); + if (StringUtils.isNotNull(subGenTable)) { + importList.add("java.util.List"); + } + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(JSONObject paramsObj) { + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)) { + return paramsObj.getString(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) { + break; + } + } + } + return num; + } +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/constant/GenConstants.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/constant/GenConstants.java new file mode 100644 index 0000000..5529e52 --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/constant/GenConstants.java @@ -0,0 +1,199 @@ +package com.ebts.generator.utils.constant; + +/** + * 代码生成通用常量 + * + * @author binlin + */ +public class GenConstants { + /** + * 单表(增删改查) + */ + public static final String TPL_CRUD = "crud"; + + /** + * 树表(增删改查) + */ + public static final String TPL_TREE = "tree"; + + /** + * 主子表(增删改查) + */ + public static final String TPL_SUB = "sub"; + + /** + * 关联查询(增删改查) + */ + public static final String TPL_ASS = "ass"; + /** + * 多表关联查询(增删改查) + */ + public static final String TPL_REL = "rel"; + + /** + * 树编码字段 + */ + public static final String TREE_CODE = "treeCode"; + + /** + * 树父编码字段 + */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** + * 树名称字段 + */ + public static final String TREE_NAME = "treeName"; + + /** + * 上级菜单ID字段 + */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** + * 上级菜单名称字段 + */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** + * 数据库字符串类型 + */ + public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2", "tinytext", "text", + "mediumtext", "longtext"}; + + /** + * 数据库文本类型 + */ + public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; + + /** + * 数据库时间类型 + */ + public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"}; + + /** + * 数据库数字类型 + */ + public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "float", "double", "decimal"}; + + /** + * 页面不需要编辑字段 + */ + public static final String[] COLUMNNAME_NOT_EDIT = {"id", "create_by", "create_time", "del_flag"}; + + /** + * 页面不需要显示的列表字段 + */ + public static final String[] COLUMNNAME_NOT_LIST = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time"}; + + /** + * 页面不需要查询字段 + */ + public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark"}; + + /** + * Entity基类字段 + */ + public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime", "remark"}; + + /** + * Tree基类字段 + */ + public static final String[] TREE_ENTITY = {"parentName", "parentId", "orderNum", "ancestors", "children"}; + + /** + * 文本框 + */ + public static final String HTML_INPUT = "input"; + + /** + * 文本域 + */ + public static final String HTML_TEXTAREA = "textarea"; + + /** + * 下拉框 + */ + public static final String HTML_SELECT = "select"; + + /** + * 单选框 + */ + public static final String HTML_RADIO = "radio"; + + /** + * 复选框 + */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** + * 日期控件 + */ + public static final String HTML_DATETIME = "datetime"; + + /** + * 图片上传控件 + */ + public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** + * 文件上传控件 + */ + public static final String HTML_FILE_UPLOAD = "fileUpload"; + + /** + * 富文本控件 + */ + public static final String HTML_EDITOR = "editor"; + + /** + * 字符串类型 + */ + public static final String TYPE_STRING = "String"; + + /** + * 整型 + */ + public static final String TYPE_INTEGER = "Integer"; + + /** + * 长整型 + */ + public static final String TYPE_LONG = "Long"; + + /** + * 浮点型 + */ + public static final String TYPE_DOUBLE = "Double"; + + /** + * 高精度计算类型 + */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** + * 时间类型 + */ + public static final String TYPE_DATE = "Date"; + + /** + * 模糊查询 + */ + public static final String QUERY_LIKE = "LIKE"; + /** + * 精确查询 + */ + public static final String QUERY_EQ = "EQ"; + + /** + * 需要 + */ + public static final String REQUIRE = "1"; + /** + * 不需要 + */ + public static final String NO_REQUIRE = "0"; +} diff --git a/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/sql/GenSqlUtil.java b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/sql/GenSqlUtil.java new file mode 100644 index 0000000..84de2da --- /dev/null +++ b/ebts/ebts-generator/src/main/java/com/ebts/generator/utils/sql/GenSqlUtil.java @@ -0,0 +1,33 @@ +package com.ebts.generator.utils.sql; + +import com.ebts.common.exception.BaseException; +import com.ebts.common.utils.StringUtils; + +/** + * sql操作工具类 + * + * @author binlin + */ +public class GenSqlUtil { + /** + * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 检查字符,防止注入绕过 + */ + public static String escapeOrderBySql(String value) { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { + throw new BaseException("参数不符合规范,不能进行查询"); + } + return value; + } + + /** + * 验证 order by 语法是否符合规范 + */ + public static boolean isValidOrderBySql(String value) { + return value.matches(SQL_PATTERN); + } +} diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/ApiclassMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/ApiclassMapper.xml new file mode 100644 index 0000000..fdfbf2f --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/ApiclassMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, m_id, c_name, c_describe, package_name, author, email, remark,prefix, create_time, create_by, update_time, update_by from gen_api_class + + + + + + + + insert into gen_api_class + + m_id, + c_name, + c_describe, + package_name, + author, + email, + remark, + prefix, + create_by, + update_by, + + + #{mId}, + #{cName}, + #{cDescribe}, + #{packageName}, + #{author}, + #{email}, + #{remark}, + #{prefix}, + #{createBy}, + #{updateBy}, + + + + + update gen_api_class + + m_id = #{mId}, + c_name = #{cName}, + c_describe = #{cDescribe}, + package_name = #{packageName}, + author = #{author}, + email = #{email}, + remark = #{remark}, + prefix = #{prefix}, + create_by = #{createBy}, + update_by = #{updateBy}, + + where id = #{id} + + + + delete from gen_api_class where id = #{id} + + + + delete from gen_api_class where id in + + #{id} + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..3382528 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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,is_regular from gen_table_column + + + + + + + + insert into gen_table_column ( + 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 + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + + + update gen_table_column + + column_comment = #{item.columnComment}, + java_type = #{item.javaType}, + java_field = #{item.javaField}, + is_insert = #{item.isInsert}, + is_edit = #{item.isEdit}, + is_list = #{item.isList}, + is_query = #{item.isQuery}, + is_required = #{item.isRequired}, + is_regular = #{item.isRegular}, + query_type = #{item.queryType}, + html_type = #{item.htmlType}, + dict_type = #{item.dictType}, + sort = #{item.sort}, + update_by = #{item.updateBy}, + update_time = sysdate() + + where column_id = #{item.columnId} + + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/GenTableMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..1537d41 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${paramSQL} + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, + package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, + options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + ass_table_name = #{assTableName}, + ass_table_column = #{assTableColumn}, + ass_table_fk_column = #{assTableFkColumn}, + ass_query_type = #{assQueryType}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/InterTableMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/InterTableMapper.xml new file mode 100644 index 0000000..1bd2c4a --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/InterTableMapper.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, m_id, c_id, it_name, it_describe, is_permission, requrl, method, is_generate, type, create_time, create_by from gen_inter_table + + + + + + + + + + + insert into gen_inter_table (m_id, c_id, it_name, it_describe, is_permission, requrl, method, is_generate, type, create_by) VALUES + + (#{item.mId},#{item.cId},#{item.itName},#{item.itDescribe},#{item.isPermission},#{item.requrl},#{item.method},#{item.isGenerate},#{item.type},#{item.createBy}) + + + + delete from gen_inter_table where c_id = #{cId} and type = 2 + + + delete from gen_inter_table where c_id = #{cId} and type = 1 + + + + insert into gen_inter_table + + m_id, + c_id, + it_name, + it_describe, + is_permission, + requrl, + method, + type, + is_generate, + create_by, + + + #{mId}, + #{cId}, + #{itName}, + #{itDescribe}, + #{isPermission}, + #{requrl}, + #{method}, + #{type}, + #{isGenerate}, + #{createBy}, + + + + + update gen_inter_table + + m_id = #{mId}, + c_id = #{cId}, + it_name = #{itName}, + it_describe = #{itDescribe}, + is_permission = #{isPermission}, + requrl = #{requrl}, + method = #{method}, + type = #{type}, + is_generate = #{isGenerate}, + create_by = #{createBy}, + + where id = #{id} + + + + delete from gen_inter_table where id = #{id} + + + + delete from gen_inter_table where id in + + #{id} + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/ModuleMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/ModuleMapper.xml new file mode 100644 index 0000000..7e7bf63 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/ModuleMapper.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + select id, m_name, m_describe, remark, create_time, create_by, update_time, update_by from gen_module + + + + + + + + insert into gen_module + + m_name, + m_describe, + remark, + create_by, + update_by, + + + #{mName}, + #{mDescribe}, + #{remark}, + #{createBy}, + #{updateBy}, + + + + + update gen_module + + m_name = #{mName}, + m_describe = #{mDescribe}, + remark = #{remark}, + create_by = #{createBy}, + update_by = #{updateBy}, + + where id = #{id} + + + + delete from gen_module where id = #{id} + + + + delete from gen_module where id in + + #{id} + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/QueryMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/QueryMapper.xml new file mode 100644 index 0000000..1fc782f --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/QueryMapper.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + delete from sys_menu where path = #{path} + + + insert into sys_menu( + menu_id, + parent_id, + menu_name, + order_num, + path, + component, + is_frame, + is_cache, + menu_type, + visible, + status, + perms, + icon, + remark, + create_by, + create_time + )values( + #{menuId}, + #{parentId}, + #{menuName}, + #{orderNum}, + #{path}, + #{component}, + #{isFrame}, + #{isCache}, + #{menuType}, + #{visible}, + #{status}, + #{perms}, + #{icon}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update gen_uni_query set is_release = #{isRelease} where id = #{id} + + + + + + delete from gen_uni_con where uq_id = #{uqId} + + + insert into gen_uni_con(uq_id,uc_name,uc_key,uc_con,uc_mock,uc_describe,uc_type,type) values + + (#{item.uqId},#{item.ucName},#{item.ucKey},#{item.ucCon},#{item.ucMock},#{item.ucDescribe},#{item.ucType},#{item.type}) + + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/RegularMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/RegularMapper.xml new file mode 100644 index 0000000..70f773c --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/RegularMapper.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + select id, name, regular, validation, enable, create_by, create_time, update_by, update_time from gen_regular + + + + + + + + + insert into gen_regular + + name, + regular, + validation, + enable, + create_by, + create_time, + update_by, + update_time, + + + #{name}, + #{regular}, + #{validation}, + #{enable}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update gen_regular + + name = #{name}, + regular = #{regular}, + validation = #{validation}, + enable = #{enable}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from gen_regular where id = #{id} + + + + delete from gen_regular where id in + + #{id} + + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/RelMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/RelMapper.xml new file mode 100644 index 0000000..55aad48 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/RelMapper.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into gen_rel_table(id, table_id, rel_name,rel_as,table_name,table_as, rel_comment, + rel_column, table_column, rel_class, relclass, query_type, sort, create_by) + values + + (#{item.id},#{item.tableId},#{item.relName},#{item.relAs},#{item.tableName}, + #{item.tableAs},#{item.relComment},#{item.relColumn},#{item.tableColumn},#{item.relClass}, + #{item.relclass},#{item.queryType},#{item.sort},#{item.createBy}) + + + + + insert into gen_rel_column(rel_id, column_name, column_comment, column_type, java_type, java_field, is_list, + is_query, query_type, html_type, dict_type, sort, create_by) + values + + (#{item.relId},#{item.columnName},#{item.columnComment},#{item.columnType}, + #{item.javaType},#{item.javaField},#{item.isList},#{item.isQuery}, + #{item.queryType},#{item.htmlType},#{item.dictType},#{item.sort}, + #{item.createBy}) + + + + + + + + delete from gen_rel_column where rel_id = #{relId} + + + + delete from gen_rel_table where table_id = #{tableId} + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/SearchTableRoleMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/SearchTableRoleMapper.xml new file mode 100644 index 0000000..661a8df --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/SearchTableRoleMapper.xml @@ -0,0 +1,65 @@ + + + + + + + + + + select search_table_id, role_id from gen_search_table_role + + + + + + + + + insert into gen_search_table_role + + search_table_id, + role_id, + + + #{searchTableId}, + #{roleId}, + + + + + update gen_search_table_role + + role_id = #{roleId}, + + where search_table_id = #{searchTableId} + + + + delete from gen_search_table_role where search_table_id = #{searchTableId} + + + + delete from gen_search_table_role where search_table_id in + + #{searchTableId} + + + + insert into gen_search_table_role (search_table_id, role_id) values + + (#{item.searchTableId},#{item.roleId}) + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/TopSearchTableMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/TopSearchTableMapper.xml new file mode 100644 index 0000000..2ec8374 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/TopSearchTableMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, table_name, table_comment, remark, create_by, create_time, update_by, update_time from gen_top_search_table + + + + + + + + + + + + insert into gen_top_search_table + + table_name, + table_comment, + remark, + create_by, + + + #{tableName}, + #{tableComment}, + #{remark}, + #{createBy}, + + + + + update gen_top_search_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + remark = #{remark}, + create_by = #{createBy}, + + where id = #{id} + + + + delete from gen_top_search_table where id = #{id} + + + + delete from gen_top_search_table where id in + + #{id} + + + + + delete from gen_top_search_column where search_table_id in + + #{searchTableId} + + + + + delete from gen_top_search_column where search_table_id = #{searchTableId} + + + + insert into gen_top_search_column(search_table_id,column_name,column_comment,column_type,is_use,create_by,create_time,update_by,update_time) values + + (#{item.searchTableId},#{item.columnName},#{item.columnComment},#{item.columnType},#{item.isUse},#{item.createBy},#{item.createTime},#{item.updateBy},#{item.updateTime}) + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/mapper/generator/UniQueryMapper.xml b/ebts/ebts-generator/src/main/resources/mapper/generator/UniQueryMapper.xml new file mode 100644 index 0000000..7633649 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/mapper/generator/UniQueryMapper.xml @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + select id, uq_name, uq_sql, uq_describe, is_release, create_by, create_time, update_by, update_time from gen_uni_query + + + + + + + + insert into gen_uni_query + + uq_name, + uq_sql, + uq_describe, + create_by, + update_by, + + + #{uqName}, + #{uqSql}, + #{uqDescribe}, + #{createBy}, + #{updateBy}, + + + + + update gen_uni_query + + uq_name = #{uqName}, + uq_sql = #{uqSql}, + uq_describe = #{uqDescribe}, + create_by = #{createBy}, + update_by = #{updateBy}, + + where id = #{id} + + + + delete from gen_uni_query where id = #{id} + + + + delete from gen_uni_con where uq_id = #{id} + + + + delete from gen_uni_query where id in + + #{id} + + + \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/vm/java/class.java.vm b/ebts/ebts-generator/src/main/resources/vm/java/class.java.vm new file mode 100644 index 0000000..2d7ede3 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/java/class.java.vm @@ -0,0 +1,66 @@ +package ${packageName}.controller; + +/** + * ${ClassName} ${functionName} + * + * Author ${author} + * Email ${emali} + * Date ${time} +*/ +import com.ebts.common.annotation.Log; +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.exception.EbtsException; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + + + +#if($Permission) +@Api(value = "${functionName}",tags = "${functionName}") +#end +@RestController +@RequestMapping("${reqMapping}") +public class ${ClassName}Controller extends BaseController{ + private final Logger logger = LoggerFactory.getLogger(${ClassName}Controller.class); + +#foreach($column in $columns) +#if($column.isGenerate.equals("1")) +#set($InterName = $column.itName.substring(0,1).toUpperCase() + ${column.itName.substring(1)}) + /** + * ${column.itDescribe} + */ + @ApiOperation("${column.itDescribe}") +#if($column.isPermission.equals("1")) + @PreAuthorize("@ebts.hasPermi('${prefix}:${column.requrl}')") + @Log(title = "${column.itDescribe}", businessType = BusinessType.OTHER) +#end + @${column.method}Mapping("/${column.requrl}") +#if($column.method.equals("Get")) + public AjaxResult ${InterName} ( Map parms){ +#else + public AjaxResult ${InterName} (@RequestBody Map parms){ +#end + try { + return AjaxResult.success("${column.itDescribe}测试!"); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EBTSException(ReturnConstants.OP_ERROR,e); + } + } +#end +#end +} + + + diff --git a/ebts/ebts-generator/src/main/resources/vm/java/controller.java.vm b/ebts/ebts-generator/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 0000000..9f8b5d5 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,163 @@ +package ${packageName}.controller; + +import java.io.Serializable; +import java.util.List; +import java.util.regex.Pattern; + + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.core.controller.EBTSController; +import com.ebts.common.utils.ServerResult; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +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.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ebts.common.annotation.Log; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.exception.EbtsException; +import ${packageName}.entity.${ClassName}; +import ${packageName}.service.${ClassName}Service; +import com.ebts.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.ebts.common.core.page.TableDataInfo; +#elseif($table.tree) +#elseif($table.tplCategory.equals("rel")) +import org.springframework.validation.annotation.Validated; +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ + +@Api(value = "${functionName}管理",tags = "${functionName}管理") +@RestController +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends EBTSController { + protected final Logger logger = LoggerFactory.getLogger(${ClassName}Controller.class); + + @Autowired + private ${ClassName}Service ${className}Service; + + /** + * 查询${functionName}列表 + */ + @ApiOperation("查询${functionName}列表") + @PreAuthorize("@ebts.hasPermi('${permissionPrefix}:list')") + @PostMapping("/list") + public Serializable list(@Validated @RequestBody ${ClassName} ${className}) { + startPage(${className}.getPageInfo()); + ServerResult> genServerResult = ${className}Service.select${ClassName}List(${className}); + if (genServerResult.isStart()) { +#if($table.crud || $table.sub || $tplCategory.equals("rel")) + return getDataTable(genServerResult.getData()); +#elseif($table.tree) + return AjaxResult.success(genServerResult.getData()); +#end + } else { + return AjaxResult.info(genServerResult.getMsg()); + } + } + + /** + * 导出${functionName}列表 + */ + @ApiOperation("导出${functionName}列表") + @PreAuthorize("@ebts.hasPermi('${permissionPrefix}:export')") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public AjaxResult export(@Validated @RequestBody ${ClassName} ${className}) { + ServerResult> genServerResult = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}. class); + if (genServerResult.isStart()) { + return util.exportExcel(genServerResult.getData(), "${businessName}"); + } else { + return AjaxResult.error(genServerResult.getMsg()); + } + } + + /** + * 获取${functionName}详细信息 + */ + @ApiOperation("获取${functionName}详细信息") + @ApiImplicitParam(name = "${pkColumn.javaField}" , value = "${functionName}${pkColumn.javaField}" , required = true, dataType = "${pkColumn.javaType}" , paramType = "path") + @PreAuthorize("@ebts.hasPermi('${permissionPrefix}:query')") + @GetMapping(value = "/{${pkColumn.javaField}}") + public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) { + ServerResult<${ClassName}> genServerResult = ${className}Service.select${ClassName}ById(${pkColumn.javaField}); + if (genServerResult.isStart()) { + return AjaxResult.success(genServerResult.getData()); + } else { + return AjaxResult.info(genServerResult.getMsg()); + } + } + + /** + * 新增${functionName} + */ + @ApiOperation("新增${functionName}") + @ApiImplicitParam(name = "${className}" , value = "新增${functionName}信息" , dataType = "${ClassName}") + @PreAuthorize("@ebts.hasPermi('${permissionPrefix}:add')") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody ${ClassName} ${className}) { + ServerResult genServerResult = ${className}Service.insert${ClassName}(${className}); + if (genServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(genServerResult.getMsg()); + } + } + + /** + * 修改${functionName} + */ + @ApiOperation("修改${functionName}") + @ApiImplicitParam(name = "${className}" , value = "修改${functionName}信息" , dataType = "${ClassName}") + @PreAuthorize("@ebts.hasPermi('${permissionPrefix}:edit')") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@Validated @RequestBody ${ClassName} ${className}) { + ServerResult genServerResult = ${className}Service.update${ClassName}(${className}); + if (genServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(genServerResult.getMsg()); + } + } + + /** + * 删除${functionName} + */ + @ApiOperation("删除${functionName}") + @ApiImplicitParam(name = "${pkColumn.javaField}s" , value = "${functionName}${pkColumn.javaField}s" , required = true, dataType = "${pkColumn.javaType}" , paramType = "path") + @PreAuthorize("@ebts.hasPermi('${permissionPrefix}:remove')") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @DeleteMapping("/{${pkColumn.javaField}s}") + public AjaxResult remove(@PathVariable ${pkColumn.javaType}[] ${pkColumn.javaField}s) { + if (${pkColumn.javaField}s.length<0){ + return AjaxResult.error("id不能为空!"); + } + ServerResult genServerResult = ${className}Service.delete${ClassName}ByIds(${pkColumn.javaField}s); + if (genServerResult.isStart()) { + return AjaxResult.success(); + } else { + return AjaxResult.error(genServerResult.getMsg()); + } + } +} diff --git a/ebts/ebts-generator/src/main/resources/vm/java/dao.java.vm b/ebts/ebts-generator/src/main/resources/vm/java/dao.java.vm new file mode 100644 index 0000000..c305e53 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/java/dao.java.vm @@ -0,0 +1,90 @@ +package ${packageName}.dao; + +import java.util.List; +import ${packageName}.entity.${ClassName}; +#if($table.sub) +import ${packageName}.entity.${subClassName}; +#end + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Dao { + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return ${functionName} + */ + ${ClassName} select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + int update${ClassName}(${ClassName} ${className}); + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + int delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据ID + * @return 结果 + */ + int delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据ID + * @return 结果 + */ + int delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 批量新增${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}列表 + * @return 结果 + */ + int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 通过${functionName}ID删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/ebts/ebts-generator/src/main/resources/vm/java/entity.java.vm b/ebts/ebts-generator/src/main/resources/vm/java/entity.java.vm new file mode 100644 index 0000000..f91e14f --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/java/entity.java.vm @@ -0,0 +1,162 @@ +package ${packageName}.entity; + +#foreach ($import in $importList) +import ${import}; +#end +#if($table.crud || $table.sub || $tplCategory.equals("rel")) + #set($Entity="BaseEntity") +#elseif($table.tree) + #set($Entity="TreeEntity") +#end +#if($table.tplCategory.equals("rel")) +import com.ebts.common.annotation.Excels; +#elseif($table.tplCategory.equals("sub")) +import ${packageName}.entity.${subClassName}; +#end +import com.ebts.common.core.entity.${Entity}; +import com.ebts.common.annotation.Excel; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end +@ApiModel("${functionName}") +public class ${ClassName} extends ${Entity}{ +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end +#if($column.isRequired == 1) + @NotNull(message = "${column.columnComment}不能为空!") +#end +#if($column.isRegular != 1) + @Pattern(regexp = "${column.regular}",message = "${column.columnComment}格式错误!") +#end + @ApiModelProperty("${column.columnComment}") + private $column.javaType $column.javaField; +#end +#end + +#if($table.sub) + /** $table.subTable.functionName信息 */ + @ApiModelProperty("${table.subTable.functionName}信息") + private List<${subClassName}> ${subclassName}List; + +#elseif($tplCategory.equals("rel")) +#foreach($table in $relTables) +#foreach($column in $table.relColumns) +#if($column.isList.equals("1")) +#set($count = $count + 1) +#end +#end + #set($targetName = "") + #set($indexs = 0) +#foreach($column in $table.relColumns) +#if($column.isList.equals("1")) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#set($indexs = $indexs + 1) +#set($targetName = $targetName + '@Excel(name = "'+$comment+'",targetAttr = "'+$column.javaField+'")') +#if($indexs != $count) +#set($targetName = $targetName + ",") +#end +#end +#end + + /** ${table.relComment}信息 */ + @Excels({${targetName}}) + private ${table.relClass} ${table.relclass}; +#end + +#end + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField){ + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}(){ + return $column.javaField; + } +#end +#end + +#if($table.sub) + public List<${subClassName}> get${subClassName}List(){ + return ${subclassName}List; + } + + public void set${subClassName}List(List<${subClassName}> ${subclassName}List){ + this.${subclassName}List = ${subclassName}List; + } +#elseif($table.tplCategory.equals("rel")) +#foreach($table in $relTables) + public ${table.relClass} get${table.relClass}(){ + return ${table.relclass}; + } + + public void set${table.relClass}(${table.relClass} ${table.relclass}){ + this.${table.relclass} = ${table.relclass}; + } +#end +#end + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end +#if($table.sub) + .append("${subclassName}List", get${subClassName}List()) +#elseif($tplCategory.equals("rel")) +#foreach($table in $relTables) + .append("${table.relclass}",get${table.relClass}()) +#end +#end + .toString(); + } +} diff --git a/ebts/ebts-generator/src/main/resources/vm/java/rel-entity.java.vm b/ebts/ebts-generator/src/main/resources/vm/java/rel-entity.java.vm new file mode 100644 index 0000000..981590f --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/java/rel-entity.java.vm @@ -0,0 +1,52 @@ +package ${packageName}.entity; + +import com.ebts.common.annotation.Excel; +import com.ebts.common.core.entity.BaseEntity; + +/** + * + * @author ${author} + * @date ${datetime} + */ + +public class ${relTable.relClass} extends BaseEntity{ + +#foreach($column in $relTable.relColumns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) + #set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else + #set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end + private $column.javaType $column.javaField; + +#end +#end + +#foreach ($column in $relTable.relColumns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField){ + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}(){ + return $column.javaField; + } +#end +#end +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/vm/java/service.java.vm b/ebts/ebts-generator/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..9707899 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,63 @@ +package ${packageName}.service; + +import java.util.List; + +import com.ebts.common.utils.ServerResult; +import ${packageName}.entity.${ClassName}; + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Service +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return ${functionName} + */ + ServerResult<${ClassName}> select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + ServerResult> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + ServerResult insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + ServerResult update${ClassName}(${ClassName} ${className}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}ID + * @return 结果 + */ + ServerResult delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + ServerResult delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}); +} diff --git a/ebts/ebts-generator/src/main/resources/vm/java/serviceImpl.java.vm b/ebts/ebts-generator/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..368f921 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,234 @@ +package ${packageName}.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.ebts.common.utils.DateUtils; +#end +#if($column.javaField == 'updateBy' || $column.javaField == 'createBy') +import com.ebts.common.utils.SecurityUtils; +#end +#end +import com.ebts.common.utils.ServerResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +#if($table.sub) +import java.util.ArrayList; +import com.ebts.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.entity.${subClassName}; +#end +import ${packageName}.dao.${ClassName}Dao; +import ${packageName}.entity.${ClassName}; +import ${packageName}.service.${ClassName}Service; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements ${ClassName}Service { + private Logger logger = LoggerFactory.getLogger(${ClassName}ServiceImpl.class); + + @Autowired + private ${ClassName}Dao ${className}Dao; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return ${functionName} + */ + @Override + public ServerResult<${ClassName}> select${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}) { + try { + ${ClassName} ${className} = ${className}Dao.select${ClassName}ById(${pkColumn.javaField}); + if (${className} != null){ + return new ServerResult<>(true,${className}); + }else { + return new ServerResult<>(false, ReturnConstants.RESULT_EMPTY); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public ServerResult> select${ClassName}List(${ClassName} ${className}) { + try { + List<${ClassName}> ${className}List = ${className}Dao.select${ClassName}List(${className}); + if (${className}List.size()>0){ + return new ServerResult<>(true,${className}List); + }else { + return new ServerResult<>(false,ReturnConstants.RESULT_EMPTY); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public ServerResult insert${ClassName}(${ClassName} ${className}) { + try { +#foreach ($column in $columns) +#if($column.javaField == 'createBy') + ${className}.setCreateBy(SecurityUtils.getUserId()); +#end +#end +#if($table.sub) + int renewal = ${className}Dao.insert${ClassName}(${className}); + if (insert${subClassName}(${className})){ + return new ServerResult<>(false,ReturnConstants.DB_EX); + } +#else + Integer renewal = ${className}Dao.insert${ClassName}(${className}); +#end + if (renewal >0){ + return new ServerResult<>(true,renewal); + }else { + return new ServerResult<>(false,ReturnConstants.SYS_FAILL); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public ServerResult update${ClassName}(${ClassName} ${className}) { + try { +#foreach ($column in $columns) +#if($column.javaField == 'updateBy') + ${className}.setUpdateBy(SecurityUtils.getUserId()); +#end +#end +#if($table.sub) + ${className}Dao.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); + if (insert${subClassName}(${className})){ + return new ServerResult<>(false,ReturnConstants.DB_EX); + } +#end + Integer renewal = ${className}Dao.update${ClassName}(${className}); + if (renewal >0){ + return new ServerResult<>(true,renewal); + }else { + return new ServerResult<>(false,ReturnConstants.SYS_FAILL); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}ID + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public ServerResult delete${ClassName}ByIds(${pkColumn.javaType}[] ${pkColumn.javaField}s) { + try { +#if($table.sub) + //批量删除子表数据 + ${className}Dao.delete${subClassName}By${subTableFkClassName}s(${pkColumn.javaField}s); +#end + Integer renewal = ${className}Dao.delete${ClassName}ByIds(${pkColumn.javaField}s); + if (renewal >0){ + return new ServerResult<>(true,renewal); + }else { + return new ServerResult<>(false,ReturnConstants.SYS_FAILL); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + @Override + public ServerResult delete${ClassName}ById(${pkColumn.javaType} ${pkColumn.javaField}) { + try { +#if($table.sub) + //删除子表数据 + ${className}Dao.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + Integer renewal = ${className}Dao.delete${ClassName}ById(${pkColumn.javaField}); + if (renewal >0){ + return new ServerResult<>(true,renewal); + }else { + return new ServerResult<>(false,ReturnConstants.SYS_FAILL); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +#if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public boolean insert${subClassName}(${ClassName} ${className}) { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + Long ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} : ${subclassName}List){ + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) { + Integer renewal = ${className}Dao.batch${subClassName}(list); + if (renewal>0){ + return false; + } + } + } + return true; + } +#end +} diff --git a/ebts/ebts-generator/src/main/resources/vm/java/sub-entity.java.vm b/ebts/ebts-generator/src/main/resources/vm/java/sub-entity.java.vm new file mode 100644 index 0000000..160a2e6 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/java/sub-entity.java.vm @@ -0,0 +1,70 @@ +package ${packageName}.entity; + +#foreach ($import in $subImportList) +import ${import}; +#end +import com.ebts.common.annotation.Excel; +import com.ebts.common.core.entity.BaseEntity; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity{ + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField){ + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}(){ + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/ebts/ebts-generator/src/main/resources/vm/js/api.js.vm b/ebts/ebts-generator/src/main/resources/vm/js/api.js.vm new file mode 100644 index 0000000..366a327 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/js/api.js.vm @@ -0,0 +1,54 @@ +import request from '@/utils/request' + + +// 查询${functionName}列表 +export function list${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'post', + data: data + }) +} + +// 导出${functionName} +export function export${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}/export', + method: 'post', + data: data + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/vm/sql/class.sql.vm b/ebts/ebts-generator/src/main/resources/vm/sql/class.sql.vm new file mode 100644 index 0000000..52471a8 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/sql/class.sql.vm @@ -0,0 +1,18 @@ +-- ${functionName}Controller + +delete from sys_menu where perms= '${prefix}'; + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', 5, '1', '#','' ,1, 0, 'F', '0', '0', '${prefix}','#', ${createBy}, sysdate(), 0, null, '${functionName}接口管理'); + +SELECT @parentId := LAST_INSERT_ID(); +#foreach($column in $columns) +#if($column.isGenerate.equals("1")) + +delete from sys_menu where perms= '${prefix}:${column.requrl}'; + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${column.itDescribe}', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${prefix}:${column.requrl}', '#', ${createBy}, sysdate(), 0, null, ''); +#end +#end + diff --git a/ebts/ebts-generator/src/main/resources/vm/sql/table.sql.vm b/ebts/ebts-generator/src/main/resources/vm/sql/table.sql.vm new file mode 100644 index 0000000..8d4ed9a --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/sql/table.sql.vm @@ -0,0 +1,35 @@ +-- 菜单 SQL + +delete from sys_menu where perms= '${permissionPrefix}:list'; + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', ${createBy}, sysdate(), 0, null, '${functionName}菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +delete from sys_menu where perms= '${permissionPrefix}:query'; + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', ${createBy}, sysdate(), 0, null, ''); + +delete from sys_menu where perms = '${permissionPrefix}:add'; + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', ${createBy}, sysdate(), 0, null, ''); + +delete from sys_menu where perms = '${permissionPrefix}:edit'; + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', ${createBy}, sysdate(), 0, null, ''); + +delete from sys_menu where perms = '${permissionPrefix}:remove'; + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', ${createBy}, sysdate(), 0, null, ''); + +delete from sys_menu where perms = '${permissionPrefix}:export'; + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export', '#', ${createBy}, sysdate(), 0, null, ''); \ No newline at end of file diff --git a/ebts/ebts-generator/src/main/resources/vm/vue/index-tree.vue.vm b/ebts/ebts-generator/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..3d96336 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,526 @@ + + + diff --git a/ebts/ebts-generator/src/main/resources/vm/vue/index.vue.vm b/ebts/ebts-generator/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..16c32ca --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,808 @@ + + + diff --git a/ebts/ebts-generator/src/main/resources/vm/xml/mapper.xml.vm b/ebts/ebts-generator/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..e3f4126 --- /dev/null +++ b/ebts/ebts-generator/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,247 @@ + + + + + +#foreach ($column in $columns) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end +#if($table.tplCategory.equals("rel")) + +#foreach($table in $relTables) + +#end + +#foreach($table in $relTables) + +#foreach($column in $table.relColumns) + +#end + +#end + +#end + + select#foreach($column in $columns) $column.columnName#if($velocityCount != $columns.size()),#end#end from ${tableName} + + + +#if($tplCategory.equals("rel")) + + + +#foreach($column in $columns) +#set($queryType=$column.queryType) +#set($javaField=$column.javaField) +#set($javaType=$column.javaType) +#set($columnName=$column.columnName) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#if($column.isQuery.equals("1")) +#if($column.queryType == "EQ") + and $columnName = #{$javaField} +#elseif($queryType == "NE") + and $columnName != #{$javaField} +#elseif($queryType == "GT") + and $columnName > #{$javaField} +#elseif($queryType == "GTE") + and $columnName >= #{$javaField} +#elseif($queryType == "LT") + and $columnName < #{$javaField} +#elseif($queryType == "LTE") + and $columnName <= #{$javaField} +#elseif($queryType == "LIKE") + and $columnName like concat('%', #{$javaField}, '%') +#elseif($queryType == "BETWEEN") + and $columnName between #{params.begin$AttrName} and #{params.end$AttrName} +#end +#end +#end +#end + + + + +#if($tplCategory.equals("rel")) + +#end + + + insert into ${tableName} + +#foreach($column in $columns) +#if(($column.columnName != $pkColumn.columnName || !$pkColumn.increment) && $column.isInsert == 1) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if(($column.columnName != $pkColumn.columnName || !$pkColumn.increment) && $column.isInsert == 1) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName && $column.isInsert == 1) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#set($index = 0)#foreach($column in $subTable.columns)#if($column.isPk.equals("1"))#set($insex = 1)#else$column.columnName#if($velocityCount != ($subTable.columns.size()-$index)),#end#end#end) values + + (#foreach($column in $subTable.columns)#if($column.isPk.equals("1"))#set($index = 1)#else#{item.$column.javaField}#if($velocityCount != $subTable.columns.size()),#end#end#end) + + +#end + \ No newline at end of file diff --git a/ebts/ebts-quartz/pom.xml b/ebts/ebts-quartz/pom.xml new file mode 100644 index 0000000..4c576bb --- /dev/null +++ b/ebts/ebts-quartz/pom.xml @@ -0,0 +1,40 @@ + + + + ebts + com.ebts + 1.0.0 + + 4.0.0 + + ebts-quartz + + + quartz定时任务 + + + + + + + org.quartz-scheduler + quartz + + + com.mchange + c3p0 + + + + + + + com.ebts + ebts-common + + + + + \ No newline at end of file diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/config/ScheduleConfig.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/config/ScheduleConfig.java new file mode 100644 index 0000000..c3f36d0 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/config/ScheduleConfig.java @@ -0,0 +1,57 @@ +package com.ebts.quartz.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +import javax.sql.DataSource; +import java.util.Properties; + +/** + * 定时任务配置 + * + * @author binlin + */ +@Configuration +public class ScheduleConfig { + @Bean + public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) { + SchedulerFactoryBean factory = new SchedulerFactoryBean(); + factory.setDataSource(dataSource); + + // quartz参数 + Properties prop = new Properties(); +// todo + prop.put("org.quartz.scheduler.instanceName", "Scheduler"); + prop.put("org.quartz.scheduler.instanceId", "AUTO"); + // 线程池配置 + prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool"); + prop.put("org.quartz.threadPool.threadCount", "20"); + prop.put("org.quartz.threadPool.threadPriority", "5"); + // JobStore配置 + prop.put("org.quartz.jobStore.class", "org.quartz.impl.jdbcjobstore.JobStoreTX"); + // 集群配置 + prop.put("org.quartz.jobStore.isClustered", "true"); + prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000"); + prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1"); + prop.put("org.quartz.jobStore.txIsolationLevelSerializable", "true"); + + // sqlserver 启用 + // prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?"); + prop.put("org.quartz.jobStore.misfireThreshold", "12000"); + prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_"); + factory.setQuartzProperties(prop); + + factory.setSchedulerName("Scheduler"); + // 延时启动 + factory.setStartupDelay(1); + factory.setApplicationContextSchedulerContextKey("applicationContextKey"); + // 可选,QuartzScheduler + // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 + factory.setOverwriteExistingJobs(true); + // 设置自动启动,默认为true + factory.setAutoStartup(true); + + return factory; + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/controller/JobController.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/controller/JobController.java new file mode 100644 index 0000000..2012baa --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/controller/JobController.java @@ -0,0 +1,133 @@ +package com.ebts.quartz.controller; + +import java.io.Serializable; +import java.util.List; + +import org.quartz.SchedulerException; +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.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.exception.job.TaskException; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.quartz.entity.Job; +import com.ebts.quartz.service.JobService; +import com.ebts.quartz.util.CronUtils; + +/** + * 调度任务信息操作处理 + * + * @author binlin + */ +@RestController +@RequestMapping("/monitor/job") +public class JobController extends BaseController { + + @Autowired + private JobService jobService; + + /** + * 查询定时任务列表 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:list')") + @GetMapping("/list") + public Serializable list(Job job) { + startPage(); + List list = jobService.selectJobList(job); + return getDataTable(list); + } + + /** + * 导出定时任务列表 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:export')") + @Log(title = "定时任务", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public AjaxResult export(Job job) { + List list = jobService.selectJobList(job); + ExcelUtil util = new ExcelUtil(Job.class); + return util.exportExcel(list, "定时任务"); + } + + /** + * 获取定时任务详细信息 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:query')") + @GetMapping(value = "/{jobId}") + public AjaxResult getInfo(@PathVariable("jobId") Long jobId) { + return AjaxResult.success(jobService.selectJobById(jobId)); + } + + /** + * 新增定时任务 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:add')") + @Log(title = "定时任务", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody Job job) throws SchedulerException, TaskException { + if (!CronUtils.isValid(job.getCronExpression())) { + return AjaxResult.error("cron表达式不正确"); + } + job.setCreateBy(SecurityUtils.getUserId()); + return toAjax(jobService.insertJob(job)); + } + + /** + * 修改定时任务 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:edit')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody Job job) throws SchedulerException, TaskException { + if (!CronUtils.isValid(job.getCronExpression())) { + return AjaxResult.error("cron表达式不正确"); + } + job.setUpdateBy(SecurityUtils.getUserId()); + return toAjax(jobService.updateJob(job)); + } + + /** + * 定时任务状态修改 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody Job job) throws SchedulerException { + Job newJob = jobService.selectJobById(job.getJobId()); + newJob.setStatus(job.getStatus()); + return toAjax(jobService.changeStatus(newJob)); + } + + /** + * 定时任务立即执行一次 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:changeStatus')") + @Log(title = "定时任务", businessType = BusinessType.UPDATE) + @PutMapping("/run") + public AjaxResult run(@RequestBody Job job) throws SchedulerException { + jobService.run(job); + return AjaxResult.success(); + } + + /** + * 删除定时任务 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:remove')") + @Log(title = "定时任务", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobIds}") + public AjaxResult remove(@PathVariable Long[] jobIds) throws SchedulerException, TaskException { + jobService.deleteJobByIds(jobIds); + return AjaxResult.success(); + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/controller/JobLogController.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/controller/JobLogController.java new file mode 100644 index 0000000..a25b7f5 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/controller/JobLogController.java @@ -0,0 +1,85 @@ +package com.ebts.quartz.controller; + +import java.io.Serializable; +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.ebts.common.annotation.Log; +import com.ebts.common.core.controller.BaseController; +import com.ebts.common.core.entity.AjaxResult; +import com.ebts.common.enums.BusinessType; +import com.ebts.common.utils.poi.ExcelUtil; +import com.ebts.quartz.entity.JobLog; +import com.ebts.quartz.service.JobLogService; + +/** + * 调度日志操作处理 + * + * @author binlin + */ +@RestController +@RequestMapping("/monitor/jobLog") +public class JobLogController extends BaseController { + @Autowired + private JobLogService jobLogService; + + /** + * 查询定时任务调度日志列表 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:list')") + @GetMapping("/list") + public Serializable list(JobLog jobLog) { + startPage(); + List list = jobLogService.selectJobLogList(jobLog); + return getDataTable(list); + } + + /** + * 导出定时任务调度日志列表 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:export')") + @Log(title = "任务调度日志", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public AjaxResult export(JobLog jobLog) { + List list = jobLogService.selectJobLogList(jobLog); + ExcelUtil util = new ExcelUtil(JobLog.class); + return util.exportExcel(list, "调度日志"); + } + + /** + * 根据调度编号获取详细信息 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:query')") + @GetMapping(value = "/{configId}") + public AjaxResult getInfo(@PathVariable Long jobLogId) { + return AjaxResult.success(jobLogService.selectJobLogById(jobLogId)); + } + + + /** + * 删除定时任务调度日志 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:remove')") + @Log(title = "定时任务调度日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{jobLogIds}") + public AjaxResult remove(@PathVariable Long[] jobLogIds) { + return toAjax(jobLogService.deleteJobLogByIds(jobLogIds)); + } + + /** + * 清空定时任务调度日志 + */ + @PreAuthorize("@ebts.hasPermi('monitor:job:remove')") + @Log(title = "调度日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() { + jobLogService.cleanJobLog(); + return AjaxResult.success(); + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/dao/JobDao.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/dao/JobDao.java new file mode 100644 index 0000000..7c6d42a --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/dao/JobDao.java @@ -0,0 +1,67 @@ +package com.ebts.quartz.dao; + +import java.util.List; + +import com.ebts.quartz.entity.Job; + +/** + * 调度任务信息 数据层 + * + * @author binlin + */ +public interface JobDao { + /** + * 查询调度任务日志集合 + * + * @param job 调度信息 + * @return 操作日志集合 + */ + public List selectJobList(Job job); + + /** + * 查询所有调度任务 + * + * @return 调度任务列表 + */ + public List selectJobAll(); + + /** + * 通过调度ID查询调度任务信息 + * + * @param jobId 调度ID + * @return 角色对象信息 + */ + public Job selectJobById(Long jobId); + + /** + * 通过调度ID删除调度任务信息 + * + * @param jobId 调度ID + * @return 结果 + */ + public int deleteJobById(Long jobId); + + /** + * 批量删除调度任务信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteJobByIds(Long[] ids); + + /** + * 修改调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int updateJob(Job job); + + /** + * 新增调度任务信息 + * + * @param job 调度任务信息 + * @return 结果 + */ + public int insertJob(Job job); +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/dao/JobLogDao.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/dao/JobLogDao.java new file mode 100644 index 0000000..97c7e8e --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/dao/JobLogDao.java @@ -0,0 +1,64 @@ +package com.ebts.quartz.dao; + +import java.util.List; + +import com.ebts.quartz.entity.JobLog; + +/** + * 调度任务日志信息 数据层 + * + * @author binlin + */ +public interface JobLogDao { + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(JobLog jobLog); + + /** + * 查询所有调度任务日志 + * + * @return 调度任务日志列表 + */ + public List selectJobLogAll(); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public JobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + * @return 结果 + */ + public int insertJobLog(JobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的数据ID + * @return 结果 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/entity/Job.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/entity/Job.java new file mode 100644 index 0000000..b66f549 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/entity/Job.java @@ -0,0 +1,170 @@ +package com.ebts.quartz.entity; + +import java.io.Serializable; +import java.util.Date; +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.JsonFormat; +import com.ebts.common.annotation.Excel; +import com.ebts.common.annotation.Excel.ColumnType; +import com.ebts.common.constant.ScheduleConstants; +import com.ebts.common.core.entity.BaseEntity; +import com.ebts.common.utils.StringUtils; +import com.ebts.quartz.util.CronUtils; + +/** + * 定时任务调度表 sys_job + * + * @author binlin + */ +public class Job extends BaseEntity implements Serializable { + + + /** + * 任务ID + */ + @Excel(name = "任务序号", cellType = ColumnType.NUMERIC) + private Long jobId; + + /** + * 任务名称 + */ + @Excel(name = "任务名称") + private String jobName; + + /** + * 任务组名 + */ + @Excel(name = "任务组名") + private String jobGroup; + + /** + * 调用目标字符串 + */ + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** + * cron执行表达式 + */ + @Excel(name = "执行表达式 ") + private String cronExpression; + + /** + * cron计划策略 + */ + @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行") + private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; + + /** + * 是否并发执行(0允许 1禁止) + */ + @Excel(name = "并发执行", readConverterExp = "0=允许,1=禁止") + private String concurrent; + + /** + * 任务状态(0正常 1暂停) + */ + @Excel(name = "任务状态", readConverterExp = "0=正常,1=暂停") + private String status; + + public Long getJobId() { + return jobId; + } + + public void setJobId(Long jobId) { + this.jobId = jobId; + } + + @NotBlank(message = "任务名称不能为空") + @Size(min = 0, max = 64, message = "任务名称不能超过64个字符") + public String getJobName() { + return jobName; + } + + public void setJobName(String jobName) { + this.jobName = jobName; + } + + public String getJobGroup() { + return jobGroup; + } + + public void setJobGroup(String jobGroup) { + this.jobGroup = jobGroup; + } + + @NotBlank(message = "调用目标字符串不能为空") + @Size(min = 0, max = 500, message = "调用目标字符串长度不能超过500个字符") + public String getInvokeTarget() { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) { + this.invokeTarget = invokeTarget; + } + + @NotBlank(message = "Cron执行表达式不能为空") + @Size(min = 0, max = 255, message = "Cron执行表达式不能超过255个字符") + public String getCronExpression() { + return cronExpression; + } + + public void setCronExpression(String cronExpression) { + this.cronExpression = cronExpression; + } + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + public Date getNextValidTime() { + if (StringUtils.isNotEmpty(cronExpression)) { + return CronUtils.getNextExecution(cronExpression); + } + return null; + } + + public String getMisfirePolicy() { + return misfirePolicy; + } + + public void setMisfirePolicy(String misfirePolicy) { + this.misfirePolicy = misfirePolicy; + } + + public String getConcurrent() { + return concurrent; + } + + public void setConcurrent(String concurrent) { + this.concurrent = concurrent; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("jobId", getJobId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("cronExpression", getCronExpression()) + .append("nextValidTime", getNextValidTime()) + .append("misfirePolicy", getMisfirePolicy()) + .append("concurrent", getConcurrent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/entity/JobLog.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/entity/JobLog.java new file mode 100644 index 0000000..9ae4e15 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/entity/JobLog.java @@ -0,0 +1,155 @@ +package com.ebts.quartz.entity; + +import java.util.Date; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ebts.common.annotation.Excel; +import com.ebts.common.core.entity.BaseEntity; + +/** + * 定时任务调度日志表 sys_job_log + * + * @author binlin + */ +public class JobLog extends BaseEntity { + + + /** + * ID + */ + @Excel(name = "日志序号") + private Long jobLogId; + + /** + * 任务名称 + */ + @Excel(name = "任务名称") + private String jobName; + + /** + * 任务组名 + */ + @Excel(name = "任务组名") + private String jobGroup; + + /** + * 调用目标字符串 + */ + @Excel(name = "调用目标字符串") + private String invokeTarget; + + /** + * 日志信息 + */ + @Excel(name = "日志信息") + private String jobMessage; + + /** + * 执行状态(0正常 1失败) + */ + @Excel(name = "执行状态", readConverterExp = "0=正常,1=失败") + private String status; + + /** + * 异常信息 + */ + @Excel(name = "异常信息") + private String exceptionInfo; + + /** + * 开始时间 + */ + private Date startTime; + + /** + * 停止时间 + */ + private Date stopTime; + + public Long getJobLogId() { + return jobLogId; + } + + public void setJobLogId(Long jobLogId) { + this.jobLogId = jobLogId; + } + + public String getJobName() { + return jobName; + } + + public void setJobName(String jobName) { + this.jobName = jobName; + } + + public String getJobGroup() { + return jobGroup; + } + + public void setJobGroup(String jobGroup) { + this.jobGroup = jobGroup; + } + + public String getInvokeTarget() { + return invokeTarget; + } + + public void setInvokeTarget(String invokeTarget) { + this.invokeTarget = invokeTarget; + } + + public String getJobMessage() { + return jobMessage; + } + + public void setJobMessage(String jobMessage) { + this.jobMessage = jobMessage; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getExceptionInfo() { + return exceptionInfo; + } + + public void setExceptionInfo(String exceptionInfo) { + this.exceptionInfo = exceptionInfo; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getStopTime() { + return stopTime; + } + + public void setStopTime(Date stopTime) { + this.stopTime = stopTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("jobLogId", getJobLogId()) + .append("jobName", getJobName()) + .append("jobGroup", getJobGroup()) + .append("jobMessage", getJobMessage()) + .append("status", getStatus()) + .append("exceptionInfo", getExceptionInfo()) + .append("startTime", getStartTime()) + .append("stopTime", getStopTime()) + .toString(); + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/JobLogService.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/JobLogService.java new file mode 100644 index 0000000..62ec39f --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/JobLogService.java @@ -0,0 +1,56 @@ +package com.ebts.quartz.service; + +import java.util.List; + +import com.ebts.quartz.entity.JobLog; + +/** + * 定时任务调度日志信息信息 服务层 + * + * @author binlin + */ +public interface JobLogService { + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + public List selectJobLogList(JobLog jobLog); + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + public JobLog selectJobLogById(Long jobLogId); + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + public void addJobLog(JobLog jobLog); + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的日志ID + * @return 结果 + */ + public int deleteJobLogByIds(Long[] logIds); + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + * @return 结果 + */ + public int deleteJobLogById(Long jobId); + + /** + * 清空任务日志 + */ + public void cleanJobLog(); +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/JobService.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/JobService.java new file mode 100644 index 0000000..f4679d5 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/JobService.java @@ -0,0 +1,102 @@ +package com.ebts.quartz.service; + +import java.util.List; + +import org.quartz.SchedulerException; +import com.ebts.common.exception.job.TaskException; +import com.ebts.quartz.entity.Job; + +/** + * 定时任务调度信息信息 服务层 + * + * @author binlin + */ +public interface JobService { + /** + * 获取quartz调度器的计划任务 + * + * @param job 调度信息 + * @return 调度任务集合 + */ + public List selectJobList(Job job); + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + public Job selectJobById(Long jobId); + + /** + * 暂停任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int pauseJob(Job job) throws SchedulerException; + + /** + * 恢复任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int resumeJob(Job job) throws SchedulerException; + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + * @return 结果 + */ + public int deleteJob(Job job) throws SchedulerException; + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + public void deleteJobByIds(Long[] jobIds) throws SchedulerException; + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + * @return 结果 + */ + public int changeStatus(Job job) throws SchedulerException; + + /** + * 立即运行任务 + * + * @param job 调度信息 + * @return 结果 + */ + public void run(Job job) throws SchedulerException; + + /** + * 新增任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int insertJob(Job job) throws SchedulerException, TaskException; + + /** + * 更新任务 + * + * @param job 调度信息 + * @return 结果 + */ + public int updateJob(Job job) throws SchedulerException, TaskException; + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + public boolean checkCronExpressionIsValid(String cronExpression); +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/impl/JobLogServiceImpl.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/impl/JobLogServiceImpl.java new file mode 100644 index 0000000..ac78eeb --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/impl/JobLogServiceImpl.java @@ -0,0 +1,81 @@ +package com.ebts.quartz.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.quartz.entity.JobLog; +import com.ebts.quartz.dao.JobLogDao; +import com.ebts.quartz.service.JobLogService; + +/** + * 定时任务调度日志信息 服务层 + * + * @author binlin + */ +@Service +public class JobLogServiceImpl implements JobLogService { + @Autowired + private JobLogDao jobLogMapper; + + /** + * 获取quartz调度器日志的计划任务 + * + * @param jobLog 调度日志信息 + * @return 调度任务日志集合 + */ + @Override + public List selectJobLogList(JobLog jobLog) { + return jobLogMapper.selectJobLogList(jobLog); + } + + /** + * 通过调度任务日志ID查询调度信息 + * + * @param jobLogId 调度任务日志ID + * @return 调度任务日志对象信息 + */ + @Override + public JobLog selectJobLogById(Long jobLogId) { + return jobLogMapper.selectJobLogById(jobLogId); + } + + /** + * 新增任务日志 + * + * @param jobLog 调度日志信息 + */ + @Override + public void addJobLog(JobLog jobLog) { + jobLogMapper.insertJobLog(jobLog); + } + + /** + * 批量删除调度日志信息 + * + * @param logIds 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteJobLogByIds(Long[] logIds) { + return jobLogMapper.deleteJobLogByIds(logIds); + } + + /** + * 删除任务日志 + * + * @param jobId 调度日志ID + */ + @Override + public int deleteJobLogById(Long jobId) { + return jobLogMapper.deleteJobLogById(jobId); + } + + /** + * 清空任务日志 + */ + @Override + public void cleanJobLog() { + jobLogMapper.cleanJobLog(); + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/impl/JobServiceImpl.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/impl/JobServiceImpl.java new file mode 100644 index 0000000..cdcaca4 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/service/impl/JobServiceImpl.java @@ -0,0 +1,230 @@ +package com.ebts.quartz.service.impl; + +import java.util.List; +import javax.annotation.PostConstruct; + +import org.quartz.JobDataMap; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.ebts.common.constant.ScheduleConstants; +import com.ebts.common.exception.job.TaskException; +import com.ebts.quartz.entity.Job; +import com.ebts.quartz.dao.JobDao; +import com.ebts.quartz.service.JobService; +import com.ebts.quartz.util.CronUtils; +import com.ebts.quartz.util.ScheduleUtils; + +/** + * 定时任务调度信息 服务层 + * + * @author binlin + */ +@Service +public class JobServiceImpl implements JobService { + @Autowired + private Scheduler scheduler; + + @Autowired + private JobDao jobMapper; + + /** + * 项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据) + */ + @PostConstruct + public void init() throws SchedulerException, TaskException { + scheduler.clear(); + List jobList = jobMapper.selectJobAll(); + for (Job job : jobList) { + ScheduleUtils.createScheduleJob(scheduler, job); + } + } + + /** + * 获取quartz调度器的计划任务列表 + * + * @param job 调度信息 + * @return + */ + @Override + public List selectJobList(Job job) { + return jobMapper.selectJobList(job); + } + + /** + * 通过调度任务ID查询调度信息 + * + * @param jobId 调度任务ID + * @return 调度任务对象信息 + */ + @Override + public Job selectJobById(Long jobId) { + return jobMapper.selectJobById(jobId); + } + + /** + * 暂停任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int pauseJob(Job job) throws SchedulerException { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 恢复任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int resumeJob(Job job) throws SchedulerException { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); + int rows = jobMapper.updateJob(job); + if (rows > 0) { + scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 删除任务后,所对应的trigger也将被删除 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteJob(Job job) throws SchedulerException { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + int rows = jobMapper.deleteJobById(jobId); + if (rows > 0) { + scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + return rows; + } + + /** + * 批量删除调度信息 + * + * @param jobIds 需要删除的任务ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteJobByIds(Long[] jobIds) throws SchedulerException { + for (Long jobId : jobIds) { + Job job = jobMapper.selectJobById(jobId); + deleteJob(job); + } + } + + /** + * 任务调度状态修改 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int changeStatus(Job job) throws SchedulerException { + int rows = 0; + String status = job.getStatus(); + if (ScheduleConstants.Status.NORMAL.getValue().equals(status)) { + rows = resumeJob(job); + } else if (ScheduleConstants.Status.PAUSE.getValue().equals(status)) { + rows = pauseJob(job); + } + return rows; + } + + /** + * 立即运行任务 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void run(Job job) throws SchedulerException { + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + Job properties = selectJobById(job.getJobId()); + // 参数 + JobDataMap dataMap = new JobDataMap(); + dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties); + scheduler.triggerJob(ScheduleUtils.getJobKey(jobId, jobGroup), dataMap); + } + + /** + * 新增任务 + * + * @param job 调度信息 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertJob(Job job) throws SchedulerException, TaskException { + job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); + int rows = jobMapper.insertJob(job); + if (rows > 0) { + ScheduleUtils.createScheduleJob(scheduler, job); + } + return rows; + } + + /** + * 更新任务的时间表达式 + * + * @param job 调度信息 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateJob(Job job) throws SchedulerException, TaskException { + Job properties = selectJobById(job.getJobId()); + int rows = jobMapper.updateJob(job); + if (rows > 0) { + updateSchedulerJob(job, properties.getJobGroup()); + } + return rows; + } + + /** + * 更新任务 + * + * @param job 任务对象 + * @param jobGroup 任务组名 + */ + public void updateSchedulerJob(Job job, String jobGroup) throws SchedulerException, TaskException { + Long jobId = job.getJobId(); + // 判断是否存在 + JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup); + if (scheduler.checkExists(jobKey)) { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(jobKey); + } + ScheduleUtils.createScheduleJob(scheduler, job); + } + + /** + * 校验cron表达式是否有效 + * + * @param cronExpression 表达式 + * @return 结果 + */ + @Override + public boolean checkCronExpressionIsValid(String cronExpression) { + return CronUtils.isValid(cronExpression); + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/task/RyTask.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/task/RyTask.java new file mode 100644 index 0000000..97b012e --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/task/RyTask.java @@ -0,0 +1,24 @@ +package com.ebts.quartz.task; + +import org.springframework.stereotype.Component; +import com.ebts.common.utils.StringUtils; + +/** + * 定时任务调度测试 + * + * @author binlin + */ +@Component("ryTask") +public class RyTask { + public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i) { + System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i)); + } + + public void ryParams(String params) { + System.out.println("执行有参方法:" + params); + } + + public void ryNoParams() { + System.out.println("执行无参方法"); + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/AbstractQuartzJob.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/AbstractQuartzJob.java new file mode 100644 index 0000000..9352761 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/AbstractQuartzJob.java @@ -0,0 +1,96 @@ +package com.ebts.quartz.util; + +import java.util.Date; + +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ebts.common.constant.Constants; +import com.ebts.common.constant.ScheduleConstants; +import com.ebts.common.utils.ExceptionUtil; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.bean.BeanUtils; +import com.ebts.common.utils.spring.SpringUtils; +import com.ebts.quartz.entity.Job; +import com.ebts.quartz.entity.JobLog; +import com.ebts.quartz.service.JobLogService; + +/** + * 抽象quartz调用 + * + * @author binlin + */ +public abstract class AbstractQuartzJob implements org.quartz.Job { + private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class); + + /** + * 线程本地变量 + */ + private static ThreadLocal threadLocal = new ThreadLocal<>(); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + Job job = new Job(); + BeanUtils.copyBeanProp(job, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES)); + try { + before(context, job); + if (job != null) { + doExecute(context, job); + } + after(context, job, null); + } catch (Exception e) { + log.error("任务执行异常 - :", e); + after(context, job, e); + } + } + + /** + * 执行前 + * + * @param context 工作执行上下文对象 + * @param job 系统计划任务 + */ + protected void before(JobExecutionContext context, Job job) { + threadLocal.set(new Date()); + } + + /** + * 执行后 + * + * @param context 工作执行上下文对象 + * @param job 系统计划任务 + */ + protected void after(JobExecutionContext context, Job job, Exception e) { + Date startTime = threadLocal.get(); + threadLocal.remove(); + + final JobLog jobLog = new JobLog(); + jobLog.setJobName(job.getJobName()); + jobLog.setJobGroup(job.getJobGroup()); + jobLog.setInvokeTarget(job.getInvokeTarget()); + jobLog.setStartTime(startTime); + jobLog.setStopTime(new Date()); + long runMs = jobLog.getStopTime().getTime() - jobLog.getStartTime().getTime(); + jobLog.setJobMessage(jobLog.getJobName() + " 总共耗时:" + runMs + "毫秒"); + if (e != null) { + jobLog.setStatus(Constants.FAIL); + String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000); + jobLog.setExceptionInfo(errorMsg); + } else { + jobLog.setStatus(Constants.SUCCESS); + } + + // 写入数据库当中 + SpringUtils.getBean(JobLogService.class).addJobLog(jobLog); + } + + /** + * 执行方法,由子类重载 + * + * @param context 工作执行上下文对象 + * @param job 系统计划任务 + * @throws Exception 执行过程中的异常 + */ + protected abstract void doExecute(JobExecutionContext context, Job job) throws Exception; +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/CronUtils.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/CronUtils.java new file mode 100644 index 0000000..042b72f --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/CronUtils.java @@ -0,0 +1,53 @@ +package com.ebts.quartz.util; + +import java.text.ParseException; +import java.util.Date; + +import org.quartz.CronExpression; + +/** + * cron表达式工具类 + * + * @author binlin + */ +public class CronUtils { + /** + * 返回一个布尔值代表一个给定的Cron表达式的有效性 + * + * @param cronExpression Cron表达式 + * @return boolean 表达式是否有效 + */ + public static boolean isValid(String cronExpression) { + return CronExpression.isValidExpression(cronExpression); + } + + /** + * 返回一个字符串值,表示该消息无效Cron表达式给出有效性 + * + * @param cronExpression Cron表达式 + * @return String 无效时返回表达式错误描述,如果有效返回null + */ + public static String getInvalidMessage(String cronExpression) { + try { + new CronExpression(cronExpression); + return null; + } catch (ParseException pe) { + return pe.getMessage(); + } + } + + /** + * 返回下一个执行时间根据给定的Cron表达式 + * + * @param cronExpression Cron表达式 + * @return Date 下次Cron表达式执行时间 + */ + public static Date getNextExecution(String cronExpression) { + try { + CronExpression cron = new CronExpression(cronExpression); + return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis())); + } catch (ParseException e) { + throw new IllegalArgumentException(e.getMessage()); + } + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/JobInvokeUtil.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/JobInvokeUtil.java new file mode 100644 index 0000000..f8cab92 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/JobInvokeUtil.java @@ -0,0 +1,159 @@ +package com.ebts.quartz.util; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.LinkedList; +import java.util.List; + +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.spring.SpringUtils; +import com.ebts.quartz.entity.Job; + +/** + * 任务执行工具 + * + * @author binlin + */ +public class JobInvokeUtil { + /** + * 执行方法 + * + * @param job 系统任务 + */ + public static void invokeMethod(Job job) throws Exception { + String invokeTarget = job.getInvokeTarget(); + String beanName = getBeanName(invokeTarget); + String methodName = getMethodName(invokeTarget); + List methodParams = getMethodParams(invokeTarget); + + if (!isValidClassName(beanName)) { + Object bean = SpringUtils.getBean(beanName); + invokeMethod(bean, methodName, methodParams); + } else { + Object bean = Class.forName(beanName).newInstance(); + invokeMethod(bean, methodName, methodParams); + } + } + + /** + * 调用任务方法 + * + * @param bean 目标对象 + * @param methodName 方法名称 + * @param methodParams 方法参数 + */ + private static void invokeMethod(Object bean, String methodName, List methodParams) + throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, + InvocationTargetException { + if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) { + Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams)); + method.invoke(bean, getMethodParamsValue(methodParams)); + } else { + Method method = bean.getClass().getDeclaredMethod(methodName); + method.invoke(bean); + } + } + + /** + * 校验是否为为class包名 + * + * @param str 名称 + * @return true是 false否 + */ + public static boolean isValidClassName(String invokeTarget) { + return StringUtils.countMatches(invokeTarget, ".") > 1; + } + + /** + * 获取bean名称 + * + * @param invokeTarget 目标字符串 + * @return bean名称 + */ + public static String getBeanName(String invokeTarget) { + String beanName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringBeforeLast(beanName, "."); + } + + /** + * 获取bean方法 + * + * @param invokeTarget 目标字符串 + * @return method方法 + */ + public static String getMethodName(String invokeTarget) { + String methodName = StringUtils.substringBefore(invokeTarget, "("); + return StringUtils.substringAfterLast(methodName, "."); + } + + /** + * 获取method方法参数相关列表 + * + * @param invokeTarget 目标字符串 + * @return method方法相关参数列表 + */ + public static List getMethodParams(String invokeTarget) { + String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")"); + if (StringUtils.isEmpty(methodStr)) { + return null; + } + String[] methodParams = methodStr.split(","); + List classs = new LinkedList<>(); + for (int i = 0; i < methodParams.length; i++) { + String str = StringUtils.trimToEmpty(methodParams[i]); + // String字符串类型,包含' + if (StringUtils.contains(str, "'")) { + classs.add(new Object[]{StringUtils.replace(str, "'", ""), String.class}); + } + // boolean布尔类型,等于true或者false + else if (StringUtils.equals(str, "true") || StringUtils.equalsIgnoreCase(str, "false")) { + classs.add(new Object[]{Boolean.valueOf(str), Boolean.class}); + } + // long长整形,包含L + else if (StringUtils.containsIgnoreCase(str, "L")) { + classs.add(new Object[]{Long.valueOf(StringUtils.replaceIgnoreCase(str, "L", "")), Long.class}); + } + // double浮点类型,包含D + else if (StringUtils.containsIgnoreCase(str, "D")) { + classs.add(new Object[]{Double.valueOf(StringUtils.replaceIgnoreCase(str, "D", "")), Double.class}); + } + // 其他类型归类为整形 + else { + classs.add(new Object[]{Integer.valueOf(str), Integer.class}); + } + } + return classs; + } + + /** + * 获取参数类型 + * + * @param methodParams 参数相关列表 + * @return 参数类型列表 + */ + public static Class[] getMethodParamsType(List methodParams) { + Class[] classs = new Class[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) { + classs[index] = (Class) os[1]; + index++; + } + return classs; + } + + /** + * 获取参数值 + * + * @param methodParams 参数相关列表 + * @return 参数值列表 + */ + public static Object[] getMethodParamsValue(List methodParams) { + Object[] classs = new Object[methodParams.size()]; + int index = 0; + for (Object[] os : methodParams) { + classs[index] = (Object) os[0]; + index++; + } + return classs; + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/QuartzDisallowConcurrentExecution.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/QuartzDisallowConcurrentExecution.java new file mode 100644 index 0000000..70d5b00 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/QuartzDisallowConcurrentExecution.java @@ -0,0 +1,18 @@ +package com.ebts.quartz.util; + +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import com.ebts.quartz.entity.Job; + +/** + * 定时任务处理(禁止并发执行) + * + * @author binlin + */ +@DisallowConcurrentExecution +public class QuartzDisallowConcurrentExecution extends AbstractQuartzJob { + @Override + protected void doExecute(JobExecutionContext context, Job job) throws Exception { + JobInvokeUtil.invokeMethod(job); + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/QuartzJobExecution.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/QuartzJobExecution.java new file mode 100644 index 0000000..d822347 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/QuartzJobExecution.java @@ -0,0 +1,16 @@ +package com.ebts.quartz.util; + +import org.quartz.JobExecutionContext; +import com.ebts.quartz.entity.Job; + +/** + * 定时任务处理(允许并发执行) + * + * @author binlin + */ +public class QuartzJobExecution extends AbstractQuartzJob { + @Override + protected void doExecute(JobExecutionContext context, Job job) throws Exception { + JobInvokeUtil.invokeMethod(job); + } +} diff --git a/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/ScheduleUtils.java b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/ScheduleUtils.java new file mode 100644 index 0000000..043ae32 --- /dev/null +++ b/ebts/ebts-quartz/src/main/java/com/ebts/quartz/util/ScheduleUtils.java @@ -0,0 +1,102 @@ +package com.ebts.quartz.util; + +import org.quartz.CronScheduleBuilder; +import org.quartz.CronTrigger; +import org.quartz.JobBuilder; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; +import com.ebts.common.constant.ScheduleConstants; +import com.ebts.common.exception.job.TaskException; +import com.ebts.common.exception.job.TaskException.Code; +import com.ebts.quartz.entity.Job; + +/** + * 定时任务工具类 + * + * @author binlin + */ +public class ScheduleUtils { + /** + * 得到quartz任务类 + * + * @param job 执行计划 + * @return 具体执行任务类 + */ + private static Class getQuartzJobClass(Job job) { + boolean isConcurrent = "0".equals(job.getConcurrent()); + return isConcurrent ? QuartzJobExecution.class : QuartzDisallowConcurrentExecution.class; + } + + /** + * 构建任务触发对象 + */ + public static TriggerKey getTriggerKey(Long jobId, String jobGroup) { + return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 构建任务键对象 + */ + public static JobKey getJobKey(Long jobId, String jobGroup) { + return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup); + } + + /** + * 创建定时任务 + */ + public static void createScheduleJob(Scheduler scheduler, Job job) throws SchedulerException, TaskException { + Class jobClass = getQuartzJobClass(job); + // 构建job信息 + Long jobId = job.getJobId(); + String jobGroup = job.getJobGroup(); + JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build(); + + // 表达式调度构建器 + CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); + cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); + + // 按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup)) + .withSchedule(cronScheduleBuilder).build(); + + // 放入参数,运行时的方法可以获取 + jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); + + // 判断是否存在 + if (scheduler.checkExists(getJobKey(jobId, jobGroup))) { + // 防止创建时存在数据问题 先移除,然后在执行创建操作 + scheduler.deleteJob(getJobKey(jobId, jobGroup)); + } + + scheduler.scheduleJob(jobDetail, trigger); + + // 暂停任务 + if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) { + scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup)); + } + } + + /** + * 设置定时任务策略 + */ + public static CronScheduleBuilder handleCronScheduleMisfirePolicy(Job job, CronScheduleBuilder cb) + throws TaskException { + switch (job.getMisfirePolicy()) { + case ScheduleConstants.MISFIRE_DEFAULT: + return cb; + case ScheduleConstants.MISFIRE_IGNORE_MISFIRES: + return cb.withMisfireHandlingInstructionIgnoreMisfires(); + case ScheduleConstants.MISFIRE_FIRE_AND_PROCEED: + return cb.withMisfireHandlingInstructionFireAndProceed(); + case ScheduleConstants.MISFIRE_DO_NOTHING: + return cb.withMisfireHandlingInstructionDoNothing(); + default: + throw new TaskException("The task misfire policy '" + job.getMisfirePolicy() + + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR); + } + } +} diff --git a/ebts/ebts-quartz/src/main/resources/mapper/quartz/JobLogMapper.xml b/ebts/ebts-quartz/src/main/resources/mapper/quartz/JobLogMapper.xml new file mode 100644 index 0000000..a39f0d9 --- /dev/null +++ b/ebts/ebts-quartz/src/main/resources/mapper/quartz/JobLogMapper.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time + from sys_job_log + + + + + + + + + + delete from sys_job_log where job_log_id = #{jobLogId} + + + + delete from sys_job_log where job_log_id in + + #{jobLogId} + + + + + truncate table sys_job_log + + + + insert into sys_job_log( + job_log_id, + job_name, + job_group, + invoke_target, + job_message, + status, + exception_info, + create_time + )values( + #{jobLogId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{jobMessage}, + #{status}, + #{exceptionInfo}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ebts/ebts-quartz/src/main/resources/mapper/quartz/JobMapper.xml b/ebts/ebts-quartz/src/main/resources/mapper/quartz/JobMapper.xml new file mode 100644 index 0000000..d79eeb2 --- /dev/null +++ b/ebts/ebts-quartz/src/main/resources/mapper/quartz/JobMapper.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark + from sys_job + + + + + + + + + + delete from sys_job where job_id = #{jobId} + + + + delete from sys_job where job_id in + + #{jobId} + + + + + update sys_job + + job_name = #{jobName}, + job_group = #{jobGroup}, + invoke_target = #{invokeTarget}, + cron_expression = #{cronExpression}, + misfire_policy = #{misfirePolicy}, + concurrent = #{concurrent}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where job_id = #{jobId} + + + + insert into sys_job( + job_id, + job_name, + job_group, + invoke_target, + cron_expression, + misfire_policy, + concurrent, + status, + remark, + create_by, + create_time + )values( + #{jobId}, + #{jobName}, + #{jobGroup}, + #{invokeTarget}, + #{cronExpression}, + #{misfirePolicy}, + #{concurrent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ebts/ebts-system/pom.xml b/ebts/ebts-system/pom.xml new file mode 100644 index 0000000..1978b3e --- /dev/null +++ b/ebts/ebts-system/pom.xml @@ -0,0 +1,28 @@ + + + + ebts + com.ebts + 1.0.0 + + 4.0.0 + + ebts-system + + + system系统模块 + + + + + + + com.ebts + ebts-common + + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/ConfigDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/ConfigDao.java new file mode 100644 index 0000000..0a588fe --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/ConfigDao.java @@ -0,0 +1,68 @@ +package com.ebts.system.dao; + +import java.util.List; + +import com.ebts.system.entity.Config; + +/** + * 参数配置 数据层 + * + * @author binlin + */ +public interface ConfigDao { + /** + * 查询参数配置信息 + * + * @param config 参数配置信息 + * @return 参数配置信息 + */ + public Config selectConfig(Config config); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + public List selectConfigList(Config config); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数配置信息 + */ + public Config checkConfigKeyUnique(String configKey); + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int insertConfig(Config config); + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int updateConfig(Config config); + + /** + * 删除参数配置 + * + * @param configId 参数ID + * @return 结果 + */ + public int deleteConfigById(Long configId); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + * @return 结果 + */ + public int deleteConfigByIds(Long[] configIds); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/DeptDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/DeptDao.java new file mode 100644 index 0000000..1dbca14 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/DeptDao.java @@ -0,0 +1,118 @@ +package com.ebts.system.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.ebts.common.core.entity.entity.Dept; + +/** + * 部门管理 数据层 + * + * @author binlin + */ +public interface DeptDao { + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + public List selectDeptList(Dept dept); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @param deptCheckStrictly 部门树选择项是否关联显示 + * @return 选中部门列表 + */ + public List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + public Dept selectDeptById(Long deptId); + + /** + * 根据ID查询所有子部门 + * + * @param deptId 部门ID + * @return 部门列表 + */ + public List selectChildrenDeptById(Long deptId); + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + public int selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + public int hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 + */ + public int checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param deptName 部门名称 + * @param parentId 父部门ID + * @return 结果 + */ + public Dept checkDeptNameUnique(@Param("deptName") String deptName, @Param("parentId") Long parentId); + + /** + * 新增部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int insertDept(Dept dept); + + /** + * 修改部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int updateDept(Dept dept); + + /** + * 修改所在部门的父级部门状态 + * + * @param dept 部门 + */ + public void updateDeptStatus(Dept dept); + + /** + * 修改子元素关系 + * + * @param depts 子元素 + * @return 结果 + */ + public int updateDeptChildren(@Param("depts") List depts); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + public int deleteDeptById(Long deptId); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/DictDataDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/DictDataDao.java new file mode 100644 index 0000000..0ba99ed --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/DictDataDao.java @@ -0,0 +1,95 @@ +package com.ebts.system.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.ebts.common.core.entity.entity.DictData; + +/** + * 字典表 数据层 + * + * @author binlin + */ +public interface DictDataDao { + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + public List selectDictDataList(DictData dictData); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + public List selectDictDataByType(String dictType); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + public String selectDictLabel(@Param("dictType") String dictType, @Param("dictValue") String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + public DictData selectDictDataById(Long dictCode); + + /** + * 查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据 + */ + public int countDictDataByType(String dictType); + + /** + * 通过字典ID删除字典数据信息 + * + * @param dictCode 字典数据ID + * @return 结果 + */ + public int deleteDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + * @return 结果 + */ + public int deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int insertDictData(DictData dictData); + + /** + * 修改字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int updateDictData(DictData dictData); + + /** + * 同步修改字典类型 + * + * @param oldDictType 旧字典类型 + * @param newDictType 新旧字典类型 + * @return 结果 + */ + public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/DictTypeDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/DictTypeDao.java new file mode 100644 index 0000000..83361a5 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/DictTypeDao.java @@ -0,0 +1,85 @@ +package com.ebts.system.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Mapper; +import com.ebts.common.core.entity.entity.DictType; + +/** + * 字典表 数据层 + * + * @author binlin + */ +@Mapper +public interface DictTypeDao { + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + public List selectDictTypeList(DictType dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + public List selectDictTypeAll(); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + public DictType selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + public DictType selectDictTypeByType(String dictType); + + /** + * 通过字典ID删除字典信息 + * + * @param dictId 字典ID + * @return 结果 + */ + public int deleteDictTypeById(Long dictId); + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + * @return 结果 + */ + public int deleteDictTypeByIds(Long[] dictIds); + + /** + * 新增字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int insertDictType(DictType dictType); + + /** + * 修改字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int updateDictType(DictType dictType); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + public DictType checkDictTypeUnique(String dictType); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/FileDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/FileDao.java new file mode 100644 index 0000000..3ce6626 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/FileDao.java @@ -0,0 +1,68 @@ +package com.ebts.system.dao; + +import java.util.List; + +import com.ebts.system.entity.SysFile; + +/** + * 文件信息Mapper接口 + * + * @author binlin + * @date 2021-02-17 + */ +public interface FileDao { + /** + * 查询文件信息 + * + * @param fileId 文件信息ID + * @return 文件信息 + */ + SysFile selectFileById(Long fileId); + + /** + * 查询文件信息列表 + * + * @param sysFile 文件信息 + * @return 文件信息集合 + */ + List selectFileList(SysFile sysFile); + + /** + * 查询文件夹列表 + * @return + */ + List selectFileFolder(); + + + /** + * 新增文件信息 + * + * @param sysFile 文件信息 + * @return 结果 + */ + int insertFile(SysFile sysFile); + + /** + * 修改文件信息 + * + * @param sysFile 文件信息 + * @return 结果 + */ + int updateFile(SysFile sysFile); + + /** + * 删除文件信息 + * + * @param fileId 文件信息ID + * @return 结果 + */ + int deleteFileById(Long fileId); + + /** + * 批量删除文件信息 + * + * @param fileIds 需要删除的数据ID + * @return 结果 + */ + int deleteFileByIds(Long[] fileIds); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/LogininforDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/LogininforDao.java new file mode 100644 index 0000000..f31deae --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/LogininforDao.java @@ -0,0 +1,42 @@ +package com.ebts.system.dao; + +import java.util.List; + +import com.ebts.system.entity.Logininfor; + +/** + * 系统访问日志情况信息 数据层 + * + * @author binlin + */ +public interface LogininforDao { + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void insertLogininfor(Logininfor logininfor); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + public List selectLogininforList(Logininfor logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + public int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + * + * @return 结果 + */ + public int cleanLogininfor(); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/MenuDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/MenuDao.java new file mode 100644 index 0000000..9a820c8 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/MenuDao.java @@ -0,0 +1,117 @@ +package com.ebts.system.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.ebts.common.core.entity.entity.Menu; + +/** + * 菜单表 数据层 + * + * @author binlin + */ +public interface MenuDao { + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + public List

selectMenuList(Menu menu); + + /** + * 根据用户所有权限 + * + * @return 权限列表 + */ + public List selectMenuPerms(); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + public List selectMenuListByUserId(Menu menu); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public List selectMenuPermsByUserId(Long userId); + + /** + * 根据用户ID查询菜单 + * + * @return 菜单列表 + */ + public List selectMenuTreeAll(); + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @param menuCheckStrictly 菜单树选择项是否关联显示 + * @return 选中菜单列表 + */ + public List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + public Menu selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int hasChildByMenuId(Long menuId); + + /** + * 新增菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int insertMenu(Menu menu); + + /** + * 修改菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int updateMenu(Menu menu); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menuName 菜单名称 + * @param parentId 父菜单ID + * @return 结果 + */ + public Menu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/NoticeDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/NoticeDao.java new file mode 100644 index 0000000..166b357 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/NoticeDao.java @@ -0,0 +1,60 @@ +package com.ebts.system.dao; + +import java.util.List; + +import com.ebts.system.entity.Notice; + +/** + * 通知公告表 数据层 + * + * @author binlin + */ +public interface NoticeDao { + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + public Notice selectNoticeById(Long noticeId); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + public List selectNoticeList(Notice notice); + + /** + * 新增公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int insertNotice(Notice notice); + + /** + * 修改公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int updateNotice(Notice notice); + + /** + * 批量删除公告 + * + * @param noticeId 公告ID + * @return 结果 + */ + public int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + public int deleteNoticeByIds(Long[] noticeIds); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/OperLogDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/OperLogDao.java new file mode 100644 index 0000000..b17b55a --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/OperLogDao.java @@ -0,0 +1,48 @@ +package com.ebts.system.dao; + +import java.util.List; + +import com.ebts.system.entity.OperLog; + +/** + * 操作日志 数据层 + * + * @author binlin + */ +public interface OperLogDao { + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void insertOperlog(OperLog operLog); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + public List selectOperLogList(OperLog operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + public int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + public OperLog selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + public void cleanOperLog(); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/PostDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/PostDao.java new file mode 100644 index 0000000..40978ac --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/PostDao.java @@ -0,0 +1,99 @@ +package com.ebts.system.dao; + +import java.util.List; + +import com.ebts.system.entity.Post; + +/** + * 岗位信息 数据层 + * + * @author binlin + */ +public interface PostDao { + /** + * 查询岗位数据集合 + * + * @param post 岗位信息 + * @return 岗位数据集合 + */ + public List selectPostList(Post post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + public List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + public Post selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + public List selectPostListByUserId(Long userId); + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + public List selectPostsByUserName(String userName); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + public int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 修改岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int updatePost(Post post); + + /** + * 新增岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int insertPost(Post post); + + /** + * 校验岗位名称 + * + * @param postName 岗位名称 + * @return 结果 + */ + public Post checkPostNameUnique(String postName); + + /** + * 校验岗位编码 + * + * @param postCode 岗位编码 + * @return 结果 + */ + public Post checkPostCodeUnique(String postCode); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/RealQueryServiceDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/RealQueryServiceDao.java new file mode 100644 index 0000000..88a931c --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/RealQueryServiceDao.java @@ -0,0 +1,38 @@ +package com.ebts.system.dao; + +import com.ebts.system.entity.RealUniQuery; + +import java.util.List; +import java.util.Map; + +/** + * @Author 18209 + * @Date 2021/2/22 18:04 + * @Version 1.0 + */ +public interface RealQueryServiceDao { + /** + * 查询万能查询 + * + * @param id 万能查询ID + * @return 万能查询 + */ + RealUniQuery selectRealUniQueryById(Long id); + + + /** + * 查询结果 + * @param paramSQL + * @return + */ + List> realUniQuery(String paramSQL); + + + /** + * 获取页面信息 + * @param id + * @return + */ + List queryRealInfo(Long id); + +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleDao.java new file mode 100644 index 0000000..a3d53a6 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleDao.java @@ -0,0 +1,107 @@ +package com.ebts.system.dao; + +import java.util.List; + +import com.ebts.common.core.entity.entity.Role; + +/** + * 角色表 数据层 + * + * @author binlin + */ +public interface RoleDao { + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + public List selectRoleList(Role role); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + public List selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + public List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + public List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + public Role selectRoleById(Long roleId); + + /** + * 根据用户ID查询角色 + * + * @param userName 用户名 + * @return 角色列表 + */ + public List selectRolesByUserName(String userName); + + /** + * 校验角色名称是否唯一 + * + * @param roleName 角色名称 + * @return 角色信息 + */ + public Role checkRoleNameUnique(String roleName); + + /** + * 校验角色权限是否唯一 + * + * @param roleKey 角色权限 + * @return 角色信息 + */ + public Role checkRoleKeyUnique(String roleKey); + + /** + * 修改角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRole(Role role); + + /** + * 新增角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int insertRole(Role role); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleDeptDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleDeptDao.java new file mode 100644 index 0000000..b1ba994 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleDeptDao.java @@ -0,0 +1,44 @@ +package com.ebts.system.dao; + +import java.util.List; + +import com.ebts.system.entity.RoleDept; + +/** + * 角色与部门关联表 数据层 + * + * @author binlin + */ +public interface RoleDeptDao { + /** + * 通过角色ID删除角色和部门关联 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleDeptByRoleId(Long roleId); + + /** + * 批量删除角色部门关联信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteRoleDept(Long[] ids); + + /** + * 查询部门使用数量 + * + * @param deptId 部门ID + * @return 结果 + */ + public int selectCountRoleDeptByDeptId(Long deptId); + + /** + * 批量新增角色部门信息 + * + * @param roleDeptList 角色部门列表 + * @return 结果 + */ + public int batchRoleDept(List roleDeptList); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleMenuDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleMenuDao.java new file mode 100644 index 0000000..96addf3 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/RoleMenuDao.java @@ -0,0 +1,36 @@ +package com.ebts.system.dao; + +import java.util.List; + +import com.ebts.system.entity.RoleMenu; + +/** + * 角色与菜单关联表 数据层 + * + * @author binlin + */ +public interface RoleMenuDao { + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int checkMenuExistRole(Long menuId); + + /** + * 通过角色ID删除角色和菜单关联 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleMenuByRoleId(Long roleId); + + /** + * 批量新增角色菜单信息 + * + * @param roleMenuList 角色菜单列表 + * @return 结果 + */ + public int batchRoleMenu(List roleMenuList); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/SequenceDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/SequenceDao.java new file mode 100644 index 0000000..9c591a7 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/SequenceDao.java @@ -0,0 +1,23 @@ +package com.ebts.system.dao; + +/** + * @Author 18209 + * @Date 2021/2/24 17:56 + * @Version 1.0 + */ +public interface SequenceDao { + + /** + * 当前值 + * @param tableName + * @return + */ + Long currval(String tableName); + + /** + * 下一个值 + * @param tableName + * @return + */ + Long nextval(String tableName); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/UserDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/UserDao.java new file mode 100644 index 0000000..be53493 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/UserDao.java @@ -0,0 +1,111 @@ +package com.ebts.system.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.ebts.common.core.entity.entity.User; + +/** + * 用户表 数据层 + * + * @author binlin + */ +public interface UserDao { + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(User user); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public User selectUserByUserName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public User selectUserById(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int insertUser(User user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(User user); + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + public int updateUserAvatar(@Param("userName") String userName, @Param("avatar") String avatar); + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + public int resetUserPwd(@Param("userName") String userName, @Param("password") String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + public int checkUserNameUnique(String userName); + + /** + * 校验手机号码是否唯一 + * + * @param phonenumber 手机号码 + * @return 结果 + */ + public User checkPhoneUnique(String phonenumber); + + /** + * 校验email是否唯一 + * + * @param email 用户邮箱 + * @return 结果 + */ + public User checkEmailUnique(String email); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/UserPostDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/UserPostDao.java new file mode 100644 index 0000000..4eeed28 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/UserPostDao.java @@ -0,0 +1,44 @@ +package com.ebts.system.dao; + +import java.util.List; + +import com.ebts.system.entity.UserPost; + +/** + * 用户与岗位关联表 数据层 + * + * @author binlin + */ +public interface UserPostDao { + /** + * 通过用户ID删除用户和岗位关联 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserPostByUserId(Long userId); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + public int countUserPostById(Long postId); + + /** + * 批量删除用户和岗位关联 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteUserPost(Long[] ids); + + /** + * 批量新增用户岗位信息 + * + * @param userPostList 用户角色列表 + * @return 结果 + */ + public int batchUserPost(List userPostList); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dao/UserRoleDao.java b/ebts/ebts-system/src/main/java/com/ebts/system/dao/UserRoleDao.java new file mode 100644 index 0000000..6c2346c --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dao/UserRoleDao.java @@ -0,0 +1,62 @@ +package com.ebts.system.dao; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; +import com.ebts.system.entity.UserRole; + +/** + * 用户与角色关联表 数据层 + * + * @author binlin + */ +public interface UserRoleDao { + /** + * 通过用户ID删除用户和角色关联 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserRoleByUserId(Long userId); + + /** + * 批量删除用户和角色关联 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteUserRole(Long[] ids); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 批量新增用户角色信息 + * + * @param userRoleList 用户角色列表 + * @return 结果 + */ + public int batchUserRole(List userRoleList); + + /** + * 删除用户和角色关联信息 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + public int deleteUserRoleInfo(UserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + public int deleteUserRoleInfos(@Param("roleId") Long roleId, @Param("userIds") Long[] userIds); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/dto/FileDownload.java b/ebts/ebts-system/src/main/java/com/ebts/system/dto/FileDownload.java new file mode 100644 index 0000000..f272a50 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/dto/FileDownload.java @@ -0,0 +1,29 @@ +package com.ebts.system.dto; + +import java.io.InputStream; + +public class FileDownload { + private String fileName; + private InputStream inputStream; + + public FileDownload(String fileName, InputStream inputStream) { + this.fileName = fileName; + this.inputStream = inputStream; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public InputStream getInputStream() { + return inputStream; + } + + public void setInputStream(InputStream inputStream) { + this.inputStream = inputStream; + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/Config.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/Config.java new file mode 100644 index 0000000..b220a25 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/Config.java @@ -0,0 +1,111 @@ +package com.ebts.system.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.ebts.common.annotation.Excel; +import com.ebts.common.annotation.Excel.ColumnType; +import com.ebts.common.core.entity.BaseEntity; + +/** + * 参数配置表 sys_config + * + * @author binlin + */ +public class Config extends BaseEntity { + + + /** + * 参数主键 + */ + @Excel(name = "参数主键", cellType = ColumnType.NUMERIC) + private Long configId; + + /** + * 参数名称 + */ + @Excel(name = "参数名称") + private String configName; + + /** + * 参数键名 + */ + @Excel(name = "参数键名") + private String configKey; + + /** + * 参数键值 + */ + @Excel(name = "参数键值") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + @Excel(name = "系统内置", readConverterExp = "Y=是,N=否") + private String configType; + + public Long getConfigId() { + return configId; + } + + public void setConfigId(Long configId) { + this.configId = configId; + } + + @NotBlank(message = "参数名称不能为空") + @Size(min = 0, max = 100, message = "参数名称不能超过100个字符") + public String getConfigName() { + return configName; + } + + public void setConfigName(String configName) { + this.configName = configName; + } + + @NotBlank(message = "参数键名长度不能为空") + @Size(min = 0, max = 100, message = "参数键名长度不能超过100个字符") + public String getConfigKey() { + return configKey; + } + + public void setConfigKey(String configKey) { + this.configKey = configKey; + } + + @NotBlank(message = "参数键值不能为空") + @Size(min = 0, max = 500, message = "参数键值长度不能超过500个字符") + public String getConfigValue() { + return configValue; + } + + public void setConfigValue(String configValue) { + this.configValue = configValue; + } + + public String getConfigType() { + return configType; + } + + public void setConfigType(String configType) { + this.configType = configType; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("configId", getConfigId()) + .append("configName", getConfigName()) + .append("configKey", getConfigKey()) + .append("configValue", getConfigValue()) + .append("configType", getConfigType()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/Logininfor.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/Logininfor.java new file mode 100644 index 0000000..39d3473 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/Logininfor.java @@ -0,0 +1,144 @@ +package com.ebts.system.entity; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ebts.common.annotation.Excel; +import com.ebts.common.annotation.Excel.ColumnType; +import com.ebts.common.core.entity.BaseEntity; + +/** + * 系统访问记录表 sys_logininfor + * + * @author binlin + */ +public class Logininfor extends BaseEntity { + + + /** + * ID + */ + @Excel(name = "序号", cellType = ColumnType.NUMERIC) + private Long infoId; + + /** + * 用户账号 + */ + @Excel(name = "用户账号") + private String userName; + + /** + * 登录状态 0成功 1失败 + */ + @Excel(name = "登录状态", readConverterExp = "0=成功,1=失败") + private String status; + + /** + * 登录IP地址 + */ + @Excel(name = "登录地址") + private String ipaddr; + + /** + * 登录地点 + */ + @Excel(name = "登录地点") + private String loginLocation; + + /** + * 浏览器类型 + */ + @Excel(name = "浏览器") + private String browser; + + /** + * 操作系统 + */ + @Excel(name = "操作系统") + private String os; + + /** + * 提示消息 + */ + @Excel(name = "提示消息") + private String msg; + + /** + * 访问时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date loginTime; + + public Long getInfoId() { + return infoId; + } + + public void setInfoId(Long infoId) { + this.infoId = infoId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getIpaddr() { + return ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + + public String getBrowser() { + return browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public Date getLoginTime() { + return loginTime; + } + + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/Notice.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/Notice.java new file mode 100644 index 0000000..bd9369f --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/Notice.java @@ -0,0 +1,100 @@ +package com.ebts.system.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.ebts.common.core.entity.BaseEntity; + +/** + * 通知公告表 sys_notice + * + * @author binlin + */ +public class Notice extends BaseEntity { + + + /** + * 公告ID + */ + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + public Long getNoticeId() { + return noticeId; + } + + public void setNoticeId(Long noticeId) { + this.noticeId = noticeId; + } + + public void setNoticeTitle(String noticeTitle) { + this.noticeTitle = noticeTitle; + } + + @NotBlank(message = "公告标题不能为空") + @Size(min = 0, max = 50, message = "公告标题不能超过50个字符") + public String getNoticeTitle() { + return noticeTitle; + } + + public void setNoticeType(String noticeType) { + this.noticeType = noticeType; + } + + public String getNoticeType() { + return noticeType; + } + + public void setNoticeContent(String noticeContent) { + this.noticeContent = noticeContent; + } + + public String getNoticeContent() { + return noticeContent; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getStatus() { + return status; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("noticeId", getNoticeId()) + .append("noticeTitle", getNoticeTitle()) + .append("noticeType", getNoticeType()) + .append("noticeContent", getNoticeContent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/OperLog.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/OperLog.java new file mode 100644 index 0000000..bab7e6d --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/OperLog.java @@ -0,0 +1,255 @@ +package com.ebts.system.entity; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ebts.common.annotation.Excel; +import com.ebts.common.annotation.Excel.ColumnType; +import com.ebts.common.core.entity.BaseEntity; + +/** + * 操作日志记录表 oper_log + * + * @author binlin + */ +public class OperLog extends BaseEntity { + + + /** + * 日志主键 + */ + @Excel(name = "操作序号", cellType = ColumnType.NUMERIC) + private Long operId; + + /** + * 操作模块 + */ + @Excel(name = "操作模块") + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 请求方法 + */ + @Excel(name = "请求方法") + private String method; + + /** + * 请求方式 + */ + @Excel(name = "请求方式") + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") + private Integer operatorType; + + /** + * 操作人员 + */ + @Excel(name = "操作人员") + private String operName; + + /** + * 部门名称 + */ + @Excel(name = "部门名称") + private String deptName; + + /** + * 请求url + */ + @Excel(name = "请求地址") + private String operUrl; + + /** + * 操作地址 + */ + @Excel(name = "操作地址") + private String operIp; + + /** + * 操作地点 + */ + @Excel(name = "操作地点") + private String operLocation; + + /** + * 请求参数 + */ + @Excel(name = "请求参数") + private String operParam; + + /** + * 返回参数 + */ + @Excel(name = "返回参数") + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + @Excel(name = "状态", readConverterExp = "0=正常,1=异常") + private Integer status; + + /** + * 错误消息 + */ + @Excel(name = "错误消息") + private String errorMsg; + + /** + * 操作时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date operTime; + + public Long getOperId() { + return operId; + } + + public void setOperId(Long operId) { + this.operId = operId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public Integer getBusinessType() { + return businessType; + } + + public void setBusinessType(Integer businessType) { + this.businessType = businessType; + } + + public Integer[] getBusinessTypes() { + return businessTypes; + } + + public void setBusinessTypes(Integer[] businessTypes) { + this.businessTypes = businessTypes; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } + + public String getRequestMethod() { + return requestMethod; + } + + public void setRequestMethod(String requestMethod) { + this.requestMethod = requestMethod; + } + + public Integer getOperatorType() { + return operatorType; + } + + public void setOperatorType(Integer operatorType) { + this.operatorType = operatorType; + } + + public String getOperName() { + return operName; + } + + public void setOperName(String operName) { + this.operName = operName; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getOperUrl() { + return operUrl; + } + + public void setOperUrl(String operUrl) { + this.operUrl = operUrl; + } + + public String getOperIp() { + return operIp; + } + + public void setOperIp(String operIp) { + this.operIp = operIp; + } + + public String getOperLocation() { + return operLocation; + } + + public void setOperLocation(String operLocation) { + this.operLocation = operLocation; + } + + public String getOperParam() { + return operParam; + } + + public void setOperParam(String operParam) { + this.operParam = operParam; + } + + public String getJsonResult() { + return jsonResult; + } + + public void setJsonResult(String jsonResult) { + this.jsonResult = jsonResult; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getErrorMsg() { + return errorMsg; + } + + public void setErrorMsg(String errorMsg) { + this.errorMsg = errorMsg; + } + + public Date getOperTime() { + return operTime; + } + + public void setOperTime(Date operTime) { + this.operTime = operTime; + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/Post.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/Post.java new file mode 100644 index 0000000..5e03f2d --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/Post.java @@ -0,0 +1,123 @@ +package com.ebts.system.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.ebts.common.annotation.Excel; +import com.ebts.common.annotation.Excel.ColumnType; +import com.ebts.common.core.entity.BaseEntity; + +/** + * 岗位表 sys_post + * + * @author binlin + */ +public class Post extends BaseEntity { + + + /** + * 岗位序号 + */ + @Excel(name = "岗位序号", cellType = ColumnType.NUMERIC) + private Long postId; + + /** + * 岗位编码 + */ + @Excel(name = "岗位编码") + private String postCode; + + /** + * 岗位名称 + */ + @Excel(name = "岗位名称") + private String postName; + + /** + * 岗位排序 + */ + @Excel(name = "岗位排序") + private String postSort; + + /** + * 状态(0正常 1停用) + */ + @Excel(name = "状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** + * 用户是否存在此岗位标识 默认不存在 + */ + private boolean flag = false; + + public Long getPostId() { + return postId; + } + + public void setPostId(Long postId) { + this.postId = postId; + } + + @NotBlank(message = "岗位编码不能为空") + @Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符") + public String getPostCode() { + return postCode; + } + + public void setPostCode(String postCode) { + this.postCode = postCode; + } + + @NotBlank(message = "岗位名称不能为空") + @Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符") + public String getPostName() { + return postName; + } + + public void setPostName(String postName) { + this.postName = postName; + } + + @NotBlank(message = "显示顺序不能为空") + public String getPostSort() { + return postSort; + } + + public void setPostSort(String postSort) { + this.postSort = postSort; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public boolean isFlag() { + return flag; + } + + public void setFlag(boolean flag) { + this.flag = flag; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("postId", getPostId()) + .append("postCode", getPostCode()) + .append("postName", getPostName()) + .append("postSort", getPostSort()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/RealUniCon.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/RealUniCon.java new file mode 100644 index 0000000..42d67e8 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/RealUniCon.java @@ -0,0 +1,141 @@ +package com.ebts.system.entity; + +/** + * 万能查询条件对象 sys_uni_con + * + * @author binlin + * @date 2021-01-30 + */ +public class RealUniCon { + + + /** + * id + */ + private Long id; + + /** + * 万能查询tableid + */ + private Long uqId; + + /** + * 名称(lable) + */ + private String ucName; + + /** + * 关键字 + */ + private String ucKey; + + /** + * 查询条件 + */ + private String ucCon; + + /** + * 模拟数据 + */ + private String ucMock; + + /** + * 真实数据 + */ + private Object ucReal; + + /** + * 描述 + */ + private String ucDescribe; + + /** + * 输入类型 + */ + private String ucType; + + /** + * 显示类型 + */ + private Integer type; + + public String getUcType() { + return ucType; + } + + public void setUcType(String ucType) { + this.ucType = ucType; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setUqId(Long uqId) { + this.uqId = uqId; + } + + public Long getUqId() { + return uqId; + } + + public void setUcName(String ucName) { + this.ucName = ucName; + } + + public String getUcName() { + return ucName; + } + + public void setUcKey(String ucKey) { + this.ucKey = ucKey; + } + + public String getUcKey() { + return ucKey; + } + + public void setUcCon(String ucCon) { + this.ucCon = ucCon; + } + + public String getUcCon() { + return ucCon; + } + + public String getUcMock() { + return ucMock; + } + + public void setUcMock(String ucMock) { + this.ucMock = ucMock; + } + + public String getUcDescribe() { + return ucDescribe; + } + + public void setUcDescribe(String ucDescribe) { + this.ucDescribe = ucDescribe; + } + + public Object getUcReal() { + return ucReal; + } + + public void setUcReal(Object ucReal) { + this.ucReal = ucReal; + } +} \ No newline at end of file diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/RealUniQuery.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/RealUniQuery.java new file mode 100644 index 0000000..5d66772 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/RealUniQuery.java @@ -0,0 +1,131 @@ +package com.ebts.system.entity; + +import com.ebts.common.core.entity.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.ArrayList; +import java.util.List; + +/** + * 万能查询对象 sys_uni_query + * + * @author binlin + * @date 2021-01-30 + */ +public class RealUniQuery extends BaseEntity { + + /** + * id + */ + private Long id; + + /** + * 名称 + */ + private String uqName; + + /** + * sql语句 + */ + private String uqSql; + + /** + * 描述 + */ + private String uqDescribe; + + /** + * 是否发布(0:否,1:发布) + */ + private Integer isRelease; + + private List realUniCons; + + private Integer pageNum; + + private Integer pageSize; + + + public Integer getIsRelease() { + return isRelease; + } + + public void setIsRelease(Integer isRelease) { + this.isRelease = isRelease; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public List getUniCons() { + if (realUniCons == null) { + return realUniCons = new ArrayList(); + } else { + return realUniCons; + } + } + + public void setUniCons(List realUniCons) { + this.realUniCons = realUniCons; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getId() { + return id; + } + + public void setUqName(String uqName) { + this.uqName = uqName; + } + + public String getUqName() { + return uqName; + } + + public void setUqSql(String uqSql) { + this.uqSql = uqSql; + } + + public String getUqSql() { + return uqSql; + } + + public void setUqDescribe(String uqDescribe) { + this.uqDescribe = uqDescribe; + } + + public String getUqDescribe() { + return uqDescribe; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("uqName", getUqName()) + .append("uqSql", getUqSql()) + .append("uqDescribe", getUqDescribe()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/RoleDept.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/RoleDept.java new file mode 100644 index 0000000..3394cae --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/RoleDept.java @@ -0,0 +1,45 @@ +package com.ebts.system.entity; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 角色和部门关联 sys_role_dept + * + * @author binlin + */ +public class RoleDept { + /** + * 角色ID + */ + private Long roleId; + + /** + * 部门ID + */ + private Long deptId; + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public Long getDeptId() { + return deptId; + } + + public void setDeptId(Long deptId) { + this.deptId = deptId; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("deptId", getDeptId()) + .toString(); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/RoleMenu.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/RoleMenu.java new file mode 100644 index 0000000..d9ceadf --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/RoleMenu.java @@ -0,0 +1,45 @@ +package com.ebts.system.entity; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 角色和菜单关联 sys_role_menu + * + * @author binlin + */ +public class RoleMenu { + /** + * 角色ID + */ + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public Long getMenuId() { + return menuId; + } + + public void setMenuId(Long menuId) { + this.menuId = menuId; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("menuId", getMenuId()) + .toString(); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/SysFile.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/SysFile.java new file mode 100644 index 0000000..58bb610 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/SysFile.java @@ -0,0 +1,185 @@ +package com.ebts.system.entity; + +import com.ebts.common.annotation.Excel; +import com.ebts.common.core.entity.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 文件信息对象 sys_file + * + * @author binlin + * @date 2021-02-17 + */ +@ApiModel("文件信息") +public class SysFile extends BaseEntity { + + /** + * 文件id + */ + @ApiModelProperty("文件id") + private Long fileId; + /** + * 文件夹id + */ + @ApiModelProperty("文件夹id") + private Long pId; + + @ApiModelProperty("上级id") + private Long unionId; + + /** + * 角色id + */ + @ApiModelProperty("角色id") + private String roleIds; + /** + * 文件夹继承权限 + */ + @ApiModelProperty("文件夹继承权限") + private String inherit; + /** + * 文件名称 + */ + @Excel(name = "文件名称") + @ApiModelProperty("文件名称") + private String fileName; + /** + * 映射名称 + */ + @ApiModelProperty("映射名称") + private String mapping; + /** + * 文件路径 + */ + @Excel(name = "文件路径") + @ApiModelProperty("文件路径") + private String fileAddr; + /** + * 文件类型(文件夹:folder,文件:file) + */ + @Excel(name = "文件类型") + @ApiModelProperty("文件类型") + private String fileType; + /** + * 文件大小(MB) + */ + @Excel(name = "文件大小(MB)") + @ApiModelProperty("文件大小(MB)") + private Long fileSize; + /** + * 是否公开 + */ + @Excel(name = "是否公开") + @ApiModelProperty("是否公开") + private String isPublic; + + public Long getUnionId() { + return unionId; + } + + public void setUnionId(Long unionId) { + this.unionId = unionId; + } + + public String getInherit() { + return inherit; + } + + public void setInherit(String inherit) { + this.inherit = inherit; + } + + public void setFileId(Long fileId) { + this.fileId = fileId; + } + + public Long getFileId() { + return fileId; + } + + public void setpId(Long pId) { + this.pId = pId; + } + + public Long getpId() { + return pId; + } + + public String getRoleIds() { + return roleIds; + } + + public void setRoleIds(String roleIds) { + this.roleIds = roleIds; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFileName() { + return fileName; + } + + public void setMapping(String mapping) { + this.mapping = mapping; + } + + public String getMapping() { + return mapping; + } + + public void setFileAddr(String fileAddr) { + this.fileAddr = fileAddr; + } + + public String getFileAddr() { + return fileAddr; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getFileType() { + return fileType; + } + + public Long getFileSize() { + return fileSize; + } + + public void setFileSize(Long fileSize) { + this.fileSize = fileSize; + } + + public void setIsPublic(String isPublic) { + this.isPublic = isPublic; + } + + public String getIsPublic() { + return isPublic; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("fileId", getFileId()) + .append("pId", getpId()) + .append("roleIds", getRoleIds()) + .append("fileName", getFileName()) + .append("mapping", getMapping()) + .append("fileAddr", getFileAddr()) + .append("fileType", getFileType()) + .append("fileSize", getFileSize()) + .append("isPublic", getIsPublic()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/UserOnline.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/UserOnline.java new file mode 100644 index 0000000..9b69ca9 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/UserOnline.java @@ -0,0 +1,112 @@ +package com.ebts.system.entity; + +/** + * 当前在线会话 + * + * @author binlin + */ +public class UserOnline { + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + + public String getTokenId() { + return tokenId; + } + + public void setTokenId(String tokenId) { + this.tokenId = tokenId; + } + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getIpaddr() { + return ipaddr; + } + + public void setIpaddr(String ipaddr) { + this.ipaddr = ipaddr; + } + + public String getLoginLocation() { + return loginLocation; + } + + public void setLoginLocation(String loginLocation) { + this.loginLocation = loginLocation; + } + + public String getBrowser() { + return browser; + } + + public void setBrowser(String browser) { + this.browser = browser; + } + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + public Long getLoginTime() { + return loginTime; + } + + public void setLoginTime(Long loginTime) { + this.loginTime = loginTime; + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/UserPost.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/UserPost.java new file mode 100644 index 0000000..07087ab --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/UserPost.java @@ -0,0 +1,45 @@ +package com.ebts.system.entity; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 用户和岗位关联 sys_user_post + * + * @author binlin + */ +public class UserPost { + /** + * 用户ID + */ + private Long userId; + + /** + * 岗位ID + */ + private Long postId; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getPostId() { + return postId; + } + + public void setPostId(Long postId) { + this.postId = postId; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("postId", getPostId()) + .toString(); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/UserRole.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/UserRole.java new file mode 100644 index 0000000..f14ca2e --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/UserRole.java @@ -0,0 +1,45 @@ +package com.ebts.system.entity; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +/** + * 用户和角色关联 sys_user_role + * + * @author binlin + */ +public class UserRole { + /** + * 用户ID + */ + private Long userId; + + /** + * 角色ID + */ + private Long roleId; + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("roleId", getRoleId()) + .toString(); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/vo/MetaVo.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/vo/MetaVo.java new file mode 100644 index 0000000..e1cf70c --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/vo/MetaVo.java @@ -0,0 +1,61 @@ +package com.ebts.system.entity.vo; + +/** + * 路由显示信息 + * + * @author binlin + */ +public class MetaVo { + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + public MetaVo() { + } + + public MetaVo(String title, String icon) { + this.title = title; + this.icon = icon; + } + + public MetaVo(String title, String icon, boolean noCache) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public boolean isNoCache() { + return noCache; + } + + public void setNoCache(boolean noCache) { + this.noCache = noCache; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/entity/vo/RouterVo.java b/ebts/ebts-system/src/main/java/com/ebts/system/entity/vo/RouterVo.java new file mode 100644 index 0000000..01b1f8d --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/entity/vo/RouterVo.java @@ -0,0 +1,117 @@ +package com.ebts.system.entity.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; + +import java.util.List; + +/** + * 路由配置信息 + * + * @author binlin + */ +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class RouterVo { + /** + * 路由名字 + */ + private String name; + + /** + * 路由地址 + */ + private String path; + + /** + * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 + */ + private boolean hidden; + + /** + * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 组件地址 + */ + private String component; + + /** + * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + */ + private Boolean alwaysShow; + + /** + * 其他元素 + */ + private MetaVo meta; + + /** + * 子路由 + */ + private List children; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public boolean getHidden() { + return hidden; + } + + public void setHidden(boolean hidden) { + this.hidden = hidden; + } + + public String getRedirect() { + return redirect; + } + + public void setRedirect(String redirect) { + this.redirect = redirect; + } + + public String getComponent() { + return component; + } + + public void setComponent(String component) { + this.component = component; + } + + public Boolean getAlwaysShow() { + return alwaysShow; + } + + public void setAlwaysShow(Boolean alwaysShow) { + this.alwaysShow = alwaysShow; + } + + public MetaVo getMeta() { + return meta; + } + + public void setMeta(MetaVo meta) { + this.meta = meta; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/ConfigService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/ConfigService.java new file mode 100644 index 0000000..95ccb33 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/ConfigService.java @@ -0,0 +1,73 @@ +package com.ebts.system.service; + +import java.util.List; + +import com.ebts.system.entity.Config; + +/** + * 参数配置 服务层 + * + * @author binlin + */ +public interface ConfigService { + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + public Config selectConfigById(Long configId); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数键值 + */ + public String selectConfigByKey(String configKey); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + public List selectConfigList(Config config); + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int insertConfig(Config config); + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + public int updateConfig(Config config); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + * @return 结果 + */ + public int deleteConfigByIds(Long[] configIds); + + /** + * 清空缓存数据 + */ + public void clearCache(); + + /** + * 校验参数键名是否唯一 + * + * @param config 参数信息 + * @return 结果 + */ + public String checkConfigKeyUnique(Config config); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/DeptService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/DeptService.java new file mode 100644 index 0000000..edd0c52 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/DeptService.java @@ -0,0 +1,109 @@ +package com.ebts.system.service; + +import java.util.List; + +import com.ebts.common.core.entity.TreeSelect; +import com.ebts.common.core.entity.entity.Dept; + +/** + * 部门管理 服务层 + * + * @author binlin + */ +public interface DeptService { + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + public List selectDeptList(Dept dept); + + /** + * 构建前端所需要树结构 + * + * @param depts 部门列表 + * @return 树结构列表 + */ + public List buildDeptTree(List depts); + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + public List buildDeptTreeSelect(List depts); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + public List selectDeptListByRoleId(Long roleId); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + public Dept selectDeptById(Long deptId); + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + public int selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在部门子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + public boolean hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + public boolean checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + public String checkDeptNameUnique(Dept dept); + + /** + * 新增保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int insertDept(Dept dept); + + /** + * 修改保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + public int updateDept(Dept dept); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + public int deleteDeptById(Long deptId); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/DictDataService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/DictDataService.java new file mode 100644 index 0000000..e87ad12 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/DictDataService.java @@ -0,0 +1,61 @@ +package com.ebts.system.service; + +import java.util.List; + +import com.ebts.common.core.entity.entity.DictData; + +/** + * 字典 业务层 + * + * @author binlin + */ +public interface DictDataService { + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + public List selectDictDataList(DictData dictData); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + public String selectDictLabel(String dictType, String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + public DictData selectDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + * @return 结果 + */ + public int deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int insertDictData(DictData dictData); + + /** + * 修改保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + public int updateDictData(DictData dictData); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/DictTypeService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/DictTypeService.java new file mode 100644 index 0000000..a3ce91e --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/DictTypeService.java @@ -0,0 +1,89 @@ +package com.ebts.system.service; + +import java.util.List; + +import com.ebts.common.core.entity.entity.DictData; +import com.ebts.common.core.entity.entity.DictType; + +/** + * 字典 业务层 + * + * @author binlin + */ +public interface DictTypeService { + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + public List selectDictTypeList(DictType dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + public List selectDictTypeAll(); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + public List selectDictDataByType(String dictType); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + public DictType selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + public DictType selectDictTypeByType(String dictType); + + /** + * 批量删除字典信息 + * + * @param dictIds 需要删除的字典ID + * @return 结果 + */ + public int deleteDictTypeByIds(Long[] dictIds); + + /** + * 清空缓存数据 + */ + public void clearCache(); + + /** + * 新增保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int insertDictType(DictType dictType); + + /** + * 修改保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + public int updateDictType(DictType dictType); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + public String checkDictTypeUnique(DictType dictType); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/FileService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/FileService.java new file mode 100644 index 0000000..3514106 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/FileService.java @@ -0,0 +1,79 @@ +package com.ebts.system.service; + +import java.util.List; + +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.utils.ServerResult; +import com.ebts.system.entity.SysFile; + +/** + * 文件信息Service接口 + * + * @author binlin + * @date 2021-02-17 + */ +public interface FileService { + /** + * 查询文件信息 + * + * @param fileId 文件信息ID + * @return 文件信息 + */ + ServerResult selectFileById(Long fileId); + + /** + * 查询文件信息列表 + * + * @param sysFile 文件信息 + * @return 文件信息集合 + */ + ServerResult> selectFileList(SysFile sysFile); + + /** + * 查询文件夹基本信息 + * @return + */ + ServerResult> selectFileFolder(); + + /** + * 新增文件信息 + * + * @param sysFile 文件信息 + * @return 结果 + */ + ServerResult insertFile(SysFile sysFile); + + /** + * 修改文件信息 + * + * @param sysFile 文件信息 + * @return 结果 + */ + ServerResult updateFile(SysFile sysFile); + + /** + * 批量删除文件信息 + * + * @param fileIds 需要删除的文件信息ID + * @return 结果 + */ + ServerResult deleteFileByIds(Long[] fileIds); + + /** + * 删除文件信息信息 + * + * @param fileId 文件信息ID + * @return 结果 + */ + ServerResult deleteFileById(Long fileId); + + /** + * 下载指定文件 + * + * @param fileId + * @param loginUser + * @return + */ + ServerResult downloadFile(Long fileId, LoginUser loginUser); + +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/LogininforService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/LogininforService.java new file mode 100644 index 0000000..aacb0f1 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/LogininforService.java @@ -0,0 +1,40 @@ +package com.ebts.system.service; + +import java.util.List; + +import com.ebts.system.entity.Logininfor; + +/** + * 系统访问日志情况信息 服务层 + * + * @author binlin + */ +public interface LogininforService { + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + public void insertLogininfor(Logininfor logininfor); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + public List selectLogininforList(Logininfor logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return + */ + public int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + */ + public void cleanLogininfor(); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/MenuService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/MenuService.java new file mode 100644 index 0000000..2d4ef8e --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/MenuService.java @@ -0,0 +1,136 @@ +package com.ebts.system.service; + +import java.util.List; +import java.util.Set; + +import com.ebts.common.core.entity.TreeSelect; +import com.ebts.common.core.entity.entity.Menu; +import com.ebts.system.entity.vo.RouterVo; + +/** + * 菜单 业务层 + * + * @author binlin + */ +public interface MenuService { + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuList(Long userId); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuList(Menu menu, Long userId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public Set selectMenuPermsByUserId(Long userId); + + /** + * 根据用户ID查询菜单树信息 + * + * @param userId 用户ID + * @return 菜单列表 + */ + public List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + public List selectMenuListByRoleId(Long roleId); + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + public List buildMenus(List menus); + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + public List buildMenuTree(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + public List buildMenuTreeSelect(List menus); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + public Menu selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + public boolean hasChildByMenuId(Long menuId); + + /** + * 查询菜单是否存在角色 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + public boolean checkMenuExistRole(Long menuId); + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int insertMenu(Menu menu); + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + public int updateMenu(Menu menu); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + public int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + public String checkMenuNameUnique(Menu menu); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/NoticeService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/NoticeService.java new file mode 100644 index 0000000..91ac892 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/NoticeService.java @@ -0,0 +1,60 @@ +package com.ebts.system.service; + +import java.util.List; + +import com.ebts.system.entity.Notice; + +/** + * 公告 服务层 + * + * @author binlin + */ +public interface NoticeService { + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + public Notice selectNoticeById(Long noticeId); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + public List selectNoticeList(Notice notice); + + /** + * 新增公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int insertNotice(Notice notice); + + /** + * 修改公告 + * + * @param notice 公告信息 + * @return 结果 + */ + public int updateNotice(Notice notice); + + /** + * 删除公告信息 + * + * @param noticeId 公告ID + * @return 结果 + */ + public int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + public int deleteNoticeByIds(Long[] noticeIds); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/OperLogService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/OperLogService.java new file mode 100644 index 0000000..34d90fc --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/OperLogService.java @@ -0,0 +1,48 @@ +package com.ebts.system.service; + +import java.util.List; + +import com.ebts.system.entity.OperLog; + +/** + * 操作日志 服务层 + * + * @author binlin + */ +public interface OperLogService { + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + public void insertOperlog(OperLog operLog); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + public List selectOperLogList(OperLog operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + public int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + public OperLog selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + public void cleanOperLog(); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/PostService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/PostService.java new file mode 100644 index 0000000..dd4ae08 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/PostService.java @@ -0,0 +1,100 @@ +package com.ebts.system.service; + +import java.util.List; + +import com.ebts.system.entity.Post; + +/** + * 岗位信息 服务层 + * + * @author binlin + */ +public interface PostService { + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位列表 + */ + public List selectPostList(Post post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + public List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + public Post selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + public List selectPostListByUserId(Long userId); + + /** + * 校验岗位名称 + * + * @param post 岗位信息 + * @return 结果 + */ + public String checkPostNameUnique(Post post); + + /** + * 校验岗位编码 + * + * @param post 岗位信息 + * @return 结果 + */ + public String checkPostCodeUnique(Post post); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + public int countUserPostById(Long postId); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + public int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + * @throws Exception 异常 + */ + public int deletePostByIds(Long[] postIds); + + /** + * 新增保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int insertPost(Post post); + + /** + * 修改保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + public int updatePost(Post post); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/RealQueryService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/RealQueryService.java new file mode 100644 index 0000000..11fe9f6 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/RealQueryService.java @@ -0,0 +1,31 @@ +package com.ebts.system.service; + +import com.ebts.common.utils.ServerResult; +import com.ebts.system.entity.RealUniQuery; + +import java.util.List; +import java.util.Map; + +/** + * @Author 18209 + * @Date 2021/2/22 18:03 + * @Version 1.0 + */ +public interface RealQueryService { + /** + * 获取查询信息 + * @param realUniQuery + * @param type + * @return + */ + ServerResult>> RealData(RealUniQuery realUniQuery, Integer type); + + + /** + * 获取真实查询基本信息 + * + * @param id + * @return + */ + ServerResult> RealInfo(Long id); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/RoleService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/RoleService.java new file mode 100644 index 0000000..3c2da75 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/RoleService.java @@ -0,0 +1,132 @@ +package com.ebts.system.service; + +import java.util.List; +import java.util.Set; + +import com.ebts.common.core.entity.entity.Role; + +/** + * 角色业务层 + * + * @author binlin + */ +public interface RoleService { + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + public List selectRoleList(Role role); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 权限列表 + */ + public Set selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @param type + * @return 角色列表 + */ + public List selectRoleAll(Integer type); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + public List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + public Role selectRoleById(Long roleId); + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + public String checkRoleNameUnique(Role role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + public String checkRoleKeyUnique(Role role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + public void checkRoleAllowed(Role role); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + public int countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int insertRole(Role role); + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRole(Role role); + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + public int updateRoleStatus(Role role); + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + public int authDataScope(Role role); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + public int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/SequenceService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/SequenceService.java new file mode 100644 index 0000000..12b34e6 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/SequenceService.java @@ -0,0 +1,23 @@ +package com.ebts.system.service; + +/** + * @Author 18209 + * @Date 2021/2/24 17:56 + * @Version 1.0 + */ +public interface SequenceService { + /** + * 当前值 + * @param tableName + * @return + */ + Long currval(String tableName); + + /** + * 下一个值 + * @param tableName + * @return + */ + Long nextval(String tableName); + +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/UserOnlineService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/UserOnlineService.java new file mode 100644 index 0000000..06c5016 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/UserOnlineService.java @@ -0,0 +1,47 @@ +package com.ebts.system.service; + +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.system.entity.UserOnline; + +/** + * 在线用户 服务层 + * + * @author binlin + */ +public interface UserOnlineService { + /** + * 通过登录地址查询信息 + * + * @param ipaddr 登录地址 + * @param user 用户信息 + * @return 在线用户信息 + */ + public UserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user); + + /** + * 通过用户名称查询信息 + * + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + public UserOnline selectOnlineByUserName(String userName, LoginUser user); + + /** + * 通过登录地址/用户名称查询信息 + * + * @param ipaddr 登录地址 + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + public UserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user); + + /** + * 设置在线用户信息 + * + * @param user 用户信息 + * @return 在线用户 + */ + public UserOnline loginUserToUserOnline(LoginUser user); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/UserService.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/UserService.java new file mode 100644 index 0000000..5eb2a52 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/UserService.java @@ -0,0 +1,167 @@ +package com.ebts.system.service; + +import java.util.List; + +import com.ebts.common.core.entity.entity.User; + +/** + * 用户 业务层 + * + * @author binlin + */ +public interface UserService { + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + public List selectUserList(User user); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + public User selectUserByUserName(String userName); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + public User selectUserById(Long userId); + + /** + * 根据用户ID查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + public String selectUserRoleGroup(String userName); + + /** + * 根据用户ID查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + public String selectUserPostGroup(String userName); + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + public String checkUserNameUnique(String userName); + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public String checkPhoneUnique(User user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + public String checkEmailUnique(User user); + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + public void checkUserAllowed(User user); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int insertUser(User user); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(User user); + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserStatus(User user); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUserProfile(User user); + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + public boolean updateUserAvatar(String userName, String avatar); + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + public int resetPwd(User user); + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + public int resetUserPwd(String userName, String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + public int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); + + /** + * 导入用户数据 + * + * @param userList 用户数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + public String importUser(List userList, Boolean isUpdateSupport, Long operName); +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/ConfigServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/ConfigServiceImpl.java new file mode 100644 index 0000000..fd5348e --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/ConfigServiceImpl.java @@ -0,0 +1,233 @@ +package com.ebts.system.service.impl; + +import java.util.Collection; +import java.util.List; +import javax.annotation.PostConstruct; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.common.annotation.DataSource; +import com.ebts.common.constant.Constants; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.redis.RedisCache; +import com.ebts.common.core.text.Convert; +import com.ebts.common.enums.DataSourceType; +import com.ebts.common.exception.CustomException; +import com.ebts.common.utils.StringUtils; +import com.ebts.system.entity.Config; +import com.ebts.system.dao.ConfigDao; +import com.ebts.system.service.ConfigService; + +/** + * 参数配置 服务层实现 + * + * @author binlin + */ +@Service +public class ConfigServiceImpl implements ConfigService { + private Logger logger = LoggerFactory.getLogger(ConfigServiceImpl.class); + @Autowired + private ConfigDao configMapper; + + @Autowired + private RedisCache redisCache; + + /** + * 项目启动时,初始化参数到缓存 + */ + @PostConstruct + public void init() { + try { + List configsList = configMapper.selectConfigList(new Config()); + for (Config config : configsList) { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + @Override + @DataSource(DataSourceType.MASTER) + public Config selectConfigById(Long configId) { + try { + Config config = new Config(); + config.setConfigId(configId); + return configMapper.selectConfig(config); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数key + * @return 参数键值 + */ + @Override + public String selectConfigByKey(String configKey) { + try { + String configValue = Convert.toStr(redisCache.getCacheObject(getCacheKey(configKey))); + if (StringUtils.isNotEmpty(configValue)) { + return configValue; + } + Config config = new Config(); + config.setConfigKey(configKey); + Config retConfig = configMapper.selectConfig(config); + if (StringUtils.isNotNull(retConfig)) { + redisCache.setCacheObject(getCacheKey(configKey), retConfig.getConfigValue()); + return retConfig.getConfigValue(); + } + return StringUtils.EMPTY; + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + @Override + public List selectConfigList(Config config) { + try { + return configMapper.selectConfigList(config); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public int insertConfig(Config config) { + try { + int row = configMapper.insertConfig(config); + if (row > 0) { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改参数配置 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public int updateConfig(Config config) { + try { + int row = configMapper.updateConfig(config); + if (row > 0) { + redisCache.setCacheObject(getCacheKey(config.getConfigKey()), config.getConfigValue()); + } + return row; + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + * @return 结果 + */ + @Override + public int deleteConfigByIds(Long[] configIds) { + try { + for (Long configId : configIds) { + Config config = selectConfigById(configId); + if (StringUtils.equals(UserConstants.YES, config.getConfigType())) { + throw new CustomException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + } + } + int count = configMapper.deleteConfigByIds(configIds); + if (count > 0) { + Collection keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*"); + redisCache.deleteObject(keys); + } + return count; + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 清空缓存数据 + */ + @Override + public void clearCache() { + try { + Collection keys = redisCache.keys(Constants.SYS_CONFIG_KEY + "*"); + redisCache.deleteObject(keys); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验参数键名是否唯一 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public String checkConfigKeyUnique(Config config) { + try { + Long configId = StringUtils.isNull(config.getConfigId()) ? -1L : config.getConfigId(); + Config info = configMapper.checkConfigKeyUnique(config.getConfigKey()); + if (StringUtils.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 设置cache key + * + * @param configKey 参数键 + * @return 缓存键key + */ + private String getCacheKey(String configKey) { + try { + return Constants.SYS_CONFIG_KEY + configKey; + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DeptServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DeptServiceImpl.java new file mode 100644 index 0000000..2433bb8 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DeptServiceImpl.java @@ -0,0 +1,351 @@ +package com.ebts.system.service.impl; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.common.annotation.DataScope; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.entity.TreeSelect; +import com.ebts.common.core.entity.entity.Dept; +import com.ebts.common.core.entity.entity.Role; +import com.ebts.common.exception.CustomException; +import com.ebts.common.utils.StringUtils; +import com.ebts.system.dao.DeptDao; +import com.ebts.system.dao.RoleDao; +import com.ebts.system.service.DeptService; + +/** + * 部门管理 服务实现 + * + * @author binlin + */ +@Service +public class DeptServiceImpl implements DeptService { + private Logger logger = LoggerFactory.getLogger(DeptServiceImpl.class); + + @Autowired + private DeptDao sysDeptDao; + + @Autowired + private RoleDao roleDao; + + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + @Override + @DataScope(deptAlias = "d") + public List selectDeptList(Dept dept) { + try { + return sysDeptDao.selectDeptList(dept); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 构建前端所需要树结构 + * + * @param depts 部门列表 + * @return 树结构列表 + */ + @Override + public List buildDeptTree(List depts) { + try { + List returnList = new ArrayList(); + List tempList = new ArrayList(); + for (Dept dept : depts) { + tempList.add(dept.getDeptId()); + } + for (Iterator iterator = depts.iterator(); iterator.hasNext(); ) { + Dept dept = (Dept) iterator.next(); + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(dept.getParentId())) { + recursionFn(depts, dept); + returnList.add(dept); + } + } + if (returnList.isEmpty()) { + returnList = depts; + } + return returnList; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + @Override + public List buildDeptTreeSelect(List depts) { + try { + List deptTrees = buildDeptTree(depts); + return deptTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + @Override + public List selectDeptListByRoleId(Long roleId) { + try { + Role role = roleDao.selectRoleById(roleId); + return sysDeptDao.selectDeptListByRoleId(roleId, role.isDeptCheckStrictly()); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + @Override + public Dept selectDeptById(Long deptId) { + try { + return sysDeptDao.selectDeptById(deptId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据ID查询所有子部门(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + @Override + public int selectNormalChildrenDeptById(Long deptId) { + try { + return sysDeptDao.selectNormalChildrenDeptById(deptId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public boolean hasChildByDeptId(Long deptId) { + try { + int result = sysDeptDao.hasChildByDeptId(deptId); + return result > 0 ? true : false; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + @Override + public boolean checkDeptExistUser(Long deptId) { + try { + int result = sysDeptDao.checkDeptExistUser(deptId); + return result > 0 ? true : false; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public String checkDeptNameUnique(Dept dept) { + try { + Long deptId = StringUtils.isNull(dept.getDeptId()) ? -1L : dept.getDeptId(); + Dept info = sysDeptDao.checkDeptNameUnique(dept.getDeptName(), dept.getParentId()); + if (StringUtils.isNotNull(info) && info.getDeptId().longValue() != deptId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public int insertDept(Dept dept) { + try { + Dept info = sysDeptDao.selectDeptById(dept.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { + throw new CustomException("部门停用,不允许新增"); + } + dept.setAncestors(info.getAncestors() + "," + dept.getParentId()); + return sysDeptDao.insertDept(dept); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改保存部门信息 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public int updateDept(Dept dept) { + try { + Dept newParentDept = sysDeptDao.selectDeptById(dept.getParentId()); + Dept oldDept = sysDeptDao.selectDeptById(dept.getDeptId()); + if (StringUtils.isNotNull(newParentDept) && StringUtils.isNotNull(oldDept)) { + String newAncestors = newParentDept.getAncestors() + "," + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + } + int result = sysDeptDao.updateDept(dept); + if (UserConstants.DEPT_NORMAL.equals(dept.getStatus())) { + // 如果该部门是启用状态,则启用该部门的所有上级部门 + updateParentDeptStatus(dept); + } + return result; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改该部门的父级部门状态 + * + * @param dept 当前部门 + */ + private void updateParentDeptStatus(Dept dept) { + try { + Long updateBy = dept.getUpdateBy(); + dept = sysDeptDao.selectDeptById(dept.getDeptId()); + dept.setUpdateBy(updateBy); + sysDeptDao.updateDeptStatus(dept); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改子元素关系 + * + * @param deptId 被修改的部门ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { + try { + List children = sysDeptDao.selectChildrenDeptById(deptId); + for (Dept child : children) { + child.setAncestors(child.getAncestors().replace(oldAncestors, newAncestors)); + } + if (children.size() > 0) { + sysDeptDao.updateDeptChildren(children); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public int deleteDeptById(Long deptId) { + try { + return sysDeptDao.deleteDeptById(deptId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 递归列表 + */ + private void recursionFn(List list, Dept t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (Dept tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, Dept t) { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) { + Dept n = (Dept) it.next(); + if (StringUtils.isNotNull(n.getParentId()) && n.getParentId().longValue() == t.getDeptId().longValue()) { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, Dept t) { + return getChildList(list, t).size() > 0 ? true : false; + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DictDataServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DictDataServiceImpl.java new file mode 100644 index 0000000..9f08686 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DictDataServiceImpl.java @@ -0,0 +1,111 @@ +package com.ebts.system.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.CustomException; +import com.ebts.common.exception.EbtsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.common.core.entity.entity.DictData; +import com.ebts.common.utils.DictUtils; +import com.ebts.system.dao.DictDataDao; +import com.ebts.system.service.DictDataService; + +/** + * 字典 业务层处理 + * + * @author binlin + */ +@Service +public class DictDataServiceImpl implements DictDataService { + private Logger logger = LoggerFactory.getLogger(DictDataServiceImpl.class); + @Autowired + private DictDataDao dictDataDao; + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataList(DictData dictData) { + try { + return dictDataDao.selectDictDataList(dictData); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) { + return dictDataDao.selectDictLabel(dictType, dictValue); + } + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + @Override + public DictData selectDictDataById(Long dictCode) { + return dictDataDao.selectDictDataById(dictCode); + } + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + * @return 结果 + */ + @Override + public int deleteDictDataByIds(Long[] dictCodes) { + int row = dictDataDao.deleteDictDataByIds(dictCodes); + if (row > 0) { + DictUtils.clearDictCache(); + } + return row; + } + + /** + * 新增保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + @Override + public int insertDictData(DictData dictData) { + int row = dictDataDao.insertDictData(dictData); + if (row > 0) { + DictUtils.clearDictCache(); + } + return row; + } + + /** + * 修改保存字典数据信息 + * + * @param dictData 字典数据信息 + * @return 结果 + */ + @Override + public int updateDictData(DictData dictData) { + int row = dictDataDao.updateDictData(dictData); + if (row > 0) { + DictUtils.clearDictCache(); + } + return row; + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DictTypeServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DictTypeServiceImpl.java new file mode 100644 index 0000000..45f73e4 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/DictTypeServiceImpl.java @@ -0,0 +1,247 @@ +package com.ebts.system.service.impl; + +import java.util.List; +import javax.annotation.PostConstruct; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +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.ebts.common.constant.UserConstants; +import com.ebts.common.core.entity.entity.DictData; +import com.ebts.common.core.entity.entity.DictType; +import com.ebts.common.exception.CustomException; +import com.ebts.common.utils.DictUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.system.dao.DictDataDao; +import com.ebts.system.dao.DictTypeDao; +import com.ebts.system.service.DictTypeService; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +/** + * 字典 业务层处理 + * + * @author binlin + */ +@Service +public class DictTypeServiceImpl implements DictTypeService { + private Logger logger = LoggerFactory.getLogger(DictTypeServiceImpl.class); + + @Autowired + private DictTypeDao dictTypeMapper; + + @Autowired + private DictDataDao dictDataMapper; + + /** + * 项目启动时,初始化字典到缓存 + */ + @PostConstruct + public void init() { + try { + List dictTypeList = dictTypeMapper.selectDictTypeAll(); + for (DictType dictType : dictTypeList) { + List dictDatas = dictDataMapper.selectDictDataByType(dictType.getDictType()); + DictUtils.setDictCache(dictType.getDictType(), dictDatas); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeList(DictType dictType) { + try { + return dictTypeMapper.selectDictTypeList(dictType); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeAll() { + try { + return dictTypeMapper.selectDictTypeAll(); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataByType(String dictType) { + try { + List dictDatas = DictUtils.getDictCache(dictType); + if (StringUtils.isNotEmpty(dictDatas)) { + return dictDatas; + } + dictDatas = dictDataMapper.selectDictDataByType(dictType); + if (StringUtils.isNotEmpty(dictDatas)) { + DictUtils.setDictCache(dictType, dictDatas); + return dictDatas; + } + return null; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + @Override + public DictType selectDictTypeById(Long dictId) { + try { + return dictTypeMapper.selectDictTypeById(dictId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + @Override + public DictType selectDictTypeByType(String dictType) { + try { + return dictTypeMapper.selectDictTypeByType(dictType); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + * @return 结果 + */ + @Override + public int deleteDictTypeByIds(Long[] dictIds) { + try { + for (Long dictId : dictIds) { + DictType dictType = selectDictTypeById(dictId); + if (dictDataMapper.countDictDataByType(dictType.getDictType()) > 0) { + throw new CustomException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + } + int count = dictTypeMapper.deleteDictTypeByIds(dictIds); + if (count > 0) { + DictUtils.clearDictCache(); + } + return count; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 清空缓存数据 + */ + @Override + public void clearCache() { + try { + DictUtils.clearDictCache(); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + @Override + public int insertDictType(DictType dictType) { + try { + int row = dictTypeMapper.insertDictType(dictType); + if (row > 0) { + DictUtils.clearDictCache(); + } + return row; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改保存字典类型信息 + * + * @param dictType 字典类型信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateDictType(DictType dictType) { + try { + DictType oldDict = dictTypeMapper.selectDictTypeById(dictType.getDictId()); + dictDataMapper.updateDictDataType(oldDict.getDictType(), dictType.getDictType()); + int row = dictTypeMapper.updateDictType(dictType); + if (row > 0) { + DictUtils.clearDictCache(); + } + return row; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验字典类型称是否唯一 + * + * @param dict 字典类型 + * @return 结果 + */ + @Override + public String checkDictTypeUnique(DictType dict) { + try { + Long dictId = StringUtils.isNull(dict.getDictId()) ? -1L : dict.getDictId(); + DictType dictType = dictTypeMapper.checkDictTypeUnique(dict.getDictType()); + if (StringUtils.isNotNull(dictType) && dictType.getDictId().longValue() != dictId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/FileServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/FileServiceImpl.java new file mode 100644 index 0000000..bfaa966 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/FileServiceImpl.java @@ -0,0 +1,257 @@ +package com.ebts.system.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.core.entity.entity.Role; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.exception.EbtsException; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.ServerResult; +import com.ebts.system.entity.SysFile; +import com.ebts.system.utils.FtpUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.system.dao.FileDao; +import com.ebts.system.service.FileService; + +/** + * 文件信息Service业务层处理 + * + * @author binlin + * @date 2021-02-17 + */ +@Service +public class FileServiceImpl implements FileService { + private Logger logger = LoggerFactory.getLogger(FileServiceImpl.class); + + @Autowired + private FileDao fileDao; + + + /** + * 查询文件信息 + * + * @param fileId 文件信息ID + * @return 文件信息 + */ + @Override + public ServerResult selectFileById(Long fileId) { + try { + SysFile sysFile = fileDao.selectFileById(fileId); + if (sysFile != null) { + return new ServerResult<>(true, sysFile); + } else { + return new ServerResult<>(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询文件信息列表 + * + * @param sysFile 文件信息 + * @return 文件信息 + */ + @Override + public ServerResult> selectFileList(SysFile sysFile) { + try { + List sysFileList = fileDao.selectFileList(sysFile); + if (sysFileList.size() > 0) { + return new ServerResult>(true, sysFileList); + } else { + return new ServerResult>(false, ReturnConstants.RESULT_EMPTY); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + @Override + public ServerResult> selectFileFolder() { + try { + List sysFiles = fileDao.selectFileFolder(); + return new ServerResult<>(true, sysFiles); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增文件信息 + * + * @param sysFile 文件信息 + * @return 结果 + */ + @Override + public ServerResult insertFile(SysFile sysFile) { + try { + if (sysFile == null) { + return new ServerResult<>(false, "文件上传失败!"); + } + if (sysFile.getpId() != null) { + if (sysFile.getpId() > 0) { + SysFile folder = fileDao.selectFileById(sysFile.getpId()); + sysFile.setInherit(folder.getRoleIds()); + } + } + sysFile.setCreateBy(SecurityUtils.getUserId()); + try { + sysFile = FtpUtils.uploadFtp(sysFile); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + return new ServerResult<>(false, "文件处理出错,请重新上传文件!"); + } + Integer renewal = fileDao.insertFile(sysFile); + if (renewal > 0) { + return new ServerResult<>(true, sysFile); + } else { + return new ServerResult<>(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改文件信息 + * + * @param sysFile 文件信息 + * @return 结果 + */ + @Override + public ServerResult updateFile(SysFile sysFile) { + try { + if (sysFile.getIsPublic().equals("1")){ + return new ServerResult<>(false,"此文件不可修改!"); + } + if (sysFile.getpId() != null || sysFile.getpId() > 0) { + SysFile folder = fileDao.selectFileById(sysFile.getpId()); + sysFile.setInherit(folder.getRoleIds()); + } + sysFile.setUpdateBy(SecurityUtils.getUserId()); + Integer renewal = fileDao.updateFile(sysFile); + if (renewal > 0) { + return new ServerResult<>(true, renewal); + } else { + return new ServerResult<>(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除文件信息 + * + * @param fileIds 需要删除的文件信息ID + * @return 结果 + */ + @Override + public ServerResult deleteFileByIds(Long[] fileIds) { + try { + List sysFiles = new ArrayList<>(); + SysFile sysFile = null; + for (Long fileId : fileIds) { + sysFile = fileDao.selectFileById(fileId); + sysFiles.add(sysFile); + } + if (!FtpUtils.deleteFile(sysFiles)) { + return new ServerResult<>(false, ReturnConstants.OP_ERROR); + } + Integer renewal = fileDao.deleteFileByIds(fileIds); + if (renewal > 0) { + return new ServerResult<>(true, renewal); + } else { + return new ServerResult<>(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + return new ServerResult(false, ReturnConstants.DB_EX); + } + } + + /** + * 下载文件 + * @param fileId + * @param loginUser + * @return + */ + @Override + public ServerResult downloadFile(Long fileId, LoginUser loginUser) { + try { + SysFile sysFile = fileDao.selectFileById(fileId); + if (sysFile.getIsPublic().equals("2")) { + if (loginUser == null) { + return new ServerResult<>(false, "请登录后再试!"); + } else { + if (!loginUser.getUser().isAdmin()) { + String roleid; + if (sysFile.getpId() != 0) { + roleid = sysFile.getInherit() + "," + sysFile.getRoleIds(); + } else { + roleid = sysFile.getRoleIds(); + } + String[] roleIds = roleid.split(","); + boolean start = true; + for (Role role : loginUser.getUser().getRoles()) { + for (String roleId : roleIds) { + if (String.valueOf(role.getRoleId()).equals(roleId)) { + start = false; + break; + } + } + if (!start) { + break; + } + } + if (start) { + return new ServerResult<>(false, "您没有下载该文件的权限!"); + } + } + } + } + String fileName = FtpUtils.downloadFile(sysFile); + if (fileName == null) { + return new ServerResult<>(false, "文件下载失败!"); + } else { + return new ServerResult<>(true, sysFile); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除文件信息信息 + * + * @param fileId 文件信息ID + * @return 结果 + */ + @Override + public ServerResult deleteFileById(Long fileId) { + try { + Integer renewal = fileDao.deleteFileById(fileId); + if (renewal > 0) { + return new ServerResult<>(true, renewal); + } else { + return new ServerResult<>(false, ReturnConstants.SYS_FAILL); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/LogininforServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/LogininforServiceImpl.java new file mode 100644 index 0000000..9d34c0f --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/LogininforServiceImpl.java @@ -0,0 +1,87 @@ +package com.ebts.system.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.CustomException; +import com.ebts.common.exception.EbtsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.system.entity.Logininfor; +import com.ebts.system.dao.LogininforDao; +import com.ebts.system.service.LogininforService; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author binlin + */ +@Service +public class LogininforServiceImpl implements LogininforService { + private Logger logger = LoggerFactory.getLogger(LogininforServiceImpl.class); + + @Autowired + private LogininforDao logininforMapper; + + /** + * 新增系统登录日志 + * + * @param logininfor 访问日志对象 + */ + @Override + public void insertLogininfor(Logininfor logininfor) { + try { + logininforMapper.insertLogininfor(logininfor); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + @Override + public List selectLogininforList(Logininfor logininfor) { + try { + return logininforMapper.selectLogininforList(logininfor); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return + */ + @Override + public int deleteLogininforByIds(Long[] infoIds) { + try { + return logininforMapper.deleteLogininforByIds(infoIds); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 清空系统登录日志 + */ + @Override + public void cleanLogininfor() { + try { + logininforMapper.cleanLogininfor(); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/MenuServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/MenuServiceImpl.java new file mode 100644 index 0000000..417c390 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/MenuServiceImpl.java @@ -0,0 +1,482 @@ +package com.ebts.system.service.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.CustomException; +import com.ebts.common.exception.EbtsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.entity.TreeSelect; +import com.ebts.common.core.entity.entity.Menu; +import com.ebts.common.core.entity.entity.Role; +import com.ebts.common.core.entity.entity.User; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.system.entity.vo.MetaVo; +import com.ebts.system.entity.vo.RouterVo; +import com.ebts.system.dao.MenuDao; +import com.ebts.system.dao.RoleDao; +import com.ebts.system.dao.RoleMenuDao; +import com.ebts.system.service.MenuService; + +/** + * 菜单 业务层处理 + * + * @author binlin + */ +@Service +public class MenuServiceImpl implements MenuService { + private Logger logger = LoggerFactory.getLogger(MenuServiceImpl.class); + + public static final String PREMISSION_STRING = "perms[\"{0}\"]"; + + @Autowired + private MenuDao menuMapper; + + @Autowired + private RoleDao roleMapper; + + @Autowired + private RoleMenuDao roleMenuMapper; + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Override + public List selectMenuList(Long userId) { + try { + return selectMenuList(new Menu(), userId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + @Override + public List selectMenuList(Menu menu, Long userId) { + try { + List menuList = null; + // 管理员显示所有菜单信息 + if (User.isAdmin(userId)) { + menuList = menuMapper.selectMenuList(menu); + } else { + menu.getParams().put("userId", userId); + menuList = menuMapper.selectMenuListByUserId(menu); + } + return menuList; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) { + try { + List perms = menuMapper.selectMenuPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户名称 + * @return 菜单列表 + */ + @Override + public List selectMenuTreeByUserId(Long userId) { + try { + List menus = null; + if (SecurityUtils.isAdmin(userId)) { + menus = menuMapper.selectMenuTreeAll(); + } else { + menus = menuMapper.selectMenuTreeByUserId(userId); + } + return getChildPerms(menus, 0); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByRoleId(Long roleId) { + try { + Role role = roleMapper.selectRoleById(roleId); + return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List menus) { + try { + List routers = new LinkedList(); + for (Menu menu : menus) { + RouterVo router = new RouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(getRouteName(menu)); + router.setPath(getRouterPath(menu)); + router.setComponent(getComponent(menu)); + router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()))); + List cMenus = menu.getChildren(); + if (!cMenus.isEmpty() && cMenus.size() > 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } else if (isMeunFrame(menu)) { + List childrenList = new ArrayList(); + RouterVo children = new RouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(StringUtils.capitalize(menu.getPath())); + children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()))); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 构建前端所需要树结构 + * + * @param menus 菜单列表 + * @return 树结构列表 + */ + @Override + public List buildMenuTree(List menus) { + try { + List returnList = new ArrayList(); + List tempList = new ArrayList(); + for (Menu dept : menus) { + tempList.add(dept.getMenuId()); + } + for (Iterator iterator = menus.iterator(); iterator.hasNext(); ) { + Menu menu = (Menu) iterator.next(); + // 如果是顶级节点, 遍历该父节点的所有子节点 + if (!tempList.contains(menu.getParentId())) { + recursionFn(menus, menu); + returnList.add(menu); + } + } + if (returnList.isEmpty()) { + returnList = menus; + } + return returnList; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List buildMenuTreeSelect(List menus) { + try { + List menuTrees = buildMenuTree(menus); + return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + @Override + public Menu selectMenuById(Long menuId) { + try { + return menuMapper.selectMenuById(menuId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean hasChildByMenuId(Long menuId) { + try { + int result = menuMapper.hasChildByMenuId(menuId); + return result > 0 ? true : false; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) { + try { + int result = roleMenuMapper.checkMenuExistRole(menuId); + return result > 0 ? true : false; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int insertMenu(Menu menu) { + try { + return menuMapper.insertMenu(menu); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改保存菜单信息 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(Menu menu) { + try { + return menuMapper.updateMenu(menu); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) { + try { + return menuMapper.deleteMenuById(menuId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public String checkMenuNameUnique(Menu menu) { + try { + Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId(); + Menu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId()); + if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 获取路由名称 + * + * @param menu 菜单信息 + * @return 路由名称 + */ + public String getRouteName(Menu menu) { + String routerName = StringUtils.capitalize(menu.getPath()); + // 非外链并且是一级目录(类型为目录) + if (isMeunFrame(menu)) { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 获取路由地址 + * + * @param menu 菜单信息 + * @return 路由地址 + */ + public String getRouterPath(Menu menu) { + String routerPath = menu.getPath(); + // 非外链并且是一级目录(类型为目录) + if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) + && UserConstants.NO_FRAME.equals(menu.getIsFrame())) { + routerPath = "/" + menu.getPath(); + } + // 非外链并且是一级目录(类型为菜单) + else if (isMeunFrame(menu)) { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + * + * @param menu 菜单信息 + * @return 组件信息 + */ + public String getComponent(Menu menu) { + String component = UserConstants.LAYOUT; + if (StringUtils.isNotEmpty(menu.getComponent()) && !isMeunFrame(menu)) { + component = menu.getComponent(); + } + return component; + } + + /** + * 是否为菜单内部跳转 + * + * @param menu 菜单信息 + * @return 结果 + */ + public boolean isMeunFrame(Menu menu) { + return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType()) + && menu.getIsFrame().equals(UserConstants.NO_FRAME); + } + + /** + * 根据父节点的ID获取所有子节点 + * + * @param list 分类表 + * @param parentId 传入的父节点ID + * @return String + */ + public List getChildPerms(List list, int parentId) { + List returnList = new ArrayList(); + for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { + Menu t = (Menu) iterator.next(); + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId() == parentId) { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + * + * @param list + * @param t + */ + private void recursionFn(List list, Menu t) { + // 得到子节点列表 + List childList = getChildList(list, t); + t.setChildren(childList); + for (Menu tChild : childList) { + if (hasChild(list, tChild)) { + recursionFn(list, tChild); + } + } + } + + /** + * 得到子节点列表 + */ + private List getChildList(List list, Menu t) { + List tlist = new ArrayList(); + Iterator it = list.iterator(); + while (it.hasNext()) { + Menu n = (Menu) it.next(); + if (n.getParentId().longValue() == t.getMenuId().longValue()) { + tlist.add(n); + } + } + return tlist; + } + + /** + * 判断是否有子节点 + */ + private boolean hasChild(List list, Menu t) { + return getChildList(list, t).size() > 0 ? true : false; + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/NoticeServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/NoticeServiceImpl.java new file mode 100644 index 0000000..0162b4a --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/NoticeServiceImpl.java @@ -0,0 +1,123 @@ +package com.ebts.system.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.CustomException; +import com.ebts.common.exception.EbtsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.system.entity.Notice; +import com.ebts.system.dao.NoticeDao; +import com.ebts.system.service.NoticeService; + +/** + * 公告 服务层实现 + * + * @author binlin + */ +@Service +public class NoticeServiceImpl implements NoticeService { + private Logger logger = LoggerFactory.getLogger(NoticeServiceImpl.class); + + @Autowired + private NoticeDao noticeMapper; + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + @Override + public Notice selectNoticeById(Long noticeId) { + try { + return noticeMapper.selectNoticeById(noticeId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + @Override + public List selectNoticeList(Notice notice) { + try { + return noticeMapper.selectNoticeList(notice); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增公告 + * + * @param notice 公告信息 + * @return 结果 + */ + @Override + public int insertNotice(Notice notice) { + try { + return noticeMapper.insertNotice(notice); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改公告 + * + * @param notice 公告信息 + * @return 结果 + */ + @Override + public int updateNotice(Notice notice) { + try { + return noticeMapper.updateNotice(notice); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除公告对象 + * + * @param noticeId 公告ID + * @return 结果 + */ + @Override + public int deleteNoticeById(Long noticeId) { + try { + return noticeMapper.deleteNoticeById(noticeId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + @Override + public int deleteNoticeByIds(Long[] noticeIds) { + try { + return noticeMapper.deleteNoticeByIds(noticeIds); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/OperLogServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/OperLogServiceImpl.java new file mode 100644 index 0000000..1e2ffbd --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/OperLogServiceImpl.java @@ -0,0 +1,103 @@ +package com.ebts.system.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.CustomException; +import com.ebts.common.exception.EbtsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.system.entity.OperLog; +import com.ebts.system.dao.OperLogDao; +import com.ebts.system.service.OperLogService; + +/** + * 操作日志 服务层处理 + * + * @author binlin + */ +@Service +public class OperLogServiceImpl implements OperLogService { + private Logger logger = LoggerFactory.getLogger(OperLogServiceImpl.class); + + @Autowired + private OperLogDao operLogMapper; + + /** + * 新增操作日志 + * + * @param operLog 操作日志对象 + */ + @Override + public void insertOperlog(OperLog operLog) { + try { + operLogMapper.insertOperlog(operLog); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + @Override + public List selectOperLogList(OperLog operLog) { + try { + return operLogMapper.selectOperLogList(operLog); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + @Override + public int deleteOperLogByIds(Long[] operIds) { + try { + return operLogMapper.deleteOperLogByIds(operIds); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + @Override + public OperLog selectOperLogById(Long operId) { + try { + return operLogMapper.selectOperLogById(operId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 清空操作日志 + */ + @Override + public void cleanOperLog() { + try { + operLogMapper.cleanOperLog(); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/PostServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/PostServiceImpl.java new file mode 100644 index 0000000..3468685 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/PostServiceImpl.java @@ -0,0 +1,225 @@ +package com.ebts.system.service.impl; + +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.exception.CustomException; +import com.ebts.common.utils.StringUtils; +import com.ebts.system.entity.Post; +import com.ebts.system.dao.PostDao; +import com.ebts.system.dao.UserPostDao; +import com.ebts.system.service.PostService; + +/** + * 岗位信息 服务层处理 + * + * @author binlin + */ +@Service +public class PostServiceImpl implements PostService { + private Logger logger = LoggerFactory.getLogger(PostServiceImpl.class); + + @Autowired + private PostDao postMapper; + + @Autowired + private UserPostDao userPostMapper; + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位信息集合 + */ + @Override + public List selectPostList(Post post) { + try { + return postMapper.selectPostList(post); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + @Override + public List selectPostAll() { + try { + return postMapper.selectPostAll(); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + @Override + public Post selectPostById(Long postId) { + try { + return postMapper.selectPostById(postId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + @Override + public List selectPostListByUserId(Long userId) { + try { + return postMapper.selectPostListByUserId(userId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验岗位名称是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public String checkPostNameUnique(Post post) { + try { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + Post info = postMapper.checkPostNameUnique(post.getPostName()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public String checkPostCodeUnique(Post post) { + try { + Long postId = StringUtils.isNull(post.getPostId()) ? -1L : post.getPostId(); + Post info = postMapper.checkPostCodeUnique(post.getPostCode()); + if (StringUtils.isNotNull(info) && info.getPostId().longValue() != postId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int countUserPostById(Long postId) { + try { + return userPostMapper.countUserPostById(postId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int deletePostById(Long postId) { + try { + return postMapper.deletePostById(postId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + * @throws Exception 异常 + */ + @Override + public int deletePostByIds(Long[] postIds) { + try { + for (Long postId : postIds) { + Post post = selectPostById(postId); + if (countUserPostById(postId) > 0) { + throw new CustomException(String.format("%1$s已分配,不能删除", post.getPostName())); + } + } + return postMapper.deletePostByIds(postIds); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public int insertPost(Post post) { + try { + return postMapper.insertPost(post); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改保存岗位信息 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public int updatePost(Post post) { + try { + return postMapper.updatePost(post); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/RealQueryServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/RealQueryServiceImpl.java new file mode 100644 index 0000000..ae171e0 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/RealQueryServiceImpl.java @@ -0,0 +1,129 @@ +package com.ebts.system.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.ebts.common.exception.EbtsException; +import com.github.pagehelper.PageHelper; +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.utils.ServerResult; +import com.ebts.system.dao.RealQueryServiceDao; +import com.ebts.system.entity.RealUniCon; +import com.ebts.system.entity.RealUniQuery; +import com.ebts.system.service.RealQueryService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @Author 18209 + * @Date 2021/2/22 18:04 + * @Version 1.0 + */ +@Service +public class RealQueryServiceImpl implements RealQueryService { + private Logger logger = LoggerFactory.getLogger(RealQueryServiceImpl.class); + @Autowired + private RealQueryServiceDao realQueryServiceDao; + + + @Override + public ServerResult> RealInfo(Long id) { + try { + List uniCons = realQueryServiceDao.queryRealInfo(id); + return new ServerResult<>(true, uniCons); + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + @Override + public ServerResult>> RealData(RealUniQuery realUniQuery, Integer type) { + try { + List realUniCons = realUniQuery.getUniCons(); + Integer pageNum = null, pageSize = null; + if (type == 2) { + pageNum = realUniQuery.getPageNum(); + pageSize = realUniQuery.getPageSize(); + } + realUniQuery = realQueryServiceDao.selectRealUniQueryById(realUniQuery.getId()); + StringBuilder sql = new StringBuilder(realUniQuery.getUqSql().toLowerCase()); + if (realUniQuery.getIsRelease() == 0) { + return new ServerResult<>(false, ReturnConstants.STATE_ERROR); + } else { + if (realUniCons.size() > 0) { + sql.append(" where 1 = 1 "); + for (RealUniCon realUniCon : realUniCons) { + sql.append(conversionReal(realUniCon)); + } + } + if (type == 2) { + PageHelper.startPage(pageNum, pageSize, ""); + } + List> dataMap = realQueryServiceDao.realUniQuery(sql.toString()); + return new ServerResult<>(true, dataMap, realUniQuery.getUqName()); + } + } catch (RuntimeException e) { + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + public String conversionReal(RealUniCon realUniCon) { + if (realUniCon.getUcReal() == null&&!realUniCon.getUcReal().equals("")) { + return ""; + } else { + String sql = " and "; + switch (realUniCon.getUcCon()) { + case "EQ": + sql += realUniCon.getUcKey() + " = '" + realUniCon.getUcReal() + "'"; + break; + case "NE": + sql += realUniCon.getUcKey() + " != '" + realUniCon.getUcReal() + "'"; + break; + case "GT": + sql += realUniCon.getUcKey() + " > '" + realUniCon.getUcReal() + "'"; + break; + case "GTE": + sql += realUniCon.getUcKey() + " >= '" + realUniCon.getUcReal() + "'"; + break; + case "LT": + sql += realUniCon.getUcKey() + " < '" + realUniCon.getUcReal() + "'"; + break; + case "LTE": + sql += realUniCon.getUcKey() + " <= '" + realUniCon.getUcReal() + "'"; + break; + case "LIKE": + sql += realUniCon.getUcKey() + " like '%" + realUniCon.getUcReal() + "%'"; + break; + case "BETWEEN": + if (realUniCon.getUcType().equals("input")) { + JSONObject jsonObject = (JSONObject) JSONObject.toJSON(realUniCon.getUcReal()); + Object begin = jsonObject.get("begin"); + Object end = jsonObject.get("end"); + if (begin != null && end != null) { + sql += realUniCon.getUcKey() + " between '" + begin + "' AND '" + end + "'"; + } else { + sql = ""; + } + } else if (realUniCon.getUcType().equals("datetime")) { + List list = (ArrayList) realUniCon.getUcReal(); + if (list.size() == 2) { + String startTime = list.get(0); + String endTime = list.get(1); + sql += realUniCon.getUcKey() + " between '" + startTime + "' AND '" + endTime + "'"; + } else { + sql = ""; + } + } + break; + } + return sql; + } + } + +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/RoleServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/RoleServiceImpl.java new file mode 100644 index 0000000..4f77a25 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/RoleServiceImpl.java @@ -0,0 +1,366 @@ +package com.ebts.system.service.impl; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +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.ebts.common.annotation.DataScope; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.entity.entity.Role; +import com.ebts.common.exception.CustomException; +import com.ebts.common.utils.StringUtils; +import com.ebts.common.utils.spring.SpringUtils; +import com.ebts.system.entity.RoleDept; +import com.ebts.system.entity.RoleMenu; +import com.ebts.system.dao.RoleDeptDao; +import com.ebts.system.dao.RoleDao; +import com.ebts.system.dao.RoleMenuDao; +import com.ebts.system.dao.UserRoleDao; +import com.ebts.system.service.RoleService; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +/** + * 角色 业务层处理 + * + * @author binlin + */ +@Service +public class RoleServiceImpl implements RoleService { + private Logger logger = LoggerFactory.getLogger(RoleServiceImpl.class); + + @Autowired + private RoleDao roleMapper; + + @Autowired + private RoleMenuDao roleMenuMapper; + + @Autowired + private UserRoleDao userRoleMapper; + + @Autowired + private RoleDeptDao roleDeptMapper; + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + @Override + @DataScope(deptAlias = "d") + public List selectRoleList(Role role) { + try { + return roleMapper.selectRoleList(role); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectRolePermissionByUserId(Long userId) { + try { + List perms = roleMapper.selectRolePermissionByUserId(userId); + Set permsSet = new HashSet<>(); + for (Role perm : perms) { + if (StringUtils.isNotNull(perm)) { + permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(","))); + } + } + return permsSet; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询所有角色 + * + * @param type + * @return 角色列表 + */ + @Override + public List selectRoleAll(Integer type) { + try { + return SpringUtils.getAopProxy(this).selectRoleList(new Role(type)); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + @Override + public List selectRoleListByUserId(Long userId) { + try { + return roleMapper.selectRoleListByUserId(userId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + @Override + public Role selectRoleById(Long roleId) { + try { + return roleMapper.selectRoleById(roleId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public String checkRoleNameUnique(Role role) { + try { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + Role info = roleMapper.checkRoleNameUnique(role.getRoleName()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public String checkRoleKeyUnique(Role role) { + try { + Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId(); + Role info = roleMapper.checkRoleKeyUnique(role.getRoleKey()); + if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + @Override + public void checkRoleAllowed(Role role) { + try { + if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin()) { + throw new CustomException("不允许操作超级管理员角色"); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public int countUserRoleByRoleId(Long roleId) { + try { + return userRoleMapper.countUserRoleByRoleId(roleId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int insertRole(Role role) { + try { + // 新增角色信息 + roleMapper.insertRole(role); + return insertRoleMenu(role); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改保存角色信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int updateRole(Role role) { + try { + // 修改角色信息 + roleMapper.updateRole(role); + // 删除角色与菜单关联 + roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId()); + return insertRoleMenu(role); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改角色状态 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public int updateRoleStatus(Role role) { + try { + return roleMapper.updateRole(role); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改数据权限信息 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + @Transactional + public int authDataScope(Role role) { + try { + // 修改角色信息 + roleMapper.updateRole(role); + // 删除角色与部门关联 + roleDeptMapper.deleteRoleDeptByRoleId(role.getRoleId()); + // 新增角色和部门信息(数据权限) + return insertRoleDept(role); + }catch (RuntimeException e){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增角色菜单信息 + * + * @param role 角色对象 + */ + public int insertRoleMenu(Role role) { + int rows = 1; + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long menuId : role.getMenuIds()) { + RoleMenu rm = new RoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) { + rows = roleMenuMapper.batchRoleMenu(list); + } + return rows; + } + + /** + * 新增角色部门信息(数据权限) + * + * @param role 角色对象 + */ + public int insertRoleDept(Role role) { + int rows = 1; + // 新增角色与部门(数据权限)管理 + List list = new ArrayList(); + for (Long deptId : role.getDeptIds()) { + RoleDept rd = new RoleDept(); + rd.setRoleId(role.getRoleId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) { + rows = roleDeptMapper.batchRoleDept(list); + } + return rows; + } + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public int deleteRoleById(Long roleId) { + return roleMapper.deleteRoleById(roleId); + } + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + @Override + public int deleteRoleByIds(Long[] roleIds) { + for (Long roleId : roleIds) { + checkRoleAllowed(new Role(roleId)); + Role role = selectRoleById(roleId); + if (countUserRoleByRoleId(roleId) > 0) { + throw new CustomException(String.format("%1$s已分配,不能删除", role.getRoleName())); + } + } + return roleMapper.deleteRoleByIds(roleIds); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/SequenceServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/SequenceServiceImpl.java new file mode 100644 index 0000000..e5ea5d2 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/SequenceServiceImpl.java @@ -0,0 +1,31 @@ +package com.ebts.system.service.impl; + +import com.ebts.system.dao.SequenceDao; +import com.ebts.system.service.SequenceService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * @Author 18209 + * @Date 2021/2/24 17:56 + * @Version 1.0 + */ +@Service +public class SequenceServiceImpl implements SequenceService { + private Logger logger = LoggerFactory.getLogger(SequenceServiceImpl.class); + + @Autowired + private SequenceDao sequenceDao; + + @Override + public Long currval(String tableName) { + return sequenceDao.currval(tableName); + } + + @Override + public Long nextval(String tableName) { + return sequenceDao.nextval(tableName); + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/UserOnlineServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/UserOnlineServiceImpl.java new file mode 100644 index 0000000..6b38b56 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/UserOnlineServiceImpl.java @@ -0,0 +1,113 @@ +package com.ebts.system.service.impl; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.CustomException; +import com.ebts.common.exception.EbtsException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import com.ebts.common.core.entity.model.LoginUser; +import com.ebts.common.utils.StringUtils; +import com.ebts.system.entity.UserOnline; +import com.ebts.system.service.UserOnlineService; + +/** + * 在线用户 服务层处理 + * + * @author binlin + */ +@Service +public class UserOnlineServiceImpl implements UserOnlineService { + private Logger logger = LoggerFactory.getLogger(UserOnlineServiceImpl.class); + + /** + * 通过登录地址查询信息 + * + * @param ipaddr 登录地址 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public UserOnline selectOnlineByIpaddr(String ipaddr, LoginUser user) { + try { + if (StringUtils.equals(ipaddr, user.getIpaddr())) { + return loginUserToUserOnline(user); + } + return null; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 通过用户名称查询信息 + * + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public UserOnline selectOnlineByUserName(String userName, LoginUser user) { + try { + if (StringUtils.equals(userName, user.getUsername())) { + return loginUserToUserOnline(user); + } + return null; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 通过登录地址/用户名称查询信息 + * + * @param ipaddr 登录地址 + * @param userName 用户名称 + * @param user 用户信息 + * @return 在线用户信息 + */ + @Override + public UserOnline selectOnlineByInfo(String ipaddr, String userName, LoginUser user) { + try { + if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername())) { + return loginUserToUserOnline(user); + } + return null; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 设置在线用户信息 + * + * @param user 用户信息 + * @return 在线用户 + */ + @Override + public UserOnline loginUserToUserOnline(LoginUser user) { + try { + if (StringUtils.isNull(user) || StringUtils.isNull(user.getUser())) { + return null; + } + UserOnline userOnline = new UserOnline(); + userOnline.setTokenId(user.getToken()); + userOnline.setUserName(user.getUsername()); + userOnline.setIpaddr(user.getIpaddr()); + userOnline.setLoginLocation(user.getLoginLocation()); + userOnline.setBrowser(user.getBrowser()); + userOnline.setOs(user.getOs()); + userOnline.setLoginTime(user.getLoginTime()); + if (StringUtils.isNotNull(user.getUser().getDept())) { + userOnline.setDeptName(user.getUser().getDept().getDeptName()); + } + return userOnline; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/UserServiceImpl.java b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..676bba6 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/service/impl/UserServiceImpl.java @@ -0,0 +1,510 @@ +package com.ebts.system.service.impl; + +import java.util.ArrayList; +import java.util.List; + +import com.ebts.common.constant.ReturnConstants; +import com.ebts.common.exception.EbtsException; +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.ebts.common.annotation.DataScope; +import com.ebts.common.constant.UserConstants; +import com.ebts.common.core.entity.entity.Role; +import com.ebts.common.core.entity.entity.User; +import com.ebts.common.exception.CustomException; +import com.ebts.common.utils.SecurityUtils; +import com.ebts.common.utils.StringUtils; +import com.ebts.system.entity.Post; +import com.ebts.system.entity.UserPost; +import com.ebts.system.entity.UserRole; +import com.ebts.system.dao.PostDao; +import com.ebts.system.dao.RoleDao; +import com.ebts.system.dao.UserDao; +import com.ebts.system.dao.UserPostDao; +import com.ebts.system.dao.UserRoleDao; +import com.ebts.system.service.ConfigService; +import com.ebts.system.service.UserService; +import org.springframework.transaction.interceptor.TransactionAspectSupport; + +/** + * 用户 业务层处理 + * + * @author binlin + */ +@Service +public class UserServiceImpl implements UserService { + private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class); + + @Autowired + private UserDao userMapper; + + @Autowired + private RoleDao roleMapper; + + @Autowired + private PostDao postMapper; + + @Autowired + private UserRoleDao userRoleMapper; + + @Autowired + private UserPostDao userPostMapper; + + @Autowired + private ConfigService configService; + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + @DataScope(deptAlias = "d", userAlias = "u") + public List selectUserList(User user) { + try { + return userMapper.selectUserList(user); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + @Override + public User selectUserByUserName(String userName) { + try { + return userMapper.selectUserByUserName(userName); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public User selectUserById(Long userId) { + try { + return userMapper.selectUserById(userId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询用户所属角色组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserRoleGroup(String userName) { + try { + List list = roleMapper.selectRolesByUserName(userName); + StringBuffer idsStr = new StringBuffer(); + for (Role role : list) { + idsStr.append(role.getRoleName()).append(","); + } + if (StringUtils.isNotEmpty(idsStr.toString())) { + return idsStr.substring(0, idsStr.length() - 1); + } + return idsStr.toString(); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 查询用户所属岗位组 + * + * @param userName 用户名 + * @return 结果 + */ + @Override + public String selectUserPostGroup(String userName) { + try { + List list = postMapper.selectPostsByUserName(userName); + StringBuffer idsStr = new StringBuffer(); + for (Post post : list) { + idsStr.append(post.getPostName()).append(","); + } + if (StringUtils.isNotEmpty(idsStr.toString())) { + return idsStr.substring(0, idsStr.length() - 1); + } + return idsStr.toString(); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验用户名称是否唯一 + * + * @param userName 用户名称 + * @return 结果 + */ + @Override + public String checkUserNameUnique(String userName) { + try { + int count = userMapper.checkUserNameUnique(userName); + if (count > 0) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public String checkPhoneUnique(User user) { + try { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + User info = userMapper.checkPhoneUnique(user.getPhonenumber()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public String checkEmailUnique(User user) { + try { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + User info = userMapper.checkEmailUnique(user.getEmail()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + @Override + public void checkUserAllowed(User user) { + try { + if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) { + throw new CustomException("不允许操作超级管理员用户"); + } + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int insertUser(User user) { + try { + // 新增用户信息 + int rows = userMapper.insertUser(user); + // 新增用户岗位关联 + insertUserPost(user); + // 新增用户与角色管理 + insertUserRole(user); + return rows; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateUser(User user) { + try { + Long userId = user.getUserId(); + // 删除用户与角色关联 + userRoleMapper.deleteUserRoleByUserId(userId); + // 新增用户与角色管理 + insertUserRole(user); + // 删除用户与岗位关联 + userPostMapper.deleteUserPostByUserId(userId); + // 新增用户与岗位管理 + insertUserPost(user); + return userMapper.updateUser(user); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserStatus(User user) { + try { + return userMapper.updateUser(user); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserProfile(User user) { + try { + return userMapper.updateUser(user); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + @Override + public boolean updateUserAvatar(String userName, String avatar) { + try { + return userMapper.updateUserAvatar(userName, avatar) > 0; + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int resetPwd(User user) { + try { + return userMapper.updateUser(user); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + @Override + public int resetUserPwd(String userName, String password) { + try { + return userMapper.resetUserPwd(userName, password); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 新增用户角色信息 + * + * @param user 用户对象 + */ + public void insertUserRole(User user) { + Long[] roles = user.getRoleIds(); + if (StringUtils.isNotNull(roles)) { + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long roleId : roles) { + UserRole ur = new UserRole(); + ur.setUserId(user.getUserId()); + ur.setRoleId(roleId); + list.add(ur); + } + if (list.size() > 0) { + userRoleMapper.batchUserRole(list); + } + } + } + + /** + * 新增用户岗位信息 + * + * @param user 用户对象 + */ + public void insertUserPost(User user) { + Long[] posts = user.getPostIds(); + if (StringUtils.isNotNull(posts)) { + // 新增用户与岗位管理 + List list = new ArrayList(); + for (Long postId : posts) { + UserPost up = new UserPost(); + up.setUserId(user.getUserId()); + up.setPostId(postId); + list.add(up); + } + if (list.size() > 0) { + userPostMapper.batchUserPost(list); + } + } + } + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteUserById(Long userId) { + try { + // 删除用户与角色关联 + userRoleMapper.deleteUserRoleByUserId(userId); + // 删除用户与岗位表 + userPostMapper.deleteUserPostByUserId(userId); + return userMapper.deleteUserById(userId); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + @Override + public int deleteUserByIds(Long[] userIds) { + try { + for (Long userId : userIds) { + checkUserAllowed(new User(userId)); + } + return userMapper.deleteUserByIds(userIds); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } + + /** + * 导入用户数据 + * + * @param userList 用户数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public String importUser(List userList, Boolean isUpdateSupport, Long operName) { + try { + if (StringUtils.isNull(userList) || userList.size() == 0) { + throw new CustomException("导入用户数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + String password = configService.selectConfigByKey("sys.user.initPassword"); + for (User user : userList) { + try { + // 验证是否存在这个用户 + User u = userMapper.selectUserByUserName(user.getUserName()); + if (StringUtils.isNull(u)) { + user.setPassword(SecurityUtils.encryptPassword(password)); + user.setCreateBy(operName); + this.insertUser(user); + successNum++; + successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 导入成功"); + } else if (isUpdateSupport) { + user.setUpdateBy(operName); + this.updateUser(user); + successNum++; + successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 更新成功"); + } else { + failureNum++; + failureMsg.append("
" + failureNum + "、账号 " + user.getUserName() + " 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); + logger.error(msg, e); + } + } + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new CustomException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + }catch (RuntimeException e){ + logger.error(e.getMessage()); + throw new EbtsException(ReturnConstants.OP_ERROR,e); + } + } +} diff --git a/ebts/ebts-system/src/main/java/com/ebts/system/utils/FtpUtils.java b/ebts/ebts-system/src/main/java/com/ebts/system/utils/FtpUtils.java new file mode 100644 index 0000000..5042235 --- /dev/null +++ b/ebts/ebts-system/src/main/java/com/ebts/system/utils/FtpUtils.java @@ -0,0 +1,336 @@ +package com.ebts.system.utils; + + +import com.ebts.common.config.EBTSConfig; +import com.ebts.common.utils.DateUtils; +import com.ebts.common.utils.file.FileUtils; +import com.ebts.common.utils.uuid.IdUtils; +import com.ebts.system.entity.SysFile; +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPClientConfig; +import org.apache.commons.net.ftp.FTPReply; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +import java.util.List; + +/** + * @Author 18209 + * @Date 2021/2/18 15:34 + * @Version 1.0 + */ +@Component +@ConfigurationProperties(prefix = "ftp") +public class FtpUtils { + + private static Logger logger = LoggerFactory.getLogger(FtpUtils.class); + + private static String baseDir = "/profile"; + /** + * 公开目录 + */ + private static String pubfiles; + /** + * 保护目录 + */ + private static String prifiles; + + public static String getPubfiles() { + return pubfiles; + } + + //ftp服务器ip地址 + private static String ftpAddress; + //端口号 + private static int ftpPort; + //用户名 + private static String ftpUsername; + //密码 + private static String ftpPassword; + //字符集编码 + private static String encoding; + //静态资源域名 + private static String resources; + //后端部署域名 + private static String apiurl; + + + public static String getApiurl() { + return apiurl; + } + + public void setApiurl(String apiurl) { + FtpUtils.apiurl = apiurl; + } + + public static String getAvatarDir() { + return pubfiles + "avatar"; + } + + public void setPubfiles(String pubfiles) { + FtpUtils.pubfiles = pubfiles + "/"; + } + + public void setPrifiles(String prifiles) { + FtpUtils.prifiles = prifiles + "/"; + } + + public static String getResources() { + return resources; + } + + public void setResources(String resources) { + FtpUtils.resources = resources; + } + + public void setFtpAddress(String ftpAddress) { + FtpUtils.ftpAddress = ftpAddress; + } + + public void setFtpPort(int ftpPort) { + FtpUtils.ftpPort = ftpPort; + } + + public void setFtpUsername(String ftpUsername) { + FtpUtils.ftpUsername = ftpUsername; + } + + public void setFtpPassword(String ftpPassword) { + FtpUtils.ftpPassword = ftpPassword; + } + + public void setEncoding(String encoding) { + FtpUtils.encoding = encoding; + } + + /** + * 头像上传 + * @param file + * @return + */ + public static String uploadFtp(MultipartFile file) { + String avatarDir = getAvatarDir(); + String avatarName = IdUtils.fastUUID(); + InputStream inputStream = null; + try { + inputStream = file.getInputStream(); + } catch (IOException e) { + e.printStackTrace(); + } + FTPClient ftpClient = linkFtp(); + if (ftpClient == null) { + return null; + } + try { + String[] basePathList = avatarDir.split("/"); + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); + for (String path : basePathList) { + if (!ftpClient.changeWorkingDirectory(path)) { + ftpClient.makeDirectory(path); + ftpClient.changeWorkingDirectory(path); + } + } + ftpClient.enterLocalPassiveMode(); + ftpClient.storeFile(avatarName, inputStream); + inputStream.close(); + ftpClient.logout(); + } catch (IOException e) { + logger.error(e.getMessage()); + return null; + } + return "/avatar/" + avatarName; + } + + + /** + * 上传文件 + * + * @param sysFile + * @return + */ + public static SysFile uploadFtp(SysFile sysFile) { + String dir = EBTSConfig.getProfile() + sysFile.getFileAddr().substring(baseDir.length()); + String ftpdir = "/"; + if (sysFile.getIsPublic().equals("1")) { + ftpdir += pubfiles; + } else { + ftpdir += prifiles; + } + ftpdir += DateUtils.datePath(); + File file = new File(dir); + sysFile.setFileName(file.getName()); + sysFile.setFileSize(file.length() / 1024 / 1024); + sysFile.setMapping(IdUtils.fastUUID() + "." + getExtension(file.getName())); + sysFile.setFileAddr(ftpdir); + sysFile.setFileType(getExtension(file.getName())); + InputStream inputStream = null; + try { + inputStream = new FileInputStream(file); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + FTPClient ftpClient = linkFtp(); + if (ftpClient == null) { + return null; + } + try { + String[] basePathList = ftpdir.split("/"); + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//设置文件类型 + for (int i = 0; i < basePathList.length; i++) { + if (!ftpClient.changeWorkingDirectory(basePathList[i])) { + ftpClient.makeDirectory(basePathList[i]);//创建文件夹 + ftpClient.changeWorkingDirectory(basePathList[i]);//改变目录 + } + } + ftpClient.enterLocalPassiveMode(); + ftpClient.storeFile(sysFile.getMapping(), inputStream); + inputStream.close(); + ftpClient.logout(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + + if (!FileUtils.deleteFile(dir)) { + return null; + } + return sysFile; + } + + + /** + * ftp下载文件 + * + * @param sysFile + * @return + */ + public static String downloadFile(SysFile sysFile) { + String[] basePathList = sysFile.getFileAddr().split("/"); + FTPClient ftpClient = linkFtp(); + try { + if (ftpClient == null) { + return null; + } + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//设置文件类型 + //设置linux ftp服务器 + FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX); + ftpClient.configure(conf); + //设置访问被动模式 + ftpClient.setRemoteVerificationEnabled(false); + ftpClient.enterLocalPassiveMode(); + for (int i = 0; i < basePathList.length; i++) { + ftpClient.changeWorkingDirectory(basePathList[i]);//改变目录 + } +// FTPFile[] ftpFiles = ftpClient.listFiles(articleFile.getFileName()); +// if (ftpFiles == null || ftpFiles.length == 0) { +// logger.error("远程文件不存在"); +// return null; +// } else if (ftpFiles.length > 1) { +// logger.error("远程文件是文件夹"); +// return null; +// } + String fileDir = EBTSConfig.getDownloadPath() + sysFile.getFileName(); + OutputStream os = new FileOutputStream(fileDir); + ftpClient.retrieveFile(sysFile.getMapping(), os); + return fileDir; + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (ftpClient.isConnected()) { + try { + ftpClient.disconnect(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + + /** + * ftp删除文件 + * + * @param sysFileList + * @return + */ + public static boolean deleteFile(List sysFileList) { + FTPClient ftpClient = linkFtp(); + boolean start = false; + try { + if (ftpClient == null) { + return false; + } + for (SysFile sysFile : sysFileList) { + String[] basePathList = sysFile.getFileAddr().split("/"); + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//设置文件类型 + ftpClient.enterLocalPassiveMode(); + for (int i = 0; i < basePathList.length; i++) { + ftpClient.changeWorkingDirectory(basePathList[i]);//改变目录 + } + start = ftpClient.deleteFile(sysFile.getMapping()); + if (!start) { + return false; + } + } + return true; + } catch (IOException e) { + e.printStackTrace(); + logger.error("ftp删除文件出错:" + e.toString()); + return false; + } finally { + if (ftpClient.isConnected()) { + try { + ftpClient.disconnect(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + + /** + * ftp服务器连接 + * + * @return + */ + public static FTPClient linkFtp() { + FTPClient ftpClient = new FTPClient();//实例FTP客户端 + ftpClient.enterLocalPassiveMode(); + ftpClient.setAutodetectUTF8(true); + // 保存FTP控制连接使用的字符集,必须在连接前设置 + ftpClient.setControlEncoding(encoding); + try { + ftpClient.connect(ftpAddress, ftpPort);//连接FTP服务器 + ftpClient.login(ftpUsername, ftpPassword);//用户名密码登录 + if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { + logger.error("未连接到FTP,用户名或密码错误。"); + ftpClient.disconnect(); + return null; + } else { + logger.info("FTP连接成功"); + return ftpClient; + } + } catch (IOException e) { + logger.error("FTP登录失败" + e.getMessage()); + e.printStackTrace(); + try { + ftpClient.disconnect(); + } catch (IOException ioException) { + ioException.printStackTrace(); + } + return null; + } + } + + public static final String getExtension(String fileName) { + return FilenameUtils.getExtension(fileName); + } + +} diff --git a/ebts/ebts-system/src/main/resources/mapper/system/ConfigMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/ConfigMapper.xml new file mode 100644 index 0000000..3e085c0 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/ConfigMapper.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + select config_id, config_name, config_key, config_value, config_type, create_by, create_time, update_by, update_time, remark + from sys_config + + + + + + + and config_id = #{configId} + + + and config_key = #{configKey} + + + + + + + + + + + + insert into sys_config ( + config_name, + config_key, + config_value, + config_type, + create_by, + remark, + create_time + )values( + #{configName}, + #{configKey}, + #{configValue}, + #{configType}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_config + + config_name = #{configName}, + config_key = #{configKey}, + config_value = #{configValue}, + config_type = #{configType}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where config_id = #{configId} + + + + delete from sys_config where config_id = #{configId} + + + + delete from sys_config where config_id in + + #{configId} + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/DeptMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/DeptMapper.xml new file mode 100644 index 0000000..1de3916 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/DeptMapper.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + select d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.phone, d.email, d.status, d.del_flag, d.create_by, d.create_time + from sys_dept d + + + + + + + + + + + + + + + + + + + + insert into sys_dept( + dept_id, + parent_id, + dept_name, + ancestors, + order_num, + leader, + phone, + email, + status, + create_by, + create_time + )values( + #{deptId}, + #{parentId}, + #{deptName}, + #{ancestors}, + #{orderNum}, + #{leader}, + #{phone}, + #{email}, + #{status}, + #{createBy}, + sysdate() + ) + + + + update sys_dept + + parent_id = #{parentId}, + dept_name = #{deptName}, + ancestors = #{ancestors}, + order_num = #{orderNum}, + leader = #{leader}, + phone = #{phone}, + email = #{email}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where dept_id = #{deptId} + + + + update sys_dept set ancestors = + + when #{item.deptId} then #{item.ancestors} + + where dept_id in + + #{item.deptId} + + + + + update sys_dept + + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where dept_id in (${ancestors}) + + + + update sys_dept set del_flag = '2' where dept_id = #{deptId} + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/DictDataMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/DictDataMapper.xml new file mode 100644 index 0000000..a5f2f1a --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/DictDataMapper.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + select dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default, status, create_by, create_time, remark + from sys_dict_data + + + + + + + + + + + + + + delete from sys_dict_data where dict_code = #{dictCode} + + + + delete from sys_dict_data where dict_code in + + #{dictCode} + + + + + update sys_dict_data + + dict_sort = #{dictSort}, + dict_label = #{dictLabel}, + dict_value = #{dictValue}, + dict_type = #{dictType}, + css_class = #{cssClass}, + list_class = #{listClass}, + is_default = #{isDefault}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_code = #{dictCode} + + + + update sys_dict_data set dict_type = #{newDictType} where dict_type = #{oldDictType} + + + + insert into sys_dict_data( + dict_sort, + dict_label, + dict_value, + dict_type, + css_class, + list_class, + is_default, + status, + remark, + create_by, + create_time + )values( + #{dictSort}, + #{dictLabel}, + #{dictValue}, + #{dictType}, + #{cssClass}, + #{listClass}, + #{isDefault}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/DictTypeMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/DictTypeMapper.xml new file mode 100644 index 0000000..2fd7b03 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/DictTypeMapper.xml @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + select dict_id, dict_name, dict_type, status, create_by, create_time, remark + from sys_dict_type + + + + + + + + + + + + + + delete from sys_dict_type where dict_id = #{dictId} + + + + delete from sys_dict_type where dict_id in + + #{dictId} + + + + + update sys_dict_type + + dict_name = #{dictName}, + dict_type = #{dictType}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where dict_id = #{dictId} + + + + insert into sys_dict_type( + dict_name, + dict_type, + status, + remark, + create_by, + create_time + )values( + #{dictName}, + #{dictType}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/FileMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/FileMapper.xml new file mode 100644 index 0000000..0b35dd4 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/FileMapper.xml @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + + + + select file_id, p_id, union_id, role_ids,inherit, file_name, mapping, file_addr, file_type, file_size, is_public, create_by, create_time, update_by, update_time from sys_file + + + + + + + + + insert into sys_file + + p_id, + union_id, + role_ids, + inherit, + file_name, + mapping, + file_addr, + file_type, + file_size, + is_public, + create_by, + update_by, + + + #{pId}, + #{unionId}, + #{roleIds}, + #{inherit}, + #{fileName}, + #{mapping}, + #{fileAddr}, + #{fileType}, + #{fileSize}, + #{isPublic}, + #{createBy}, + #{updateBy}, + + + + + update sys_file + + role_ids = #{roleIds}, + + where file_id = #{fileId} + + + + delete from sys_file where file_id = #{fileId} + + + + delete from sys_file where file_id in + + #{fileId} + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/LogininforMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/LogininforMapper.xml new file mode 100644 index 0000000..3a84e28 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/LogininforMapper.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + insert into sys_logininfor (user_name, status, ipaddr, login_location, browser, os, msg, login_time) + values (#{userName}, #{status}, #{ipaddr}, #{loginLocation}, #{browser}, #{os}, #{msg}, sysdate()) + + + + + + delete from sys_logininfor where info_id in + + #{infoId} + + + + + truncate table sys_logininfor + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/MenuMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/MenuMapper.xml new file mode 100644 index 0000000..12ee8a0 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/MenuMapper.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time + from sys_menu + + + + + + + + + + + + + + + + + + + + + + + + update sys_menu + + menu_name = #{menuName}, + parent_id = #{parentId}, + order_num = #{orderNum}, + path = #{path}, + component = #{component}, + is_frame = #{isFrame}, + is_cache = #{isCache}, + menu_type = #{menuType}, + visible = #{visible}, + status = #{status}, + perms = #{perms}, + icon = #{icon}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where menu_id = #{menuId} + + + + insert into sys_menu( + menu_id, + parent_id, + menu_name, + order_num, + path, + component, + is_frame, + is_cache, + menu_type, + visible, + status, + perms, + icon, + remark, + create_by, + create_time + )values( + #{menuId}, + #{parentId}, + #{menuName}, + #{orderNum}, + #{path}, + #{component}, + #{isFrame}, + #{isCache}, + #{menuType}, + #{visible}, + #{status}, + #{perms}, + #{icon}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_menu where menu_id = #{menuId} + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/NoticeMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/NoticeMapper.xml new file mode 100644 index 0000000..f49fc55 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/NoticeMapper.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + select notice_id, notice_title, notice_type, cast(notice_content as char) as notice_content, status, create_by, create_time, update_by, update_time, remark + from sys_notice + + + + + + + + insert into sys_notice ( + notice_title, + notice_type, + notice_content, + status, + remark, + create_by, + create_time + )values( + #{noticeTitle}, + #{noticeType}, + #{noticeContent}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_notice + + notice_title = #{noticeTitle}, + notice_type = #{noticeType}, + notice_content = #{noticeContent}, + status = #{status}, + update_by = #{updateBy}, + update_time = sysdate() + + where notice_id = #{noticeId} + + + + delete from sys_notice where notice_id = #{noticeId} + + + + delete from sys_notice where notice_id in + + #{noticeId} + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/OperLogMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/OperLogMapper.xml new file mode 100644 index 0000000..324ee1a --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/OperLogMapper.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time + from sys_oper_log + + + + insert into sys_oper_log(title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time) + values (#{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, #{deptName}, #{operUrl}, #{operIp}, #{operLocation}, #{operParam}, #{jsonResult}, #{status}, #{errorMsg}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/PostMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/PostMapper.xml new file mode 100644 index 0000000..a375515 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/PostMapper.xml @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark + from sys_post + + + + + + + + + + + + + + + + + + update sys_post + + post_code = #{postCode}, + post_name = #{postName}, + post_sort = #{postSort}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where post_id = #{postId} + + + + insert into sys_post( + post_id, + post_code, + post_name, + post_sort, + status, + remark, + create_by, + create_time + )values( + #{postId}, + #{postCode}, + #{postName}, + #{postSort}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + delete from sys_post where post_id = #{postId} + + + + delete from sys_post where post_id in + + #{postId} + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/RealQueryServiceMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/RealQueryServiceMapper.xml new file mode 100644 index 0000000..58c0864 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/RealQueryServiceMapper.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, uq_name, uq_sql, uq_describe, is_release, create_by, create_time, update_by, update_time from gen_uni_query + + + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/RoleDeptMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/RoleDeptMapper.xml new file mode 100644 index 0000000..a66cd68 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/RoleDeptMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_role_dept where role_id=#{roleId} + + + + + + delete from sys_role_dept where role_id in + + #{roleId} + + + + + insert into sys_role_dept(role_id, dept_id) values + + (#{item.roleId},#{item.deptId}) + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/RoleMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/RoleMapper.xml new file mode 100644 index 0000000..7aced7c --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/RoleMapper.xml @@ -0,0 +1,157 @@ + + + + + + + + + + + + + + + + + + + + + + + + select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.menu_check_strictly, r.dept_check_strictly, + r.status, r.del_flag, r.create_time, r.remark ,r.role_type + from sys_role r + left join sys_user_role ur on ur.role_id = r.role_id + left join sys_user u on u.user_id = ur.user_id + left join sys_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + + + + + + + + insert into sys_role( + role_id, + role_name, + role_key, + role_sort, + data_scope, + menu_check_strictly, + dept_check_strictly, + status, + remark, + create_by, + create_time + )values( + #{roleId}, + #{roleName}, + #{roleKey}, + #{roleSort}, + #{dataScope}, + #{menuCheckStrictly}, + #{deptCheckStrictly}, + #{status}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update sys_role + + role_name = #{roleName}, + role_key = #{roleKey}, + role_sort = #{roleSort}, + data_scope = #{dataScope}, + menu_check_strictly = #{menuCheckStrictly}, + dept_check_strictly = #{deptCheckStrictly}, + status = #{status}, + remark = #{remark}, + update_by = #{updateBy}, + update_time = sysdate() + + where role_id = #{roleId} + + + + update sys_user set status = #{status} where user_id = #{userId} + + + + delete from sys_role where role_id = #{roleId} + + + + update sys_role set del_flag = '2' where role_id in + + #{roleId} + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/RoleMenuMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/RoleMenuMapper.xml new file mode 100644 index 0000000..1a41f89 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/RoleMenuMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + delete from sys_role_menu where role_id=#{roleId} + + + + insert into sys_role_menu(role_id, menu_id) values + + (#{item.roleId},#{item.menuId}) + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/SeqMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/SeqMapper.xml new file mode 100644 index 0000000..754b1ff --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/SeqMapper.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/UserMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/UserMapper.xml new file mode 100644 index 0000000..05740ed --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/UserMapper.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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.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 sys_user_role ur on u.user_id = ur.user_id + left join sys_role r on r.role_id = ur.role_id + + + + + + + + + + + + + + + + insert into sys_user( + user_id, + dept_id, + user_name, + nick_name, + email, + avatar, + phonenumber, + sex, + password, + status, + create_by, + remark, + create_time + )values( + #{userId}, + #{deptId}, + #{userName}, + #{nickName}, + #{email}, + #{avatar}, + #{phonenumber}, + #{sex}, + #{password}, + #{status}, + #{createBy}, + #{remark}, + sysdate() + ) + + + + update sys_user + + dept_id = #{deptId}, + user_name = #{userName}, + nick_name = #{nickName}, + email = #{email}, + phonenumber = #{phonenumber}, + sex = #{sex}, + avatar = #{avatar}, + password = #{password}, + status = #{status}, + login_ip = #{loginIp}, + login_date = #{loginDate}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where user_id = #{userId} + + + + update sys_user set status = #{status} where user_id = #{userId} + + + + update sys_user set avatar = #{avatar} where user_name = #{userName} + + + + update sys_user set password = #{password} where user_name = #{userName} + + + + delete from sys_user where user_id = #{userId} + + + + update sys_user set del_flag = '2' where user_id in + + #{userId} + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/UserPostMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/UserPostMapper.xml new file mode 100644 index 0000000..2111ec0 --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/UserPostMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + delete from sys_user_post where user_id=#{userId} + + + + + + delete from sys_user_post where user_id in + + #{userId} + + + + + insert into sys_user_post(user_id, post_id) values + + (#{item.userId},#{item.postId}) + + + + \ No newline at end of file diff --git a/ebts/ebts-system/src/main/resources/mapper/system/UserRoleMapper.xml b/ebts/ebts-system/src/main/resources/mapper/system/UserRoleMapper.xml new file mode 100644 index 0000000..9ce822a --- /dev/null +++ b/ebts/ebts-system/src/main/resources/mapper/system/UserRoleMapper.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + delete from sys_user_role where user_id=#{userId} + + + + + + delete from sys_user_role where user_id in + + #{userId} + + + + + insert into sys_user_role(user_id, role_id) values + + (#{item.userId},#{item.roleId}) + + + + + delete from sys_user_role where user_id=#{userId} and role_id=#{roleId} + + + + delete from sys_user_role where role_id=#{roleId} and user_id in + + #{userId} + + + \ No newline at end of file diff --git a/ebts/pom.xml b/ebts/pom.xml new file mode 100644 index 0000000..3ba10f7 --- /dev/null +++ b/ebts/pom.xml @@ -0,0 +1,261 @@ + + + 4.0.0 + + com.ebts + ebts + 1.0.0 + + ebts + http://www.ebts.top + EBTS + + + 1.0.0 + UTF-8 + UTF-8 + 1.8 + 3.1.1 + 1.2.6 + 1.19 + 2.9.2 + 2.3.2 + 1.3.0 + 1.2.74 + 5.2.5 + 5.5.0 + 2.5 + 1.3.3 + 3.17 + 1.7 + 0.9.1 + + + + + + + + + org.springframework.boot + spring-boot-dependencies + 2.1.17.RELEASE + pom + import + + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + eu.bitwalker + UserAgentUtils + ${bitwalker.version} + + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.boot.version} + + + + + com.github.oshi + oshi-core + ${oshi.version} + + + + net.java.dev.jna + jna + ${jna.version} + + + + net.java.dev.jna + jna-platform + ${jna.version} + + + + + io.springfox + springfox-swagger2 + ${swagger.version} + + + io.swagger + swagger-annotations + + + io.swagger + swagger-models + + + + + + + io.springfox + springfox-swagger-ui + ${swagger.version} + + + + + commons-io + commons-io + ${commons.io.version} + + + + + commons-fileupload + commons-fileupload + ${commons.fileupload.version} + + + + + org.apache.poi + poi-ooxml + ${poi.version} + + + + + org.apache.velocity + velocity + ${velocity.version} + + + + + com.alibaba + fastjson + ${fastjson.version} + + + + + io.jsonwebtoken + jjwt + ${jwt.version} + + + + + com.github.penggle + kaptcha + ${kaptcha.version} + + + + + com.ebts + ebts-quartz + ${ebts.version} + + + + + com.ebts + ebts-generator + ${ebts.version} + + + + + com.ebts + ebts-test + ${ebts.version} + + + + + com.ebts + ebts-framework + ${ebts.version} + + + + + com.ebts + ebts-system + ${ebts.version} + + + + + com.ebts + ebts-common + ${ebts.version} + + + + + + ebts-admin + ebts-framework + ebts-system + ebts-quartz + ebts-generator + ebts-common + + pom + + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + + + public + aliyun nexus + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + + + + + public + aliyun nexus + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + false + + + + + \ No newline at end of file