From cf04d441960f9d13ab2390f30dbd926d3888b4b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=AF=E8=88=AA?= Date: Mon, 26 Feb 2024 19:15:34 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E9=A1=B9=E7=9B=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/src/main/java/com/qihang/api/Api.java | 2 +- .../main/java/com/qihang/api/TokenFilter.java | 2 +- api/src/main/resources/application.yaml | 6 +- {oms-api => core}/.gitignore | 0 core/common/.gitignore | 38 + core/common/pom.xml | 73 + .../src/main/java/com/qihang/common/App.java | 13 + .../com/qihang/common}/common/AjaxResult.java | 4 +- .../com/qihang/common}/common/CharsetKit.java | 5 +- .../java/com/qihang/common}/common/R.java | 2 +- .../common}/common/ServiceException.java | 2 +- .../qihang/common/common/ServletUtils.java | 220 ++ .../config}/FastJson2JsonRedisSerializer.java | 2 +- .../com/qihang/common}/config/RedisCache.java | 2 +- .../qihang/common}/config/RedisConfig.java | 3 +- .../common}/constant/CacheConstants.java | 2 +- .../qihang/common}/constant/Constants.java | 2 +- .../com/qihang/common/constant}/Convert.java | 5 +- .../qihang/common/constant}/StrFormatter.java | 4 +- .../common/constant}/UserConstants.java | 2 +- .../com/qihang/common/enums}/HttpStatus.java | 4 +- .../com/qihang/common}/enums/UserStatus.java | 2 +- .../common/exception}/BaseException.java | 8 +- .../common/exception}/UserException.java | 4 +- .../exception}/UserNotExistsException.java | 4 +- .../com/qihang/common}/utils/DateUtils.java | 2 +- .../com/qihang/common}/utils/IdUtils.java | 2 +- .../qihang/common}/utils/MessageUtils.java | 2 +- .../com/qihang/common}/utils/SpringUtils.java | 2 +- .../com/qihang/common}/utils/StringUtils.java | 48 +- .../java/com/qihang/common}/utils/UUID.java | 2 +- .../qihang/common}/utils/http/HttpHelper.java | 2 +- .../qihang/common}/utils/http/HttpUtils.java | 6 +- .../qihang/common/utils/ip/AddressUtils.java | 54 + .../com/qihang/common/utils/ip/IpUtils.java | 384 ++++ core/pom.xml | 27 + core/security/.gitignore | 38 + core/security/pom.xml | 78 + .../main/java/com/qihang/security/App.java | 8 + .../security/AuthenticationContextHolder.java | 4 +- .../AuthenticationExceptionHandler.java | 6 +- .../JwtAuthenticationTokenFilter.java | 6 +- .../java/com/qihang/security}/LoginUser.java | 4 +- .../com/qihang}/security/SecurityConfig.java | 2 +- .../com/qihang/security}/TokenService.java | 19 +- .../security/UserDetailsServiceImpl.java | 16 +- .../UserPasswordNotMatchException.java | 6 +- .../com/qihang/security/entity}/SysUser.java | 54 +- .../qihang/security/mapper/SysUserMapper.java | 130 ++ .../security}/service/ISysUserService.java | 39 +- .../security}/service/SysLoginService.java | 30 +- .../service/impl/SysUserServiceImpl.java | 294 +++ .../qihang/security/utils}/AddressUtils.java | 8 +- .../com/qihang/security/utils}/IpUtils.java | 24 +- .../qihang/security}/utils/ServletUtils.java | 19 +- .../qihang/oms/api/domain/vo/MenuMetaVo.java | 4 - pom.xml | 24 +- sys-api/.gitignore | 38 + {oms-api => sys-api}/pom.xml | 9 +- .../main/java/com/qihang/sys/api/SysApi.java | 24 +- .../com/qihang/sys/api/common/AjaxResult.java | 214 ++ .../qihang/sys/api/common/BaseException.java | 98 + .../com/qihang/sys/api/common/CharsetKit.java | 88 + .../com/qihang/sys/api/common/Convert.java | 1001 +++++++++ .../com/qihang/sys/api/common/HttpStatus.java | 94 + .../java/com/qihang/sys/api/common/R.java | 62 + .../sys/api/common/ServiceException.java | 74 + .../qihang/sys/api/common/StrFormatter.java | 93 + .../qihang/sys/api/common/UserConstants.java | 78 + .../qihang/sys/api/common/UserException.java | 18 + .../api/common/UserNotExistsException.java | 16 + .../common/UserPasswordNotMatchException.java | 16 + .../qihang/sys}/api/config/MyBatisConfig.java | 0 .../com/qihang/sys/api/config/RedisCache.java | 265 +++ .../qihang/sys/api/config/RedisConfig.java | 71 + .../com/qihang/sys}/api/config/WebConfig.java | 0 .../sys/api/constant/CacheConstants.java | 44 + .../qihang/sys/api/constant/Constants.java | 142 ++ .../sys}/api/controller/HomeController.java | 6 +- .../sys}/api/controller/LoginController.java | 12 +- .../sys}/api/controller/MenusController.java | 17 +- .../sys}/api/controller/UsersController.java | 7 +- .../qihang/sys}/api/domain/BaseEntity.java | 2 +- .../com/qihang/sys}/api/domain/LoginBody.java | 2 +- .../com/qihang/sys/api/domain/LoginUser.java | 268 +++ .../com/qihang/sys}/api/domain/SysMenu.java | 5 +- .../com/qihang/sys/api/domain/SysUser.java | 249 ++ .../qihang/sys/api/domain/vo/MenuMetaVo.java | 4 + .../sys}/api/domain/vo/MenusDetailVo.java | 2 +- .../qihang/sys}/api/domain/vo/MenusVo.java | 2 +- .../qihang/sys}/api/domain/vo/UserInfoVo.java | 2 +- .../com/qihang/sys/api/enums/UserStatus.java | 30 + .../qihang/sys}/api/mapper/SysMenuMapper.java | 4 +- .../qihang/sys}/api/mapper/SysUserMapper.java | 31 +- .../security/AuthenticationContextHolder.java | 28 + .../AuthenticationExceptionHandler.java | 44 + .../JwtAuthenticationTokenFilter.java | 89 + .../com/qihang/sys}/api/security/JwtUtil.java | 0 .../sys/api/security/SecurityConfig.java | 109 + .../security/SecurityUserDetailsService.java | 0 .../api/security/UserDetailsServiceImpl.java | 73 + .../qihang/sys}/api/service/EchoService.java | 2 +- .../sys}/api/service/ISysMenuService.java | 4 +- .../sys/api/service/ISysUserService.java | 161 ++ .../sys/api/service/SysLoginService.java | 144 ++ .../qihang/sys/api/service/TokenService.java | 227 ++ .../api/service/impl/SysMenuServiceImpl.java | 68 +- .../api/service/impl/SysUserServiceImpl.java | 50 +- .../com/qihang/sys/api/utils/DateUtils.java | 188 ++ .../utils/FastJson2JsonRedisSerializer.java | 49 + .../com/qihang/sys/api/utils/IdUtils.java | 49 + .../qihang/sys/api/utils/MessageUtils.java | 25 + .../qihang/sys/api/utils/ServletUtils.java | 219 ++ .../com/qihang/sys/api/utils/SpringUtils.java | 157 ++ .../com/qihang/sys/api/utils/StringUtils.java | 611 +++++ .../java/com/qihang/sys/api/utils/UUID.java | 492 ++++ .../qihang/sys/api/utils/http/HttpHelper.java | 56 + .../qihang/sys/api/utils/http/HttpUtils.java | 266 +++ .../qihang/sys/api/utils/ip/AddressUtils.java | 54 + .../com/qihang/sys/api/utils/ip/IpUtils.java | 384 ++++ .../src/main/resources/application.yaml | 4 +- .../src/main/resources/logback.xml | 0 .../resources/mapper/system/SysMenuMapper.xml | 2 +- .../resources/mapper/user/SysUserMapper.xml | 2 +- .../main/resources/mybatis/mybatis-config.xml | 0 .../src/test/java/com/qihang/AppTest.java | 0 tao-api/pom.xml | 84 +- .../src/main/java/com/qihang/tao/TaoApi.java | 4 +- .../com/qihang/tao/common/CharsetKit.java | 172 +- .../java/com/qihang/tao/common/Convert.java | 2000 ++++++++--------- .../com/qihang/tao/common/MessageUtils.java | 50 +- .../main/java/com/qihang/tao/common/R.java | 124 +- .../qihang/tao/common/ServiceException.java | 148 +- .../com/qihang/tao/common/SpringUtils.java | 314 +-- .../com/qihang/tao/common/StrFormatter.java | 182 +- .../com/qihang/tao/common/StringUtils.java | 1218 +++++----- .../com/qihang/tao/common/UserStatus.java | 60 +- .../config/FastJson2JsonRedisSerializer.java | 98 +- .../com/qihang/tao/config/RedisCache.java | 530 ++--- .../com/qihang/tao/config/RedisConfig.java | 138 +- .../qihang/tao/constant/CacheConstants.java | 88 +- .../com/qihang/tao/constant/Constants.java | 284 +-- .../java/com/qihang/tao/domain/SysUser.java | 498 ++-- .../java/com/qihang/tao/domain/TaoGoods.java | 11 + .../com/qihang/tao/mapper/SysUserMapper.java | 84 +- .../com/qihang/tao/mapper/TaoGoodsMapper.java | 7 + .../AuthenticationExceptionHandler.java | 90 +- .../JwtAuthenticationTokenFilter.java | 172 +- .../com/qihang/tao/security/LoginUser.java | 534 ++--- .../qihang/tao/security/SecurityConfig.java | 218 +- .../com/qihang/tao/security/TokenService.java | 420 ++-- .../tao/security/UserDetailsServiceImpl.java | 140 +- .../qihang/tao/service/ISysUserService.java | 118 +- .../tao/service/impl/SysUserServiceImpl.java | 220 +- .../resources/mapper/oms/TaoGoodsMapper.xml | 5 + .../resources/mapper/user/SysUserMapper.xml | 57 +- vue3/src/api/auth/index.ts | 4 +- vue3/src/api/menu/index.ts | 2 +- vue3/src/api/user/index.ts | 2 +- 159 files changed, 12328 insertions(+), 4148 deletions(-) rename {oms-api => core}/.gitignore (100%) create mode 100644 core/common/.gitignore create mode 100644 core/common/pom.xml create mode 100644 core/common/src/main/java/com/qihang/common/App.java rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/common/AjaxResult.java (98%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/common/CharsetKit.java (96%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/common/R.java (97%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/common/ServiceException.java (97%) create mode 100644 core/common/src/main/java/com/qihang/common/common/ServletUtils.java rename {oms-api/src/main/java/com/qihang/oms/api/utils => core/common/src/main/java/com/qihang/common/config}/FastJson2JsonRedisSerializer.java (97%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/config/RedisCache.java (99%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/config/RedisConfig.java (96%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/constant/CacheConstants.java (95%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/constant/Constants.java (98%) rename {oms-api/src/main/java/com/qihang/oms/api/common => core/common/src/main/java/com/qihang/common/constant}/Convert.java (99%) rename {oms-api/src/main/java/com/qihang/oms/api/common => core/common/src/main/java/com/qihang/common/constant}/StrFormatter.java (97%) rename {oms-api/src/main/java/com/qihang/oms/api/common => core/common/src/main/java/com/qihang/common/constant}/UserConstants.java (98%) rename {oms-api/src/main/java/com/qihang/oms/api/common => core/common/src/main/java/com/qihang/common/enums}/HttpStatus.java (95%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/enums/UserStatus.java (92%) rename {oms-api/src/main/java/com/qihang/oms/api/common => core/common/src/main/java/com/qihang/common/exception}/BaseException.java (92%) rename {oms-api/src/main/java/com/qihang/oms/api/common => core/common/src/main/java/com/qihang/common/exception}/UserException.java (86%) rename {oms-api/src/main/java/com/qihang/oms/api/common => core/common/src/main/java/com/qihang/common/exception}/UserNotExistsException.java (86%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/utils/DateUtils.java (99%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/utils/IdUtils.java (96%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/utils/MessageUtils.java (94%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/utils/SpringUtils.java (99%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/utils/StringUtils.java (95%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/utils/UUID.java (99%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/utils/http/HttpHelper.java (97%) rename {oms-api/src/main/java/com/qihang/oms/api => core/common/src/main/java/com/qihang/common}/utils/http/HttpUtils.java (98%) create mode 100644 core/common/src/main/java/com/qihang/common/utils/ip/AddressUtils.java create mode 100644 core/common/src/main/java/com/qihang/common/utils/ip/IpUtils.java create mode 100644 core/pom.xml create mode 100644 core/security/.gitignore create mode 100644 core/security/pom.xml create mode 100644 core/security/src/main/java/com/qihang/security/App.java rename {oms-api/src/main/java/com/qihang/oms/api => core/security/src/main/java/com/qihang}/security/AuthenticationContextHolder.java (92%) rename {oms-api/src/main/java/com/qihang/oms/api => core/security/src/main/java/com/qihang}/security/AuthenticationExceptionHandler.java (95%) rename {oms-api/src/main/java/com/qihang/oms/api => core/security/src/main/java/com/qihang}/security/JwtAuthenticationTokenFilter.java (95%) rename {oms-api/src/main/java/com/qihang/oms/api/domain => core/security/src/main/java/com/qihang/security}/LoginUser.java (98%) rename {oms-api/src/main/java/com/qihang/oms/api => core/security/src/main/java/com/qihang}/security/SecurityConfig.java (99%) rename {oms-api/src/main/java/com/qihang/oms/api/service => core/security/src/main/java/com/qihang/security}/TokenService.java (92%) rename {oms-api/src/main/java/com/qihang/oms/api => core/security/src/main/java/com/qihang}/security/UserDetailsServiceImpl.java (85%) rename {oms-api/src/main/java/com/qihang/oms/api/common => core/security/src/main/java/com/qihang/security}/UserPasswordNotMatchException.java (78%) rename {oms-api/src/main/java/com/qihang/oms/api/domain => core/security/src/main/java/com/qihang/security/entity}/SysUser.java (76%) create mode 100644 core/security/src/main/java/com/qihang/security/mapper/SysUserMapper.java rename {oms-api/src/main/java/com/qihang/oms/api => core/security/src/main/java/com/qihang/security}/service/ISysUserService.java (93%) rename {oms-api/src/main/java/com/qihang/oms/api => core/security/src/main/java/com/qihang/security}/service/SysLoginService.java (89%) create mode 100644 core/security/src/main/java/com/qihang/security/service/impl/SysUserServiceImpl.java rename {oms-api/src/main/java/com/qihang/oms/api/utils/ip => core/security/src/main/java/com/qihang/security/utils}/AddressUtils.java (91%) rename {oms-api/src/main/java/com/qihang/oms/api/utils/ip => core/security/src/main/java/com/qihang/security/utils}/IpUtils.java (98%) rename {oms-api/src/main/java/com/qihang/oms/api => core/security/src/main/java/com/qihang/security}/utils/ServletUtils.java (96%) delete mode 100644 oms-api/src/main/java/com/qihang/oms/api/domain/vo/MenuMetaVo.java create mode 100644 sys-api/.gitignore rename {oms-api => sys-api}/pom.xml (97%) rename oms-api/src/main/java/com/qihang/oms/api/OmsApi.java => sys-api/src/main/java/com/qihang/sys/api/SysApi.java (62%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/AjaxResult.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/BaseException.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/CharsetKit.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/Convert.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/HttpStatus.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/R.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/ServiceException.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/StrFormatter.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/UserConstants.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/UserException.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/UserNotExistsException.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/common/UserPasswordNotMatchException.java rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/config/MyBatisConfig.java (100%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/config/RedisCache.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/config/RedisConfig.java rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/config/WebConfig.java (100%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/constant/CacheConstants.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/constant/Constants.java rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/controller/HomeController.java (81%) rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/controller/LoginController.java (74%) rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/controller/MenusController.java (96%) rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/controller/UsersController.java (88%) rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/domain/BaseEntity.java (98%) rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/domain/LoginBody.java (96%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/domain/LoginUser.java rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/domain/SysMenu.java (97%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/domain/SysUser.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/domain/vo/MenuMetaVo.java rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/domain/vo/MenusDetailVo.java (96%) rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/domain/vo/MenusVo.java (97%) rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/domain/vo/UserInfoVo.java (96%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/enums/UserStatus.java rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/mapper/SysMenuMapper.java (97%) rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/mapper/SysUserMapper.java (93%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/security/AuthenticationContextHolder.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/security/AuthenticationExceptionHandler.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/security/JwtAuthenticationTokenFilter.java rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/security/JwtUtil.java (100%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/security/SecurityConfig.java rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/security/SecurityUserDetailsService.java (100%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/security/UserDetailsServiceImpl.java rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/service/EchoService.java (86%) rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/service/ISysMenuService.java (97%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/service/ISysUserService.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/service/SysLoginService.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/service/TokenService.java rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/service/impl/SysMenuServiceImpl.java (96%) rename {oms-api/src/main/java/com/qihang/oms => sys-api/src/main/java/com/qihang/sys}/api/service/impl/SysUserServiceImpl.java (92%) create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/DateUtils.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/FastJson2JsonRedisSerializer.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/IdUtils.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/MessageUtils.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/ServletUtils.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/SpringUtils.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/StringUtils.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/UUID.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/http/HttpHelper.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/http/HttpUtils.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/ip/AddressUtils.java create mode 100644 sys-api/src/main/java/com/qihang/sys/api/utils/ip/IpUtils.java rename {oms-api => sys-api}/src/main/resources/application.yaml (87%) rename {oms-api => sys-api}/src/main/resources/logback.xml (100%) rename {oms-api => sys-api}/src/main/resources/mapper/system/SysMenuMapper.xml (99%) rename {oms-api => sys-api}/src/main/resources/mapper/user/SysUserMapper.xml (99%) rename {oms-api => sys-api}/src/main/resources/mybatis/mybatis-config.xml (100%) rename {oms-api => sys-api}/src/test/java/com/qihang/AppTest.java (100%) create mode 100644 tao-api/src/main/java/com/qihang/tao/domain/TaoGoods.java create mode 100644 tao-api/src/main/java/com/qihang/tao/mapper/TaoGoodsMapper.java create mode 100644 tao-api/src/main/resources/mapper/oms/TaoGoodsMapper.xml diff --git a/api/src/main/java/com/qihang/api/Api.java b/api/src/main/java/com/qihang/api/Api.java index b4140b43..23658ad7 100644 --- a/api/src/main/java/com/qihang/api/Api.java +++ b/api/src/main/java/com/qihang/api/Api.java @@ -15,7 +15,7 @@ public class Api { public static void main( String[] args ) { - System.out.println( "Hello World! Api" ); + System.out.println( "Hello api! " ); SpringApplication.run(Api.class, args); } diff --git a/api/src/main/java/com/qihang/api/TokenFilter.java b/api/src/main/java/com/qihang/api/TokenFilter.java index a06f9377..56f5ffa2 100644 --- a/api/src/main/java/com/qihang/api/TokenFilter.java +++ b/api/src/main/java/com/qihang/api/TokenFilter.java @@ -20,7 +20,7 @@ public class TokenFilter implements GlobalFilter, Ordered { System.out.println("Token:"+token); String url = exchange.getRequest().getURI().getPath(); System.out.println("intercept " + url); - if(url.equals("/api/oms-api/login")){ + if(url.equals("/api/sys-api/login")){ // 登录页面 放行 return chain.filter(exchange); } diff --git a/api/src/main/resources/application.yaml b/api/src/main/resources/application.yaml index cd878be5..46325912 100644 --- a/api/src/main/resources/application.yaml +++ b/api/src/main/resources/application.yaml @@ -26,10 +26,10 @@ spring: - Path=/api/tao-api/** filters: - StripPrefix=2 - - id: oms_api_route - uri: lb://oms-api + - id: sys_api_route + uri: lb://sys-api predicates: - - Path=/api/oms-api/** + - Path=/api/sys-api/** filters: - StripPrefix=2 # - TokenFilter diff --git a/oms-api/.gitignore b/core/.gitignore similarity index 100% rename from oms-api/.gitignore rename to core/.gitignore diff --git a/core/common/.gitignore b/core/common/.gitignore new file mode 100644 index 00000000..5ff6309b --- /dev/null +++ b/core/common/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/core/common/pom.xml b/core/common/pom.xml new file mode 100644 index 00000000..ced9c7b4 --- /dev/null +++ b/core/common/pom.xml @@ -0,0 +1,73 @@ + + 4.0.0 + + com.qihang + core + 1.0-SNAPSHOT + + + com.qihang + common + jar + + common + http://maven.apache.org + + + UTF-8 + 3.0.2 + + + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + + + io.jsonwebtoken + jjwt-api + ${jwt.version} + + + io.jsonwebtoken + jjwt-impl + ${jwt.version} + runtime + + + + io.jsonwebtoken + jjwt-jackson + ${jwt.version} + runtime + + + + + eu.bitwalker + UserAgentUtils + 1.21 + + + jakarta.platform + jakarta.jakartaee-api + 9.1.0 + provided + + + + + + + + + + + + + + + diff --git a/core/common/src/main/java/com/qihang/common/App.java b/core/common/src/main/java/com/qihang/common/App.java new file mode 100644 index 00000000..7db512ed --- /dev/null +++ b/core/common/src/main/java/com/qihang/common/App.java @@ -0,0 +1,13 @@ +package com.qihang.common; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/AjaxResult.java b/core/common/src/main/java/com/qihang/common/common/AjaxResult.java similarity index 98% rename from oms-api/src/main/java/com/qihang/oms/api/common/AjaxResult.java rename to core/common/src/main/java/com/qihang/common/common/AjaxResult.java index 34766a10..4b435c7d 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/AjaxResult.java +++ b/core/common/src/main/java/com/qihang/common/common/AjaxResult.java @@ -1,6 +1,8 @@ -package com.qihang.oms.api.common; +package com.qihang.common.common; +import com.qihang.common.enums.HttpStatus; + import java.util.HashMap; import java.util.Objects; diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/CharsetKit.java b/core/common/src/main/java/com/qihang/common/common/CharsetKit.java similarity index 96% rename from oms-api/src/main/java/com/qihang/oms/api/common/CharsetKit.java rename to core/common/src/main/java/com/qihang/common/common/CharsetKit.java index da54e3e8..d48387eb 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/CharsetKit.java +++ b/core/common/src/main/java/com/qihang/common/common/CharsetKit.java @@ -1,7 +1,6 @@ -package com.qihang.oms.api.common; +package com.qihang.common.common; - -import com.qihang.oms.api.utils.StringUtils; +import com.qihang.common.utils.StringUtils; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/R.java b/core/common/src/main/java/com/qihang/common/common/R.java similarity index 97% rename from oms-api/src/main/java/com/qihang/oms/api/common/R.java rename to core/common/src/main/java/com/qihang/common/common/R.java index 3d434f46..bc383d3f 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/R.java +++ b/core/common/src/main/java/com/qihang/common/common/R.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.common; +package com.qihang.common.common; import java.util.HashMap; import java.util.Map; diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/ServiceException.java b/core/common/src/main/java/com/qihang/common/common/ServiceException.java similarity index 97% rename from oms-api/src/main/java/com/qihang/oms/api/common/ServiceException.java rename to core/common/src/main/java/com/qihang/common/common/ServiceException.java index cc712384..06751af4 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/ServiceException.java +++ b/core/common/src/main/java/com/qihang/common/common/ServiceException.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.common; +package com.qihang.common.common; /** * 业务异常 diff --git a/core/common/src/main/java/com/qihang/common/common/ServletUtils.java b/core/common/src/main/java/com/qihang/common/common/ServletUtils.java new file mode 100644 index 00000000..d39a799d --- /dev/null +++ b/core/common/src/main/java/com/qihang/common/common/ServletUtils.java @@ -0,0 +1,220 @@ +//package com.qihang.common.common; +// +//import com.qihang.common.constant.Convert; +//import com.qihang.common.constant.Constants; +//import com.qihang.common.utils.StringUtils; +//import jakarta.servlet.ServletRequest; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import jakarta.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 java.io.IOException; +//import java.io.UnsupportedEncodingException; +//import java.net.URLDecoder; +//import java.net.URLEncoder; +//import java.util.Collections; +//import java.util.HashMap; +//import java.util.Map; +// +///** +// * 客户端工具类 +// * +// * @author qihang +// */ +//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); +// } +// +// /** +// * 获取Boolean参数 +// */ +// public static Boolean getParameterToBool(String name) +// { +// return Convert.toBool(getRequest().getParameter(name)); +// } +// +// /** +// * 获取Boolean参数 +// */ +// public static Boolean getParameterToBool(String name, Boolean defaultValue) +// { +// return Convert.toBool(getRequest().getParameter(name), defaultValue); +// } +// +// /** +// * 获得所有请求参数 +// * +// * @param request 请求对象{@link ServletRequest} +// * @return Map +// */ +// public static Map getParams(ServletRequest request) +// { +// final Map map = request.getParameterMap(); +// return Collections.unmodifiableMap(map); +// } +// +// /** +// * 获得所有请求参数 +// * +// * @param request 请求对象{@link ServletRequest} +// * @return Map +// */ +// public static Map getParamMap(ServletRequest request) +// { +// Map params = new HashMap<>(); +// for (Map.Entry entry : getParams(request).entrySet()) +// { +// params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); +// } +// return params; +// } +// +// /** +// * 获取request +// */ +// 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 待渲染的字符串 +// */ +// public static void 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(); +// } +// } +// +// /** +// * 是否是Ajax异步请求 +// * +// * @param request +// */ +// public static boolean isAjaxRequest(HttpServletRequest request) +// { +// String accept = request.getHeader("accept"); +// if (accept != null && accept.contains("application/json")) +// { +// return true; +// } +// +// String xRequestedWith = request.getHeader("X-Requested-With"); +// if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) +// { +// return true; +// } +// +// String uri = request.getRequestURI(); +// if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) +// { +// return true; +// } +// +// String ajax = request.getParameter("__ajax"); +// return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); +// } +// +// /** +// * 内容编码 +// * +// * @param str 内容 +// * @return 编码后的内容 +// */ +// public static String urlEncode(String str) +// { +// try +// { +// return URLEncoder.encode(str, Constants.UTF8); +// } +// catch (UnsupportedEncodingException e) +// { +// return StringUtils.EMPTY; +// } +// } +// +// /** +// * 内容解码 +// * +// * @param str 内容 +// * @return 解码后的内容 +// */ +// public static String urlDecode(String str) +// { +// try +// { +// return URLDecoder.decode(str, Constants.UTF8); +// } +// catch (UnsupportedEncodingException e) +// { +// return StringUtils.EMPTY; +// } +// } +//} diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/FastJson2JsonRedisSerializer.java b/core/common/src/main/java/com/qihang/common/config/FastJson2JsonRedisSerializer.java similarity index 97% rename from oms-api/src/main/java/com/qihang/oms/api/utils/FastJson2JsonRedisSerializer.java rename to core/common/src/main/java/com/qihang/common/config/FastJson2JsonRedisSerializer.java index c2f5e4a0..f820b393 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/FastJson2JsonRedisSerializer.java +++ b/core/common/src/main/java/com/qihang/common/config/FastJson2JsonRedisSerializer.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.utils; +package com.qihang.common.config; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONReader; diff --git a/oms-api/src/main/java/com/qihang/oms/api/config/RedisCache.java b/core/common/src/main/java/com/qihang/common/config/RedisCache.java similarity index 99% rename from oms-api/src/main/java/com/qihang/oms/api/config/RedisCache.java rename to core/common/src/main/java/com/qihang/common/config/RedisCache.java index d2af2d24..9b8296d7 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/config/RedisCache.java +++ b/core/common/src/main/java/com/qihang/common/config/RedisCache.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.config; +package com.qihang.common.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; diff --git a/oms-api/src/main/java/com/qihang/oms/api/config/RedisConfig.java b/core/common/src/main/java/com/qihang/common/config/RedisConfig.java similarity index 96% rename from oms-api/src/main/java/com/qihang/oms/api/config/RedisConfig.java rename to core/common/src/main/java/com/qihang/common/config/RedisConfig.java index f415ff66..06d4c685 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/config/RedisConfig.java +++ b/core/common/src/main/java/com/qihang/common/config/RedisConfig.java @@ -1,7 +1,6 @@ -package com.qihang.oms.api.config; +package com.qihang.common.config; -import com.qihang.oms.api.utils.FastJson2JsonRedisSerializer; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; diff --git a/oms-api/src/main/java/com/qihang/oms/api/constant/CacheConstants.java b/core/common/src/main/java/com/qihang/common/constant/CacheConstants.java similarity index 95% rename from oms-api/src/main/java/com/qihang/oms/api/constant/CacheConstants.java rename to core/common/src/main/java/com/qihang/common/constant/CacheConstants.java index 2bdb1f9c..7709d9eb 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/constant/CacheConstants.java +++ b/core/common/src/main/java/com/qihang/common/constant/CacheConstants.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.constant; +package com.qihang.common.constant; /** * 缓存的key 常量 diff --git a/oms-api/src/main/java/com/qihang/oms/api/constant/Constants.java b/core/common/src/main/java/com/qihang/common/constant/Constants.java similarity index 98% rename from oms-api/src/main/java/com/qihang/oms/api/constant/Constants.java rename to core/common/src/main/java/com/qihang/common/constant/Constants.java index b181a856..895a8c26 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/constant/Constants.java +++ b/core/common/src/main/java/com/qihang/common/constant/Constants.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.constant; +package com.qihang.common.constant; import io.jsonwebtoken.Claims; diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/Convert.java b/core/common/src/main/java/com/qihang/common/constant/Convert.java similarity index 99% rename from oms-api/src/main/java/com/qihang/oms/api/common/Convert.java rename to core/common/src/main/java/com/qihang/common/constant/Convert.java index 779ad084..d3fd20cc 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/Convert.java +++ b/core/common/src/main/java/com/qihang/common/constant/Convert.java @@ -1,6 +1,7 @@ -package com.qihang.oms.api.common; +package com.qihang.common.constant; -import com.qihang.oms.api.utils.StringUtils; +import com.qihang.common.common.CharsetKit; +import com.qihang.common.utils.StringUtils; import org.apache.commons.lang3.ArrayUtils; import java.math.BigDecimal; diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/StrFormatter.java b/core/common/src/main/java/com/qihang/common/constant/StrFormatter.java similarity index 97% rename from oms-api/src/main/java/com/qihang/oms/api/common/StrFormatter.java rename to core/common/src/main/java/com/qihang/common/constant/StrFormatter.java index 77c46950..2fd0adce 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/StrFormatter.java +++ b/core/common/src/main/java/com/qihang/common/constant/StrFormatter.java @@ -1,7 +1,7 @@ -package com.qihang.oms.api.common; +package com.qihang.common.constant; -import com.qihang.oms.api.utils.StringUtils; +import com.qihang.common.utils.StringUtils; /** * 字符串格式化 diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/UserConstants.java b/core/common/src/main/java/com/qihang/common/constant/UserConstants.java similarity index 98% rename from oms-api/src/main/java/com/qihang/oms/api/common/UserConstants.java rename to core/common/src/main/java/com/qihang/common/constant/UserConstants.java index bf4a2fff..9077c961 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/UserConstants.java +++ b/core/common/src/main/java/com/qihang/common/constant/UserConstants.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.common; +package com.qihang.common.constant; /** * 用户常量信息 diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/HttpStatus.java b/core/common/src/main/java/com/qihang/common/enums/HttpStatus.java similarity index 95% rename from oms-api/src/main/java/com/qihang/oms/api/common/HttpStatus.java rename to core/common/src/main/java/com/qihang/common/enums/HttpStatus.java index ba0e29ff..79686e4c 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/HttpStatus.java +++ b/core/common/src/main/java/com/qihang/common/enums/HttpStatus.java @@ -1,8 +1,8 @@ -package com.qihang.oms.api.common; +package com.qihang.common.enums;//package com.qihang.oms.api.common; /** * 返回状态码 - * + * * @author qihang */ public class HttpStatus diff --git a/oms-api/src/main/java/com/qihang/oms/api/enums/UserStatus.java b/core/common/src/main/java/com/qihang/common/enums/UserStatus.java similarity index 92% rename from oms-api/src/main/java/com/qihang/oms/api/enums/UserStatus.java rename to core/common/src/main/java/com/qihang/common/enums/UserStatus.java index 9fad08bd..961fb6f3 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/enums/UserStatus.java +++ b/core/common/src/main/java/com/qihang/common/enums/UserStatus.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.enums; +package com.qihang.common.enums; /** * 用户状态 diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/BaseException.java b/core/common/src/main/java/com/qihang/common/exception/BaseException.java similarity index 92% rename from oms-api/src/main/java/com/qihang/oms/api/common/BaseException.java rename to core/common/src/main/java/com/qihang/common/exception/BaseException.java index ab9d753c..3cb8c51b 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/BaseException.java +++ b/core/common/src/main/java/com/qihang/common/exception/BaseException.java @@ -1,12 +1,12 @@ -package com.qihang.oms.api.common; +package com.qihang.common.exception; -import com.qihang.oms.api.utils.MessageUtils; -import com.qihang.oms.api.utils.StringUtils; +import com.qihang.common.utils.MessageUtils; +import com.qihang.common.utils.StringUtils; /** * 基础异常 - * + * * @author qihang */ public class BaseException extends RuntimeException diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/UserException.java b/core/common/src/main/java/com/qihang/common/exception/UserException.java similarity index 86% rename from oms-api/src/main/java/com/qihang/oms/api/common/UserException.java rename to core/common/src/main/java/com/qihang/common/exception/UserException.java index 29590a56..7249b1cb 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/UserException.java +++ b/core/common/src/main/java/com/qihang/common/exception/UserException.java @@ -1,10 +1,10 @@ -package com.qihang.oms.api.common; +package com.qihang.common.exception; /** * 用户信息异常类 - * + * * @author qihang */ public class UserException extends BaseException diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/UserNotExistsException.java b/core/common/src/main/java/com/qihang/common/exception/UserNotExistsException.java similarity index 86% rename from oms-api/src/main/java/com/qihang/oms/api/common/UserNotExistsException.java rename to core/common/src/main/java/com/qihang/common/exception/UserNotExistsException.java index ef46c7b9..920f27f0 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/UserNotExistsException.java +++ b/core/common/src/main/java/com/qihang/common/exception/UserNotExistsException.java @@ -1,8 +1,8 @@ -package com.qihang.oms.api.common; +package com.qihang.common.exception; /** * 用户不存在异常类 - * + * * @author qihang */ public class UserNotExistsException extends UserException diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/DateUtils.java b/core/common/src/main/java/com/qihang/common/utils/DateUtils.java similarity index 99% rename from oms-api/src/main/java/com/qihang/oms/api/utils/DateUtils.java rename to core/common/src/main/java/com/qihang/common/utils/DateUtils.java index 1dad26b5..9511c8ad 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/DateUtils.java +++ b/core/common/src/main/java/com/qihang/common/utils/DateUtils.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.utils; +package com.qihang.common.utils; import org.apache.commons.lang3.time.DateFormatUtils; diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/IdUtils.java b/core/common/src/main/java/com/qihang/common/utils/IdUtils.java similarity index 96% rename from oms-api/src/main/java/com/qihang/oms/api/utils/IdUtils.java rename to core/common/src/main/java/com/qihang/common/utils/IdUtils.java index 8d3fc500..3063ef19 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/IdUtils.java +++ b/core/common/src/main/java/com/qihang/common/utils/IdUtils.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.utils; +package com.qihang.common.utils; /** * ID生成器工具类 diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/MessageUtils.java b/core/common/src/main/java/com/qihang/common/utils/MessageUtils.java similarity index 94% rename from oms-api/src/main/java/com/qihang/oms/api/utils/MessageUtils.java rename to core/common/src/main/java/com/qihang/common/utils/MessageUtils.java index b05eb675..07cb1722 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/MessageUtils.java +++ b/core/common/src/main/java/com/qihang/common/utils/MessageUtils.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.utils; +package com.qihang.common.utils; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/SpringUtils.java b/core/common/src/main/java/com/qihang/common/utils/SpringUtils.java similarity index 99% rename from oms-api/src/main/java/com/qihang/oms/api/utils/SpringUtils.java rename to core/common/src/main/java/com/qihang/common/utils/SpringUtils.java index a36b85a1..3dd63b6d 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/SpringUtils.java +++ b/core/common/src/main/java/com/qihang/common/utils/SpringUtils.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.utils; +package com.qihang.common.utils; import org.springframework.aop.framework.AopContext; import org.springframework.beans.BeansException; diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/StringUtils.java b/core/common/src/main/java/com/qihang/common/utils/StringUtils.java similarity index 95% rename from oms-api/src/main/java/com/qihang/oms/api/utils/StringUtils.java rename to core/common/src/main/java/com/qihang/common/utils/StringUtils.java index 0782143f..b86cfe82 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/StringUtils.java +++ b/core/common/src/main/java/com/qihang/common/utils/StringUtils.java @@ -1,9 +1,7 @@ -package com.qihang.oms.api.utils; +package com.qihang.common.utils; - -import com.qihang.oms.api.constant.Constants; -import com.qihang.oms.api.common.StrFormatter; -import org.springframework.util.AntPathMatcher; +import com.qihang.common.constant.Constants; +import com.qihang.common.constant.StrFormatter; import java.util.*; @@ -522,21 +520,21 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param strs 需要检查的字符串数组 * @return 是否匹配 */ - public static boolean matches(String str, List strs) - { - if (isEmpty(str) || isEmpty(strs)) - { - return false; - } - for (String pattern : strs) - { - if (isMatch(pattern, str)) - { - return true; - } - } - return false; - } +// public static boolean matches(String str, List strs) +// { +// if (isEmpty(str) || isEmpty(strs)) +// { +// return false; +// } +// for (String pattern : strs) +// { +// if (isMatch(pattern, str)) +// { +// return true; +// } +// } +// return false; +// } /** * 判断url是否与规则配置: @@ -548,11 +546,11 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils * @param url 需要匹配的url * @return */ - public static boolean isMatch(String pattern, String url) - { - AntPathMatcher matcher = new AntPathMatcher(); - return matcher.match(pattern, url); - } +// public static boolean isMatch(String pattern, String url) +// { +// AntPathMatcher matcher = new AntPathMatcher(); +// return matcher.match(pattern, url); +// } @SuppressWarnings("unchecked") public static T cast(Object obj) diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/UUID.java b/core/common/src/main/java/com/qihang/common/utils/UUID.java similarity index 99% rename from oms-api/src/main/java/com/qihang/oms/api/utils/UUID.java rename to core/common/src/main/java/com/qihang/common/utils/UUID.java index 28e24e5a..2030a7c4 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/UUID.java +++ b/core/common/src/main/java/com/qihang/common/utils/UUID.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.utils; +package com.qihang.common.utils; diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/http/HttpHelper.java b/core/common/src/main/java/com/qihang/common/utils/http/HttpHelper.java similarity index 97% rename from oms-api/src/main/java/com/qihang/oms/api/utils/http/HttpHelper.java rename to core/common/src/main/java/com/qihang/common/utils/http/HttpHelper.java index 0e54a2d5..4cf370df 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/http/HttpHelper.java +++ b/core/common/src/main/java/com/qihang/common/utils/http/HttpHelper.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.utils.http; +package com.qihang.common.utils.http; import jakarta.servlet.ServletRequest; import org.apache.commons.lang3.exception.ExceptionUtils; diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/http/HttpUtils.java b/core/common/src/main/java/com/qihang/common/utils/http/HttpUtils.java similarity index 98% rename from oms-api/src/main/java/com/qihang/oms/api/utils/http/HttpUtils.java rename to core/common/src/main/java/com/qihang/common/utils/http/HttpUtils.java index ad00cd61..0449ff03 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/http/HttpUtils.java +++ b/core/common/src/main/java/com/qihang/common/utils/http/HttpUtils.java @@ -1,7 +1,7 @@ -package com.qihang.oms.api.utils.http; +package com.qihang.common.utils.http; -import com.qihang.oms.api.constant.Constants; -import com.qihang.oms.api.utils.StringUtils; +import com.qihang.common.constant.Constants; +import com.qihang.common.utils.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/core/common/src/main/java/com/qihang/common/utils/ip/AddressUtils.java b/core/common/src/main/java/com/qihang/common/utils/ip/AddressUtils.java new file mode 100644 index 00000000..3855f351 --- /dev/null +++ b/core/common/src/main/java/com/qihang/common/utils/ip/AddressUtils.java @@ -0,0 +1,54 @@ +//package com.qihang.common.utils.ip; +// +//import com.alibaba.fastjson2.JSON; +//import com.alibaba.fastjson2.JSONObject; +//import com.qihang.common.constant.Constants; +//import com.qihang.common.utils.http.HttpUtils; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.util.StringUtils; +// +///** +// * 获取地址类 +// * +// * @author qihang +// */ +//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) +// { +// // 内网不查询 +// if (IpUtils.internalIp(ip)) +// { +// return "内网IP"; +// } +// +// try +// { +// String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); +// if (StringUtils.isEmpty(rspStr)) +// { +// log.error("获取地理位置异常 {}", ip); +// return UNKNOWN; +// } +// JSONObject obj = JSON.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 UNKNOWN; +// } +//} diff --git a/core/common/src/main/java/com/qihang/common/utils/ip/IpUtils.java b/core/common/src/main/java/com/qihang/common/utils/ip/IpUtils.java new file mode 100644 index 00000000..ab06aa49 --- /dev/null +++ b/core/common/src/main/java/com/qihang/common/utils/ip/IpUtils.java @@ -0,0 +1,384 @@ +//package com.qihang.common.utils.ip; +// +// +//import com.qihang.common.common.ServletUtils; +//import com.qihang.common.utils.StringUtils; +//import jakarta.servlet.http.HttpServletRequest; +// +//import java.net.InetAddress; +//import java.net.UnknownHostException; +// +///** +// * 获取IP方法 +// * +// * @author qihang +// */ +//public class IpUtils +//{ +// public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; +// // 匹配 ip +// public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; +// public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; +// // 匹配网段 +// public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")"; +// +// /** +// * 获取客户端IP +// * +// * @return IP地址 +// */ +// public static String getIpAddr() +// { +// return getIpAddr(ServletUtils.getRequest()); +// } +// +// /** +// * 获取客户端IP +// * +// * @param request 请求对象 +// * @return IP地址 +// */ +// public static String getIpAddr(HttpServletRequest request) +// { +// if (request == null) +// { +// 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" : getMultistageReverseProxyIp(ip); +// } +// +// /** +// * 检查是否为内部IP地址 +// * +// * @param ip IP地址 +// * @return 结果 +// */ +// public static boolean internalIp(String ip) +// { +// byte[] addr = textToNumericFormatV4(ip); +// return internalIp(addr) || "127.0.0.1".equals(ip); +// } +// +// /** +// * 检查是否为内部IP地址 +// * +// * @param addr byte地址 +// * @return 结果 +// */ +// private static boolean internalIp(byte[] addr) +// { +// if (StringUtils.isNull(addr) || addr.length < 2) +// { +// 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; +// } +// +// /** +// * 获取IP地址 +// * +// * @return 本地IP地址 +// */ +// public static String getHostIp() +// { +// try +// { +// return InetAddress.getLocalHost().getHostAddress(); +// } +// catch (UnknownHostException e) +// { +// } +// return "127.0.0.1"; +// } +// +// /** +// * 获取主机名 +// * +// * @return 本地主机名 +// */ +// public static String getHostName() +// { +// try +// { +// return InetAddress.getLocalHost().getHostName(); +// } +// catch (UnknownHostException e) +// { +// } +// return "未知"; +// } +// +// /** +// * 从多级反向代理中获得第一个非unknown IP地址 +// * +// * @param ip 获得的IP地址 +// * @return 第一个非unknown IP地址 +// */ +// public static String getMultistageReverseProxyIp(String ip) +// { +// // 多级反向代理检测 +// if (ip != null && ip.indexOf(",") > 0) +// { +// final String[] ips = ip.trim().split(","); +// for (String subIp : ips) +// { +// if (false == isUnknown(subIp)) +// { +// ip = subIp; +// break; +// } +// } +// } +// return StringUtils.substring(ip, 0, 255); +// } +// +// /** +// * 检测给定字符串是否为未知,多用于检测HTTP请求相关 +// * +// * @param checkString 被检测的字符串 +// * @return 是否未知 +// */ +// public static boolean isUnknown(String checkString) +// { +// return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); +// } +// +// /** +// * 是否为IP +// */ +// public static boolean isIP(String ip) +// { +// return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); +// } +// +// /** +// * 是否为IP,或 *为间隔的通配符地址 +// */ +// public static boolean isIpWildCard(String ip) +// { +// return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); +// } +// +// /** +// * 检测参数是否在ip通配符里 +// */ +// public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) +// { +// String[] s1 = ipWildCard.split("\\."); +// String[] s2 = ip.split("\\."); +// boolean isMatchedSeg = true; +// for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) +// { +// if (!s1[i].equals(s2[i])) +// { +// isMatchedSeg = false; +// break; +// } +// } +// return isMatchedSeg; +// } +// +// /** +// * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串 +// */ +// public static boolean isIPSegment(String ipSeg) +// { +// return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); +// } +// +// /** +// * 判断ip是否在指定网段中 +// */ +// public static boolean ipIsInNetNoCheck(String iparea, String ip) +// { +// int idx = iparea.indexOf('-'); +// String[] sips = iparea.substring(0, idx).split("\\."); +// String[] sipe = iparea.substring(idx + 1).split("\\."); +// String[] sipt = ip.split("\\."); +// long ips = 0L, ipe = 0L, ipt = 0L; +// for (int i = 0; i < 4; ++i) +// { +// ips = ips << 8 | Integer.parseInt(sips[i]); +// ipe = ipe << 8 | Integer.parseInt(sipe[i]); +// ipt = ipt << 8 | Integer.parseInt(sipt[i]); +// } +// if (ips > ipe) +// { +// long t = ips; +// ips = ipe; +// ipe = t; +// } +// return ips <= ipt && ipt <= ipe; +// } +// +// /** +// * 校验ip是否符合过滤串规则 +// * +// * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` +// * @param ip 校验IP地址 +// * @return boolean 结果 +// */ +// public static boolean isMatchedIp(String filter, String ip) +// { +// if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) +// { +// return false; +// } +// String[] ips = filter.split(";"); +// for (String iStr : ips) +// { +// if (isIP(iStr) && iStr.equals(ip)) +// { +// return true; +// } +// else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) +// { +// return true; +// } +// else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) +// { +// return true; +// } +// } +// return false; +// } +//} \ No newline at end of file diff --git a/core/pom.xml b/core/pom.xml new file mode 100644 index 00000000..65cf29db --- /dev/null +++ b/core/pom.xml @@ -0,0 +1,27 @@ + + 4.0.0 + + com.qihang + qihang-oms + 1.0-SNAPSHOT + + + com.qihang + core + pom + + core + http://maven.apache.org + + security + common + + + UTF-8 + + + + + + diff --git a/core/security/.gitignore b/core/security/.gitignore new file mode 100644 index 00000000..5ff6309b --- /dev/null +++ b/core/security/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/core/security/pom.xml b/core/security/pom.xml new file mode 100644 index 00000000..01a0a785 --- /dev/null +++ b/core/security/pom.xml @@ -0,0 +1,78 @@ + + 4.0.0 + + com.qihang + core + 1.0-SNAPSHOT + + + com.qihang + security + jar + + security + http://maven.apache.org + + + UTF-8 + 3.0.2 + 0.11.5 + + + + + org.springframework.boot + spring-boot-starter-security + ${spring-boot.version} + + + com.baomidou + mybatis-plus-boot-starter + 3.5.5 + + + org.springframework.boot + spring-boot-starter-data-redis + ${spring-boot.version} + + + + io.jsonwebtoken + jjwt-api + ${jwt.version} + + + io.jsonwebtoken + jjwt-impl + ${jwt.version} + runtime + + + + io.jsonwebtoken + jjwt-jackson + ${jwt.version} + runtime + + + + + eu.bitwalker + UserAgentUtils + 1.21 + + + jakarta.platform + jakarta.jakartaee-api + 9.1.0 + provided + + + + com.qihang + common + 1.0-SNAPSHOT + + + diff --git a/core/security/src/main/java/com/qihang/security/App.java b/core/security/src/main/java/com/qihang/security/App.java new file mode 100644 index 00000000..1cf8ed4b --- /dev/null +++ b/core/security/src/main/java/com/qihang/security/App.java @@ -0,0 +1,8 @@ +package com.qihang.security; + +public class App { + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/oms-api/src/main/java/com/qihang/oms/api/security/AuthenticationContextHolder.java b/core/security/src/main/java/com/qihang/security/AuthenticationContextHolder.java similarity index 92% rename from oms-api/src/main/java/com/qihang/oms/api/security/AuthenticationContextHolder.java rename to core/security/src/main/java/com/qihang/security/AuthenticationContextHolder.java index 34340b0e..41adba4c 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/security/AuthenticationContextHolder.java +++ b/core/security/src/main/java/com/qihang/security/AuthenticationContextHolder.java @@ -1,10 +1,10 @@ -package com.qihang.oms.api.security; +package com.qihang.security; import org.springframework.security.core.Authentication; /** * 身份验证信息 - * + * * @author qihang */ public class AuthenticationContextHolder diff --git a/oms-api/src/main/java/com/qihang/oms/api/security/AuthenticationExceptionHandler.java b/core/security/src/main/java/com/qihang/security/AuthenticationExceptionHandler.java similarity index 95% rename from oms-api/src/main/java/com/qihang/oms/api/security/AuthenticationExceptionHandler.java rename to core/security/src/main/java/com/qihang/security/AuthenticationExceptionHandler.java index 6e3588e0..44c8d7f8 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/security/AuthenticationExceptionHandler.java +++ b/core/security/src/main/java/com/qihang/security/AuthenticationExceptionHandler.java @@ -1,6 +1,8 @@ -package com.qihang.oms.api.security; +package com.qihang.security; import com.alibaba.fastjson2.JSON; + +import com.qihang.common.common.R; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -10,7 +12,7 @@ import org.springframework.http.MediaType; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.stereotype.Component; -import com.qihang.oms.api.common.R; + import java.io.IOException; import java.io.PrintWriter; diff --git a/oms-api/src/main/java/com/qihang/oms/api/security/JwtAuthenticationTokenFilter.java b/core/security/src/main/java/com/qihang/security/JwtAuthenticationTokenFilter.java similarity index 95% rename from oms-api/src/main/java/com/qihang/oms/api/security/JwtAuthenticationTokenFilter.java rename to core/security/src/main/java/com/qihang/security/JwtAuthenticationTokenFilter.java index c8f773f4..4820edd3 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/security/JwtAuthenticationTokenFilter.java +++ b/core/security/src/main/java/com/qihang/security/JwtAuthenticationTokenFilter.java @@ -1,10 +1,8 @@ -package com.qihang.oms.api.security; +package com.qihang.security; import com.alibaba.fastjson2.JSON; -import com.qihang.oms.api.common.R; -import com.qihang.oms.api.domain.LoginUser; -import com.qihang.oms.api.service.TokenService; +import com.qihang.common.common.R; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; diff --git a/oms-api/src/main/java/com/qihang/oms/api/domain/LoginUser.java b/core/security/src/main/java/com/qihang/security/LoginUser.java similarity index 98% rename from oms-api/src/main/java/com/qihang/oms/api/domain/LoginUser.java rename to core/security/src/main/java/com/qihang/security/LoginUser.java index 0dbea5e8..d3599124 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/domain/LoginUser.java +++ b/core/security/src/main/java/com/qihang/security/LoginUser.java @@ -1,7 +1,7 @@ -package com.qihang.oms.api.domain; +package com.qihang.security; import com.alibaba.fastjson2.annotation.JSONField; -import com.qihang.oms.api.domain.SysUser; +import com.qihang.security.entity.SysUser; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; diff --git a/oms-api/src/main/java/com/qihang/oms/api/security/SecurityConfig.java b/core/security/src/main/java/com/qihang/security/SecurityConfig.java similarity index 99% rename from oms-api/src/main/java/com/qihang/oms/api/security/SecurityConfig.java rename to core/security/src/main/java/com/qihang/security/SecurityConfig.java index 3808f766..c7cd2330 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/security/SecurityConfig.java +++ b/core/security/src/main/java/com/qihang/security/SecurityConfig.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.security; +package com.qihang.security; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/oms-api/src/main/java/com/qihang/oms/api/service/TokenService.java b/core/security/src/main/java/com/qihang/security/TokenService.java similarity index 92% rename from oms-api/src/main/java/com/qihang/oms/api/service/TokenService.java rename to core/security/src/main/java/com/qihang/security/TokenService.java index fd403bde..c7d8824e 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/service/TokenService.java +++ b/core/security/src/main/java/com/qihang/security/TokenService.java @@ -1,14 +1,13 @@ -package com.qihang.oms.api.service; +package com.qihang.security; -import com.alibaba.cloud.commons.lang.StringUtils; -import com.qihang.oms.api.config.RedisCache; -import com.qihang.oms.api.constant.CacheConstants; -import com.qihang.oms.api.constant.Constants; -import com.qihang.oms.api.domain.LoginUser; -import com.qihang.oms.api.utils.IdUtils; -import com.qihang.oms.api.utils.ServletUtils; -import com.qihang.oms.api.utils.ip.AddressUtils; -import com.qihang.oms.api.utils.ip.IpUtils; +import com.qihang.common.config.RedisCache; +import com.qihang.common.constant.CacheConstants; +import com.qihang.common.constant.Constants; +import com.qihang.common.utils.IdUtils; +import com.qihang.common.utils.StringUtils; +import com.qihang.security.utils.AddressUtils; +import com.qihang.security.utils.IpUtils; +import com.qihang.security.utils.ServletUtils; import eu.bitwalker.useragentutils.UserAgent; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; diff --git a/oms-api/src/main/java/com/qihang/oms/api/security/UserDetailsServiceImpl.java b/core/security/src/main/java/com/qihang/security/UserDetailsServiceImpl.java similarity index 85% rename from oms-api/src/main/java/com/qihang/oms/api/security/UserDetailsServiceImpl.java rename to core/security/src/main/java/com/qihang/security/UserDetailsServiceImpl.java index 3136a849..4d17f890 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/security/UserDetailsServiceImpl.java +++ b/core/security/src/main/java/com/qihang/security/UserDetailsServiceImpl.java @@ -1,13 +1,13 @@ -package com.qihang.oms.api.security; +package com.qihang.security; -import com.qihang.oms.api.common.ServiceException; -import com.qihang.oms.api.domain.LoginUser; -import com.qihang.oms.api.domain.SysUser; -import com.qihang.oms.api.enums.UserStatus; -import com.qihang.oms.api.service.ISysUserService; -import com.qihang.oms.api.utils.MessageUtils; -import com.qihang.oms.api.utils.StringUtils; +import com.qihang.common.common.ServiceException; +import com.qihang.common.enums.UserStatus; +import com.qihang.common.utils.MessageUtils; +import com.qihang.common.utils.StringUtils; + +import com.qihang.security.entity.SysUser; +import com.qihang.security.service.ISysUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/oms-api/src/main/java/com/qihang/oms/api/common/UserPasswordNotMatchException.java b/core/security/src/main/java/com/qihang/security/UserPasswordNotMatchException.java similarity index 78% rename from oms-api/src/main/java/com/qihang/oms/api/common/UserPasswordNotMatchException.java rename to core/security/src/main/java/com/qihang/security/UserPasswordNotMatchException.java index 90ce6fd3..ea2a9254 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/common/UserPasswordNotMatchException.java +++ b/core/security/src/main/java/com/qihang/security/UserPasswordNotMatchException.java @@ -1,8 +1,10 @@ -package com.qihang.oms.api.common; +package com.qihang.security; + +import com.qihang.common.exception.UserException; /** * 用户密码不正确或不符合规范异常类 - * + * * @author qihang */ public class UserPasswordNotMatchException extends UserException diff --git a/oms-api/src/main/java/com/qihang/oms/api/domain/SysUser.java b/core/security/src/main/java/com/qihang/security/entity/SysUser.java similarity index 76% rename from oms-api/src/main/java/com/qihang/oms/api/domain/SysUser.java rename to core/security/src/main/java/com/qihang/security/entity/SysUser.java index c251bb83..99123155 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/domain/SysUser.java +++ b/core/security/src/main/java/com/qihang/security/entity/SysUser.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.domain; +package com.qihang.security.entity; import java.util.Date; @@ -8,7 +8,7 @@ import java.util.Date; * * @author qihang */ -public class SysUser extends BaseEntity +public class SysUser { private static final long serialVersionUID = 1L; @@ -60,7 +60,18 @@ public class SysUser extends BaseEntity /** 角色ID */ private Long roleId; +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + /** 更新者 */ + private String updateBy; + + /** 更新时间 */ +// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + /** 创建者 */ + private String createBy; + private String remark; public SysUser() { @@ -246,4 +257,43 @@ public class SysUser extends BaseEntity this.roleId = roleId; } + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } } diff --git a/core/security/src/main/java/com/qihang/security/mapper/SysUserMapper.java b/core/security/src/main/java/com/qihang/security/mapper/SysUserMapper.java new file mode 100644 index 00000000..3559676b --- /dev/null +++ b/core/security/src/main/java/com/qihang/security/mapper/SysUserMapper.java @@ -0,0 +1,130 @@ +//package com.qihang.security.mapper; +// +//import com.qihang.security.entity.SysUser; +//import org.apache.ibatis.annotations.Mapper; +//import org.apache.ibatis.annotations.Param; +// +//import java.util.List; +// +///** +// * 用户表 数据层 +// * +// * @author qihang +// */ +//@Mapper +//public interface SysUserMapper +//{ +// /** +// * 根据条件分页查询用户列表 +// * +// * @param sysUser 用户信息 +// * @return 用户信息集合信息 +// */ +// public List selectUserList(SysUser sysUser); +// +// /** +// * 根据条件分页查询已配用户角色列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// public List selectAllocatedList(SysUser user); +// +// /** +// * 根据条件分页查询未分配用户角色列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// public List selectUnallocatedList(SysUser user); +// +// /** +// * 通过用户名查询用户 +// * +// * @param userName 用户名 +// * @return 用户对象信息 +// */ +// public SysUser selectUserByUserName(String userName); +// +// /** +// * 通过用户ID查询用户 +// * +// * @param userId 用户ID +// * @return 用户对象信息 +// */ +// public SysUser selectUserById(Long userId); +// +// /** +// * 新增用户信息 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public int insertUser(SysUser user); +// +// /** +// * 修改用户信息 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public int updateUser(SysUser 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 SysUser checkUserNameUnique(String userName); +// +// /** +// * 校验手机号码是否唯一 +// * +// * @param phonenumber 手机号码 +// * @return 结果 +// */ +// public SysUser checkPhoneUnique(String phonenumber); +// +// /** +// * 校验email是否唯一 +// * +// * @param email 用户邮箱 +// * @return 结果 +// */ +// public SysUser checkEmailUnique(String email); +//} diff --git a/oms-api/src/main/java/com/qihang/oms/api/service/ISysUserService.java b/core/security/src/main/java/com/qihang/security/service/ISysUserService.java similarity index 93% rename from oms-api/src/main/java/com/qihang/oms/api/service/ISysUserService.java rename to core/security/src/main/java/com/qihang/security/service/ISysUserService.java index 62457fba..d33f6068 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/service/ISysUserService.java +++ b/core/security/src/main/java/com/qihang/security/service/ISysUserService.java @@ -1,19 +1,20 @@ -package com.qihang.oms.api.service; +package com.qihang.security.service; -import com.qihang.oms.api.domain.SysUser; + +import com.qihang.security.entity.SysUser; import java.util.List; /** * 用户 业务层 - * + * * @author qihang */ public interface ISysUserService { /** * 根据条件分页查询用户列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -21,7 +22,7 @@ public interface ISysUserService /** * 根据条件分页查询已分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -29,7 +30,7 @@ public interface ISysUserService /** * 根据条件分页查询未分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -37,7 +38,7 @@ public interface ISysUserService /** * 通过用户名查询用户 - * + * * @param userName 用户名 * @return 用户对象信息 */ @@ -45,7 +46,7 @@ public interface ISysUserService /** * 通过用户ID查询用户 - * + * * @param userId 用户ID * @return 用户对象信息 */ @@ -53,7 +54,7 @@ public interface ISysUserService /** * 校验用户名称是否唯一 - * + * * @param user 用户信息 * @return 结果 */ @@ -77,7 +78,7 @@ public interface ISysUserService /** * 校验用户是否允许操作 - * + * * @param user 用户信息 */ public void checkUserAllowed(SysUser user); @@ -85,7 +86,7 @@ public interface ISysUserService /** * 新增用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -93,7 +94,7 @@ public interface ISysUserService /** * 注册用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -101,7 +102,7 @@ public interface ISysUserService /** * 修改用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -109,7 +110,7 @@ public interface ISysUserService /** * 修改用户状态 - * + * * @param user 用户信息 * @return 结果 */ @@ -117,7 +118,7 @@ public interface ISysUserService /** * 修改用户基本信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -125,7 +126,7 @@ public interface ISysUserService /** * 修改用户头像 - * + * * @param userName 用户名 * @param avatar 头像地址 * @return 结果 @@ -134,7 +135,7 @@ public interface ISysUserService /** * 重置用户密码 - * + * * @param user 用户信息 * @return 结果 */ @@ -142,7 +143,7 @@ public interface ISysUserService /** * 重置用户密码 - * + * * @param userName 用户名 * @param password 密码 * @return 结果 @@ -151,7 +152,7 @@ public interface ISysUserService /** * 通过用户ID删除用户 - * + * * @param userId 用户ID * @return 结果 */ diff --git a/oms-api/src/main/java/com/qihang/oms/api/service/SysLoginService.java b/core/security/src/main/java/com/qihang/security/service/SysLoginService.java similarity index 89% rename from oms-api/src/main/java/com/qihang/oms/api/service/SysLoginService.java rename to core/security/src/main/java/com/qihang/security/service/SysLoginService.java index 0e52ea3b..757d31e2 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/service/SysLoginService.java +++ b/core/security/src/main/java/com/qihang/security/service/SysLoginService.java @@ -1,15 +1,17 @@ -package com.qihang.oms.api.service; +package com.qihang.security.service; -import com.qihang.oms.api.common.UserConstants; -import com.qihang.oms.api.common.UserNotExistsException; -import com.qihang.oms.api.common.UserPasswordNotMatchException; -import com.qihang.oms.api.config.RedisCache; -import com.qihang.oms.api.domain.LoginUser; -import com.qihang.oms.api.domain.SysUser; -import com.qihang.oms.api.security.AuthenticationContextHolder; -import com.qihang.oms.api.utils.DateUtils; -import com.qihang.oms.api.utils.StringUtils; -import com.qihang.oms.api.utils.ip.IpUtils; + +import com.qihang.common.config.RedisCache; +import com.qihang.common.constant.UserConstants; +import com.qihang.common.exception.UserNotExistsException; +import com.qihang.common.utils.DateUtils; +import com.qihang.common.utils.StringUtils; +import com.qihang.security.AuthenticationContextHolder; +import com.qihang.security.LoginUser; +import com.qihang.security.TokenService; +import com.qihang.security.UserPasswordNotMatchException; +import com.qihang.security.entity.SysUser; +import com.qihang.security.utils.IpUtils; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; @@ -21,7 +23,7 @@ import org.springframework.stereotype.Component; /** * 登录校验方法 - * + * * @author qihang */ @Component @@ -35,7 +37,7 @@ public class SysLoginService @Autowired private RedisCache redisCache; - + @Autowired private ISysUserService userService; @@ -44,7 +46,7 @@ public class SysLoginService /** * 登录验证 - * + * * @param username 用户名 * @param password 密码 * @param code 验证码 diff --git a/core/security/src/main/java/com/qihang/security/service/impl/SysUserServiceImpl.java b/core/security/src/main/java/com/qihang/security/service/impl/SysUserServiceImpl.java new file mode 100644 index 00000000..589ac1b4 --- /dev/null +++ b/core/security/src/main/java/com/qihang/security/service/impl/SysUserServiceImpl.java @@ -0,0 +1,294 @@ +//package com.qihang.security.service.impl; +// +// +//import com.qihang.common.common.ServiceException; +//import com.qihang.common.constant.UserConstants; +//import com.qihang.common.utils.StringUtils; +//import com.qihang.security.entity.SysUser; +//import com.qihang.security.mapper.SysUserMapper; +//import com.qihang.security.service.ISysUserService; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Service; +//import org.springframework.transaction.annotation.Transactional; +// +//import java.util.List; +// +///** +// * 用户 业务层处理 +// * +// * @author qihang +// */ +//@Service +//public class SysUserServiceImpl implements ISysUserService +//{ +// private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); +// +// @Autowired +// private SysUserMapper userMapper; +// +// /** +// * 根据条件分页查询用户列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// @Override +// public List selectUserList(SysUser user) +// { +// return userMapper.selectUserList(user); +// } +// +// /** +// * 根据条件分页查询已分配用户角色列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// @Override +// public List selectAllocatedList(SysUser user) +// { +// return userMapper.selectAllocatedList(user); +// } +// +// /** +// * 根据条件分页查询未分配用户角色列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// @Override +// public List selectUnallocatedList(SysUser user) +// { +// return userMapper.selectUnallocatedList(user); +// } +// +// /** +// * 通过用户名查询用户 +// * +// * @param userName 用户名 +// * @return 用户对象信息 +// */ +// @Override +// public SysUser selectUserByUserName(String userName) +// { +// return userMapper.selectUserByUserName(userName); +// } +// +// /** +// * 通过用户ID查询用户 +// * +// * @param userId 用户ID +// * @return 用户对象信息 +// */ +// @Override +// public SysUser selectUserById(Long userId) +// { +// return userMapper.selectUserById(userId); +// } +// +// /** +// * 校验用户名称是否唯一 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// @Override +// public boolean checkUserNameUnique(SysUser user) +// { +// Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); +// SysUser info = userMapper.checkUserNameUnique(user.getUserName()); +// if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) +// { +// return UserConstants.NOT_UNIQUE; +// } +// return UserConstants.UNIQUE; +// } +// +// /** +// * 校验手机号码是否唯一 +// * +// * @param user 用户信息 +// * @return +// */ +// @Override +// public boolean checkPhoneUnique(SysUser user) +// { +// Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); +// SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber()); +// if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) +// { +// return UserConstants.NOT_UNIQUE; +// } +// return UserConstants.UNIQUE; +// } +// +// /** +// * 校验email是否唯一 +// * +// * @param user 用户信息 +// * @return +// */ +// @Override +// public boolean checkEmailUnique(SysUser user) +// { +// Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); +// SysUser info = userMapper.checkEmailUnique(user.getEmail()); +// if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) +// { +// return UserConstants.NOT_UNIQUE; +// } +// return UserConstants.UNIQUE; +// } +// +// /** +// * 校验用户是否允许操作 +// * +// * @param user 用户信息 +// */ +// @Override +// public void checkUserAllowed(SysUser user) +// { +// if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) +// { +// throw new ServiceException("不允许操作超级管理员用户"); +// } +// } +// +// /** +// * 新增保存用户信息 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// @Override +// @Transactional +// public int insertUser(SysUser user) +// { +// // 新增用户信息 +// int rows = userMapper.insertUser(user); +//// // 新增用户岗位关联 +//// insertUserPost(user); +//// // 新增用户与角色管理 +//// insertUserRole(user); +// return rows; +// } +// +// /** +// * 注册用户信息 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// @Override +// public boolean registerUser(SysUser user) +// { +// return userMapper.insertUser(user) > 0; +// } +// +// /** +// * 修改保存用户信息 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// @Override +// @Transactional +// public int updateUser(SysUser user) +// { +// Long userId = user.getUserId(); +//// // 删除用户与角色关联 +//// userRoleMapper.deleteUserRoleByUserId(userId); +//// // 新增用户与角色管理 +//// insertUserRole(user); +//// // 删除用户与岗位关联 +//// userPostMapper.deleteUserPostByUserId(userId); +// // 新增用户与岗位管理 +//// insertUserPost(user); +// return userMapper.updateUser(user); +// } +// +// +// /** +// * 修改用户状态 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// @Override +// public int updateUserStatus(SysUser user) +// { +// return userMapper.updateUser(user); +// } +// +// /** +// * 修改用户基本信息 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// @Override +// public int updateUserProfile(SysUser user) +// { +// return userMapper.updateUser(user); +// } +// +// /** +// * 修改用户头像 +// * +// * @param userName 用户名 +// * @param avatar 头像地址 +// * @return 结果 +// */ +// @Override +// public boolean updateUserAvatar(String userName, String avatar) +// { +// return userMapper.updateUserAvatar(userName, avatar) > 0; +// } +// +// /** +// * 重置用户密码 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// @Override +// public int resetPwd(SysUser user) +// { +// return userMapper.updateUser(user); +// } +// +// /** +// * 重置用户密码 +// * +// * @param userName 用户名 +// * @param password 密码 +// * @return 结果 +// */ +// @Override +// public int resetUserPwd(String userName, String password) +// { +// return userMapper.resetUserPwd(userName, password); +// } +// +// +// +// /** +// * 通过用户ID删除用户 +// * +// * @param userId 用户ID +// * @return 结果 +// */ +// @Override +// @Transactional +// public int deleteUserById(Long userId) +// { +//// // 删除用户与角色关联 +//// userRoleMapper.deleteUserRoleByUserId(userId); +//// // 删除用户与岗位表 +//// userPostMapper.deleteUserPostByUserId(userId); +// return userMapper.deleteUserById(userId); +// } +// +//} diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/ip/AddressUtils.java b/core/security/src/main/java/com/qihang/security/utils/AddressUtils.java similarity index 91% rename from oms-api/src/main/java/com/qihang/oms/api/utils/ip/AddressUtils.java rename to core/security/src/main/java/com/qihang/security/utils/AddressUtils.java index 6e3eb859..aba6e5ef 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/ip/AddressUtils.java +++ b/core/security/src/main/java/com/qihang/security/utils/AddressUtils.java @@ -1,16 +1,16 @@ -package com.qihang.oms.api.utils.ip; +package com.qihang.security.utils; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; -import com.qihang.oms.api.constant.Constants; -import com.qihang.oms.api.utils.http.HttpUtils; +import com.qihang.common.constant.Constants; +import com.qihang.common.utils.http.HttpUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.StringUtils; /** * 获取地址类 - * + * * @author qihang */ public class AddressUtils diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/ip/IpUtils.java b/core/security/src/main/java/com/qihang/security/utils/IpUtils.java similarity index 98% rename from oms-api/src/main/java/com/qihang/oms/api/utils/ip/IpUtils.java rename to core/security/src/main/java/com/qihang/security/utils/IpUtils.java index 99b0434d..a603cb02 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/ip/IpUtils.java +++ b/core/security/src/main/java/com/qihang/security/utils/IpUtils.java @@ -1,8 +1,6 @@ -package com.qihang.oms.api.utils.ip; +package com.qihang.security.utils; - -import com.qihang.oms.api.utils.ServletUtils; -import com.qihang.oms.api.utils.StringUtils; +import com.qihang.common.utils.StringUtils; import jakarta.servlet.http.HttpServletRequest; import java.net.InetAddress; @@ -10,7 +8,7 @@ import java.net.UnknownHostException; /** * 获取IP方法 - * + * * @author qihang */ public class IpUtils @@ -24,7 +22,7 @@ public class IpUtils /** * 获取客户端IP - * + * * @return IP地址 */ public static String getIpAddr() @@ -34,7 +32,7 @@ public class IpUtils /** * 获取客户端IP - * + * * @param request 请求对象 * @return IP地址 */ @@ -72,7 +70,7 @@ public class IpUtils /** * 检查是否为内部IP地址 - * + * * @param ip IP地址 * @return 结果 */ @@ -84,7 +82,7 @@ public class IpUtils /** * 检查是否为内部IP地址 - * + * * @param addr byte地址 * @return 结果 */ @@ -127,7 +125,7 @@ public class IpUtils /** * 将IPv4地址转换成字节 - * + * * @param text IPv4地址 * @return byte 字节 */ @@ -215,7 +213,7 @@ public class IpUtils /** * 获取IP地址 - * + * * @return 本地IP地址 */ public static String getHostIp() @@ -232,7 +230,7 @@ public class IpUtils /** * 获取主机名 - * + * * @return 本地主机名 */ public static String getHostName() @@ -352,7 +350,7 @@ public class IpUtils /** * 校验ip是否符合过滤串规则 - * + * * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` * @param ip 校验IP地址 * @return boolean 结果 diff --git a/oms-api/src/main/java/com/qihang/oms/api/utils/ServletUtils.java b/core/security/src/main/java/com/qihang/security/utils/ServletUtils.java similarity index 96% rename from oms-api/src/main/java/com/qihang/oms/api/utils/ServletUtils.java rename to core/security/src/main/java/com/qihang/security/utils/ServletUtils.java index ca205b6b..b03ffda0 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/utils/ServletUtils.java +++ b/core/security/src/main/java/com/qihang/security/utils/ServletUtils.java @@ -1,8 +1,8 @@ -package com.qihang.oms.api.utils; +package com.qihang.security.utils; - -import com.qihang.oms.api.constant.Constants; -import com.qihang.oms.api.common.Convert; +import com.qihang.common.constant.Convert; +import com.qihang.common.constant.Constants; +import com.qihang.common.utils.StringUtils; import jakarta.servlet.ServletRequest; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @@ -10,6 +10,7 @@ import jakarta.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 java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; @@ -20,7 +21,7 @@ import java.util.Map; /** * 客户端工具类 - * + * * @author qihang */ public class ServletUtils @@ -133,7 +134,7 @@ public class ServletUtils /** * 将字符串渲染到客户端 - * + * * @param response 渲染对象 * @param string 待渲染的字符串 */ @@ -154,7 +155,7 @@ public class ServletUtils /** * 是否是Ajax异步请求 - * + * * @param request */ public static boolean isAjaxRequest(HttpServletRequest request) @@ -183,7 +184,7 @@ public class ServletUtils /** * 内容编码 - * + * * @param str 内容 * @return 编码后的内容 */ @@ -201,7 +202,7 @@ public class ServletUtils /** * 内容解码 - * + * * @param str 内容 * @return 解码后的内容 */ diff --git a/oms-api/src/main/java/com/qihang/oms/api/domain/vo/MenuMetaVo.java b/oms-api/src/main/java/com/qihang/oms/api/domain/vo/MenuMetaVo.java deleted file mode 100644 index 6bf6463f..00000000 --- a/oms-api/src/main/java/com/qihang/oms/api/domain/vo/MenuMetaVo.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.qihang.oms.api.domain.vo; - -public class MenuMetaVo { -} diff --git a/pom.xml b/pom.xml index 98973573..44b110ea 100644 --- a/pom.xml +++ b/pom.xml @@ -11,15 +11,37 @@ http://maven.apache.org tao-api - oms-api + sys-api api + + core + UTF-8 + 3.0.2 + 0.11.5 + + org.projectlombok + lombok + 1.18.30 + provided + + + com.alibaba.fastjson2 + fastjson2 + 2.0.43 + + + org.apache.commons + commons-lang3 + 3.12.0 + + diff --git a/sys-api/.gitignore b/sys-api/.gitignore new file mode 100644 index 00000000..5ff6309b --- /dev/null +++ b/sys-api/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/oms-api/pom.xml b/sys-api/pom.xml similarity index 97% rename from oms-api/pom.xml rename to sys-api/pom.xml index 4db49608..54d4d947 100644 --- a/oms-api/pom.xml +++ b/sys-api/pom.xml @@ -13,11 +13,11 @@ - oms-api + sys-api 1.0 jar - oms-api + sys-api http://maven.apache.org @@ -177,6 +177,11 @@ commons-lang3 3.12.0 + + com.qihang + security + 1.0-SNAPSHOT + diff --git a/oms-api/src/main/java/com/qihang/oms/api/OmsApi.java b/sys-api/src/main/java/com/qihang/sys/api/SysApi.java similarity index 62% rename from oms-api/src/main/java/com/qihang/oms/api/OmsApi.java rename to sys-api/src/main/java/com/qihang/sys/api/SysApi.java index d8458862..8dcb8c7c 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/OmsApi.java +++ b/sys-api/src/main/java/com/qihang/sys/api/SysApi.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api; +package com.qihang.sys.api; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; @@ -14,22 +14,22 @@ import org.springframework.web.client.RestTemplate; * Hello world! * */ -@EnableFeignClients(basePackages = "com.qihang.oms.api") +@EnableFeignClients(basePackages = "com.qihang.sys.api") @EnableDiscoveryClient -//@ComponentScan(basePackages={"com.qihang"}) -@MapperScan("com.qihang.oms.api.mapper") +@ComponentScan(basePackages={"com.qihang"}) +@MapperScan("com.qihang.sys.api.mapper") @SpringBootApplication -public class OmsApi +public class SysApi { public static void main( String[] args ) { - System.out.println( "Hello World!" ); - SpringApplication.run(OmsApi.class, args); + System.out.println( "Hello sys-api!" ); + SpringApplication.run(SysApi.class, args); } - @Bean - @LoadBalanced - public RestTemplate restTemplate() { - return new RestTemplate(); - } +// @Bean +// @LoadBalanced +// public RestTemplate restTemplate() { +// return new RestTemplate(); +// } } diff --git a/sys-api/src/main/java/com/qihang/sys/api/common/AjaxResult.java b/sys-api/src/main/java/com/qihang/sys/api/common/AjaxResult.java new file mode 100644 index 00000000..9642c989 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/AjaxResult.java @@ -0,0 +1,214 @@ +//package com.qihang.oms.api.common; +// +// +//import java.util.HashMap; +//import java.util.Objects; +// +///** +// * 操作消息提醒 +// * +// * @author qihang +// */ +//public class AjaxResult extends HashMap +//{ +// private static final long serialVersionUID = 1L; +// +// /** 状态码 */ +// public static final String CODE_TAG = "code"; +// +// /** 返回内容 */ +// public static final String MSG_TAG = "msg"; +// +// /** 数据对象 */ +// public static final String DATA_TAG = "data"; +// +// /** +// * 初始化一个新创建的 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 (data!=null) +// { +// 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); +// } +// +// /** +// * 返回警告消息 +// * +// * @param msg 返回内容 +// * @return 警告消息 +// */ +// public static AjaxResult warn(String msg) +// { +// return AjaxResult.warn(msg, null); +// } +// +// /** +// * 返回警告消息 +// * +// * @param msg 返回内容 +// * @param data 数据对象 +// * @return 警告消息 +// */ +// public static AjaxResult warn(String msg, Object data) +// { +// return new AjaxResult(HttpStatus.WARN, msg, data); +// } +// +// /** +// * 返回错误消息 +// * +// * @return 错误消息 +// */ +// 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); +// } +// +// /** +// * 是否为成功消息 +// * +// * @return 结果 +// */ +// public boolean isSuccess() +// { +// return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG)); +// } +// +// /** +// * 是否为警告消息 +// * +// * @return 结果 +// */ +// public boolean isWarn() +// { +// return Objects.equals(HttpStatus.WARN, this.get(CODE_TAG)); +// } +// +// /** +// * 是否为错误消息 +// * +// * @return 结果 +// */ +// public boolean isError() +// { +// return Objects.equals(HttpStatus.ERROR, this.get(CODE_TAG)); +// } +// +// /** +// * 方便链式调用 +// * +// * @param key 键 +// * @param value 值 +// * @return 数据对象 +// */ +// @Override +// public AjaxResult put(String key, Object value) +// { +// super.put(key, value); +// return this; +// } +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/common/BaseException.java b/sys-api/src/main/java/com/qihang/sys/api/common/BaseException.java new file mode 100644 index 00000000..e63443c5 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/BaseException.java @@ -0,0 +1,98 @@ +//package com.qihang.oms.api.common; +// +// +//import com.qihang.oms.api.utils.MessageUtils; +//import com.qihang.oms.api.utils.StringUtils; +// +///** +// * 基础异常 +// * +// * @author qihang +// */ +//public class BaseException extends RuntimeException +//{ +// private static final long serialVersionUID = 1L; +// +// /** +// * 所属模块 +// */ +// 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/sys-api/src/main/java/com/qihang/sys/api/common/CharsetKit.java b/sys-api/src/main/java/com/qihang/sys/api/common/CharsetKit.java new file mode 100644 index 00000000..6ab87e87 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/CharsetKit.java @@ -0,0 +1,88 @@ +//package com.qihang.oms.api.common; +// +// +//import com.qihang.oms.api.utils.StringUtils; +// +//import java.nio.charset.Charset; +//import java.nio.charset.StandardCharsets; +// +///** +// * 字符集工具类 +// * +// * @author qihang +// */ +//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) +// { +// destCharset = 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/sys-api/src/main/java/com/qihang/sys/api/common/Convert.java b/sys-api/src/main/java/com/qihang/sys/api/common/Convert.java new file mode 100644 index 00000000..a4eb86c0 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/Convert.java @@ -0,0 +1,1001 @@ +//package com.qihang.oms.api.common; +// +//import com.qihang.oms.api.utils.StringUtils; +//import org.apache.commons.lang3.ArrayUtils; +// +//import java.math.BigDecimal; +//import java.math.BigInteger; +//import java.nio.ByteBuffer; +//import java.nio.charset.Charset; +//import java.text.NumberFormat; +//import java.util.Set; +// +///** +// * 类型转换器 +// * +// * @author qihang +// */ +//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": +// case "yes": +// case "ok": +// case "1": +// return true; +// case "false": +// case "no": +// 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 BigDecimal.valueOf((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[]) +// { +// return str((byte[]) obj, charset); +// } +// else if (obj instanceof Byte[]) +// { +// byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); +// return str(bytes, 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/sys-api/src/main/java/com/qihang/sys/api/common/HttpStatus.java b/sys-api/src/main/java/com/qihang/sys/api/common/HttpStatus.java new file mode 100644 index 00000000..25ccbd6d --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/HttpStatus.java @@ -0,0 +1,94 @@ +//package com.qihang.oms.api.common; +// +///** +// * 返回状态码 +// * +// * @author qihang +// */ +//public class HttpStatus +//{ +// /** +// * 操作成功 +// */ +// public static final int SUCCESS = 200; +// +// /** +// * 对象创建成功 +// */ +// 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; +// +// /** +// * 系统警告消息 +// */ +// public static final int WARN = 601; +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/common/R.java b/sys-api/src/main/java/com/qihang/sys/api/common/R.java new file mode 100644 index 00000000..df75abfb --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/R.java @@ -0,0 +1,62 @@ +//package com.qihang.oms.api.common; +// +//import java.util.HashMap; +//import java.util.Map; +// +///** +// * +// * +// * @Description 统一返回类封装 +// **/ +//public class R extends HashMap { +// +// private static final long serialVersionUID = 563554414843661955L; +// +// public R() { +// put("code", 0); +// put("msg", "success"); +// } +// +// public static R error(int code, String msg) { +// R r = new R(); +// r.put("code", code); +// r.put("msg", msg); +// r.put("success", false); +// return r; +// } +// +// public static R success(Object data, String msg) { +// R r = new R(); +// r.put("code", 200); +// r.put("data", data); +// r.put("msg", msg); +// r.put("success", true); +// return r; +// } +// +// public static R success(Object data) { +// return success(data, "success"); +// } +// +// public static R ok(String msg) { +// R r = new R(); +// r.put("msg", msg); +// return r; +// } +// +// public static R ok(Map map) { +// R r = new R(); +// r.putAll(map); +// return r; +// } +// +// public static R ok() { +// return new R(); +// } +// +// public R put(String key, Object value) { +// super.put(key, value); +// return this; +// } +//} +// diff --git a/sys-api/src/main/java/com/qihang/sys/api/common/ServiceException.java b/sys-api/src/main/java/com/qihang/sys/api/common/ServiceException.java new file mode 100644 index 00000000..4d423ec3 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/ServiceException.java @@ -0,0 +1,74 @@ +//package com.qihang.oms.api.common; +// +///** +// * 业务异常 +// * +// * @author qihang +// */ +//public final class ServiceException extends RuntimeException +//{ +// private static final long serialVersionUID = 1L; +// +// /** +// * 错误码 +// */ +// private Integer code; +// +// /** +// * 错误提示 +// */ +// private String message; +// +// /** +// * 错误明细,内部调试错误 +// * +// * 和 {@link CommonResult#getDetailMessage()} 一致的设计 +// */ +// private String detailMessage; +// +// /** +// * 空构造方法,避免反序列化问题 +// */ +// public ServiceException() +// { +// } +// +// public ServiceException(String message) +// { +// this.message = message; +// } +// +// public ServiceException(String message, Integer code) +// { +// this.message = message; +// this.code = code; +// } +// +// public String getDetailMessage() +// { +// return detailMessage; +// } +// +// @Override +// public String getMessage() +// { +// return message; +// } +// +// public Integer getCode() +// { +// return code; +// } +// +// public ServiceException setMessage(String message) +// { +// this.message = message; +// return this; +// } +// +// public ServiceException setDetailMessage(String detailMessage) +// { +// this.detailMessage = detailMessage; +// return this; +// } +//} \ No newline at end of file diff --git a/sys-api/src/main/java/com/qihang/sys/api/common/StrFormatter.java b/sys-api/src/main/java/com/qihang/sys/api/common/StrFormatter.java new file mode 100644 index 00000000..5f1d4dbe --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/StrFormatter.java @@ -0,0 +1,93 @@ +//package com.qihang.oms.api.common; +// +// +//import com.qihang.oms.api.utils.StringUtils; +// +///** +// * 字符串格式化 +// * +// * @author qihang +// */ +//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/sys-api/src/main/java/com/qihang/sys/api/common/UserConstants.java b/sys-api/src/main/java/com/qihang/sys/api/common/UserConstants.java new file mode 100644 index 00000000..f570b009 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/UserConstants.java @@ -0,0 +1,78 @@ +//package com.qihang.oms.api.common; +// +///** +// * 用户常量信息 +// * +// * @author qihang +// */ +//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"; +// +// /** ParentView组件标识 */ +// public final static String PARENT_VIEW = "ParentView"; +// +// /** InnerLink组件标识 */ +// public final static String INNER_LINK = "InnerLink"; +// +// /** 校验是否唯一的返回标识 */ +// public final static boolean UNIQUE = true; +// public final static boolean NOT_UNIQUE = false; +// +// /** +// * 用户名长度限制 +// */ +// public static final int USERNAME_MIN_LENGTH = 2; +// public static final int USERNAME_MAX_LENGTH = 20; +// +// /** +// * 密码长度限制 +// */ +// public static final int PASSWORD_MIN_LENGTH = 5; +// public static final int PASSWORD_MAX_LENGTH = 20; +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/common/UserException.java b/sys-api/src/main/java/com/qihang/sys/api/common/UserException.java new file mode 100644 index 00000000..81270530 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/UserException.java @@ -0,0 +1,18 @@ +//package com.qihang.oms.api.common; +// +// +// +///** +// * 用户信息异常类 +// * +// * @author qihang +// */ +//public class UserException extends BaseException +//{ +// private static final long serialVersionUID = 1L; +// +// public UserException(String code, Object[] args) +// { +// super("user", code, args, null); +// } +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/common/UserNotExistsException.java b/sys-api/src/main/java/com/qihang/sys/api/common/UserNotExistsException.java new file mode 100644 index 00000000..3e07510b --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/UserNotExistsException.java @@ -0,0 +1,16 @@ +//package com.qihang.oms.api.common; +// +///** +// * 用户不存在异常类 +// * +// * @author qihang +// */ +//public class UserNotExistsException extends UserException +//{ +// private static final long serialVersionUID = 1L; +// +// public UserNotExistsException() +// { +// super("user.not.exists", null); +// } +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/common/UserPasswordNotMatchException.java b/sys-api/src/main/java/com/qihang/sys/api/common/UserPasswordNotMatchException.java new file mode 100644 index 00000000..ee3e8db3 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/common/UserPasswordNotMatchException.java @@ -0,0 +1,16 @@ +//package com.qihang.oms.api.common; +// +///** +// * 用户密码不正确或不符合规范异常类 +// * +// * @author qihang +// */ +//public class UserPasswordNotMatchException extends UserException +//{ +// private static final long serialVersionUID = 1L; +// +// public UserPasswordNotMatchException() +// { +// super("user.password.not.match", null); +// } +//} diff --git a/oms-api/src/main/java/com/qihang/oms/api/config/MyBatisConfig.java b/sys-api/src/main/java/com/qihang/sys/api/config/MyBatisConfig.java similarity index 100% rename from oms-api/src/main/java/com/qihang/oms/api/config/MyBatisConfig.java rename to sys-api/src/main/java/com/qihang/sys/api/config/MyBatisConfig.java diff --git a/sys-api/src/main/java/com/qihang/sys/api/config/RedisCache.java b/sys-api/src/main/java/com/qihang/sys/api/config/RedisCache.java new file mode 100644 index 00000000..894ded5e --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/config/RedisCache.java @@ -0,0 +1,265 @@ +//package com.qihang.oms.api.config; +// +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.data.redis.core.BoundSetOperations; +//import org.springframework.data.redis.core.HashOperations; +//import org.springframework.data.redis.core.RedisTemplate; +//import org.springframework.data.redis.core.ValueOperations; +//import org.springframework.stereotype.Component; +// +//import java.util.*; +//import java.util.concurrent.TimeUnit; +// +///** +// * spring redis 工具类 +// * +// * @author qihang +// **/ +//@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 Redis键 +// * @return 有效时间 +// */ +// public long getExpire(final String key) +// { +// return redisTemplate.getExpire(key); +// } +// +// /** +// * 判断 key是否存在 +// * +// * @param key 键 +// * @return true 存在 false不存在 +// */ +// public Boolean hasKey(String key) +// { +// return redisTemplate.hasKey(key); +// } +// +// /** +// * 获得缓存的基本对象。 +// * +// * @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 boolean deleteObject(final Collection collection) +// { +// return redisTemplate.delete(collection) > 0; +// } +// +// /** +// * 缓存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 BoundSetOperations setCacheSet(final String key, final Set dataSet) +// { +// BoundSetOperations setOperation = redisTemplate.boundSetOps(key); +// Iterator it = dataSet.iterator(); +// while (it.hasNext()) +// { +// setOperation.add(it.next()); +// } +// return setOperation; +// } +// +// /** +// * 获得缓存的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); +// } +// +// /** +// * 删除Hash中的某条数据 +// * +// * @param key Redis键 +// * @param hKey Hash键 +// * @return 是否成功 +// */ +// public boolean deleteCacheMapValue(final String key, final String hKey) +// { +// return redisTemplate.opsForHash().delete(key, hKey) > 0; +// } +// +// /** +// * 获得缓存的基本对象列表 +// * +// * @param pattern 字符串前缀 +// * @return 对象列表 +// */ +// public Collection keys(final String pattern) +// { +// return redisTemplate.keys(pattern); +// } +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/config/RedisConfig.java b/sys-api/src/main/java/com/qihang/sys/api/config/RedisConfig.java new file mode 100644 index 00000000..1b36bde5 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/config/RedisConfig.java @@ -0,0 +1,71 @@ +//package com.qihang.oms.api.config; +// +// +//import com.qihang.oms.api.utils.FastJson2JsonRedisSerializer; +//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.core.script.DefaultRedisScript; +//import org.springframework.data.redis.serializer.StringRedisSerializer; +// +///** +// * redis配置 +// * +// * @author qihang +// */ +//@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); +// +// // 使用StringRedisSerializer来序列化和反序列化redis的key值 +// template.setKeySerializer(new StringRedisSerializer()); +// template.setValueSerializer(serializer); +// +// // Hash的key也采用StringRedisSerializer的序列化方式 +// template.setHashKeySerializer(new StringRedisSerializer()); +// template.setHashValueSerializer(serializer); +// +// template.afterPropertiesSet(); +// return template; +// } +// +// @Bean +// public DefaultRedisScript limitScript() +// { +// DefaultRedisScript redisScript = new DefaultRedisScript<>(); +// redisScript.setScriptText(limitScriptText()); +// redisScript.setResultType(Long.class); +// return redisScript; +// } +// +// /** +// * 限流脚本 +// */ +// private String limitScriptText() +// { +// return "local key = KEYS[1]\n" + +// "local count = tonumber(ARGV[1])\n" + +// "local time = tonumber(ARGV[2])\n" + +// "local current = redis.call('get', key);\n" + +// "if current and tonumber(current) > count then\n" + +// " return tonumber(current);\n" + +// "end\n" + +// "current = redis.call('incr', key)\n" + +// "if tonumber(current) == 1 then\n" + +// " redis.call('expire', key, time)\n" + +// "end\n" + +// "return tonumber(current);"; +// } +//} diff --git a/oms-api/src/main/java/com/qihang/oms/api/config/WebConfig.java b/sys-api/src/main/java/com/qihang/sys/api/config/WebConfig.java similarity index 100% rename from oms-api/src/main/java/com/qihang/oms/api/config/WebConfig.java rename to sys-api/src/main/java/com/qihang/sys/api/config/WebConfig.java diff --git a/sys-api/src/main/java/com/qihang/sys/api/constant/CacheConstants.java b/sys-api/src/main/java/com/qihang/sys/api/constant/CacheConstants.java new file mode 100644 index 00000000..1fe00302 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/constant/CacheConstants.java @@ -0,0 +1,44 @@ +package com.qihang.sys.api.constant; + +/** + * 缓存的key 常量 + * + * @author qihang + */ +public class CacheConstants +{ + /** + * 登录用户 redis key + */ + public static final String LOGIN_TOKEN_KEY = "login_tokens:"; + + /** + * 验证码 redis key + */ + public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 防重提交 redis key + */ + public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; + + /** + * 限流 redis key + */ + public static final String RATE_LIMIT_KEY = "rate_limit:"; + + /** + * 登录账户密码错误次数 redis key + */ + public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; +} diff --git a/sys-api/src/main/java/com/qihang/sys/api/constant/Constants.java b/sys-api/src/main/java/com/qihang/sys/api/constant/Constants.java new file mode 100644 index 00000000..a92b8e18 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/constant/Constants.java @@ -0,0 +1,142 @@ +package com.qihang.sys.api.constant; + +import io.jsonwebtoken.Claims; + +/** + * 通用常量信息 + * + * @author qihang + */ +public class Constants +{ + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * www主域 + */ + public static final String WWW = "www."; + + /** + * 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 REGISTER = "Register"; + + /** + * 登录失败 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 验证码有效期(分钟) + */ + 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 = Claims.SUBJECT; + + /** + * 用户头像 + */ + public static final String JWT_AVATAR = "avatar"; + + /** + * 创建时间 + */ + public static final String JWT_CREATED = "created"; + + /** + * 用户权限 + */ + public static final String JWT_AUTHORITIES = "authorities"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile"; + + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + */ + public static final String[] JOB_WHITELIST_STR = { "com.zhijian" }; + + /** + * 定时任务违规的字符 + */ + public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.zhijian.common.utils.file", "com.zhijian.common.config" }; +} diff --git a/oms-api/src/main/java/com/qihang/oms/api/controller/HomeController.java b/sys-api/src/main/java/com/qihang/sys/api/controller/HomeController.java similarity index 81% rename from oms-api/src/main/java/com/qihang/oms/api/controller/HomeController.java rename to sys-api/src/main/java/com/qihang/sys/api/controller/HomeController.java index 96f3e9ea..a04de7b4 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/controller/HomeController.java +++ b/sys-api/src/main/java/com/qihang/sys/api/controller/HomeController.java @@ -1,10 +1,8 @@ -package com.qihang.oms.api.controller; +package com.qihang.sys.api.controller; -import com.qihang.oms.api.service.EchoService; +import com.qihang.sys.api.service.EchoService; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/oms-api/src/main/java/com/qihang/oms/api/controller/LoginController.java b/sys-api/src/main/java/com/qihang/sys/api/controller/LoginController.java similarity index 74% rename from oms-api/src/main/java/com/qihang/oms/api/controller/LoginController.java rename to sys-api/src/main/java/com/qihang/sys/api/controller/LoginController.java index 16a92919..4edfdb71 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/controller/LoginController.java +++ b/sys-api/src/main/java/com/qihang/sys/api/controller/LoginController.java @@ -1,11 +1,9 @@ -package com.qihang.oms.api.controller; +package com.qihang.sys.api.controller; -import com.alibaba.nacos.api.common.Constants; -import com.qihang.oms.api.common.AjaxResult; -import com.qihang.oms.api.domain.LoginBody; -import com.qihang.oms.api.domain.SysUser; -import com.qihang.oms.api.service.ISysUserService; -import com.qihang.oms.api.service.SysLoginService; +import com.qihang.common.common.AjaxResult; +import com.qihang.sys.api.domain.LoginBody; +import com.qihang.security.service.ISysUserService; +import com.qihang.security.service.SysLoginService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; diff --git a/oms-api/src/main/java/com/qihang/oms/api/controller/MenusController.java b/sys-api/src/main/java/com/qihang/sys/api/controller/MenusController.java similarity index 96% rename from oms-api/src/main/java/com/qihang/oms/api/controller/MenusController.java rename to sys-api/src/main/java/com/qihang/sys/api/controller/MenusController.java index 050b1e8d..db421477 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/controller/MenusController.java +++ b/sys-api/src/main/java/com/qihang/sys/api/controller/MenusController.java @@ -1,13 +1,13 @@ -package com.qihang.oms.api.controller; +package com.qihang.sys.api.controller; import com.alibaba.fastjson2.JSONArray; -import com.qihang.oms.api.common.AjaxResult; -import com.qihang.oms.api.domain.LoginUser; -import com.qihang.oms.api.domain.SysMenu; -import com.qihang.oms.api.domain.vo.MenusDetailVo; -import com.qihang.oms.api.domain.vo.MenusVo; -import com.qihang.oms.api.service.ISysMenuService; -import com.qihang.oms.api.service.TokenService; +import com.qihang.common.common.AjaxResult; +import com.qihang.sys.api.domain.SysMenu; +import com.qihang.sys.api.domain.vo.MenusDetailVo; +import com.qihang.sys.api.domain.vo.MenusVo; +import com.qihang.sys.api.service.ISysMenuService; +import com.qihang.security.LoginUser; +import com.qihang.security.TokenService; import jakarta.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -15,7 +15,6 @@ import org.springframework.web.bind.annotation.RestController; import java.util.*; import java.util.stream.Collectors; -import java.util.stream.Stream; @RequestMapping("/menus") @RestController diff --git a/oms-api/src/main/java/com/qihang/oms/api/controller/UsersController.java b/sys-api/src/main/java/com/qihang/sys/api/controller/UsersController.java similarity index 88% rename from oms-api/src/main/java/com/qihang/oms/api/controller/UsersController.java rename to sys-api/src/main/java/com/qihang/sys/api/controller/UsersController.java index 2e63cb01..eaca051e 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/controller/UsersController.java +++ b/sys-api/src/main/java/com/qihang/sys/api/controller/UsersController.java @@ -1,9 +1,8 @@ -package com.qihang.oms.api.controller; +package com.qihang.sys.api.controller; -import com.qihang.oms.api.common.AjaxResult; -import com.qihang.oms.api.domain.vo.UserInfoVo; +import com.qihang.common.common.AjaxResult; +import com.qihang.sys.api.domain.vo.UserInfoVo; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/oms-api/src/main/java/com/qihang/oms/api/domain/BaseEntity.java b/sys-api/src/main/java/com/qihang/sys/api/domain/BaseEntity.java similarity index 98% rename from oms-api/src/main/java/com/qihang/oms/api/domain/BaseEntity.java rename to sys-api/src/main/java/com/qihang/sys/api/domain/BaseEntity.java index 4970a1c5..52a6a949 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/domain/BaseEntity.java +++ b/sys-api/src/main/java/com/qihang/sys/api/domain/BaseEntity.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.domain; +package com.qihang.sys.api.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/oms-api/src/main/java/com/qihang/oms/api/domain/LoginBody.java b/sys-api/src/main/java/com/qihang/sys/api/domain/LoginBody.java similarity index 96% rename from oms-api/src/main/java/com/qihang/oms/api/domain/LoginBody.java rename to sys-api/src/main/java/com/qihang/sys/api/domain/LoginBody.java index d00fe9e9..b6fa3b69 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/domain/LoginBody.java +++ b/sys-api/src/main/java/com/qihang/sys/api/domain/LoginBody.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.domain; +package com.qihang.sys.api.domain; /** * 用户登录对象 diff --git a/sys-api/src/main/java/com/qihang/sys/api/domain/LoginUser.java b/sys-api/src/main/java/com/qihang/sys/api/domain/LoginUser.java new file mode 100644 index 00000000..8659593c --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/domain/LoginUser.java @@ -0,0 +1,268 @@ +//package com.qihang.oms.api.domain; +// +//import com.alibaba.fastjson2.annotation.JSONField; +// +//import com.qihang.security.entity.SysUser; +//import org.springframework.security.core.GrantedAuthority; +//import org.springframework.security.core.userdetails.UserDetails; +// +//import java.util.Collection; +//import java.util.Set; +// +///** +// * 登录用户身份权限 +// * +// * @author qihang +// */ +//public class LoginUser implements UserDetails +//{ +// private static final long serialVersionUID = 1L; +// +// /** +// * 用户ID +// */ +// private Long userId; +// +// /** +// * 部门ID +// */ +// private Long deptId; +// +// /** +// * 用户唯一标识 +// */ +// 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 SysUser user; +// +// public LoginUser() +// { +// } +// +// public LoginUser(SysUser user, Set permissions) +// { +// this.user = user; +// this.permissions = permissions; +// } +// +// public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) +// { +// this.userId = userId; +// this.deptId = deptId; +// this.user = user; +// this.permissions = permissions; +// } +// +// public Long getUserId() +// { +// return userId; +// } +// +// public void setUserId(Long userId) +// { +// this.userId = userId; +// } +// +// public Long getDeptId() +// { +// return deptId; +// } +// +// public void setDeptId(Long deptId) +// { +// this.deptId = deptId; +// } +// +// public String getToken() +// { +// return token; +// } +// +// public void setToken(String token) +// { +// this.token = token; +// } +// +// @JSONField(serialize = false) +// @Override +// public String getPassword() +// { +// return user.getPassword(); +// } +// +// @Override +// public String getUsername() +// { +// return user.getUserName(); +// } +// +// /** +// * 账户是否未过期,过期无法验证 +// */ +// @JSONField(serialize = false) +// @Override +// public boolean isAccountNonExpired() +// { +// return true; +// } +// +// /** +// * 指定用户是否解锁,锁定的用户无法进行身份验证 +// * +// * @return +// */ +// @JSONField(serialize = false) +// @Override +// public boolean isAccountNonLocked() +// { +// return true; +// } +// +// /** +// * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 +// * +// * @return +// */ +// @JSONField(serialize = false) +// @Override +// public boolean isCredentialsNonExpired() +// { +// return true; +// } +// +// /** +// * 是否可用 ,禁用的用户不能身份验证 +// * +// * @return +// */ +// @JSONField(serialize = false) +// @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 SysUser getUser() +// { +// return user; +// } +// +// public void setUser(SysUser user) +// { +// this.user = user; +// } +// +// @Override +// public Collection getAuthorities() +// { +// return null; +// } +//} diff --git a/oms-api/src/main/java/com/qihang/oms/api/domain/SysMenu.java b/sys-api/src/main/java/com/qihang/sys/api/domain/SysMenu.java similarity index 97% rename from oms-api/src/main/java/com/qihang/oms/api/domain/SysMenu.java rename to sys-api/src/main/java/com/qihang/sys/api/domain/SysMenu.java index a09fc72d..8ea26c8e 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/domain/SysMenu.java +++ b/sys-api/src/main/java/com/qihang/sys/api/domain/SysMenu.java @@ -1,8 +1,7 @@ -package com.qihang.oms.api.domain; +package com.qihang.sys.api.domain; -import com.alibaba.fastjson2.annotation.JSONField; import com.fasterxml.jackson.annotation.JsonProperty; -import com.qihang.oms.api.domain.vo.MenusDetailVo; +import com.qihang.sys.api.domain.vo.MenusDetailVo; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; diff --git a/sys-api/src/main/java/com/qihang/sys/api/domain/SysUser.java b/sys-api/src/main/java/com/qihang/sys/api/domain/SysUser.java new file mode 100644 index 00000000..1e69a2ad --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/domain/SysUser.java @@ -0,0 +1,249 @@ +//package com.qihang.oms.api.domain; +// +// +//import java.util.Date; +// +///** +// * 用户对象 sys_user +// * +// * @author qihang +// */ +//public class SysUser extends BaseEntity +//{ +// private static final long serialVersionUID = 1L; +// +// /** 用户ID */ +// private Long userId; +// +// /** 部门ID */ +// private Long deptId; +// +// /** 用户账号 */ +// +// private String userName; +// +// /** 用户昵称 */ +// private String nickName; +// +// /** 用户邮箱 */ +// private String email; +// +// /** 手机号码 */ +// private String phonenumber; +// +// /** 用户性别 */ +// private String sex; +// +// /** 用户头像 */ +// private String avatar; +// +// /** 密码 */ +// private String password; +// +// /** 帐号状态(0正常 1停用) */ +// private String status; +// +// /** 删除标志(0代表存在 2代表删除) */ +// private String delFlag; +// +// /** 最后登录IP */ +// private String loginIp; +// +// /** 最后登录时间 */ +// private Date loginDate; +// +// /** 角色组 */ +// private Long[] roleIds; +// +// /** 岗位组 */ +// private Long[] postIds; +// +// /** 角色ID */ +// private Long roleId; +// +// public SysUser() +// { +// +// } +// +// public SysUser(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; +// } +// +// +// public String getNickName() +// { +// return nickName; +// } +// +// public void setNickName(String nickName) +// { +// this.nickName = nickName; +// } +// +// +// public String getUserName() +// { +// return userName; +// } +// +// public void setUserName(String userName) +// { +// this.userName = userName; +// } +// +// +// public String getEmail() +// { +// return email; +// } +// +// public void setEmail(String email) +// { +// this.email = email; +// } +// +// +// 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; +// } +// +// public String getPassword() +// { +// return password; +// } +// +// public void setPassword(String password) +// { +// this.password = password; +// } +// +// 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 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; +// } +// +// public Long getRoleId() +// { +// return roleId; +// } +// +// public void setRoleId(Long roleId) +// { +// this.roleId = roleId; +// } +// +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/domain/vo/MenuMetaVo.java b/sys-api/src/main/java/com/qihang/sys/api/domain/vo/MenuMetaVo.java new file mode 100644 index 00000000..7244bd89 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/domain/vo/MenuMetaVo.java @@ -0,0 +1,4 @@ +package com.qihang.sys.api.domain.vo; + +public class MenuMetaVo { +} diff --git a/oms-api/src/main/java/com/qihang/oms/api/domain/vo/MenusDetailVo.java b/sys-api/src/main/java/com/qihang/sys/api/domain/vo/MenusDetailVo.java similarity index 96% rename from oms-api/src/main/java/com/qihang/oms/api/domain/vo/MenusDetailVo.java rename to sys-api/src/main/java/com/qihang/sys/api/domain/vo/MenusDetailVo.java index 29868f10..f99d3495 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/domain/vo/MenusDetailVo.java +++ b/sys-api/src/main/java/com/qihang/sys/api/domain/vo/MenusDetailVo.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.domain.vo; +package com.qihang.sys.api.domain.vo; import java.util.List; diff --git a/oms-api/src/main/java/com/qihang/oms/api/domain/vo/MenusVo.java b/sys-api/src/main/java/com/qihang/sys/api/domain/vo/MenusVo.java similarity index 97% rename from oms-api/src/main/java/com/qihang/oms/api/domain/vo/MenusVo.java rename to sys-api/src/main/java/com/qihang/sys/api/domain/vo/MenusVo.java index 59155b03..e86f5f98 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/domain/vo/MenusVo.java +++ b/sys-api/src/main/java/com/qihang/sys/api/domain/vo/MenusVo.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.domain.vo; +package com.qihang.sys.api.domain.vo; import java.util.List; diff --git a/oms-api/src/main/java/com/qihang/oms/api/domain/vo/UserInfoVo.java b/sys-api/src/main/java/com/qihang/sys/api/domain/vo/UserInfoVo.java similarity index 96% rename from oms-api/src/main/java/com/qihang/oms/api/domain/vo/UserInfoVo.java rename to sys-api/src/main/java/com/qihang/sys/api/domain/vo/UserInfoVo.java index 31795560..aaf725c0 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/domain/vo/UserInfoVo.java +++ b/sys-api/src/main/java/com/qihang/sys/api/domain/vo/UserInfoVo.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.domain.vo; +package com.qihang.sys.api.domain.vo; import java.util.List; diff --git a/sys-api/src/main/java/com/qihang/sys/api/enums/UserStatus.java b/sys-api/src/main/java/com/qihang/sys/api/enums/UserStatus.java new file mode 100644 index 00000000..6c3c69d5 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/enums/UserStatus.java @@ -0,0 +1,30 @@ +package com.qihang.sys.api.enums; + +/** + * 用户状态 + * + * @author qihang + */ +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/oms-api/src/main/java/com/qihang/oms/api/mapper/SysMenuMapper.java b/sys-api/src/main/java/com/qihang/sys/api/mapper/SysMenuMapper.java similarity index 97% rename from oms-api/src/main/java/com/qihang/oms/api/mapper/SysMenuMapper.java rename to sys-api/src/main/java/com/qihang/sys/api/mapper/SysMenuMapper.java index 3a1aec52..63385df2 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/mapper/SysMenuMapper.java +++ b/sys-api/src/main/java/com/qihang/sys/api/mapper/SysMenuMapper.java @@ -1,7 +1,7 @@ -package com.qihang.oms.api.mapper; +package com.qihang.sys.api.mapper; -import com.qihang.oms.api.domain.SysMenu; +import com.qihang.sys.api.domain.SysMenu; import org.apache.ibatis.annotations.Param; import java.util.List; diff --git a/oms-api/src/main/java/com/qihang/oms/api/mapper/SysUserMapper.java b/sys-api/src/main/java/com/qihang/sys/api/mapper/SysUserMapper.java similarity index 93% rename from oms-api/src/main/java/com/qihang/oms/api/mapper/SysUserMapper.java rename to sys-api/src/main/java/com/qihang/sys/api/mapper/SysUserMapper.java index 5a56eec5..0f68c936 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/mapper/SysUserMapper.java +++ b/sys-api/src/main/java/com/qihang/sys/api/mapper/SysUserMapper.java @@ -1,7 +1,6 @@ -package com.qihang.oms.api.mapper; +package com.qihang.sys.api.mapper; - -import com.qihang.oms.api.domain.SysUser; +import com.qihang.security.entity.SysUser; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -9,7 +8,7 @@ import java.util.List; /** * 用户表 数据层 - * + * * @author qihang */ @Mapper @@ -17,7 +16,7 @@ public interface SysUserMapper { /** * 根据条件分页查询用户列表 - * + * * @param sysUser 用户信息 * @return 用户信息集合信息 */ @@ -25,7 +24,7 @@ public interface SysUserMapper /** * 根据条件分页查询已配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -33,7 +32,7 @@ public interface SysUserMapper /** * 根据条件分页查询未分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -41,7 +40,7 @@ public interface SysUserMapper /** * 通过用户名查询用户 - * + * * @param userName 用户名 * @return 用户对象信息 */ @@ -49,7 +48,7 @@ public interface SysUserMapper /** * 通过用户ID查询用户 - * + * * @param userId 用户ID * @return 用户对象信息 */ @@ -57,7 +56,7 @@ public interface SysUserMapper /** * 新增用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -65,7 +64,7 @@ public interface SysUserMapper /** * 修改用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -73,7 +72,7 @@ public interface SysUserMapper /** * 修改用户头像 - * + * * @param userName 用户名 * @param avatar 头像地址 * @return 结果 @@ -82,7 +81,7 @@ public interface SysUserMapper /** * 重置用户密码 - * + * * @param userName 用户名 * @param password 密码 * @return 结果 @@ -91,7 +90,7 @@ public interface SysUserMapper /** * 通过用户ID删除用户 - * + * * @param userId 用户ID * @return 结果 */ @@ -99,7 +98,7 @@ public interface SysUserMapper /** * 批量删除用户信息 - * + * * @param userIds 需要删除的用户ID * @return 结果 */ @@ -107,7 +106,7 @@ public interface SysUserMapper /** * 校验用户名称是否唯一 - * + * * @param userName 用户名称 * @return 结果 */ diff --git a/sys-api/src/main/java/com/qihang/sys/api/security/AuthenticationContextHolder.java b/sys-api/src/main/java/com/qihang/sys/api/security/AuthenticationContextHolder.java new file mode 100644 index 00000000..0cae84db --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/security/AuthenticationContextHolder.java @@ -0,0 +1,28 @@ +//package com.qihang.oms.api.security; +// +//import org.springframework.security.core.Authentication; +// +///** +// * 身份验证信息 +// * +// * @author qihang +// */ +//public class AuthenticationContextHolder +//{ +// private static final ThreadLocal contextHolder = new ThreadLocal<>(); +// +// public static Authentication getContext() +// { +// return contextHolder.get(); +// } +// +// public static void setContext(Authentication context) +// { +// contextHolder.set(context); +// } +// +// public static void clearContext() +// { +// contextHolder.remove(); +// } +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/security/AuthenticationExceptionHandler.java b/sys-api/src/main/java/com/qihang/sys/api/security/AuthenticationExceptionHandler.java new file mode 100644 index 00000000..e0646add --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/security/AuthenticationExceptionHandler.java @@ -0,0 +1,44 @@ +//package com.qihang.oms.api.security; +// +//import com.alibaba.fastjson2.JSON; +//import jakarta.servlet.ServletException; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.http.MediaType; +//import org.springframework.security.core.AuthenticationException; +//import org.springframework.security.web.AuthenticationEntryPoint; +//import org.springframework.stereotype.Component; +//import com.qihang.oms.api.common.R; +//import java.io.IOException; +//import java.io.PrintWriter; +// +//@Component +//public class AuthenticationExceptionHandler implements AuthenticationEntryPoint { +// Logger log = LoggerFactory.getLogger(getClass()); +// @Override +// public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { +// fallback(authException.getMessage(), response); +// } +// +// private void fallback(String message, HttpServletResponse response) { +// response.setCharacterEncoding("UTF-8"); +// response.setContentType(MediaType.APPLICATION_JSON_VALUE); +// PrintWriter writer = null; +// try { +// if (message == null) { +// message = "认证失败!"; +// } +// R res = R.error(500, message); +// writer = response.getWriter(); +// writer.append(JSON.toJSONString(res)); +// } catch (IOException e) { +// log.error(e.getMessage()); +// } finally { +// if (writer != null) { +// writer.close(); +// } +// } +// } +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/security/JwtAuthenticationTokenFilter.java b/sys-api/src/main/java/com/qihang/sys/api/security/JwtAuthenticationTokenFilter.java new file mode 100644 index 00000000..af7f1497 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/security/JwtAuthenticationTokenFilter.java @@ -0,0 +1,89 @@ +//package com.qihang.oms.api.security; +// +// +//import com.alibaba.fastjson2.JSON; +//import com.qihang.oms.api.common.R; +//import com.qihang.oms.api.domain.LoginUser; +//import com.qihang.oms.api.service.TokenService; +//import jakarta.servlet.FilterChain; +//import jakarta.servlet.ServletException; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//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.http.MediaType; +//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 java.io.IOException; +//import java.io.PrintWriter; +// +///** +// * token过滤器 验证token有效性 +// * +// * @author qihang +// */ +//@Component +//public class JwtAuthenticationTokenFilter extends OncePerRequestFilter +//{ +// @Autowired +// private TokenService tokenService; +// /** +// * 需要拦截的请求头信息 +// */ +// @Value("${token.header:'Authorization'}") +// public String TOKEN_HEADER = "Authorization"; +// private Logger log = LoggerFactory.getLogger(getClass()); +// @Override +// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) +// throws ServletException, IOException +// { +//// String token = exchange.getRequest().getHeaders().getFirst(TOKEN_HEADER); +// String token = request.getHeader("Authorization"); +// String url =request.getRequestURI(); +// log.info("intercept " + url); +// log.info("token: " + token); +// if(request.getRequestURI().equals("/login")){ +// // 登录页面,放行 +// chain.doFilter(request, response); +// return; +// } +// LoginUser loginUser = tokenService.getLoginUser(request); +// if (loginUser !=null ) +// { +// tokenService.verifyToken(loginUser); +// UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); +// authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); +// SecurityContextHolder.getContext().setAuthentication(authenticationToken); +// }else { +// fallback(" 授权过期!",response); +// return; +// } +// chain.doFilter(request, response); +// } +// +// private void fallback(String message, HttpServletResponse response) { +// response.setCharacterEncoding("UTF-8"); +// response.setContentType(MediaType.APPLICATION_JSON_VALUE); +// PrintWriter writer = null; +// try { +// if (message == null) { +// message = "403 Forbidden"; +// } +// R res = R.error(403, message); +// writer = response.getWriter(); +// writer.append(JSON.toJSONString(res)); +// } catch (IOException e) { +// log.error(e.getMessage()); +// } finally { +// if (writer != null) { +// writer.close(); +// } +// } +// } +//} diff --git a/oms-api/src/main/java/com/qihang/oms/api/security/JwtUtil.java b/sys-api/src/main/java/com/qihang/sys/api/security/JwtUtil.java similarity index 100% rename from oms-api/src/main/java/com/qihang/oms/api/security/JwtUtil.java rename to sys-api/src/main/java/com/qihang/sys/api/security/JwtUtil.java diff --git a/sys-api/src/main/java/com/qihang/sys/api/security/SecurityConfig.java b/sys-api/src/main/java/com/qihang/sys/api/security/SecurityConfig.java new file mode 100644 index 00000000..cfdcd9be --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/security/SecurityConfig.java @@ -0,0 +1,109 @@ +//package com.qihang.oms.api.security; +// +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.http.HttpMethod; +//import org.springframework.security.authentication.AuthenticationManager; +//import org.springframework.security.authentication.AuthenticationProvider; +//import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +//import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +//import org.springframework.security.config.annotation.web.builders.HttpSecurity; +//import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +//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.crypto.password.PasswordEncoder; +//import org.springframework.security.web.SecurityFilterChain; +//import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +// +//@Configuration +//@EnableWebSecurity +//public class SecurityConfig { +// +// @Autowired +// private UserDetailsServiceImpl userDetailsService; +// +// @Autowired +// private AuthenticationExceptionHandler invalidAuthenticationEntryPoint; +// +// @Bean +// public PasswordEncoder passwordEncoder() { +// return new BCryptPasswordEncoder(); +// } +// +// @Bean +// public JwtAuthenticationTokenFilter authenticationJwtTokenFilter() { +// return new JwtAuthenticationTokenFilter(); +// } +// +// @Bean +// public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { +// +// http +// // 禁用basic明文验证 +// .httpBasic().disable() +// // 前后端分离架构不需要csrf保护 +// .csrf().disable() +// // 禁用默认登录页 +// .formLogin().disable() +// // 禁用默认登出页 +// .logout().disable() +// // 设置异常的EntryPoint,如果不设置,默认使用Http403ForbiddenEntryPoint +// .exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(invalidAuthenticationEntryPoint)) +// // 前后端分离是无状态的,不需要session了,直接禁用。 +// .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) +// .authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests +// // 允许所有OPTIONS请求 +// .requestMatchers("/home").permitAll() +// .requestMatchers(HttpMethod.GET, "/favicon.ico").permitAll() +// // 允许直接访问授权登录接口 +// .requestMatchers(HttpMethod.POST, "/login").permitAll() +// // 允许 SpringMVC 的默认错误地址匿名访问 +// .requestMatchers("/error").permitAll() +// // 其他所有接口必须有Authority信息,Authority在登录成功后的UserDetailsImpl对象中默认设置“ROLE_USER” +// //.requestMatchers("/**").hasAnyAuthority("ROLE_USER") +// // 允许任意请求被已登录用户访问,不检查Authority +// .anyRequest().authenticated()) +// .authenticationProvider(authenticationProvider()) +// // 加我们自定义的过滤器,替代UsernamePasswordAuthenticationFilter +// .addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class); +// +// return http.build(); +// } +// +// @Bean +// public UserDetailsService userDetailsService() { +// // 调用 JwtUserDetailService实例执行实际校验 +// return username -> userDetailsService.loadUserByUsername(username); +// } +// +// /** +// * 调用loadUserByUsername获得UserDetail信息,在AbstractUserDetailsAuthenticationProvider里执行用户状态检查 +// * +// * @return +// */ +// @Bean +// public AuthenticationProvider authenticationProvider() { +// DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); +// // DaoAuthenticationProvider 从自定义的 userDetailsService.loadUserByUsername 方法获取UserDetails +// authProvider.setUserDetailsService(userDetailsService()); +// // 设置密码编辑器 +// authProvider.setPasswordEncoder(passwordEncoder()); +// return authProvider; +// } +// +// /** +// * 登录时需要调用AuthenticationManager.authenticate执行一次校验 +// * +// * @param config +// * @return +// * @throws Exception +// */ +// @Bean +// public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { +// return config.getAuthenticationManager(); +// } +// +// +//} diff --git a/oms-api/src/main/java/com/qihang/oms/api/security/SecurityUserDetailsService.java b/sys-api/src/main/java/com/qihang/sys/api/security/SecurityUserDetailsService.java similarity index 100% rename from oms-api/src/main/java/com/qihang/oms/api/security/SecurityUserDetailsService.java rename to sys-api/src/main/java/com/qihang/sys/api/security/SecurityUserDetailsService.java diff --git a/sys-api/src/main/java/com/qihang/sys/api/security/UserDetailsServiceImpl.java b/sys-api/src/main/java/com/qihang/sys/api/security/UserDetailsServiceImpl.java new file mode 100644 index 00000000..c2292871 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/security/UserDetailsServiceImpl.java @@ -0,0 +1,73 @@ +//package com.qihang.oms.api.security; +// +// +//import com.qihang.oms.api.common.ServiceException; +//import com.qihang.oms.api.domain.LoginUser; +//import com.qihang.oms.api.domain.SysUser; +//import com.qihang.oms.api.enums.UserStatus; +//import com.qihang.oms.api.service.ISysUserService; +//import com.qihang.oms.api.utils.MessageUtils; +//import com.qihang.oms.api.utils.StringUtils; +//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 java.util.HashSet; +//import java.util.Set; +// +///** +// * 用户验证处理 +// * +// * @author qihang +// */ +//@Service +//public class UserDetailsServiceImpl implements UserDetailsService +//{ +// private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); +// +// @Autowired +// private ISysUserService userService; +// +//// @Autowired +//// private SysPasswordService passwordService; +// +//// @Autowired +//// private SysPermissionService permissionService; +// +// @Override +// public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException +// { +// SysUser user = userService.selectUserByUserName(username); +// if (StringUtils.isNull(user)) +// { +// log.info("登录用户:{} 不存在.", username); +// throw new ServiceException(MessageUtils.message("user.not.exists")); +// } +// else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) +// { +// log.info("登录用户:{} 已被删除.", username); +// throw new ServiceException(MessageUtils.message("user.password.delete")); +// } +// else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) +// { +// log.info("登录用户:{} 已被停用.", username); +// throw new ServiceException(MessageUtils.message("user.blocked")); +// } +// +//// passwordService.validate(user); +// +// return createLoginUser(user); +// } +// +// public UserDetails createLoginUser(SysUser user) +// { +// Set perms = new HashSet(); +// perms.add("*:*:*"); +//// return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); +// return new LoginUser(user.getUserId(), user.getDeptId(), user, perms); +// } +//} diff --git a/oms-api/src/main/java/com/qihang/oms/api/service/EchoService.java b/sys-api/src/main/java/com/qihang/sys/api/service/EchoService.java similarity index 86% rename from oms-api/src/main/java/com/qihang/oms/api/service/EchoService.java rename to sys-api/src/main/java/com/qihang/sys/api/service/EchoService.java index 3e7e4bb2..54f38aeb 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/service/EchoService.java +++ b/sys-api/src/main/java/com/qihang/sys/api/service/EchoService.java @@ -1,4 +1,4 @@ -package com.qihang.oms.api.service; +package com.qihang.sys.api.service; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; diff --git a/oms-api/src/main/java/com/qihang/oms/api/service/ISysMenuService.java b/sys-api/src/main/java/com/qihang/sys/api/service/ISysMenuService.java similarity index 97% rename from oms-api/src/main/java/com/qihang/oms/api/service/ISysMenuService.java rename to sys-api/src/main/java/com/qihang/sys/api/service/ISysMenuService.java index 25278ced..da4df877 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/service/ISysMenuService.java +++ b/sys-api/src/main/java/com/qihang/sys/api/service/ISysMenuService.java @@ -1,6 +1,6 @@ -package com.qihang.oms.api.service; +package com.qihang.sys.api.service; -import com.qihang.oms.api.domain.SysMenu; +import com.qihang.sys.api.domain.SysMenu; import java.util.List; import java.util.Set; diff --git a/sys-api/src/main/java/com/qihang/sys/api/service/ISysUserService.java b/sys-api/src/main/java/com/qihang/sys/api/service/ISysUserService.java new file mode 100644 index 00000000..2879e5fb --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/service/ISysUserService.java @@ -0,0 +1,161 @@ +//package com.qihang.oms.api.service; +// +// +//import com.qihang.security.entity.SysUser; +// +//import java.util.List; +// +///** +// * 用户 业务层 +// * +// * @author qihang +// */ +//public interface ISysUserService +//{ +// /** +// * 根据条件分页查询用户列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// public List selectUserList(SysUser user); +// +// /** +// * 根据条件分页查询已分配用户角色列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// public List selectAllocatedList(SysUser user); +// +// /** +// * 根据条件分页查询未分配用户角色列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// public List selectUnallocatedList(SysUser user); +// +// /** +// * 通过用户名查询用户 +// * +// * @param userName 用户名 +// * @return 用户对象信息 +// */ +// public SysUser selectUserByUserName(String userName); +// +// /** +// * 通过用户ID查询用户 +// * +// * @param userId 用户ID +// * @return 用户对象信息 +// */ +// public SysUser selectUserById(Long userId); +// +// /** +// * 校验用户名称是否唯一 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public boolean checkUserNameUnique(SysUser user); +// +// /** +// * 校验手机号码是否唯一 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public boolean checkPhoneUnique(SysUser user); +// +// /** +// * 校验email是否唯一 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public boolean checkEmailUnique(SysUser user); +// +// /** +// * 校验用户是否允许操作 +// * +// * @param user 用户信息 +// */ +// public void checkUserAllowed(SysUser user); +// +// +// /** +// * 新增用户信息 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public int insertUser(SysUser user); +// +// /** +// * 注册用户信息 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public boolean registerUser(SysUser user); +// +// /** +// * 修改用户信息 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public int updateUser(SysUser user); +// +// /** +// * 修改用户状态 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public int updateUserStatus(SysUser user); +// +// /** +// * 修改用户基本信息 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public int updateUserProfile(SysUser user); +// +// /** +// * 修改用户头像 +// * +// * @param userName 用户名 +// * @param avatar 头像地址 +// * @return 结果 +// */ +// public boolean updateUserAvatar(String userName, String avatar); +// +// /** +// * 重置用户密码 +// * +// * @param user 用户信息 +// * @return 结果 +// */ +// public int resetPwd(SysUser user); +// +// /** +// * 重置用户密码 +// * +// * @param userName 用户名 +// * @param password 密码 +// * @return 结果 +// */ +// public int resetUserPwd(String userName, String password); +// +// /** +// * 通过用户ID删除用户 +// * +// * @param userId 用户ID +// * @return 结果 +// */ +// public int deleteUserById(Long userId); +// +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/service/SysLoginService.java b/sys-api/src/main/java/com/qihang/sys/api/service/SysLoginService.java new file mode 100644 index 00000000..52692404 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/service/SysLoginService.java @@ -0,0 +1,144 @@ +//package com.qihang.oms.api.service; +// +//import com.qihang.oms.api.common.UserConstants; +//import com.qihang.oms.api.common.UserNotExistsException; +//import com.qihang.oms.api.common.UserPasswordNotMatchException; +//import com.qihang.oms.api.config.RedisCache; +//import com.qihang.oms.api.domain.LoginUser; +//import com.qihang.oms.api.domain.SysUser; +//import com.qihang.oms.api.security.AuthenticationContextHolder; +//import com.qihang.oms.api.utils.DateUtils; +//import com.qihang.oms.api.utils.StringUtils; +//import com.qihang.oms.api.utils.ip.IpUtils; +//import jakarta.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; +// +// +///** +// * 登录校验方法 +// * +// * @author qihang +// */ +//@Component +//public class SysLoginService +//{ +// @Autowired +// private TokenService tokenService; +// +// @Resource +// private AuthenticationManager authenticationManager; +// +// @Autowired +// private RedisCache redisCache; +// +// @Autowired +// private ISysUserService userService; +// +//// @Autowired +//// private ISysConfigService configService; +// +// /** +// * 登录验证 +// * +// * @param username 用户名 +// * @param password 密码 +// * @param code 验证码 +// * @param uuid 唯一标识 +// * @return 结果 +// */ +// public String login(String username, String password, String code, String uuid) +// { +// // 验证码校验 +//// validateCaptcha(username, code, uuid); +// // 登录前置校验 +// loginPreCheck(username, password); +// // 用户验证 +// Authentication authentication = null; +// try +// { +// UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, password); +// AuthenticationContextHolder.setContext(authenticationToken); +// // 该方法会去调用UserDetailsServiceImpl.loadUserByUsername +// authentication = authenticationManager.authenticate(authenticationToken); +// } +// catch (Exception e) +// { +// if (e instanceof BadCredentialsException) +// { +//// AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); +// throw new UserPasswordNotMatchException(); +// } +// else +// { +//// AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage())); +//// throw new ServiceException(e.getMessage()); +// } +// } +// finally +// { +// AuthenticationContextHolder.clearContext(); +// } +//// AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"))); +// LoginUser loginUser = (LoginUser) authentication.getPrincipal(); +// recordLoginInfo(loginUser.getUserId()); +// // 生成token +// return tokenService.createToken(loginUser); +// } +// +// +// +// /** +// * 登录前置校验 +// * @param username 用户名 +// * @param password 用户密码 +// */ +// public void loginPreCheck(String username, String password) +// { +// // 用户名或密码为空 错误 +// if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password)) +// { +//// AsyncManagernager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("not.null"))); +// throw new UserNotExistsException(); +// } +// // 密码如果不在指定范围内 错误 +// if (password.length() < UserConstants.PASSWORD_MIN_LENGTH +// || password.length() > UserConstants.PASSWORD_MAX_LENGTH) +// { +//// AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); +// throw new UserPasswordNotMatchException(); +// } +// // 用户名不在指定范围内 错误 +// if (username.length() < UserConstants.USERNAME_MIN_LENGTH +// || username.length() > UserConstants.USERNAME_MAX_LENGTH) +// { +//// AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match"))); +// throw new UserPasswordNotMatchException(); +// } +// // IP黑名单校验 +//// String blackStr = configService.selectConfigByKey("sys.login.blackIPList"); +//// if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) +//// { +//// AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("login.blocked"))); +//// throw new BlackListException(); +//// } +// } +// +// /** +// * 记录登录信息 +// * +// * @param userId 用户ID +// */ +// public void recordLoginInfo(Long userId) +// { +// SysUser sysUser = new SysUser(); +// sysUser.setUserId(userId); +// sysUser.setLoginIp(IpUtils.getIpAddr()); +// sysUser.setLoginDate(DateUtils.getNowDate()); +// userService.updateUserProfile(sysUser); +// } +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/service/TokenService.java b/sys-api/src/main/java/com/qihang/sys/api/service/TokenService.java new file mode 100644 index 00000000..756944c2 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/service/TokenService.java @@ -0,0 +1,227 @@ +//package com.qihang.oms.api.service; +// +//import com.alibaba.cloud.commons.lang.StringUtils; +//import com.qihang.oms.api.config.RedisCache; +//import com.qihang.oms.api.constant.CacheConstants; +//import com.qihang.oms.api.constant.Constants; +//import com.qihang.oms.api.domain.LoginUser; +//import com.qihang.oms.api.utils.IdUtils; +//import com.qihang.oms.api.utils.ServletUtils; +//import com.qihang.oms.api.utils.ip.AddressUtils; +//import com.qihang.oms.api.utils.ip.IpUtils; +//import eu.bitwalker.useragentutils.UserAgent; +//import io.jsonwebtoken.Claims; +//import io.jsonwebtoken.Jwts; +//import io.jsonwebtoken.SignatureAlgorithm; +//import jakarta.servlet.http.HttpServletRequest; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.stereotype.Component; +// +//import java.util.HashMap; +//import java.util.Map; +//import java.util.concurrent.TimeUnit; +// +///** +// * token验证处理 +// * +// * @author qihang +// */ +//@Component +//public class TokenService +//{ +// // 令牌自定义标识 +//// @Value("${token.header:'Authorization'}") +//// private String header; +// +// // 令牌秘钥 +// @Value("${token.secret:'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkrstuvwxyzabcdefghijklmnopqrstuvwxyz'}") +// private String secret; +// +// // 令牌有效期(默认30分钟) +// @Value("${token.expireTime:30}") +// 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)) +// { +// try +// { +// Claims claims = parseToken(token); +// // 解析对应的权限以及用户信息 +// String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); +// String userKey = getTokenKey(uuid); +// LoginUser user = redisCache.getCacheObject(userKey); +// return user; +// } +// catch (Exception e) +// { +// } +// } +// return null; +// } +// +// /** +// * 设置用户身份信息 +// */ +// public void setLoginUser(LoginUser loginUser) +// { +// if (loginUser!= null && 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(); +// 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("Authorization"); +// if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) +// { +// token = token.replace(Constants.TOKEN_PREFIX, ""); +// } +// return token; +// } +// +// private String getTokenKey(String uuid) +// { +// return CacheConstants.LOGIN_TOKEN_KEY + uuid; +// } +//} diff --git a/oms-api/src/main/java/com/qihang/oms/api/service/impl/SysMenuServiceImpl.java b/sys-api/src/main/java/com/qihang/sys/api/service/impl/SysMenuServiceImpl.java similarity index 96% rename from oms-api/src/main/java/com/qihang/oms/api/service/impl/SysMenuServiceImpl.java rename to sys-api/src/main/java/com/qihang/sys/api/service/impl/SysMenuServiceImpl.java index a0fa151f..8ee44b5b 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/service/impl/SysMenuServiceImpl.java +++ b/sys-api/src/main/java/com/qihang/sys/api/service/impl/SysMenuServiceImpl.java @@ -1,12 +1,12 @@ -package com.qihang.oms.api.service.impl; +package com.qihang.sys.api.service.impl; -import com.qihang.oms.api.common.UserConstants; -import com.qihang.oms.api.constant.Constants; -import com.qihang.oms.api.domain.SysMenu; -import com.qihang.oms.api.domain.SysUser; -import com.qihang.oms.api.mapper.SysMenuMapper; -import com.qihang.oms.api.service.ISysMenuService; -import com.qihang.oms.api.utils.StringUtils; +import com.qihang.common.constant.UserConstants; +import com.qihang.common.utils.StringUtils; +import com.qihang.sys.api.constant.Constants; +import com.qihang.sys.api.domain.SysMenu; +import com.qihang.sys.api.mapper.SysMenuMapper; +import com.qihang.sys.api.service.ISysMenuService; +import com.qihang.security.entity.SysUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -15,7 +15,7 @@ import java.util.stream.Collectors; /** * 菜单 业务层处理 - * + * * @author qihang */ @Service @@ -29,7 +29,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 根据用户查询系统菜单列表 - * + * * @param userId 用户ID * @return 菜单列表 */ @@ -41,7 +41,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 查询系统菜单列表 - * + * * @param menu 菜单信息 * @return 菜单列表 */ @@ -64,7 +64,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 根据用户ID查询权限 - * + * * @param userId 用户ID * @return 权限列表 */ @@ -85,7 +85,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 根据角色ID查询权限 - * + * * @param roleId 角色ID * @return 权限列表 */ @@ -106,7 +106,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 根据用户ID查询菜单 - * + * * @param userId 用户名称 * @return 菜单列表 */ @@ -127,7 +127,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 根据角色ID查询菜单树信息 - * + * * @param roleId 角色ID * @return 选中菜单列表 */ @@ -140,7 +140,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 构建前端路由所需要的菜单 - * + * * @param menus 菜单列表 * @return 路由列表 */ @@ -198,7 +198,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 构建前端所需要树结构 - * + * * @param menus 菜单列表 * @return 树结构列表 */ @@ -226,7 +226,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 构建前端所需要下拉树结构 - * + * * @param menus 菜单列表 * @return 下拉树结构列表 */ @@ -239,7 +239,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 根据菜单ID查询信息 - * + * * @param menuId 菜单ID * @return 菜单信息 */ @@ -251,7 +251,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 是否存在菜单子节点 - * + * * @param menuId 菜单ID * @return 结果 */ @@ -264,7 +264,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 查询菜单使用数量 - * + * * @param menuId 菜单ID * @return 结果 */ @@ -277,7 +277,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 新增保存菜单信息 - * + * * @param menu 菜单信息 * @return 结果 */ @@ -289,7 +289,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 修改保存菜单信息 - * + * * @param menu 菜单信息 * @return 结果 */ @@ -301,7 +301,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 删除菜单管理信息 - * + * * @param menuId 菜单ID * @return 结果 */ @@ -313,7 +313,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 校验菜单名称是否唯一 - * + * * @param menu 菜单信息 * @return 结果 */ @@ -331,7 +331,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 获取路由名称 - * + * * @param menu 菜单信息 * @return 路由名称 */ @@ -348,7 +348,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 获取路由地址 - * + * * @param menu 菜单信息 * @return 路由地址 */ @@ -376,7 +376,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 获取组件信息 - * + * * @param menu 菜单信息 * @return 组件信息 */ @@ -400,7 +400,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 是否为菜单内部跳转 - * + * * @param menu 菜单信息 * @return 结果 */ @@ -412,7 +412,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 是否为内链组件 - * + * * @param menu 菜单信息 * @return 结果 */ @@ -423,7 +423,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 是否为parent_view组件 - * + * * @param menu 菜单信息 * @return 结果 */ @@ -434,7 +434,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 根据父节点的ID获取所有子节点 - * + * * @param list 分类表 * @param parentId 传入的父节点ID * @return String @@ -457,7 +457,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 递归列表 - * + * * @param list 分类表 * @param t 子节点 */ @@ -503,7 +503,7 @@ public class SysMenuServiceImpl implements ISysMenuService /** * 内链域名特殊字符替换 - * + * * @return 替换后的内链域名 */ public String innerLinkReplaceEach(String path) diff --git a/oms-api/src/main/java/com/qihang/oms/api/service/impl/SysUserServiceImpl.java b/sys-api/src/main/java/com/qihang/sys/api/service/impl/SysUserServiceImpl.java similarity index 92% rename from oms-api/src/main/java/com/qihang/oms/api/service/impl/SysUserServiceImpl.java rename to sys-api/src/main/java/com/qihang/sys/api/service/impl/SysUserServiceImpl.java index 807f6265..15bd37d0 100644 --- a/oms-api/src/main/java/com/qihang/oms/api/service/impl/SysUserServiceImpl.java +++ b/sys-api/src/main/java/com/qihang/sys/api/service/impl/SysUserServiceImpl.java @@ -1,24 +1,22 @@ -package com.qihang.oms.api.service.impl; +package com.qihang.sys.api.service.impl; -import com.qihang.oms.api.common.ServiceException; -import com.qihang.oms.api.common.UserConstants; -import com.qihang.oms.api.domain.SysUser; -import com.qihang.oms.api.mapper.SysUserMapper; -import com.qihang.oms.api.service.ISysUserService; -import com.qihang.oms.api.utils.StringUtils; +import com.qihang.common.common.ServiceException; +import com.qihang.common.constant.UserConstants; +import com.qihang.common.utils.StringUtils; +import com.qihang.sys.api.mapper.SysUserMapper; +import com.qihang.security.entity.SysUser; +import com.qihang.security.service.ISysUserService; 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.util.CollectionUtils; import java.util.List; -import java.util.stream.Collectors; /** * 用户 业务层处理 - * + * * @author qihang */ @Service @@ -31,7 +29,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 根据条件分页查询用户列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -43,7 +41,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 根据条件分页查询已分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -55,7 +53,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 根据条件分页查询未分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -67,7 +65,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 通过用户名查询用户 - * + * * @param userName 用户名 * @return 用户对象信息 */ @@ -79,7 +77,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 通过用户ID查询用户 - * + * * @param userId 用户ID * @return 用户对象信息 */ @@ -91,7 +89,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 校验用户名称是否唯一 - * + * * @param user 用户信息 * @return 结果 */ @@ -145,7 +143,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 校验用户是否允许操作 - * + * * @param user 用户信息 */ @Override @@ -159,7 +157,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 新增保存用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -178,7 +176,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 注册用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -190,7 +188,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 修改保存用户信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -213,7 +211,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 修改用户状态 - * + * * @param user 用户信息 * @return 结果 */ @@ -225,7 +223,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 修改用户基本信息 - * + * * @param user 用户信息 * @return 结果 */ @@ -237,7 +235,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 修改用户头像 - * + * * @param userName 用户名 * @param avatar 头像地址 * @return 结果 @@ -250,7 +248,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 重置用户密码 - * + * * @param user 用户信息 * @return 结果 */ @@ -262,7 +260,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 重置用户密码 - * + * * @param userName 用户名 * @param password 密码 * @return 结果 @@ -277,7 +275,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 通过用户ID删除用户 - * + * * @param userId 用户ID * @return 结果 */ diff --git a/sys-api/src/main/java/com/qihang/sys/api/utils/DateUtils.java b/sys-api/src/main/java/com/qihang/sys/api/utils/DateUtils.java new file mode 100644 index 00000000..ab7b0876 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/DateUtils.java @@ -0,0 +1,188 @@ +package com.qihang.sys.api.utils; + +import org.apache.commons.lang3.time.DateFormatUtils; + +import java.lang.management.ManagementFactory; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.*; +import java.util.Date; + +/** + * 时间工具类 + * + * @author qihang + */ +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 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 int differentDaysByMillisecond(Date date1, Date date2) + { + return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); + } + + /** + * 计算时间差 + * + * @param endDate 最后时间 + * @param startTime 开始时间 + * @return 时间差(天/小时/分钟) + */ + public static String timeDistance(Date endDate, Date startTime) + { + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + // long ns = 1000; + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - startTime.getTime(); + // 计算差多少天 + long 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 + "分钟"; + } + + /** + * 增加 LocalDateTime ==> Date + */ + public static Date toDate(LocalDateTime temporalAccessor) + { + ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } + + /** + * 增加 LocalDate ==> Date + */ + public static Date toDate(LocalDate temporalAccessor) + { + LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); + ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); + return Date.from(zdt.toInstant()); + } +} diff --git a/sys-api/src/main/java/com/qihang/sys/api/utils/FastJson2JsonRedisSerializer.java b/sys-api/src/main/java/com/qihang/sys/api/utils/FastJson2JsonRedisSerializer.java new file mode 100644 index 00000000..489b40d6 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/FastJson2JsonRedisSerializer.java @@ -0,0 +1,49 @@ +package com.qihang.sys.api.utils; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.JSONWriter; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; + +import java.nio.charset.Charset; + +/** + * Redis使用FastJson序列化 + * + * @author qihang + */ +public class FastJson2JsonRedisSerializer implements RedisSerializer +{ + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + private Class clazz; + + 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, JSONWriter.Feature.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, JSONReader.Feature.SupportAutoType); + } +} diff --git a/sys-api/src/main/java/com/qihang/sys/api/utils/IdUtils.java b/sys-api/src/main/java/com/qihang/sys/api/utils/IdUtils.java new file mode 100644 index 00000000..b4f4dfbc --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/IdUtils.java @@ -0,0 +1,49 @@ +package com.qihang.sys.api.utils; + +/** + * ID生成器工具类 + * + * @author qihang + */ +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/sys-api/src/main/java/com/qihang/sys/api/utils/MessageUtils.java b/sys-api/src/main/java/com/qihang/sys/api/utils/MessageUtils.java new file mode 100644 index 00000000..297d6f1e --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/MessageUtils.java @@ -0,0 +1,25 @@ +//package com.qihang.oms.api.utils; +// +//import org.springframework.context.MessageSource; +//import org.springframework.context.i18n.LocaleContextHolder; +// +///** +// * 获取i18n资源文件 +// * +// * @author qihang +// */ +//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/sys-api/src/main/java/com/qihang/sys/api/utils/ServletUtils.java b/sys-api/src/main/java/com/qihang/sys/api/utils/ServletUtils.java new file mode 100644 index 00000000..881a2d53 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/ServletUtils.java @@ -0,0 +1,219 @@ +//package com.qihang.oms.api.utils; +// +// +//import com.qihang.oms.api.constant.Constants; +//import com.qihang.oms.api.common.Convert; +//import jakarta.servlet.ServletRequest; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import jakarta.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 java.io.IOException; +//import java.io.UnsupportedEncodingException; +//import java.net.URLDecoder; +//import java.net.URLEncoder; +//import java.util.Collections; +//import java.util.HashMap; +//import java.util.Map; +// +///** +// * 客户端工具类 +// * +// * @author qihang +// */ +//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); +// } +// +// /** +// * 获取Boolean参数 +// */ +// public static Boolean getParameterToBool(String name) +// { +// return Convert.toBool(getRequest().getParameter(name)); +// } +// +// /** +// * 获取Boolean参数 +// */ +// public static Boolean getParameterToBool(String name, Boolean defaultValue) +// { +// return Convert.toBool(getRequest().getParameter(name), defaultValue); +// } +// +// /** +// * 获得所有请求参数 +// * +// * @param request 请求对象{@link ServletRequest} +// * @return Map +// */ +// public static Map getParams(ServletRequest request) +// { +// final Map map = request.getParameterMap(); +// return Collections.unmodifiableMap(map); +// } +// +// /** +// * 获得所有请求参数 +// * +// * @param request 请求对象{@link ServletRequest} +// * @return Map +// */ +// public static Map getParamMap(ServletRequest request) +// { +// Map params = new HashMap<>(); +// for (Map.Entry entry : getParams(request).entrySet()) +// { +// params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); +// } +// return params; +// } +// +// /** +// * 获取request +// */ +// 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 待渲染的字符串 +// */ +// public static void 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(); +// } +// } +// +// /** +// * 是否是Ajax异步请求 +// * +// * @param request +// */ +// public static boolean isAjaxRequest(HttpServletRequest request) +// { +// String accept = request.getHeader("accept"); +// if (accept != null && accept.contains("application/json")) +// { +// return true; +// } +// +// String xRequestedWith = request.getHeader("X-Requested-With"); +// if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) +// { +// return true; +// } +// +// String uri = request.getRequestURI(); +// if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) +// { +// return true; +// } +// +// String ajax = request.getParameter("__ajax"); +// return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); +// } +// +// /** +// * 内容编码 +// * +// * @param str 内容 +// * @return 编码后的内容 +// */ +// public static String urlEncode(String str) +// { +// try +// { +// return URLEncoder.encode(str, Constants.UTF8); +// } +// catch (UnsupportedEncodingException e) +// { +// return StringUtils.EMPTY; +// } +// } +// +// /** +// * 内容解码 +// * +// * @param str 内容 +// * @return 解码后的内容 +// */ +// public static String urlDecode(String str) +// { +// try +// { +// return URLDecoder.decode(str, Constants.UTF8); +// } +// catch (UnsupportedEncodingException e) +// { +// return StringUtils.EMPTY; +// } +// } +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/utils/SpringUtils.java b/sys-api/src/main/java/com/qihang/sys/api/utils/SpringUtils.java new file mode 100644 index 00000000..117f0d5b --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/SpringUtils.java @@ -0,0 +1,157 @@ +//package com.qihang.oms.api.utils; +// +//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; +// +///** +// * spring工具类 方便在非spring管理环境中获取bean +// * +// * @author qihang +// */ +//@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 BeansException +// * +// */ +// @SuppressWarnings("unchecked") +// public static T getBean(String name) throws BeansException +// { +// return (T) beanFactory.getBean(name); +// } +// +// /** +// * 获取类型为requiredType的对象 +// * +// * @param clz +// * @return +// * @throws 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 NoSuchBeanDefinitionException +// * +// */ +// public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException +// { +// return beanFactory.isSingleton(name); +// } +// +// /** +// * @param name +// * @return Class 注册对象的类型 +// * @throws NoSuchBeanDefinitionException +// * +// */ +// public static Class getType(String name) throws NoSuchBeanDefinitionException +// { +// return beanFactory.getType(name); +// } +// +// /** +// * 如果给定的bean名字在bean定义中有别名,则返回这些别名 +// * +// * @param name +// * @return +// * @throws 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; +// } +// +// /** +// * 获取配置文件中的值 +// * +// * @param key 配置文件的key +// * @return 当前的配置文件的值 +// * +// */ +// public static String getRequiredProperty(String key) +// { +// return applicationContext.getEnvironment().getRequiredProperty(key); +// } +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/utils/StringUtils.java b/sys-api/src/main/java/com/qihang/sys/api/utils/StringUtils.java new file mode 100644 index 00000000..63a68975 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/StringUtils.java @@ -0,0 +1,611 @@ +//package com.qihang.oms.api.utils; +// +// +//import com.qihang.oms.api.constant.Constants; +//import com.qihang.oms.api.common.StrFormatter; +//import org.springframework.util.AntPathMatcher; +// +//import java.util.*; +// +///** +// * 字符串工具类 +// * +// * @author qihang +// */ +//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); +// } +// +// /** +// * 是否为http(s)://开头 +// * +// * @param link 链接 +// * @return 结果 +// */ +// public static boolean ishttp(String link) +// { +// return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); +// } +// +// /** +// * 字符串转set +// * +// * @param str 字符串 +// * @param sep 分隔符 +// * @return set集合 +// */ +// public static final Set str2Set(String str, String sep) +// { +// return new HashSet(str2List(str, sep, true, false)); +// } +// +// /** +// * 字符串转list +// * +// * @param str 字符串 +// * @param sep 分隔符 +// * @param filterBlank 过滤纯空白 +// * @param trim 去掉首尾空白 +// * @return list集合 +// */ +// public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) +// { +// List list = new ArrayList(); +// if (StringUtils.isEmpty(str)) +// { +// return list; +// } +// +// // 过滤空白字符串 +// if (filterBlank && StringUtils.isBlank(str)) +// { +// return list; +// } +// String[] split = str.split(sep); +// for (String string : split) +// { +// if (filterBlank && StringUtils.isBlank(string)) +// { +// continue; +// } +// if (trim) +// { +// string = string.trim(); +// } +// list.add(string); +// } +// +// return list; +// } +// +// /** +// * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value +// * +// * @param collection 给定的集合 +// * @param array 给定的数组 +// * @return boolean 结果 +// */ +// public static boolean containsAny(Collection collection, String... array) +// { +// if (isEmpty(collection) || isEmpty(array)) +// { +// return false; +// } +// else +// { +// for (String str : array) +// { +// if (collection.contains(str)) +// { +// return true; +// } +// } +// return false; +// } +// } +// +// /** +// * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 +// * +// * @param cs 指定字符串 +// * @param searchCharSequences 需要检查的字符串数组 +// * @return 是否包含任意一个字符串 +// */ +// public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) +// { +// if (isEmpty(cs) || isEmpty(searchCharSequences)) +// { +// return false; +// } +// for (CharSequence testStr : searchCharSequences) +// { +// if (containsIgnoreCase(cs, testStr)) +// { +// return true; +// } +// } +// return false; +// } +// +// /** +// * 驼峰转下划线命名 +// */ +// public static String toUnderScoreCase(String str) +// { +// if (str == null) +// { +// return null; +// } +// StringBuilder sb = new StringBuilder(); +// // 前置字符是否大写 +// boolean preCharIsUpperCase = true; +// // 当前字符是否大写 +// boolean curreCharIsUpperCase = true; +// // 下一字符是否大写 +// boolean nexteCharIsUpperCase = true; +// for (int i = 0; i < str.length(); i++) +// { +// char c = str.charAt(i); +// if (i > 0) +// { +// preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); +// } +// else +// { +// preCharIsUpperCase = false; +// } +// +// curreCharIsUpperCase = Character.isUpperCase(c); +// +// if (i < (str.length() - 1)) +// { +// nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); +// } +// +// if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) +// { +// sb.append(SEPARATOR); +// } +// else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) +// { +// sb.append(SEPARATOR); +// } +// sb.append(Character.toLowerCase(c)); +// } +// +// return sb.toString(); +// } +// +// /** +// * 是否包含字符串 +// * +// * @param str 验证字符串 +// * @param strs 字符串组 +// * @return 包含返回true +// */ +// public static boolean inStringIgnoreCase(String str, String... strs) +// { +// if (str != null && strs != null) +// { +// for (String s : strs) +// { +// if (str.equalsIgnoreCase(trim(s))) +// { +// return true; +// } +// } +// } +// return false; +// } +// +// /** +// * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld +// * +// * @param name 转换前的下划线大写方式命名的字符串 +// * @return 转换后的驼峰式命名的字符串 +// */ +// public static String convertToCamelCase(String name) +// { +// StringBuilder result = new StringBuilder(); +// // 快速检查 +// if (name == null || name.isEmpty()) +// { +// // 没必要转换 +// return ""; +// } +// else if (!name.contains("_")) +// { +// // 不含下划线,仅将首字母大写 +// return name.substring(0, 1).toUpperCase() + name.substring(1); +// } +// // 用下划线将原始字符串分割 +// String[] camels = name.split("_"); +// for (String camel : camels) +// { +// // 跳过原始字符串中开头、结尾的下换线或双重下划线 +// if (camel.isEmpty()) +// { +// continue; +// } +// // 首字母大写 +// result.append(camel.substring(0, 1).toUpperCase()); +// result.append(camel.substring(1).toLowerCase()); +// } +// return result.toString(); +// } +// +// /** +// * 驼峰式命名法 +// * 例如:user_name->userName +// */ +// public static String toCamelCase(String s) +// { +// if (s == null) +// { +// return null; +// } +// if (s.indexOf(SEPARATOR) == -1) +// { +// return s; +// } +// s = s.toLowerCase(); +// StringBuilder sb = new StringBuilder(s.length()); +// boolean upperCase = false; +// for (int i = 0; i < s.length(); i++) +// { +// char c = s.charAt(i); +// +// if (c == SEPARATOR) +// { +// upperCase = true; +// } +// else if (upperCase) +// { +// sb.append(Character.toUpperCase(c)); +// upperCase = false; +// } +// else +// { +// sb.append(c); +// } +// } +// return sb.toString(); +// } +// +// /** +// * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 +// * +// * @param str 指定字符串 +// * @param strs 需要检查的字符串数组 +// * @return 是否匹配 +// */ +// public static boolean matches(String str, List strs) +// { +// if (isEmpty(str) || isEmpty(strs)) +// { +// return false; +// } +// for (String pattern : strs) +// { +// if (isMatch(pattern, str)) +// { +// return true; +// } +// } +// return false; +// } +// +// /** +// * 判断url是否与规则配置: +// * ? 表示单个字符; +// * * 表示一层路径内的任意字符串,不可跨层级; +// * ** 表示任意层路径; +// * +// * @param pattern 匹配规则 +// * @param url 需要匹配的url +// * @return +// */ +// public static boolean isMatch(String pattern, String url) +// { +// AntPathMatcher matcher = new AntPathMatcher(); +// return matcher.match(pattern, url); +// } +// +// @SuppressWarnings("unchecked") +// public static T cast(Object obj) +// { +// return (T) obj; +// } +// +// /** +// * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 +// * +// * @param num 数字对象 +// * @param size 字符串指定长度 +// * @return 返回数字的字符串格式,该字符串为指定长度。 +// */ +// public static final String padl(final Number num, final int size) +// { +// return padl(num.toString(), size, '0'); +// } +// +// /** +// * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 +// * +// * @param s 原始字符串 +// * @param size 字符串指定长度 +// * @param c 用于补齐的字符 +// * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 +// */ +// public static final String padl(final String s, final int size, final char c) +// { +// final StringBuilder sb = new StringBuilder(size); +// if (s != null) +// { +// final int len = s.length(); +// if (s.length() <= size) +// { +// for (int i = size - len; i > 0; i--) +// { +// sb.append(c); +// } +// sb.append(s); +// } +// else +// { +// return s.substring(len - size, len); +// } +// } +// else +// { +// for (int i = size; i > 0; i--) +// { +// sb.append(c); +// } +// } +// return sb.toString(); +// } +//} \ No newline at end of file diff --git a/sys-api/src/main/java/com/qihang/sys/api/utils/UUID.java b/sys-api/src/main/java/com/qihang/sys/api/utils/UUID.java new file mode 100644 index 00000000..030bb2b4 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/UUID.java @@ -0,0 +1,492 @@ +package com.qihang.sys.api.utils; + + + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +/** + * 提供通用唯一识别码(universally unique identifier)(UUID)实现 + * + * @author qihang + */ +public final class UUID implements java.io.Serializable, Comparable +{ + private static final long serialVersionUID = -1185015143654744140L; + + /** + * SecureRandom 的单例 + * + */ + private static class Holder + { + static final SecureRandom numberGenerator; + + static { + try { + numberGenerator = getSecureRandom(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + /** 此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 的静态工厂。 + * + * @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 (!isSimple) + { + builder.append('-'); + } + // time_mid + builder.append(digits(mostSigBits >> 16, 4)); + if (!isSimple) + { + builder.append('-'); + } + // time_high_and_version + builder.append(digits(mostSigBits, 4)); + if (!isSimple) + { + builder.append('-'); + } + // variant_and_sequence + builder.append(digits(leastSigBits >> 48, 4)); + if (!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() throws Exception { + try + { + return SecureRandom.getInstance("SHA1PRNG"); + } + catch (NoSuchAlgorithmException e) + { + throw new Exception(e); + } + } + + /** + * 获取随机数生成器对象
+ * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。 + * + * @return {@link ThreadLocalRandom} + */ + public static ThreadLocalRandom getRandom() + { + return ThreadLocalRandom.current(); + } +} diff --git a/sys-api/src/main/java/com/qihang/sys/api/utils/http/HttpHelper.java b/sys-api/src/main/java/com/qihang/sys/api/utils/http/HttpHelper.java new file mode 100644 index 00000000..bcd746d5 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/http/HttpHelper.java @@ -0,0 +1,56 @@ +package com.qihang.sys.api.utils.http; + +import jakarta.servlet.ServletRequest; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + +/** + * 通用http工具封装 + * + * @author qihang + */ +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, StandardCharsets.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/sys-api/src/main/java/com/qihang/sys/api/utils/http/HttpUtils.java b/sys-api/src/main/java/com/qihang/sys/api/utils/http/HttpUtils.java new file mode 100644 index 00000000..a31935b3 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/http/HttpUtils.java @@ -0,0 +1,266 @@ +//package com.qihang.oms.api.utils.http; +// +//import com.qihang.oms.api.constant.Constants; +//import com.qihang.oms.api.utils.StringUtils; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +// +//import javax.net.ssl.*; +//import java.io.*; +//import java.net.ConnectException; +//import java.net.SocketTimeoutException; +//import java.net.URL; +//import java.net.URLConnection; +//import java.nio.charset.StandardCharsets; +//import java.security.cert.X509Certificate; +// +///** +// * 通用http发送方法 +// * +// * @author qihang +// */ +//public class HttpUtils +//{ +// private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); +// +// /** +// * 向指定 URL 发送GET方法的请求 +// * +// * @param url 发送请求的 URL +// * @return 所代表远程资源的响应结果 +// */ +// public static String sendGet(String url) +// { +// return sendGet(url, StringUtils.EMPTY); +// } +// +// /** +// * 向指定 URL 发送GET方法的请求 +// * +// * @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 = StringUtils.isNotBlank(param) ? url + "?" + param : url; +// 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 +// { +// log.info("sendPost - {}", url); +// URL realUrl = new URL(url); +// 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(), StandardCharsets.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(StandardCharsets.ISO_8859_1), StandardCharsets.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/sys-api/src/main/java/com/qihang/sys/api/utils/ip/AddressUtils.java b/sys-api/src/main/java/com/qihang/sys/api/utils/ip/AddressUtils.java new file mode 100644 index 00000000..7eceb92b --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/ip/AddressUtils.java @@ -0,0 +1,54 @@ +//package com.qihang.oms.api.utils.ip; +// +//import com.alibaba.fastjson2.JSON; +//import com.alibaba.fastjson2.JSONObject; +//import com.qihang.oms.api.constant.Constants; +//import com.qihang.oms.api.utils.http.HttpUtils; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.util.StringUtils; +// +///** +// * 获取地址类 +// * +// * @author qihang +// */ +//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) +// { +// // 内网不查询 +// if (IpUtils.internalIp(ip)) +// { +// return "内网IP"; +// } +// +// try +// { +// String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK); +// if (StringUtils.isEmpty(rspStr)) +// { +// log.error("获取地理位置异常 {}", ip); +// return UNKNOWN; +// } +// JSONObject obj = JSON.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 UNKNOWN; +// } +//} diff --git a/sys-api/src/main/java/com/qihang/sys/api/utils/ip/IpUtils.java b/sys-api/src/main/java/com/qihang/sys/api/utils/ip/IpUtils.java new file mode 100644 index 00000000..dc6afce1 --- /dev/null +++ b/sys-api/src/main/java/com/qihang/sys/api/utils/ip/IpUtils.java @@ -0,0 +1,384 @@ +//package com.qihang.oms.api.utils.ip; +// +// +//import com.qihang.oms.api.utils.ServletUtils; +//import com.qihang.oms.api.utils.StringUtils; +//import jakarta.servlet.http.HttpServletRequest; +// +//import java.net.InetAddress; +//import java.net.UnknownHostException; +// +///** +// * 获取IP方法 +// * +// * @author qihang +// */ +//public class IpUtils +//{ +// public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)"; +// // 匹配 ip +// public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")"; +// public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))"; +// // 匹配网段 +// public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")"; +// +// /** +// * 获取客户端IP +// * +// * @return IP地址 +// */ +// public static String getIpAddr() +// { +// return getIpAddr(ServletUtils.getRequest()); +// } +// +// /** +// * 获取客户端IP +// * +// * @param request 请求对象 +// * @return IP地址 +// */ +// public static String getIpAddr(HttpServletRequest request) +// { +// if (request == null) +// { +// 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" : getMultistageReverseProxyIp(ip); +// } +// +// /** +// * 检查是否为内部IP地址 +// * +// * @param ip IP地址 +// * @return 结果 +// */ +// public static boolean internalIp(String ip) +// { +// byte[] addr = textToNumericFormatV4(ip); +// return internalIp(addr) || "127.0.0.1".equals(ip); +// } +// +// /** +// * 检查是否为内部IP地址 +// * +// * @param addr byte地址 +// * @return 结果 +// */ +// private static boolean internalIp(byte[] addr) +// { +// if (StringUtils.isNull(addr) || addr.length < 2) +// { +// 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; +// } +// +// /** +// * 获取IP地址 +// * +// * @return 本地IP地址 +// */ +// public static String getHostIp() +// { +// try +// { +// return InetAddress.getLocalHost().getHostAddress(); +// } +// catch (UnknownHostException e) +// { +// } +// return "127.0.0.1"; +// } +// +// /** +// * 获取主机名 +// * +// * @return 本地主机名 +// */ +// public static String getHostName() +// { +// try +// { +// return InetAddress.getLocalHost().getHostName(); +// } +// catch (UnknownHostException e) +// { +// } +// return "未知"; +// } +// +// /** +// * 从多级反向代理中获得第一个非unknown IP地址 +// * +// * @param ip 获得的IP地址 +// * @return 第一个非unknown IP地址 +// */ +// public static String getMultistageReverseProxyIp(String ip) +// { +// // 多级反向代理检测 +// if (ip != null && ip.indexOf(",") > 0) +// { +// final String[] ips = ip.trim().split(","); +// for (String subIp : ips) +// { +// if (false == isUnknown(subIp)) +// { +// ip = subIp; +// break; +// } +// } +// } +// return StringUtils.substring(ip, 0, 255); +// } +// +// /** +// * 检测给定字符串是否为未知,多用于检测HTTP请求相关 +// * +// * @param checkString 被检测的字符串 +// * @return 是否未知 +// */ +// public static boolean isUnknown(String checkString) +// { +// return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); +// } +// +// /** +// * 是否为IP +// */ +// public static boolean isIP(String ip) +// { +// return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP); +// } +// +// /** +// * 是否为IP,或 *为间隔的通配符地址 +// */ +// public static boolean isIpWildCard(String ip) +// { +// return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD); +// } +// +// /** +// * 检测参数是否在ip通配符里 +// */ +// public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip) +// { +// String[] s1 = ipWildCard.split("\\."); +// String[] s2 = ip.split("\\."); +// boolean isMatchedSeg = true; +// for (int i = 0; i < s1.length && !s1[i].equals("*"); i++) +// { +// if (!s1[i].equals(s2[i])) +// { +// isMatchedSeg = false; +// break; +// } +// } +// return isMatchedSeg; +// } +// +// /** +// * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串 +// */ +// public static boolean isIPSegment(String ipSeg) +// { +// return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG); +// } +// +// /** +// * 判断ip是否在指定网段中 +// */ +// public static boolean ipIsInNetNoCheck(String iparea, String ip) +// { +// int idx = iparea.indexOf('-'); +// String[] sips = iparea.substring(0, idx).split("\\."); +// String[] sipe = iparea.substring(idx + 1).split("\\."); +// String[] sipt = ip.split("\\."); +// long ips = 0L, ipe = 0L, ipt = 0L; +// for (int i = 0; i < 4; ++i) +// { +// ips = ips << 8 | Integer.parseInt(sips[i]); +// ipe = ipe << 8 | Integer.parseInt(sipe[i]); +// ipt = ipt << 8 | Integer.parseInt(sipt[i]); +// } +// if (ips > ipe) +// { +// long t = ips; +// ips = ipe; +// ipe = t; +// } +// return ips <= ipt && ipt <= ipe; +// } +// +// /** +// * 校验ip是否符合过滤串规则 +// * +// * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99` +// * @param ip 校验IP地址 +// * @return boolean 结果 +// */ +// public static boolean isMatchedIp(String filter, String ip) +// { +// if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip)) +// { +// return false; +// } +// String[] ips = filter.split(";"); +// for (String iStr : ips) +// { +// if (isIP(iStr) && iStr.equals(ip)) +// { +// return true; +// } +// else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip)) +// { +// return true; +// } +// else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip)) +// { +// return true; +// } +// } +// return false; +// } +//} \ No newline at end of file diff --git a/oms-api/src/main/resources/application.yaml b/sys-api/src/main/resources/application.yaml similarity index 87% rename from oms-api/src/main/resources/application.yaml rename to sys-api/src/main/resources/application.yaml index 8d38235b..f9eb9203 100644 --- a/oms-api/src/main/resources/application.yaml +++ b/sys-api/src/main/resources/application.yaml @@ -1,6 +1,6 @@ mybatis-plus: mapper-locations: classpath*:mapper/**/*Mapper.xml - type-aliases-package: com.qihang.oms.api.domain + type-aliases-package: com.qihang.sys.api.domain;com.qihang.security.entity; configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启sql日志 #mybatis: @@ -25,7 +25,7 @@ spring: import: - nacos:qihang-oms.yaml?refresh=true application: - name: oms-api + name: sys-api server: port: 8082 diff --git a/oms-api/src/main/resources/logback.xml b/sys-api/src/main/resources/logback.xml similarity index 100% rename from oms-api/src/main/resources/logback.xml rename to sys-api/src/main/resources/logback.xml diff --git a/oms-api/src/main/resources/mapper/system/SysMenuMapper.xml b/sys-api/src/main/resources/mapper/system/SysMenuMapper.xml similarity index 99% rename from oms-api/src/main/resources/mapper/system/SysMenuMapper.xml rename to sys-api/src/main/resources/mapper/system/SysMenuMapper.xml index 441e7b67..8b1d2a7b 100644 --- a/oms-api/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/sys-api/src/main/resources/mapper/system/SysMenuMapper.xml @@ -2,7 +2,7 @@ - + diff --git a/oms-api/src/main/resources/mapper/user/SysUserMapper.xml b/sys-api/src/main/resources/mapper/user/SysUserMapper.xml similarity index 99% rename from oms-api/src/main/resources/mapper/user/SysUserMapper.xml rename to sys-api/src/main/resources/mapper/user/SysUserMapper.xml index 8fad90a6..724626eb 100644 --- a/oms-api/src/main/resources/mapper/user/SysUserMapper.xml +++ b/sys-api/src/main/resources/mapper/user/SysUserMapper.xml @@ -2,7 +2,7 @@ - + diff --git a/oms-api/src/main/resources/mybatis/mybatis-config.xml b/sys-api/src/main/resources/mybatis/mybatis-config.xml similarity index 100% rename from oms-api/src/main/resources/mybatis/mybatis-config.xml rename to sys-api/src/main/resources/mybatis/mybatis-config.xml diff --git a/oms-api/src/test/java/com/qihang/AppTest.java b/sys-api/src/test/java/com/qihang/AppTest.java similarity index 100% rename from oms-api/src/test/java/com/qihang/AppTest.java rename to sys-api/src/test/java/com/qihang/AppTest.java diff --git a/tao-api/pom.xml b/tao-api/pom.xml index ac64a92b..8fded48d 100644 --- a/tao-api/pom.xml +++ b/tao-api/pom.xml @@ -52,41 +52,47 @@ com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-data-redis - - - com.alibaba.fastjson2 - fastjson2 - 2.0.43 - - - - io.jsonwebtoken - jjwt-api - ${jwt.version} - - - io.jsonwebtoken - jjwt-impl - ${jwt.version} - runtime - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + mysql mysql-connector-java 8.0.33 - - com.alibaba - druid-spring-boot-starter - 1.2.21 - + + + + + com.baomidou mybatis-plus-boot-starter @@ -97,12 +103,30 @@ commons-lang3 3.12.0 + + com.qihang + security + 1.0-SNAPSHOT + + + + + + + + + + org.projectlombok + lombok + 1.18.30 + provided + diff --git a/tao-api/src/main/java/com/qihang/tao/TaoApi.java b/tao-api/src/main/java/com/qihang/tao/TaoApi.java index 2f6f736d..605a00ea 100644 --- a/tao-api/src/main/java/com/qihang/tao/TaoApi.java +++ b/tao-api/src/main/java/com/qihang/tao/TaoApi.java @@ -5,6 +5,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.context.annotation.ComponentScan; //import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; /** @@ -14,12 +15,13 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; //@EnableWebSecurity @MapperScan("com.qihang.tao.mapper") @EnableDiscoveryClient +@ComponentScan(basePackages={"com.qihang"}) @SpringBootApplication public class TaoApi { public static void main( String[] args ) { -// System.out.println( "Hello World!" ); + System.out.println( "Hello tao-api!" ); SpringApplication.run(TaoApi.class, args); } } diff --git a/tao-api/src/main/java/com/qihang/tao/common/CharsetKit.java b/tao-api/src/main/java/com/qihang/tao/common/CharsetKit.java index 02d1c609..d716a099 100644 --- a/tao-api/src/main/java/com/qihang/tao/common/CharsetKit.java +++ b/tao-api/src/main/java/com/qihang/tao/common/CharsetKit.java @@ -1,86 +1,86 @@ -package com.qihang.tao.common; - - -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -/** - * 字符集工具类 - * - * @author qihang - */ -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) - { - destCharset = 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(); - } -} +//package com.qihang.tao.common; +// +// +//import java.nio.charset.Charset; +//import java.nio.charset.StandardCharsets; +// +///** +// * 字符集工具类 +// * +// * @author qihang +// */ +//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) +// { +// destCharset = 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/tao-api/src/main/java/com/qihang/tao/common/Convert.java b/tao-api/src/main/java/com/qihang/tao/common/Convert.java index c9fbe3eb..5cccc325 100644 --- a/tao-api/src/main/java/com/qihang/tao/common/Convert.java +++ b/tao-api/src/main/java/com/qihang/tao/common/Convert.java @@ -1,1000 +1,1000 @@ -package com.qihang.tao.common; - -import org.apache.commons.lang3.ArrayUtils; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.nio.ByteBuffer; -import java.nio.charset.Charset; -import java.text.NumberFormat; -import java.util.Set; - -/** - * 类型转换器 - * - * @author qihang - */ -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": - case "yes": - case "ok": - case "1": - return true; - case "false": - case "no": - 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 BigDecimal.valueOf((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[]) - { - return str((byte[]) obj, charset); - } - else if (obj instanceof Byte[]) - { - byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); - return str(bytes, 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("^整$", "零元整"); - } -} +//package com.qihang.tao.common; +// +//import org.apache.commons.lang3.ArrayUtils; +// +//import java.math.BigDecimal; +//import java.math.BigInteger; +//import java.nio.ByteBuffer; +//import java.nio.charset.Charset; +//import java.text.NumberFormat; +//import java.util.Set; +// +///** +// * 类型转换器 +// * +// * @author qihang +// */ +//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": +// case "yes": +// case "ok": +// case "1": +// return true; +// case "false": +// case "no": +// 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 BigDecimal.valueOf((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[]) +// { +// return str((byte[]) obj, charset); +// } +// else if (obj instanceof Byte[]) +// { +// byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); +// return str(bytes, 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/tao-api/src/main/java/com/qihang/tao/common/MessageUtils.java b/tao-api/src/main/java/com/qihang/tao/common/MessageUtils.java index 6d6bcfce..c7c1e4f1 100644 --- a/tao-api/src/main/java/com/qihang/tao/common/MessageUtils.java +++ b/tao-api/src/main/java/com/qihang/tao/common/MessageUtils.java @@ -1,25 +1,25 @@ -package com.qihang.tao.common; - -import org.springframework.context.MessageSource; -import org.springframework.context.i18n.LocaleContextHolder; - -/** - * 获取i18n资源文件 - * - * @author qihang - */ -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()); - } -} +//package com.qihang.tao.common; +// +//import org.springframework.context.MessageSource; +//import org.springframework.context.i18n.LocaleContextHolder; +// +///** +// * 获取i18n资源文件 +// * +// * @author qihang +// */ +//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/tao-api/src/main/java/com/qihang/tao/common/R.java b/tao-api/src/main/java/com/qihang/tao/common/R.java index 1ba92ad6..c7c66948 100644 --- a/tao-api/src/main/java/com/qihang/tao/common/R.java +++ b/tao-api/src/main/java/com/qihang/tao/common/R.java @@ -1,62 +1,62 @@ -package com.qihang.tao.common; - -import java.util.HashMap; -import java.util.Map; - -/** - * - * - * @Description 统一返回类封装 - **/ -public class R extends HashMap { - - private static final long serialVersionUID = 563554414843661955L; - - public R() { - put("code", 0); - put("msg", "success"); - } - - public static R error(int code, String msg) { - R r = new R(); - r.put("code", code); - r.put("msg", msg); - r.put("success", false); - return r; - } - - public static R success(Object data, String msg) { - R r = new R(); - r.put("code", 200); - r.put("data", data); - r.put("msg", msg); - r.put("success", true); - return r; - } - - public static R success(Object data) { - return success(data, "success"); - } - - public static R ok(String msg) { - R r = new R(); - r.put("msg", msg); - return r; - } - - public static R ok(Map map) { - R r = new R(); - r.putAll(map); - return r; - } - - public static R ok() { - return new R(); - } - - public R put(String key, Object value) { - super.put(key, value); - return this; - } -} - +//package com.qihang.tao.common; +// +//import java.util.HashMap; +//import java.util.Map; +// +///** +// * +// * +// * @Description 统一返回类封装 +// **/ +//public class R extends HashMap { +// +// private static final long serialVersionUID = 563554414843661955L; +// +// public R() { +// put("code", 0); +// put("msg", "success"); +// } +// +// public static R error(int code, String msg) { +// R r = new R(); +// r.put("code", code); +// r.put("msg", msg); +// r.put("success", false); +// return r; +// } +// +// public static R success(Object data, String msg) { +// R r = new R(); +// r.put("code", 200); +// r.put("data", data); +// r.put("msg", msg); +// r.put("success", true); +// return r; +// } +// +// public static R success(Object data) { +// return success(data, "success"); +// } +// +// public static R ok(String msg) { +// R r = new R(); +// r.put("msg", msg); +// return r; +// } +// +// public static R ok(Map map) { +// R r = new R(); +// r.putAll(map); +// return r; +// } +// +// public static R ok() { +// return new R(); +// } +// +// public R put(String key, Object value) { +// super.put(key, value); +// return this; +// } +//} +// diff --git a/tao-api/src/main/java/com/qihang/tao/common/ServiceException.java b/tao-api/src/main/java/com/qihang/tao/common/ServiceException.java index f39787a1..efefeb78 100644 --- a/tao-api/src/main/java/com/qihang/tao/common/ServiceException.java +++ b/tao-api/src/main/java/com/qihang/tao/common/ServiceException.java @@ -1,74 +1,74 @@ -package com.qihang.tao.common; - -/** - * 业务异常 - * - * @author qihang - */ -public final class ServiceException extends RuntimeException -{ - private static final long serialVersionUID = 1L; - - /** - * 错误码 - */ - private Integer code; - - /** - * 错误提示 - */ - private String message; - - /** - * 错误明细,内部调试错误 - * - * 和 {@link CommonResult#getDetailMessage()} 一致的设计 - */ - private String detailMessage; - - /** - * 空构造方法,避免反序列化问题 - */ - public ServiceException() - { - } - - public ServiceException(String message) - { - this.message = message; - } - - public ServiceException(String message, Integer code) - { - this.message = message; - this.code = code; - } - - public String getDetailMessage() - { - return detailMessage; - } - - @Override - public String getMessage() - { - return message; - } - - public Integer getCode() - { - return code; - } - - public ServiceException setMessage(String message) - { - this.message = message; - return this; - } - - public ServiceException setDetailMessage(String detailMessage) - { - this.detailMessage = detailMessage; - return this; - } -} \ No newline at end of file +//package com.qihang.tao.common; +// +///** +// * 业务异常 +// * +// * @author qihang +// */ +//public final class ServiceException extends RuntimeException +//{ +// private static final long serialVersionUID = 1L; +// +// /** +// * 错误码 +// */ +// private Integer code; +// +// /** +// * 错误提示 +// */ +// private String message; +// +// /** +// * 错误明细,内部调试错误 +// * +// * 和 {@link CommonResult#getDetailMessage()} 一致的设计 +// */ +// private String detailMessage; +// +// /** +// * 空构造方法,避免反序列化问题 +// */ +// public ServiceException() +// { +// } +// +// public ServiceException(String message) +// { +// this.message = message; +// } +// +// public ServiceException(String message, Integer code) +// { +// this.message = message; +// this.code = code; +// } +// +// public String getDetailMessage() +// { +// return detailMessage; +// } +// +// @Override +// public String getMessage() +// { +// return message; +// } +// +// public Integer getCode() +// { +// return code; +// } +// +// public ServiceException setMessage(String message) +// { +// this.message = message; +// return this; +// } +// +// public ServiceException setDetailMessage(String detailMessage) +// { +// this.detailMessage = detailMessage; +// return this; +// } +//} \ No newline at end of file diff --git a/tao-api/src/main/java/com/qihang/tao/common/SpringUtils.java b/tao-api/src/main/java/com/qihang/tao/common/SpringUtils.java index a96d3952..e2cf3872 100644 --- a/tao-api/src/main/java/com/qihang/tao/common/SpringUtils.java +++ b/tao-api/src/main/java/com/qihang/tao/common/SpringUtils.java @@ -1,157 +1,157 @@ -package com.qihang.tao.common; - -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; - -/** - * spring工具类 方便在非spring管理环境中获取bean - * - * @author qihang - */ -@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 BeansException - * - */ - @SuppressWarnings("unchecked") - public static T getBean(String name) throws BeansException - { - return (T) beanFactory.getBean(name); - } - - /** - * 获取类型为requiredType的对象 - * - * @param clz - * @return - * @throws 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 NoSuchBeanDefinitionException - * - */ - public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException - { - return beanFactory.isSingleton(name); - } - - /** - * @param name - * @return Class 注册对象的类型 - * @throws NoSuchBeanDefinitionException - * - */ - public static Class getType(String name) throws NoSuchBeanDefinitionException - { - return beanFactory.getType(name); - } - - /** - * 如果给定的bean名字在bean定义中有别名,则返回这些别名 - * - * @param name - * @return - * @throws 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; - } - - /** - * 获取配置文件中的值 - * - * @param key 配置文件的key - * @return 当前的配置文件的值 - * - */ - public static String getRequiredProperty(String key) - { - return applicationContext.getEnvironment().getRequiredProperty(key); - } -} +//package com.qihang.tao.common; +// +//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; +// +///** +// * spring工具类 方便在非spring管理环境中获取bean +// * +// * @author qihang +// */ +//@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 BeansException +// * +// */ +// @SuppressWarnings("unchecked") +// public static T getBean(String name) throws BeansException +// { +// return (T) beanFactory.getBean(name); +// } +// +// /** +// * 获取类型为requiredType的对象 +// * +// * @param clz +// * @return +// * @throws 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 NoSuchBeanDefinitionException +// * +// */ +// public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException +// { +// return beanFactory.isSingleton(name); +// } +// +// /** +// * @param name +// * @return Class 注册对象的类型 +// * @throws NoSuchBeanDefinitionException +// * +// */ +// public static Class getType(String name) throws NoSuchBeanDefinitionException +// { +// return beanFactory.getType(name); +// } +// +// /** +// * 如果给定的bean名字在bean定义中有别名,则返回这些别名 +// * +// * @param name +// * @return +// * @throws 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; +// } +// +// /** +// * 获取配置文件中的值 +// * +// * @param key 配置文件的key +// * @return 当前的配置文件的值 +// * +// */ +// public static String getRequiredProperty(String key) +// { +// return applicationContext.getEnvironment().getRequiredProperty(key); +// } +//} diff --git a/tao-api/src/main/java/com/qihang/tao/common/StrFormatter.java b/tao-api/src/main/java/com/qihang/tao/common/StrFormatter.java index 4876840f..dc45ecc0 100644 --- a/tao-api/src/main/java/com/qihang/tao/common/StrFormatter.java +++ b/tao-api/src/main/java/com/qihang/tao/common/StrFormatter.java @@ -1,91 +1,91 @@ -package com.qihang.tao.common; - - -/** - * 字符串格式化 - * - * @author qihang - */ -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(); - } -} +//package com.qihang.tao.common; +// +// +///** +// * 字符串格式化 +// * +// * @author qihang +// */ +//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/tao-api/src/main/java/com/qihang/tao/common/StringUtils.java b/tao-api/src/main/java/com/qihang/tao/common/StringUtils.java index 8e6008cb..5fc96546 100644 --- a/tao-api/src/main/java/com/qihang/tao/common/StringUtils.java +++ b/tao-api/src/main/java/com/qihang/tao/common/StringUtils.java @@ -1,609 +1,609 @@ -package com.qihang.tao.common; - -import com.qihang.tao.constant.Constants; -import org.springframework.util.AntPathMatcher; - -import java.util.*; - -/** - * 字符串工具类 - * - * @author qihang - */ -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); - } - - /** - * 是否为http(s)://开头 - * - * @param link 链接 - * @return 结果 - */ - public static boolean ishttp(String link) - { - return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); - } - - /** - * 字符串转set - * - * @param str 字符串 - * @param sep 分隔符 - * @return set集合 - */ - public static final Set str2Set(String str, String sep) - { - return new HashSet(str2List(str, sep, true, false)); - } - - /** - * 字符串转list - * - * @param str 字符串 - * @param sep 分隔符 - * @param filterBlank 过滤纯空白 - * @param trim 去掉首尾空白 - * @return list集合 - */ - public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) - { - List list = new ArrayList(); - if (StringUtils.isEmpty(str)) - { - return list; - } - - // 过滤空白字符串 - if (filterBlank && StringUtils.isBlank(str)) - { - return list; - } - String[] split = str.split(sep); - for (String string : split) - { - if (filterBlank && StringUtils.isBlank(string)) - { - continue; - } - if (trim) - { - string = string.trim(); - } - list.add(string); - } - - return list; - } - - /** - * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value - * - * @param collection 给定的集合 - * @param array 给定的数组 - * @return boolean 结果 - */ - public static boolean containsAny(Collection collection, String... array) - { - if (isEmpty(collection) || isEmpty(array)) - { - return false; - } - else - { - for (String str : array) - { - if (collection.contains(str)) - { - return true; - } - } - return false; - } - } - - /** - * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 - * - * @param cs 指定字符串 - * @param searchCharSequences 需要检查的字符串数组 - * @return 是否包含任意一个字符串 - */ - public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) - { - if (isEmpty(cs) || isEmpty(searchCharSequences)) - { - return false; - } - for (CharSequence testStr : searchCharSequences) - { - if (containsIgnoreCase(cs, testStr)) - { - return true; - } - } - return false; - } - - /** - * 驼峰转下划线命名 - */ - public static String toUnderScoreCase(String str) - { - if (str == null) - { - return null; - } - StringBuilder sb = new StringBuilder(); - // 前置字符是否大写 - boolean preCharIsUpperCase = true; - // 当前字符是否大写 - boolean curreCharIsUpperCase = true; - // 下一字符是否大写 - boolean nexteCharIsUpperCase = true; - for (int i = 0; i < str.length(); i++) - { - char c = str.charAt(i); - if (i > 0) - { - preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); - } - else - { - preCharIsUpperCase = false; - } - - curreCharIsUpperCase = Character.isUpperCase(c); - - if (i < (str.length() - 1)) - { - nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); - } - - if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) - { - sb.append(SEPARATOR); - } - else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) - { - sb.append(SEPARATOR); - } - sb.append(Character.toLowerCase(c)); - } - - return sb.toString(); - } - - /** - * 是否包含字符串 - * - * @param str 验证字符串 - * @param strs 字符串组 - * @return 包含返回true - */ - public static boolean inStringIgnoreCase(String str, String... strs) - { - if (str != null && strs != null) - { - for (String s : strs) - { - if (str.equalsIgnoreCase(trim(s))) - { - return true; - } - } - } - return false; - } - - /** - * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld - * - * @param name 转换前的下划线大写方式命名的字符串 - * @return 转换后的驼峰式命名的字符串 - */ - public static String convertToCamelCase(String name) - { - StringBuilder result = new StringBuilder(); - // 快速检查 - if (name == null || name.isEmpty()) - { - // 没必要转换 - return ""; - } - else if (!name.contains("_")) - { - // 不含下划线,仅将首字母大写 - return name.substring(0, 1).toUpperCase() + name.substring(1); - } - // 用下划线将原始字符串分割 - String[] camels = name.split("_"); - for (String camel : camels) - { - // 跳过原始字符串中开头、结尾的下换线或双重下划线 - if (camel.isEmpty()) - { - continue; - } - // 首字母大写 - result.append(camel.substring(0, 1).toUpperCase()); - result.append(camel.substring(1).toLowerCase()); - } - return result.toString(); - } - - /** - * 驼峰式命名法 - * 例如:user_name->userName - */ - public static String toCamelCase(String s) - { - if (s == null) - { - return null; - } - if (s.indexOf(SEPARATOR) == -1) - { - return s; - } - s = s.toLowerCase(); - StringBuilder sb = new StringBuilder(s.length()); - boolean upperCase = false; - for (int i = 0; i < s.length(); i++) - { - char c = s.charAt(i); - - if (c == SEPARATOR) - { - upperCase = true; - } - else if (upperCase) - { - sb.append(Character.toUpperCase(c)); - upperCase = false; - } - else - { - sb.append(c); - } - } - return sb.toString(); - } - - /** - * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 - * - * @param str 指定字符串 - * @param strs 需要检查的字符串数组 - * @return 是否匹配 - */ - public static boolean matches(String str, List strs) - { - if (isEmpty(str) || isEmpty(strs)) - { - return false; - } - for (String pattern : strs) - { - if (isMatch(pattern, str)) - { - return true; - } - } - return false; - } - - /** - * 判断url是否与规则配置: - * ? 表示单个字符; - * * 表示一层路径内的任意字符串,不可跨层级; - * ** 表示任意层路径; - * - * @param pattern 匹配规则 - * @param url 需要匹配的url - * @return - */ - public static boolean isMatch(String pattern, String url) - { - AntPathMatcher matcher = new AntPathMatcher(); - return matcher.match(pattern, url); - } - - @SuppressWarnings("unchecked") - public static T cast(Object obj) - { - return (T) obj; - } - - /** - * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 - * - * @param num 数字对象 - * @param size 字符串指定长度 - * @return 返回数字的字符串格式,该字符串为指定长度。 - */ - public static final String padl(final Number num, final int size) - { - return padl(num.toString(), size, '0'); - } - - /** - * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 - * - * @param s 原始字符串 - * @param size 字符串指定长度 - * @param c 用于补齐的字符 - * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 - */ - public static final String padl(final String s, final int size, final char c) - { - final StringBuilder sb = new StringBuilder(size); - if (s != null) - { - final int len = s.length(); - if (s.length() <= size) - { - for (int i = size - len; i > 0; i--) - { - sb.append(c); - } - sb.append(s); - } - else - { - return s.substring(len - size, len); - } - } - else - { - for (int i = size; i > 0; i--) - { - sb.append(c); - } - } - return sb.toString(); - } -} \ No newline at end of file +//package com.qihang.tao.common; +// +//import com.qihang.tao.constant.Constants; +//import org.springframework.util.AntPathMatcher; +// +//import java.util.*; +// +///** +// * 字符串工具类 +// * +// * @author qihang +// */ +//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); +// } +// +// /** +// * 是否为http(s)://开头 +// * +// * @param link 链接 +// * @return 结果 +// */ +// public static boolean ishttp(String link) +// { +// return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); +// } +// +// /** +// * 字符串转set +// * +// * @param str 字符串 +// * @param sep 分隔符 +// * @return set集合 +// */ +// public static final Set str2Set(String str, String sep) +// { +// return new HashSet(str2List(str, sep, true, false)); +// } +// +// /** +// * 字符串转list +// * +// * @param str 字符串 +// * @param sep 分隔符 +// * @param filterBlank 过滤纯空白 +// * @param trim 去掉首尾空白 +// * @return list集合 +// */ +// public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) +// { +// List list = new ArrayList(); +// if (StringUtils.isEmpty(str)) +// { +// return list; +// } +// +// // 过滤空白字符串 +// if (filterBlank && StringUtils.isBlank(str)) +// { +// return list; +// } +// String[] split = str.split(sep); +// for (String string : split) +// { +// if (filterBlank && StringUtils.isBlank(string)) +// { +// continue; +// } +// if (trim) +// { +// string = string.trim(); +// } +// list.add(string); +// } +// +// return list; +// } +// +// /** +// * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value +// * +// * @param collection 给定的集合 +// * @param array 给定的数组 +// * @return boolean 结果 +// */ +// public static boolean containsAny(Collection collection, String... array) +// { +// if (isEmpty(collection) || isEmpty(array)) +// { +// return false; +// } +// else +// { +// for (String str : array) +// { +// if (collection.contains(str)) +// { +// return true; +// } +// } +// return false; +// } +// } +// +// /** +// * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 +// * +// * @param cs 指定字符串 +// * @param searchCharSequences 需要检查的字符串数组 +// * @return 是否包含任意一个字符串 +// */ +// public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) +// { +// if (isEmpty(cs) || isEmpty(searchCharSequences)) +// { +// return false; +// } +// for (CharSequence testStr : searchCharSequences) +// { +// if (containsIgnoreCase(cs, testStr)) +// { +// return true; +// } +// } +// return false; +// } +// +// /** +// * 驼峰转下划线命名 +// */ +// public static String toUnderScoreCase(String str) +// { +// if (str == null) +// { +// return null; +// } +// StringBuilder sb = new StringBuilder(); +// // 前置字符是否大写 +// boolean preCharIsUpperCase = true; +// // 当前字符是否大写 +// boolean curreCharIsUpperCase = true; +// // 下一字符是否大写 +// boolean nexteCharIsUpperCase = true; +// for (int i = 0; i < str.length(); i++) +// { +// char c = str.charAt(i); +// if (i > 0) +// { +// preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); +// } +// else +// { +// preCharIsUpperCase = false; +// } +// +// curreCharIsUpperCase = Character.isUpperCase(c); +// +// if (i < (str.length() - 1)) +// { +// nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); +// } +// +// if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) +// { +// sb.append(SEPARATOR); +// } +// else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) +// { +// sb.append(SEPARATOR); +// } +// sb.append(Character.toLowerCase(c)); +// } +// +// return sb.toString(); +// } +// +// /** +// * 是否包含字符串 +// * +// * @param str 验证字符串 +// * @param strs 字符串组 +// * @return 包含返回true +// */ +// public static boolean inStringIgnoreCase(String str, String... strs) +// { +// if (str != null && strs != null) +// { +// for (String s : strs) +// { +// if (str.equalsIgnoreCase(trim(s))) +// { +// return true; +// } +// } +// } +// return false; +// } +// +// /** +// * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld +// * +// * @param name 转换前的下划线大写方式命名的字符串 +// * @return 转换后的驼峰式命名的字符串 +// */ +// public static String convertToCamelCase(String name) +// { +// StringBuilder result = new StringBuilder(); +// // 快速检查 +// if (name == null || name.isEmpty()) +// { +// // 没必要转换 +// return ""; +// } +// else if (!name.contains("_")) +// { +// // 不含下划线,仅将首字母大写 +// return name.substring(0, 1).toUpperCase() + name.substring(1); +// } +// // 用下划线将原始字符串分割 +// String[] camels = name.split("_"); +// for (String camel : camels) +// { +// // 跳过原始字符串中开头、结尾的下换线或双重下划线 +// if (camel.isEmpty()) +// { +// continue; +// } +// // 首字母大写 +// result.append(camel.substring(0, 1).toUpperCase()); +// result.append(camel.substring(1).toLowerCase()); +// } +// return result.toString(); +// } +// +// /** +// * 驼峰式命名法 +// * 例如:user_name->userName +// */ +// public static String toCamelCase(String s) +// { +// if (s == null) +// { +// return null; +// } +// if (s.indexOf(SEPARATOR) == -1) +// { +// return s; +// } +// s = s.toLowerCase(); +// StringBuilder sb = new StringBuilder(s.length()); +// boolean upperCase = false; +// for (int i = 0; i < s.length(); i++) +// { +// char c = s.charAt(i); +// +// if (c == SEPARATOR) +// { +// upperCase = true; +// } +// else if (upperCase) +// { +// sb.append(Character.toUpperCase(c)); +// upperCase = false; +// } +// else +// { +// sb.append(c); +// } +// } +// return sb.toString(); +// } +// +// /** +// * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 +// * +// * @param str 指定字符串 +// * @param strs 需要检查的字符串数组 +// * @return 是否匹配 +// */ +// public static boolean matches(String str, List strs) +// { +// if (isEmpty(str) || isEmpty(strs)) +// { +// return false; +// } +// for (String pattern : strs) +// { +// if (isMatch(pattern, str)) +// { +// return true; +// } +// } +// return false; +// } +// +// /** +// * 判断url是否与规则配置: +// * ? 表示单个字符; +// * * 表示一层路径内的任意字符串,不可跨层级; +// * ** 表示任意层路径; +// * +// * @param pattern 匹配规则 +// * @param url 需要匹配的url +// * @return +// */ +// public static boolean isMatch(String pattern, String url) +// { +// AntPathMatcher matcher = new AntPathMatcher(); +// return matcher.match(pattern, url); +// } +// +// @SuppressWarnings("unchecked") +// public static T cast(Object obj) +// { +// return (T) obj; +// } +// +// /** +// * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 +// * +// * @param num 数字对象 +// * @param size 字符串指定长度 +// * @return 返回数字的字符串格式,该字符串为指定长度。 +// */ +// public static final String padl(final Number num, final int size) +// { +// return padl(num.toString(), size, '0'); +// } +// +// /** +// * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 +// * +// * @param s 原始字符串 +// * @param size 字符串指定长度 +// * @param c 用于补齐的字符 +// * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 +// */ +// public static final String padl(final String s, final int size, final char c) +// { +// final StringBuilder sb = new StringBuilder(size); +// if (s != null) +// { +// final int len = s.length(); +// if (s.length() <= size) +// { +// for (int i = size - len; i > 0; i--) +// { +// sb.append(c); +// } +// sb.append(s); +// } +// else +// { +// return s.substring(len - size, len); +// } +// } +// else +// { +// for (int i = size; i > 0; i--) +// { +// sb.append(c); +// } +// } +// return sb.toString(); +// } +//} \ No newline at end of file diff --git a/tao-api/src/main/java/com/qihang/tao/common/UserStatus.java b/tao-api/src/main/java/com/qihang/tao/common/UserStatus.java index f91fd994..ff324500 100644 --- a/tao-api/src/main/java/com/qihang/tao/common/UserStatus.java +++ b/tao-api/src/main/java/com/qihang/tao/common/UserStatus.java @@ -1,30 +1,30 @@ -package com.qihang.tao.common; - -/** - * 用户状态 - * - * @author qihang - */ -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; - } -} +//package com.qihang.tao.common; +// +///** +// * 用户状态 +// * +// * @author qihang +// */ +//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/tao-api/src/main/java/com/qihang/tao/config/FastJson2JsonRedisSerializer.java b/tao-api/src/main/java/com/qihang/tao/config/FastJson2JsonRedisSerializer.java index 657d1368..2fd00022 100644 --- a/tao-api/src/main/java/com/qihang/tao/config/FastJson2JsonRedisSerializer.java +++ b/tao-api/src/main/java/com/qihang/tao/config/FastJson2JsonRedisSerializer.java @@ -1,49 +1,49 @@ -package com.qihang.tao.config; - -import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONReader; -import com.alibaba.fastjson2.JSONWriter; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.SerializationException; - -import java.nio.charset.Charset; - -/** - * Redis使用FastJson序列化 - * - * @author qihang - */ -public class FastJson2JsonRedisSerializer implements RedisSerializer -{ - public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); - - private Class clazz; - - 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, JSONWriter.Feature.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, JSONReader.Feature.SupportAutoType); - } -} +//package com.qihang.tao.config; +// +//import com.alibaba.fastjson2.JSON; +//import com.alibaba.fastjson2.JSONReader; +//import com.alibaba.fastjson2.JSONWriter; +//import org.springframework.data.redis.serializer.RedisSerializer; +//import org.springframework.data.redis.serializer.SerializationException; +// +//import java.nio.charset.Charset; +// +///** +// * Redis使用FastJson序列化 +// * +// * @author qihang +// */ +//public class FastJson2JsonRedisSerializer implements RedisSerializer +//{ +// public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); +// +// private Class clazz; +// +// 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, JSONWriter.Feature.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, JSONReader.Feature.SupportAutoType); +// } +//} diff --git a/tao-api/src/main/java/com/qihang/tao/config/RedisCache.java b/tao-api/src/main/java/com/qihang/tao/config/RedisCache.java index bd482e8a..2c35450c 100644 --- a/tao-api/src/main/java/com/qihang/tao/config/RedisCache.java +++ b/tao-api/src/main/java/com/qihang/tao/config/RedisCache.java @@ -1,265 +1,265 @@ -package com.qihang.tao.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.BoundSetOperations; -import org.springframework.data.redis.core.HashOperations; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.concurrent.TimeUnit; - -/** - * spring redis 工具类 - * - * @author qihang - **/ -@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 Redis键 - * @return 有效时间 - */ - public long getExpire(final String key) - { - return redisTemplate.getExpire(key); - } - - /** - * 判断 key是否存在 - * - * @param key 键 - * @return true 存在 false不存在 - */ - public Boolean hasKey(String key) - { - return redisTemplate.hasKey(key); - } - - /** - * 获得缓存的基本对象。 - * - * @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 boolean deleteObject(final Collection collection) - { - return redisTemplate.delete(collection) > 0; - } - - /** - * 缓存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 BoundSetOperations setCacheSet(final String key, final Set dataSet) - { - BoundSetOperations setOperation = redisTemplate.boundSetOps(key); - Iterator it = dataSet.iterator(); - while (it.hasNext()) - { - setOperation.add(it.next()); - } - return setOperation; - } - - /** - * 获得缓存的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); - } - - /** - * 删除Hash中的某条数据 - * - * @param key Redis键 - * @param hKey Hash键 - * @return 是否成功 - */ - public boolean deleteCacheMapValue(final String key, final String hKey) - { - return redisTemplate.opsForHash().delete(key, hKey) > 0; - } - - /** - * 获得缓存的基本对象列表 - * - * @param pattern 字符串前缀 - * @return 对象列表 - */ - public Collection keys(final String pattern) - { - return redisTemplate.keys(pattern); - } -} +//package com.qihang.tao.config; +// +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.data.redis.core.BoundSetOperations; +//import org.springframework.data.redis.core.HashOperations; +//import org.springframework.data.redis.core.RedisTemplate; +//import org.springframework.data.redis.core.ValueOperations; +//import org.springframework.stereotype.Component; +// +//import java.util.*; +//import java.util.concurrent.TimeUnit; +// +///** +// * spring redis 工具类 +// * +// * @author qihang +// **/ +//@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 Redis键 +// * @return 有效时间 +// */ +// public long getExpire(final String key) +// { +// return redisTemplate.getExpire(key); +// } +// +// /** +// * 判断 key是否存在 +// * +// * @param key 键 +// * @return true 存在 false不存在 +// */ +// public Boolean hasKey(String key) +// { +// return redisTemplate.hasKey(key); +// } +// +// /** +// * 获得缓存的基本对象。 +// * +// * @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 boolean deleteObject(final Collection collection) +// { +// return redisTemplate.delete(collection) > 0; +// } +// +// /** +// * 缓存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 BoundSetOperations setCacheSet(final String key, final Set dataSet) +// { +// BoundSetOperations setOperation = redisTemplate.boundSetOps(key); +// Iterator it = dataSet.iterator(); +// while (it.hasNext()) +// { +// setOperation.add(it.next()); +// } +// return setOperation; +// } +// +// /** +// * 获得缓存的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); +// } +// +// /** +// * 删除Hash中的某条数据 +// * +// * @param key Redis键 +// * @param hKey Hash键 +// * @return 是否成功 +// */ +// public boolean deleteCacheMapValue(final String key, final String hKey) +// { +// return redisTemplate.opsForHash().delete(key, hKey) > 0; +// } +// +// /** +// * 获得缓存的基本对象列表 +// * +// * @param pattern 字符串前缀 +// * @return 对象列表 +// */ +// public Collection keys(final String pattern) +// { +// return redisTemplate.keys(pattern); +// } +//} diff --git a/tao-api/src/main/java/com/qihang/tao/config/RedisConfig.java b/tao-api/src/main/java/com/qihang/tao/config/RedisConfig.java index 2595e7af..aee5b842 100644 --- a/tao-api/src/main/java/com/qihang/tao/config/RedisConfig.java +++ b/tao-api/src/main/java/com/qihang/tao/config/RedisConfig.java @@ -1,69 +1,69 @@ -package com.qihang.tao.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.core.script.DefaultRedisScript; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -/** - * redis配置 - * - * @author qihang - */ -@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); - - // 使用StringRedisSerializer来序列化和反序列化redis的key值 - template.setKeySerializer(new StringRedisSerializer()); - template.setValueSerializer(serializer); - - // Hash的key也采用StringRedisSerializer的序列化方式 - template.setHashKeySerializer(new StringRedisSerializer()); - template.setHashValueSerializer(serializer); - - template.afterPropertiesSet(); - return template; - } - - @Bean - public DefaultRedisScript limitScript() - { - DefaultRedisScript redisScript = new DefaultRedisScript<>(); - redisScript.setScriptText(limitScriptText()); - redisScript.setResultType(Long.class); - return redisScript; - } - - /** - * 限流脚本 - */ - private String limitScriptText() - { - return "local key = KEYS[1]\n" + - "local count = tonumber(ARGV[1])\n" + - "local time = tonumber(ARGV[2])\n" + - "local current = redis.call('get', key);\n" + - "if current and tonumber(current) > count then\n" + - " return tonumber(current);\n" + - "end\n" + - "current = redis.call('incr', key)\n" + - "if tonumber(current) == 1 then\n" + - " redis.call('expire', key, time)\n" + - "end\n" + - "return tonumber(current);"; - } -} +//package com.qihang.tao.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.core.script.DefaultRedisScript; +//import org.springframework.data.redis.serializer.StringRedisSerializer; +// +///** +// * redis配置 +// * +// * @author qihang +// */ +//@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); +// +// // 使用StringRedisSerializer来序列化和反序列化redis的key值 +// template.setKeySerializer(new StringRedisSerializer()); +// template.setValueSerializer(serializer); +// +// // Hash的key也采用StringRedisSerializer的序列化方式 +// template.setHashKeySerializer(new StringRedisSerializer()); +// template.setHashValueSerializer(serializer); +// +// template.afterPropertiesSet(); +// return template; +// } +// +// @Bean +// public DefaultRedisScript limitScript() +// { +// DefaultRedisScript redisScript = new DefaultRedisScript<>(); +// redisScript.setScriptText(limitScriptText()); +// redisScript.setResultType(Long.class); +// return redisScript; +// } +// +// /** +// * 限流脚本 +// */ +// private String limitScriptText() +// { +// return "local key = KEYS[1]\n" + +// "local count = tonumber(ARGV[1])\n" + +// "local time = tonumber(ARGV[2])\n" + +// "local current = redis.call('get', key);\n" + +// "if current and tonumber(current) > count then\n" + +// " return tonumber(current);\n" + +// "end\n" + +// "current = redis.call('incr', key)\n" + +// "if tonumber(current) == 1 then\n" + +// " redis.call('expire', key, time)\n" + +// "end\n" + +// "return tonumber(current);"; +// } +//} diff --git a/tao-api/src/main/java/com/qihang/tao/constant/CacheConstants.java b/tao-api/src/main/java/com/qihang/tao/constant/CacheConstants.java index 9fb7f0e6..139296a1 100644 --- a/tao-api/src/main/java/com/qihang/tao/constant/CacheConstants.java +++ b/tao-api/src/main/java/com/qihang/tao/constant/CacheConstants.java @@ -1,44 +1,44 @@ -package com.qihang.tao.constant; - -/** - * 缓存的key 常量 - * - * @author qihang - */ -public class CacheConstants -{ - /** - * 登录用户 redis key - */ - public static final String LOGIN_TOKEN_KEY = "login_tokens:"; - - /** - * 验证码 redis key - */ - public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; - - /** - * 参数管理 cache key - */ - public static final String SYS_CONFIG_KEY = "sys_config:"; - - /** - * 字典管理 cache key - */ - public static final String SYS_DICT_KEY = "sys_dict:"; - - /** - * 防重提交 redis key - */ - public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; - - /** - * 限流 redis key - */ - public static final String RATE_LIMIT_KEY = "rate_limit:"; - - /** - * 登录账户密码错误次数 redis key - */ - public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; -} +//package com.qihang.tao.constant; +// +///** +// * 缓存的key 常量 +// * +// * @author qihang +// */ +//public class CacheConstants +//{ +// /** +// * 登录用户 redis key +// */ +// public static final String LOGIN_TOKEN_KEY = "login_tokens:"; +// +// /** +// * 验证码 redis key +// */ +// public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; +// +// /** +// * 参数管理 cache key +// */ +// public static final String SYS_CONFIG_KEY = "sys_config:"; +// +// /** +// * 字典管理 cache key +// */ +// public static final String SYS_DICT_KEY = "sys_dict:"; +// +// /** +// * 防重提交 redis key +// */ +// public static final String REPEAT_SUBMIT_KEY = "repeat_submit:"; +// +// /** +// * 限流 redis key +// */ +// public static final String RATE_LIMIT_KEY = "rate_limit:"; +// +// /** +// * 登录账户密码错误次数 redis key +// */ +// public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; +//} diff --git a/tao-api/src/main/java/com/qihang/tao/constant/Constants.java b/tao-api/src/main/java/com/qihang/tao/constant/Constants.java index e64e1f29..d2c20a12 100644 --- a/tao-api/src/main/java/com/qihang/tao/constant/Constants.java +++ b/tao-api/src/main/java/com/qihang/tao/constant/Constants.java @@ -1,142 +1,142 @@ -package com.qihang.tao.constant; - -import io.jsonwebtoken.Claims; - -/** - * 通用常量信息 - * - * @author qihang - */ -public class Constants -{ - /** - * UTF-8 字符集 - */ - public static final String UTF8 = "UTF-8"; - - /** - * GBK 字符集 - */ - public static final String GBK = "GBK"; - - /** - * www主域 - */ - public static final String WWW = "www."; - - /** - * 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 REGISTER = "Register"; - - /** - * 登录失败 - */ - public static final String LOGIN_FAIL = "Error"; - - /** - * 验证码有效期(分钟) - */ - 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 = Claims.SUBJECT; - - /** - * 用户头像 - */ - public static final String JWT_AVATAR = "avatar"; - - /** - * 创建时间 - */ - public static final String JWT_CREATED = "created"; - - /** - * 用户权限 - */ - public static final String JWT_AUTHORITIES = "authorities"; - - /** - * 资源映射路径 前缀 - */ - public static final String RESOURCE_PREFIX = "/profile"; - - /** - * RMI 远程方法调用 - */ - public static final String LOOKUP_RMI = "rmi:"; - - /** - * LDAP 远程方法调用 - */ - public static final String LOOKUP_LDAP = "ldap:"; - - /** - * LDAPS 远程方法调用 - */ - public static final String LOOKUP_LDAPS = "ldaps:"; - - /** - * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) - */ - public static final String[] JOB_WHITELIST_STR = { "com.zhijian" }; - - /** - * 定时任务违规的字符 - */ - public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", - "org.springframework", "org.apache", "com.zhijian.common.utils.file", "com.zhijian.common.config" }; -} +//package com.qihang.tao.constant; +// +//import io.jsonwebtoken.Claims; +// +///** +// * 通用常量信息 +// * +// * @author qihang +// */ +//public class Constants +//{ +// /** +// * UTF-8 字符集 +// */ +// public static final String UTF8 = "UTF-8"; +// +// /** +// * GBK 字符集 +// */ +// public static final String GBK = "GBK"; +// +// /** +// * www主域 +// */ +// public static final String WWW = "www."; +// +// /** +// * 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 REGISTER = "Register"; +// +// /** +// * 登录失败 +// */ +// public static final String LOGIN_FAIL = "Error"; +// +// /** +// * 验证码有效期(分钟) +// */ +// 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 = Claims.SUBJECT; +// +// /** +// * 用户头像 +// */ +// public static final String JWT_AVATAR = "avatar"; +// +// /** +// * 创建时间 +// */ +// public static final String JWT_CREATED = "created"; +// +// /** +// * 用户权限 +// */ +// public static final String JWT_AUTHORITIES = "authorities"; +// +// /** +// * 资源映射路径 前缀 +// */ +// public static final String RESOURCE_PREFIX = "/profile"; +// +// /** +// * RMI 远程方法调用 +// */ +// public static final String LOOKUP_RMI = "rmi:"; +// +// /** +// * LDAP 远程方法调用 +// */ +// public static final String LOOKUP_LDAP = "ldap:"; +// +// /** +// * LDAPS 远程方法调用 +// */ +// public static final String LOOKUP_LDAPS = "ldaps:"; +// +// /** +// * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) +// */ +// public static final String[] JOB_WHITELIST_STR = { "com.zhijian" }; +// +// /** +// * 定时任务违规的字符 +// */ +// public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", +// "org.springframework", "org.apache", "com.zhijian.common.utils.file", "com.zhijian.common.config" }; +//} diff --git a/tao-api/src/main/java/com/qihang/tao/domain/SysUser.java b/tao-api/src/main/java/com/qihang/tao/domain/SysUser.java index 08ad72cf..27dd87ad 100644 --- a/tao-api/src/main/java/com/qihang/tao/domain/SysUser.java +++ b/tao-api/src/main/java/com/qihang/tao/domain/SysUser.java @@ -1,249 +1,249 @@ -package com.qihang.tao.domain; - - -import java.util.Date; - -/** - * 用户对象 sys_user - * - * @author qihang - */ -public class SysUser extends BaseEntity -{ - private static final long serialVersionUID = 1L; - - /** 用户ID */ - private Long userId; - - /** 部门ID */ - private Long deptId; - - /** 用户账号 */ - - private String userName; - - /** 用户昵称 */ - private String nickName; - - /** 用户邮箱 */ - private String email; - - /** 手机号码 */ - private String phonenumber; - - /** 用户性别 */ - private String sex; - - /** 用户头像 */ - private String avatar; - - /** 密码 */ - private String password; - - /** 帐号状态(0正常 1停用) */ - private String status; - - /** 删除标志(0代表存在 2代表删除) */ - private String delFlag; - - /** 最后登录IP */ - private String loginIp; - - /** 最后登录时间 */ - private Date loginDate; - - /** 角色组 */ - private Long[] roleIds; - - /** 岗位组 */ - private Long[] postIds; - - /** 角色ID */ - private Long roleId; - - public SysUser() - { - - } - - public SysUser(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; - } - - - public String getNickName() - { - return nickName; - } - - public void setNickName(String nickName) - { - this.nickName = nickName; - } - - - public String getUserName() - { - return userName; - } - - public void setUserName(String userName) - { - this.userName = userName; - } - - - public String getEmail() - { - return email; - } - - public void setEmail(String email) - { - this.email = email; - } - - - 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; - } - - public String getPassword() - { - return password; - } - - public void setPassword(String password) - { - this.password = password; - } - - 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 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; - } - - public Long getRoleId() - { - return roleId; - } - - public void setRoleId(Long roleId) - { - this.roleId = roleId; - } - -} +//package com.qihang.tao.domain; +// +// +//import java.util.Date; +// +///** +// * 用户对象 sys_user +// * +// * @author qihang +// */ +//public class SysUser +//{ +// private static final long serialVersionUID = 1L; +// +// /** 用户ID */ +// private Long userId; +// +// /** 部门ID */ +// private Long deptId; +// +// /** 用户账号 */ +// +// private String userName; +// +// /** 用户昵称 */ +// private String nickName; +// +// /** 用户邮箱 */ +// private String email; +// +// /** 手机号码 */ +// private String phonenumber; +// +// /** 用户性别 */ +// private String sex; +// +// /** 用户头像 */ +// private String avatar; +// +// /** 密码 */ +// private String password; +// +// /** 帐号状态(0正常 1停用) */ +// private String status; +// +// /** 删除标志(0代表存在 2代表删除) */ +// private String delFlag; +// +// /** 最后登录IP */ +// private String loginIp; +// +// /** 最后登录时间 */ +// private Date loginDate; +// +// /** 角色组 */ +// private Long[] roleIds; +// +// /** 岗位组 */ +// private Long[] postIds; +// +// /** 角色ID */ +// private Long roleId; +// +// public SysUser() +// { +// +// } +// +// public SysUser(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; +// } +// +// +// public String getNickName() +// { +// return nickName; +// } +// +// public void setNickName(String nickName) +// { +// this.nickName = nickName; +// } +// +// +// public String getUserName() +// { +// return userName; +// } +// +// public void setUserName(String userName) +// { +// this.userName = userName; +// } +// +// +// public String getEmail() +// { +// return email; +// } +// +// public void setEmail(String email) +// { +// this.email = email; +// } +// +// +// 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; +// } +// +// public String getPassword() +// { +// return password; +// } +// +// public void setPassword(String password) +// { +// this.password = password; +// } +// +// 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 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; +// } +// +// public Long getRoleId() +// { +// return roleId; +// } +// +// public void setRoleId(Long roleId) +// { +// this.roleId = roleId; +// } +// +//} diff --git a/tao-api/src/main/java/com/qihang/tao/domain/TaoGoods.java b/tao-api/src/main/java/com/qihang/tao/domain/TaoGoods.java new file mode 100644 index 00000000..e404e574 --- /dev/null +++ b/tao-api/src/main/java/com/qihang/tao/domain/TaoGoods.java @@ -0,0 +1,11 @@ +package com.qihang.tao.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("tao_goods") +public class TaoGoods { + private Long id; + private Long goodsId; +} diff --git a/tao-api/src/main/java/com/qihang/tao/mapper/SysUserMapper.java b/tao-api/src/main/java/com/qihang/tao/mapper/SysUserMapper.java index 823bcae5..3c283a3a 100644 --- a/tao-api/src/main/java/com/qihang/tao/mapper/SysUserMapper.java +++ b/tao-api/src/main/java/com/qihang/tao/mapper/SysUserMapper.java @@ -1,16 +1,14 @@ package com.qihang.tao.mapper; - - - -import com.qihang.tao.domain.SysUser; +import com.qihang.security.entity.SysUser; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; /** * 用户表 数据层 - * + * * @author qihang */ @Mapper @@ -18,7 +16,7 @@ public interface SysUserMapper { /** * 根据条件分页查询用户列表 - * + * * @param sysUser 用户信息 * @return 用户信息集合信息 */ @@ -26,7 +24,7 @@ public interface SysUserMapper /** * 根据条件分页查询已配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -34,7 +32,7 @@ public interface SysUserMapper /** * 根据条件分页查询未分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -42,7 +40,7 @@ public interface SysUserMapper /** * 通过用户名查询用户 - * + * * @param userName 用户名 * @return 用户对象信息 */ @@ -50,7 +48,7 @@ public interface SysUserMapper /** * 通过用户ID查询用户 - * + * * @param userId 用户ID * @return 用户对象信息 */ @@ -58,11 +56,75 @@ public interface SysUserMapper /** * 新增用户信息 - * + * * @param user 用户信息 * @return 结果 */ public int insertUser(SysUser user); + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + public int updateUser(SysUser 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 SysUser checkUserNameUnique(String userName); + + /** + * 校验手机号码是否唯一 + * + * @param phonenumber 手机号码 + * @return 结果 + */ + public SysUser checkPhoneUnique(String phonenumber); + + /** + * 校验email是否唯一 + * + * @param email 用户邮箱 + * @return 结果 + */ + public SysUser checkEmailUnique(String email); } diff --git a/tao-api/src/main/java/com/qihang/tao/mapper/TaoGoodsMapper.java b/tao-api/src/main/java/com/qihang/tao/mapper/TaoGoodsMapper.java new file mode 100644 index 00000000..3a70e437 --- /dev/null +++ b/tao-api/src/main/java/com/qihang/tao/mapper/TaoGoodsMapper.java @@ -0,0 +1,7 @@ +package com.qihang.tao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qihang.tao.domain.TaoGoods; + +public interface TaoGoodsMapper extends BaseMapper { +} diff --git a/tao-api/src/main/java/com/qihang/tao/security/AuthenticationExceptionHandler.java b/tao-api/src/main/java/com/qihang/tao/security/AuthenticationExceptionHandler.java index dd491410..777b4399 100644 --- a/tao-api/src/main/java/com/qihang/tao/security/AuthenticationExceptionHandler.java +++ b/tao-api/src/main/java/com/qihang/tao/security/AuthenticationExceptionHandler.java @@ -1,45 +1,45 @@ -package com.qihang.tao.security; - -import com.alibaba.fastjson2.JSON; -import com.qihang.tao.common.R; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.http.MediaType; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.io.PrintWriter; - -@Component -public class AuthenticationExceptionHandler implements AuthenticationEntryPoint { - Logger log = LoggerFactory.getLogger(getClass()); - @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { - fallback(authException.getMessage(), response); - } - - private void fallback(String message, HttpServletResponse response) { - response.setCharacterEncoding("UTF-8"); - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - PrintWriter writer = null; - try { - if (message == null) { - message = "认证失败!"; - } - R res = R.error(500, message); - writer = response.getWriter(); - writer.append(JSON.toJSONString(res)); - } catch (IOException e) { - log.error(e.getMessage()); - } finally { - if (writer != null) { - writer.close(); - } - } - } -} +//package com.qihang.tao.security; +// +//import com.alibaba.fastjson2.JSON; +//import com.qihang.tao.common.R; +//import jakarta.servlet.ServletException; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.http.MediaType; +//import org.springframework.security.core.AuthenticationException; +//import org.springframework.security.web.AuthenticationEntryPoint; +//import org.springframework.stereotype.Component; +// +//import java.io.IOException; +//import java.io.PrintWriter; +// +//@Component +//public class AuthenticationExceptionHandler implements AuthenticationEntryPoint { +// Logger log = LoggerFactory.getLogger(getClass()); +// @Override +// public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { +// fallback(authException.getMessage(), response); +// } +// +// private void fallback(String message, HttpServletResponse response) { +// response.setCharacterEncoding("UTF-8"); +// response.setContentType(MediaType.APPLICATION_JSON_VALUE); +// PrintWriter writer = null; +// try { +// if (message == null) { +// message = "认证失败!"; +// } +// R res = R.error(500, message); +// writer = response.getWriter(); +// writer.append(JSON.toJSONString(res)); +// } catch (IOException e) { +// log.error(e.getMessage()); +// } finally { +// if (writer != null) { +// writer.close(); +// } +// } +// } +//} diff --git a/tao-api/src/main/java/com/qihang/tao/security/JwtAuthenticationTokenFilter.java b/tao-api/src/main/java/com/qihang/tao/security/JwtAuthenticationTokenFilter.java index 6fef8b97..365483f4 100644 --- a/tao-api/src/main/java/com/qihang/tao/security/JwtAuthenticationTokenFilter.java +++ b/tao-api/src/main/java/com/qihang/tao/security/JwtAuthenticationTokenFilter.java @@ -1,86 +1,86 @@ -package com.qihang.tao.security; - -import com.alibaba.fastjson2.JSON; -import com.qihang.tao.common.R; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -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.http.MediaType; -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 java.io.IOException; -import java.io.PrintWriter; - -/** - * token过滤器 验证token有效性 - * - * @author qihang - */ -@Component -public class JwtAuthenticationTokenFilter extends OncePerRequestFilter -{ - @Autowired - private TokenService tokenService; - /** - * 需要拦截的请求头信息 - */ - @Value("${token.header:'Authorization'}") - public String TOKEN_HEADER = "Authorization"; - private Logger log = LoggerFactory.getLogger(getClass()); - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) - throws ServletException, IOException - { -// String token = exchange.getRequest().getHeaders().getFirst(TOKEN_HEADER); - String token = request.getHeader("Authorization"); - String url =request.getRequestURI(); - log.info("intercept " + url); - log.info("token: " + token); - if(request.getRequestURI().equals("/login")){ - // 登录页面,放行 - chain.doFilter(request, response); - return; - } - LoginUser loginUser = tokenService.getLoginUser(request); - if (loginUser !=null ) - { - tokenService.verifyToken(loginUser); - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); - authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); - SecurityContextHolder.getContext().setAuthentication(authenticationToken); - }else { - fallback(" 授权过期!",response); - return; - } - chain.doFilter(request, response); - } - - private void fallback(String message, HttpServletResponse response) { - response.setCharacterEncoding("UTF-8"); - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - PrintWriter writer = null; - try { - if (message == null) { - message = "403 Forbidden"; - } - R res = R.error(403, message); - writer = response.getWriter(); - writer.append(JSON.toJSONString(res)); - } catch (IOException e) { - log.error(e.getMessage()); - } finally { - if (writer != null) { - writer.close(); - } - } - } -} +//package com.qihang.tao.security; +// +//import com.alibaba.fastjson2.JSON; +//import com.qihang.tao.common.R; +//import jakarta.servlet.FilterChain; +//import jakarta.servlet.ServletException; +//import jakarta.servlet.http.HttpServletRequest; +//import jakarta.servlet.http.HttpServletResponse; +//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.http.MediaType; +//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 java.io.IOException; +//import java.io.PrintWriter; +// +///** +// * token过滤器 验证token有效性 +// * +// * @author qihang +// */ +//@Component +//public class JwtAuthenticationTokenFilter extends OncePerRequestFilter +//{ +// @Autowired +// private TokenService tokenService; +// /** +// * 需要拦截的请求头信息 +// */ +// @Value("${token.header:'Authorization'}") +// public String TOKEN_HEADER = "Authorization"; +// private Logger log = LoggerFactory.getLogger(getClass()); +// @Override +// protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) +// throws ServletException, IOException +// { +//// String token = exchange.getRequest().getHeaders().getFirst(TOKEN_HEADER); +// String token = request.getHeader("Authorization"); +// String url =request.getRequestURI(); +// log.info("intercept " + url); +// log.info("token: " + token); +// if(request.getRequestURI().equals("/login")){ +// // 登录页面,放行 +// chain.doFilter(request, response); +// return; +// } +// LoginUser loginUser = tokenService.getLoginUser(request); +// if (loginUser !=null ) +// { +// tokenService.verifyToken(loginUser); +// UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities()); +// authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); +// SecurityContextHolder.getContext().setAuthentication(authenticationToken); +// }else { +// fallback(" 授权过期!",response); +// return; +// } +// chain.doFilter(request, response); +// } +// +// private void fallback(String message, HttpServletResponse response) { +// response.setCharacterEncoding("UTF-8"); +// response.setContentType(MediaType.APPLICATION_JSON_VALUE); +// PrintWriter writer = null; +// try { +// if (message == null) { +// message = "403 Forbidden"; +// } +// R res = R.error(403, message); +// writer = response.getWriter(); +// writer.append(JSON.toJSONString(res)); +// } catch (IOException e) { +// log.error(e.getMessage()); +// } finally { +// if (writer != null) { +// writer.close(); +// } +// } +// } +//} diff --git a/tao-api/src/main/java/com/qihang/tao/security/LoginUser.java b/tao-api/src/main/java/com/qihang/tao/security/LoginUser.java index a47f7f02..35f0ab61 100644 --- a/tao-api/src/main/java/com/qihang/tao/security/LoginUser.java +++ b/tao-api/src/main/java/com/qihang/tao/security/LoginUser.java @@ -1,267 +1,267 @@ -package com.qihang.tao.security; - -import com.alibaba.fastjson2.annotation.JSONField; -import com.qihang.tao.domain.SysUser; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; - -import java.util.Collection; -import java.util.Set; - -/** - * 登录用户身份权限 - * - * @author qihang - */ -public class LoginUser implements UserDetails -{ - private static final long serialVersionUID = 1L; - - /** - * 用户ID - */ - private Long userId; - - /** - * 部门ID - */ - private Long deptId; - - /** - * 用户唯一标识 - */ - 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 SysUser user; - - public LoginUser() - { - } - - public LoginUser(SysUser user, Set permissions) - { - this.user = user; - this.permissions = permissions; - } - - public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) - { - this.userId = userId; - this.deptId = deptId; - this.user = user; - this.permissions = permissions; - } - - public Long getUserId() - { - return userId; - } - - public void setUserId(Long userId) - { - this.userId = userId; - } - - public Long getDeptId() - { - return deptId; - } - - public void setDeptId(Long deptId) - { - this.deptId = deptId; - } - - public String getToken() - { - return token; - } - - public void setToken(String token) - { - this.token = token; - } - - @JSONField(serialize = false) - @Override - public String getPassword() - { - return user.getPassword(); - } - - @Override - public String getUsername() - { - return user.getUserName(); - } - - /** - * 账户是否未过期,过期无法验证 - */ - @JSONField(serialize = false) - @Override - public boolean isAccountNonExpired() - { - return true; - } - - /** - * 指定用户是否解锁,锁定的用户无法进行身份验证 - * - * @return - */ - @JSONField(serialize = false) - @Override - public boolean isAccountNonLocked() - { - return true; - } - - /** - * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 - * - * @return - */ - @JSONField(serialize = false) - @Override - public boolean isCredentialsNonExpired() - { - return true; - } - - /** - * 是否可用 ,禁用的用户不能身份验证 - * - * @return - */ - @JSONField(serialize = false) - @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 SysUser getUser() - { - return user; - } - - public void setUser(SysUser user) - { - this.user = user; - } - - @Override - public Collection getAuthorities() - { - return null; - } -} +//package com.qihang.tao.security; +// +//import com.alibaba.fastjson2.annotation.JSONField; +//import com.qihang.tao.domain.SysUser; +//import org.springframework.security.core.GrantedAuthority; +//import org.springframework.security.core.userdetails.UserDetails; +// +//import java.util.Collection; +//import java.util.Set; +// +///** +// * 登录用户身份权限 +// * +// * @author qihang +// */ +//public class LoginUser implements UserDetails +//{ +// private static final long serialVersionUID = 1L; +// +// /** +// * 用户ID +// */ +// private Long userId; +// +// /** +// * 部门ID +// */ +// private Long deptId; +// +// /** +// * 用户唯一标识 +// */ +// 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 SysUser user; +// +// public LoginUser() +// { +// } +// +// public LoginUser(SysUser user, Set permissions) +// { +// this.user = user; +// this.permissions = permissions; +// } +// +// public LoginUser(Long userId, Long deptId, SysUser user, Set permissions) +// { +// this.userId = userId; +// this.deptId = deptId; +// this.user = user; +// this.permissions = permissions; +// } +// +// public Long getUserId() +// { +// return userId; +// } +// +// public void setUserId(Long userId) +// { +// this.userId = userId; +// } +// +// public Long getDeptId() +// { +// return deptId; +// } +// +// public void setDeptId(Long deptId) +// { +// this.deptId = deptId; +// } +// +// public String getToken() +// { +// return token; +// } +// +// public void setToken(String token) +// { +// this.token = token; +// } +// +// @JSONField(serialize = false) +// @Override +// public String getPassword() +// { +// return user.getPassword(); +// } +// +// @Override +// public String getUsername() +// { +// return user.getUserName(); +// } +// +// /** +// * 账户是否未过期,过期无法验证 +// */ +// @JSONField(serialize = false) +// @Override +// public boolean isAccountNonExpired() +// { +// return true; +// } +// +// /** +// * 指定用户是否解锁,锁定的用户无法进行身份验证 +// * +// * @return +// */ +// @JSONField(serialize = false) +// @Override +// public boolean isAccountNonLocked() +// { +// return true; +// } +// +// /** +// * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证 +// * +// * @return +// */ +// @JSONField(serialize = false) +// @Override +// public boolean isCredentialsNonExpired() +// { +// return true; +// } +// +// /** +// * 是否可用 ,禁用的用户不能身份验证 +// * +// * @return +// */ +// @JSONField(serialize = false) +// @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 SysUser getUser() +// { +// return user; +// } +// +// public void setUser(SysUser user) +// { +// this.user = user; +// } +// +// @Override +// public Collection getAuthorities() +// { +// return null; +// } +//} diff --git a/tao-api/src/main/java/com/qihang/tao/security/SecurityConfig.java b/tao-api/src/main/java/com/qihang/tao/security/SecurityConfig.java index aab4be94..93f000f6 100644 --- a/tao-api/src/main/java/com/qihang/tao/security/SecurityConfig.java +++ b/tao-api/src/main/java/com/qihang/tao/security/SecurityConfig.java @@ -1,109 +1,109 @@ -package com.qihang.tao.security; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.HttpMethod; -import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.authentication.AuthenticationProvider; -import org.springframework.security.authentication.dao.DaoAuthenticationProvider; -import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -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.crypto.password.PasswordEncoder; -import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -@Configuration -@EnableWebSecurity -public class SecurityConfig { - - @Autowired - private UserDetailsServiceImpl userDetailsService; - - @Autowired - private AuthenticationExceptionHandler invalidAuthenticationEntryPoint; - - @Bean - public PasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } - - @Bean - public JwtAuthenticationTokenFilter authenticationJwtTokenFilter() { - return new JwtAuthenticationTokenFilter(); - } - - @Bean - public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { - - http - // 禁用basic明文验证 - .httpBasic().disable() - // 前后端分离架构不需要csrf保护 - .csrf().disable() - // 禁用默认登录页 - .formLogin().disable() - // 禁用默认登出页 - .logout().disable() - // 设置异常的EntryPoint,如果不设置,默认使用Http403ForbiddenEntryPoint - .exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(invalidAuthenticationEntryPoint)) - // 前后端分离是无状态的,不需要session了,直接禁用。 - .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) - .authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests - // 允许所有OPTIONS请求 - .requestMatchers("/home").permitAll() - .requestMatchers(HttpMethod.GET, "/favicon.ico").permitAll() - // 允许直接访问授权登录接口 - .requestMatchers(HttpMethod.POST, "/login").permitAll() - // 允许 SpringMVC 的默认错误地址匿名访问 - .requestMatchers("/error").permitAll() - // 其他所有接口必须有Authority信息,Authority在登录成功后的UserDetailsImpl对象中默认设置“ROLE_USER” - //.requestMatchers("/**").hasAnyAuthority("ROLE_USER") - // 允许任意请求被已登录用户访问,不检查Authority - .anyRequest().authenticated()) - .authenticationProvider(authenticationProvider()) - // 加我们自定义的过滤器,替代UsernamePasswordAuthenticationFilter - .addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class); - - return http.build(); - } - - @Bean - public UserDetailsService userDetailsService() { - // 调用 JwtUserDetailService实例执行实际校验 - return username -> userDetailsService.loadUserByUsername(username); - } - - /** - * 调用loadUserByUsername获得UserDetail信息,在AbstractUserDetailsAuthenticationProvider里执行用户状态检查 - * - * @return - */ - @Bean - public AuthenticationProvider authenticationProvider() { - DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); - // DaoAuthenticationProvider 从自定义的 userDetailsService.loadUserByUsername 方法获取UserDetails - authProvider.setUserDetailsService(userDetailsService()); - // 设置密码编辑器 - authProvider.setPasswordEncoder(passwordEncoder()); - return authProvider; - } - - /** - * 登录时需要调用AuthenticationManager.authenticate执行一次校验 - * - * @param config - * @return - * @throws Exception - */ - @Bean - public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { - return config.getAuthenticationManager(); - } - - -} +//package com.qihang.tao.security; +// +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.http.HttpMethod; +//import org.springframework.security.authentication.AuthenticationManager; +//import org.springframework.security.authentication.AuthenticationProvider; +//import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +//import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +//import org.springframework.security.config.annotation.web.builders.HttpSecurity; +//import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +//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.crypto.password.PasswordEncoder; +//import org.springframework.security.web.SecurityFilterChain; +//import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +// +//@Configuration +//@EnableWebSecurity +//public class SecurityConfig { +// +// @Autowired +// private UserDetailsServiceImpl userDetailsService; +// +// @Autowired +// private AuthenticationExceptionHandler invalidAuthenticationEntryPoint; +// +// @Bean +// public PasswordEncoder passwordEncoder() { +// return new BCryptPasswordEncoder(); +// } +// +// @Bean +// public JwtAuthenticationTokenFilter authenticationJwtTokenFilter() { +// return new JwtAuthenticationTokenFilter(); +// } +// +// @Bean +// public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { +// +// http +// // 禁用basic明文验证 +// .httpBasic().disable() +// // 前后端分离架构不需要csrf保护 +// .csrf().disable() +// // 禁用默认登录页 +// .formLogin().disable() +// // 禁用默认登出页 +// .logout().disable() +// // 设置异常的EntryPoint,如果不设置,默认使用Http403ForbiddenEntryPoint +// .exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(invalidAuthenticationEntryPoint)) +// // 前后端分离是无状态的,不需要session了,直接禁用。 +// .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) +// .authorizeHttpRequests(authorizeHttpRequests -> authorizeHttpRequests +// // 允许所有OPTIONS请求 +// .requestMatchers("/home").permitAll() +// .requestMatchers(HttpMethod.GET, "/favicon.ico").permitAll() +// // 允许直接访问授权登录接口 +// .requestMatchers(HttpMethod.POST, "/login").permitAll() +// // 允许 SpringMVC 的默认错误地址匿名访问 +// .requestMatchers("/error").permitAll() +// // 其他所有接口必须有Authority信息,Authority在登录成功后的UserDetailsImpl对象中默认设置“ROLE_USER” +// //.requestMatchers("/**").hasAnyAuthority("ROLE_USER") +// // 允许任意请求被已登录用户访问,不检查Authority +// .anyRequest().authenticated()) +// .authenticationProvider(authenticationProvider()) +// // 加我们自定义的过滤器,替代UsernamePasswordAuthenticationFilter +// .addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class); +// +// return http.build(); +// } +// +// @Bean +// public UserDetailsService userDetailsService() { +// // 调用 JwtUserDetailService实例执行实际校验 +// return username -> userDetailsService.loadUserByUsername(username); +// } +// +// /** +// * 调用loadUserByUsername获得UserDetail信息,在AbstractUserDetailsAuthenticationProvider里执行用户状态检查 +// * +// * @return +// */ +// @Bean +// public AuthenticationProvider authenticationProvider() { +// DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); +// // DaoAuthenticationProvider 从自定义的 userDetailsService.loadUserByUsername 方法获取UserDetails +// authProvider.setUserDetailsService(userDetailsService()); +// // 设置密码编辑器 +// authProvider.setPasswordEncoder(passwordEncoder()); +// return authProvider; +// } +// +// /** +// * 登录时需要调用AuthenticationManager.authenticate执行一次校验 +// * +// * @param config +// * @return +// * @throws Exception +// */ +// @Bean +// public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { +// return config.getAuthenticationManager(); +// } +// +// +//} diff --git a/tao-api/src/main/java/com/qihang/tao/security/TokenService.java b/tao-api/src/main/java/com/qihang/tao/security/TokenService.java index 6f8031be..77102dcf 100644 --- a/tao-api/src/main/java/com/qihang/tao/security/TokenService.java +++ b/tao-api/src/main/java/com/qihang/tao/security/TokenService.java @@ -1,221 +1,223 @@ -package com.qihang.tao.security; - -import com.alibaba.cloud.commons.lang.StringUtils; -import com.qihang.tao.config.RedisCache; -import com.qihang.tao.constant.CacheConstants; -import com.qihang.tao.constant.Constants; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import jakarta.servlet.http.HttpServletRequest; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * token验证处理 - * - * @author qihang - */ -@Component -public class TokenService -{ - // 令牌自定义标识 -// @Value("${token.header:'Authorization'}") -// private String header; - - // 令牌秘钥 - @Value("${token.secret:'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkrstuvwxyzabcdefghijklmnopqrstuvwxyz'}") - private String secret; - - // 令牌有效期(默认30分钟) - @Value("${token.expireTime:30}") - 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)) - { - try - { - Claims claims = parseToken(token); - // 解析对应的权限以及用户信息 - String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); - String userKey = getTokenKey(uuid); - LoginUser user = redisCache.getCacheObject(userKey); - return user; - } - catch (Exception e) - { - } - } - return null; - } - - /** - * 设置用户身份信息 - */ - public void setLoginUser(LoginUser loginUser) - { - if (loginUser!= null && StringUtils.isNotEmpty(loginUser.getToken())) - { - refreshToken(loginUser); - } - } - - /** - * 删除用户身份信息 - */ - public void delLoginUser(String token) - { - if (StringUtils.isNotEmpty(token)) - { - String userKey = getTokenKey(token); - redisCache.deleteObject(userKey); - } - } - +//package com.qihang.tao.security; +// +//import com.alibaba.cloud.commons.lang.StringUtils; +//import com.qihang.tao.config.RedisCache; +//import com.qihang.tao.constant.CacheConstants; +//import com.qihang.tao.constant.Constants; +//import io.jsonwebtoken.Claims; +//import io.jsonwebtoken.Jwts; +//import io.jsonwebtoken.SignatureAlgorithm; +//import jakarta.servlet.http.HttpServletRequest; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.stereotype.Component; +// +//import java.util.HashMap; +//import java.util.Map; +//import java.util.concurrent.TimeUnit; +// +///** +// * token验证处理 +// * +// * @author qihang +// */ +//@Component +//public class TokenService +//{ +// // 令牌自定义标识 +//// @Value("${token.header:'Authorization'}") +//// private String header; +// +// // 令牌秘钥 +// @Value("${token.secret:'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijkrstuvwxyzabcdefghijklmnopqrstuvwxyz'}") +// private String secret; +// +// // 令牌有效期(默认30分钟) +// @Value("${token.expireTime:30}") +// 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; +// // /** -// * 创建令牌 +// * 获取用户身份信息 // * -// * @param loginUser 用户信息 +// * @return 用户信息 +// */ +// public LoginUser getLoginUser(HttpServletRequest request) +// { +// // 获取请求携带的令牌 +// String token = getToken(request); +// if (StringUtils.isNotEmpty(token)) +// { +// try +// { +// Claims claims = parseToken(token); +// // 解析对应的权限以及用户信息 +// String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); +// String userKey = getTokenKey(uuid); +// Object cacheObject = redisCache.getCacheObject(userKey); +// LoginUser user = (LoginUser) cacheObject; +// return user; +// } +// catch (Exception e) +// { +// String us = ""; +// } +// } +// return null; +// } +// +// /** +// * 设置用户身份信息 +// */ +// public void setLoginUser(LoginUser loginUser) +// { +// if (loginUser!= null && 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 String createToken(LoginUser loginUser) +// public void verifyToken(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); +// long expireTime = loginUser.getExpireTime(); +// long currentTime = System.currentTimeMillis(); +// if (expireTime - currentTime <= MILLIS_MINUTE_TEN) +// { +// refreshToken(loginUser); +// } // } - - /** - * 验证令牌有效期,相差不足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) +// public void refreshToken(LoginUser loginUser) // { -// UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); -// String ip = IpUtils.getIpAddr(); -// loginUser.setIpaddr(ip); -// loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); -// loginUser.setBrowser(userAgent.getBrowser().getName()); -// loginUser.setOs(userAgent.getOperatingSystem().getName()); +// 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 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("Authorization"); - if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) - { - token = token.replace(Constants.TOKEN_PREFIX, ""); - } - return token; - } - - private String getTokenKey(String uuid) - { - return CacheConstants.LOGIN_TOKEN_KEY + uuid; - } -} +// +//// /** +//// * 设置用户代理信息 +//// * +//// * @param loginUser 登录信息 +//// */ +//// public void setUserAgent(LoginUser loginUser) +//// { +//// UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); +//// String ip = IpUtils.getIpAddr(); +//// 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("Authorization"); +// if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) +// { +// token = token.replace(Constants.TOKEN_PREFIX, ""); +// } +// return token; +// } +// +// private String getTokenKey(String uuid) +// { +// return CacheConstants.LOGIN_TOKEN_KEY + uuid; +// } +//} diff --git a/tao-api/src/main/java/com/qihang/tao/security/UserDetailsServiceImpl.java b/tao-api/src/main/java/com/qihang/tao/security/UserDetailsServiceImpl.java index 4c840f30..b3ba55e8 100644 --- a/tao-api/src/main/java/com/qihang/tao/security/UserDetailsServiceImpl.java +++ b/tao-api/src/main/java/com/qihang/tao/security/UserDetailsServiceImpl.java @@ -1,71 +1,71 @@ -package com.qihang.tao.security; - -import com.qihang.tao.common.MessageUtils; -import com.qihang.tao.common.ServiceException; -import com.qihang.tao.common.StringUtils; -import com.qihang.tao.common.UserStatus; -import com.qihang.tao.domain.SysUser; -import com.qihang.tao.service.ISysUserService; -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 java.util.HashSet; -import java.util.Set; - -/** - * 用户验证处理 - * - * @author qihang - */ -@Service -public class UserDetailsServiceImpl implements UserDetailsService -{ - private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); - - @Autowired - private ISysUserService userService; - +//package com.qihang.tao.security; +// +//import com.qihang.tao.common.MessageUtils; +//import com.qihang.tao.common.ServiceException; +//import com.qihang.tao.common.StringUtils; +//import com.qihang.tao.common.UserStatus; +//import com.qihang.tao.domain.SysUser; +//import com.qihang.tao.service.ISysUserService; +//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 java.util.HashSet; +//import java.util.Set; +// +///** +// * 用户验证处理 +// * +// * @author qihang +// */ +//@Service +//public class UserDetailsServiceImpl implements UserDetailsService +//{ +// private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class); +// // @Autowired -// private SysPasswordService passwordService; - -// @Autowired -// private SysPermissionService permissionService; - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException - { - SysUser user = userService.selectUserByUserName(username); - if (StringUtils.isNull(user)) - { - log.info("登录用户:{} 不存在.", username); - throw new ServiceException(MessageUtils.message("user.not.exists")); - } - else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) - { - log.info("登录用户:{} 已被删除.", username); - throw new ServiceException(MessageUtils.message("user.password.delete")); - } - else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) - { - log.info("登录用户:{} 已被停用.", username); - throw new ServiceException(MessageUtils.message("user.blocked")); - } - -// passwordService.validate(user); - - return createLoginUser(user); - } - - public UserDetails createLoginUser(SysUser user) - { - Set perms = new HashSet(); - perms.add("*:*:*"); -// return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); - return new LoginUser(user.getUserId(), user.getDeptId(), user, perms); - } -} +// private ISysUserService userService; +// +//// @Autowired +//// private SysPasswordService passwordService; +// +//// @Autowired +//// private SysPermissionService permissionService; +// +// @Override +// public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException +// { +// SysUser user = userService.selectUserByUserName(username); +// if (StringUtils.isNull(user)) +// { +// log.info("登录用户:{} 不存在.", username); +// throw new ServiceException(MessageUtils.message("user.not.exists")); +// } +// else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) +// { +// log.info("登录用户:{} 已被删除.", username); +// throw new ServiceException(MessageUtils.message("user.password.delete")); +// } +// else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) +// { +// log.info("登录用户:{} 已被停用.", username); +// throw new ServiceException(MessageUtils.message("user.blocked")); +// } +// +//// passwordService.validate(user); +// +// return createLoginUser(user); +// } +// +// public UserDetails createLoginUser(SysUser user) +// { +// Set perms = new HashSet(); +// perms.add("*:*:*"); +//// return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user)); +// return new LoginUser(user.getUserId(), user.getDeptId(), user, perms); +// } +//} diff --git a/tao-api/src/main/java/com/qihang/tao/service/ISysUserService.java b/tao-api/src/main/java/com/qihang/tao/service/ISysUserService.java index 9ed00880..dad8ac09 100644 --- a/tao-api/src/main/java/com/qihang/tao/service/ISysUserService.java +++ b/tao-api/src/main/java/com/qihang/tao/service/ISysUserService.java @@ -1,59 +1,59 @@ -package com.qihang.tao.service; - - - -import com.qihang.tao.domain.SysUser; - -import java.util.List; - -/** - * 用户 业务层 - * - * @author qihang - */ -public interface ISysUserService -{ - /** - * 根据条件分页查询用户列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - public List selectUserList(SysUser user); - - /** - * 根据条件分页查询已分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - public List selectAllocatedList(SysUser user); - - /** - * 根据条件分页查询未分配用户角色列表 - * - * @param user 用户信息 - * @return 用户信息集合信息 - */ - public List selectUnallocatedList(SysUser user); - - /** - * 通过用户名查询用户 - * - * @param userName 用户名 - * @return 用户对象信息 - */ - public SysUser selectUserByUserName(String userName); - - /** - * 通过用户ID查询用户 - * - * @param userId 用户ID - * @return 用户对象信息 - */ - public SysUser selectUserById(Long userId); - - - - -} +//package com.qihang.tao.service; +// +// +// +//import com.qihang.tao.domain.SysUser; +// +//import java.util.List; +// +///** +// * 用户 业务层 +// * +// * @author qihang +// */ +//public interface ISysUserService +//{ +// /** +// * 根据条件分页查询用户列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// public List selectUserList(SysUser user); +// +// /** +// * 根据条件分页查询已分配用户角色列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// public List selectAllocatedList(SysUser user); +// +// /** +// * 根据条件分页查询未分配用户角色列表 +// * +// * @param user 用户信息 +// * @return 用户信息集合信息 +// */ +// public List selectUnallocatedList(SysUser user); +// +// /** +// * 通过用户名查询用户 +// * +// * @param userName 用户名 +// * @return 用户对象信息 +// */ +// public SysUser selectUserByUserName(String userName); +// +// /** +// * 通过用户ID查询用户 +// * +// * @param userId 用户ID +// * @return 用户对象信息 +// */ +// public SysUser selectUserById(Long userId); +// +// +// +// +//} diff --git a/tao-api/src/main/java/com/qihang/tao/service/impl/SysUserServiceImpl.java b/tao-api/src/main/java/com/qihang/tao/service/impl/SysUserServiceImpl.java index 18fb2a30..c68a32fc 100644 --- a/tao-api/src/main/java/com/qihang/tao/service/impl/SysUserServiceImpl.java +++ b/tao-api/src/main/java/com/qihang/tao/service/impl/SysUserServiceImpl.java @@ -1,8 +1,11 @@ package com.qihang.tao.service.impl; -import com.qihang.tao.domain.SysUser; +import com.qihang.common.common.ServiceException; +import com.qihang.common.constant.UserConstants; +import com.qihang.common.utils.StringUtils; +import com.qihang.security.entity.SysUser; +import com.qihang.security.service.ISysUserService; import com.qihang.tao.mapper.SysUserMapper; -import com.qihang.tao.service.ISysUserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,7 +16,7 @@ import java.util.List; /** * 用户 业务层处理 - * + * * @author qihang */ @Service @@ -26,7 +29,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 根据条件分页查询用户列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -38,7 +41,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 根据条件分页查询已分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -50,7 +53,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 根据条件分页查询未分配用户角色列表 - * + * * @param user 用户信息 * @return 用户信息集合信息 */ @@ -62,7 +65,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 通过用户名查询用户 - * + * * @param userName 用户名 * @return 用户对象信息 */ @@ -74,7 +77,7 @@ public class SysUserServiceImpl implements ISysUserService /** * 通过用户ID查询用户 - * + * * @param userId 用户ID * @return 用户对象信息 */ @@ -84,6 +87,207 @@ public class SysUserServiceImpl implements ISysUserService return userMapper.selectUserById(userId); } + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean checkUserNameUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkUserNameUnique(user.getUserName()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public boolean checkPhoneUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkPhoneUnique(user.getPhonenumber()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return + */ + @Override + public boolean checkEmailUnique(SysUser user) + { + Long userId = StringUtils.isNull(user.getUserId()) ? -1L : user.getUserId(); + SysUser info = userMapper.checkEmailUnique(user.getEmail()); + if (StringUtils.isNotNull(info) && info.getUserId().longValue() != userId.longValue()) + { + return UserConstants.NOT_UNIQUE; + } + return UserConstants.UNIQUE; + } + + /** + * 校验用户是否允许操作 + * + * @param user 用户信息 + */ + @Override + public void checkUserAllowed(SysUser user) + { + if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) + { + throw new ServiceException("不允许操作超级管理员用户"); + } + } + + /** + * 新增保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int insertUser(SysUser user) + { + // 新增用户信息 + int rows = userMapper.insertUser(user); +// // 新增用户岗位关联 +// insertUserPost(user); +// // 新增用户与角色管理 +// insertUserRole(user); + return rows; + } + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean registerUser(SysUser user) + { + return userMapper.insertUser(user) > 0; + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional + public int updateUser(SysUser user) + { + Long userId = user.getUserId(); +// // 删除用户与角色关联 +// userRoleMapper.deleteUserRoleByUserId(userId); +// // 新增用户与角色管理 +// insertUserRole(user); +// // 删除用户与岗位关联 +// userPostMapper.deleteUserPostByUserId(userId); + // 新增用户与岗位管理 +// insertUserPost(user); + return userMapper.updateUser(user); + } + + + /** + * 修改用户状态 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserStatus(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int updateUserProfile(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 修改用户头像 + * + * @param userName 用户名 + * @param avatar 头像地址 + * @return 结果 + */ + @Override + public boolean updateUserAvatar(String userName, String avatar) + { + return userMapper.updateUserAvatar(userName, avatar) > 0; + } + + /** + * 重置用户密码 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public int resetPwd(SysUser user) + { + return userMapper.updateUser(user); + } + + /** + * 重置用户密码 + * + * @param userName 用户名 + * @param password 密码 + * @return 结果 + */ + @Override + public int resetUserPwd(String userName, String password) + { + return userMapper.resetUserPwd(userName, password); + } + + + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + @Transactional + public int deleteUserById(Long userId) + { +// // 删除用户与角色关联 +// userRoleMapper.deleteUserRoleByUserId(userId); +// // 删除用户与岗位表 +// userPostMapper.deleteUserPostByUserId(userId); + return userMapper.deleteUserById(userId); + } } diff --git a/tao-api/src/main/resources/mapper/oms/TaoGoodsMapper.xml b/tao-api/src/main/resources/mapper/oms/TaoGoodsMapper.xml new file mode 100644 index 00000000..6da2e36b --- /dev/null +++ b/tao-api/src/main/resources/mapper/oms/TaoGoodsMapper.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/tao-api/src/main/resources/mapper/user/SysUserMapper.xml b/tao-api/src/main/resources/mapper/user/SysUserMapper.xml index 5e24a445..73cebe7b 100644 --- a/tao-api/src/main/resources/mapper/user/SysUserMapper.xml +++ b/tao-api/src/main/resources/mapper/user/SysUserMapper.xml @@ -104,7 +104,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where u.user_id = #{userId} - + + + + + insert into sys_user( @@ -137,6 +147,49 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" current_timestamp() ) - + + + 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 = current_timestamp() + + 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} + + + + update sys_user set del_flag = '2' 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/vue3/src/api/auth/index.ts b/vue3/src/api/auth/index.ts index a17654a7..1f93b6ab 100644 --- a/vue3/src/api/auth/index.ts +++ b/vue3/src/api/auth/index.ts @@ -15,7 +15,7 @@ export function loginApi(data: LoginData): AxiosPromise { formData.append("captchaKey", data.captchaKey || ""); formData.append("captchaCode", data.captchaCode || ""); return request({ - url: "/api/oms-api/login", + url: "/api/sys-api/login", method: "post", data: formData, headers: { @@ -29,7 +29,7 @@ export function loginApi(data: LoginData): AxiosPromise { */ export function logoutApi() { return request({ - url: "/api/oms-api/logout", + url: "/api/sys-api/logout", method: "delete", }); } diff --git a/vue3/src/api/menu/index.ts b/vue3/src/api/menu/index.ts index f531c08c..6cc4e0d2 100644 --- a/vue3/src/api/menu/index.ts +++ b/vue3/src/api/menu/index.ts @@ -7,7 +7,7 @@ import { MenuQuery, MenuVO, MenuForm } from "./types"; */ export function listRoutes() { return request({ - url: "/api/oms-api/menus/routes", + url: "/api/sys-api/menus/routes", method: "get", }); } diff --git a/vue3/src/api/user/index.ts b/vue3/src/api/user/index.ts index 9d3e4612..681f8da1 100644 --- a/vue3/src/api/user/index.ts +++ b/vue3/src/api/user/index.ts @@ -7,7 +7,7 @@ import { UserForm, UserInfo, UserPageVO, UserQuery } from "./types"; */ export function getUserInfoApi(): AxiosPromise { return request({ - url: "/api/oms-api/users/me", + url: "/api/sys-api/users/me", method: "get", }); }