From a5129fdc25df70a818767b123dac611fecffb4a3 Mon Sep 17 00:00:00 2001 From: Yjoioooo <693337446@qq.com> Date: Mon, 24 Apr 2023 16:24:17 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E8=BF=81=E7=A7=BBvue5.x=E5=86=85?= =?UTF-8?q?=E5=AE=B9=EF=BC=8C=E8=B0=83=E6=95=B4bo=EF=BC=8Cvo=E6=98=A0?= =?UTF-8?q?=E5=B0=84=EF=BC=8C=E8=BF=81=E7=A7=BB=E7=A7=9F=E6=88=B7=E4=B8=9A?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resource/api/RemoteFileService.java | 4 +- .../resource/api/RemoteSmsService.java | 5 +- .../domain/{SysFile.java => RemoteFile.java} | 2 +- .../domain/{SysSms.java => RemoteSms.java} | 2 +- .../dromara/system/api/RemoteDictService.java | 4 +- .../dromara/system/api/RemoteLogService.java | 8 +- .../system/api/RemoteTenantService.java | 26 + .../dromara/system/api/RemoteUserService.java | 6 +- .../system/api/domain/SysDictType.java | 67 --- .../dromara/system/api/domain/SysRole.java | 128 ---- .../api/domain/bo/RemoteLogininforBo.java | 75 +++ .../system/api/domain/bo/RemoteOperLogBo.java | 115 ++++ .../system/api/domain/bo/RemoteUserBo.java | 126 ++++ .../api/domain/vo/RemoteDictDataVo.java | 74 +++ .../system/api/domain/vo/RemoteTenantVo.java | 89 +++ ruoyi-auth/pom.xml | 10 + .../auth/controller/TokenController.java | 92 ++- .../dromara/auth/domain/vo/LoginTenantVo.java | 25 + .../org/dromara/auth/domain/vo/LoginVo.java | 15 + .../dromara/auth/domain/vo/TenantListVo.java | 19 + .../org/dromara/auth/form/EmailLoginBody.java | 6 + .../java/org/dromara/auth/form/LoginBody.java | 6 + .../org/dromara/auth/form/SmsLoginBody.java | 5 + .../dromara/auth/service/SysLoginService.java | 143 +++-- ruoyi-common/ruoyi-common-bom/pom.xml | 2 +- .../common/core/constant/CacheNames.java | 5 + .../common/core/constant/Constants.java | 33 +- .../org/dromara/common/core/domain/R.java | 7 +- .../common/core/enums/TenantStatus.java | 30 + .../common/core/utils/MapstructUtils.java | 92 +++ .../common/core/web/domain/BaseEntity.java | 4 +- .../dict/service/impl/DictServiceImpl.java | 10 +- .../dromara/common/dict/utils/DictUtils.java | 6 +- .../common/log/event/LogEventListener.java | 10 +- .../common/log/event/LogininforEvent.java | 40 +- .../common/log/event/OperLogEvent.java | 9 + .../mybatis/core/mapper/BaseMapperPlus.java | 38 +- .../common/tenant/config/TenantConfig.java | 44 +- .../common/tenant/helper/TenantHelper.java | 36 +- ruoyi-example/ruoyi-demo/pom.xml | 5 + .../demo/mapper/TestDemoEncryptMapper.java | 2 +- .../dromara/demo/mapper/TestDemoMapper.java | 2 +- .../dromara/demo/mapper/TestTreeMapper.java | 2 +- ruoyi-gateway/pom.xml | 11 + ruoyi-modules/ruoyi-gen/pom.xml | 5 + .../gen/mapper/GenTableColumnMapper.java | 2 +- .../dromara/gen/mapper/GenTableMapper.java | 6 +- .../gen/service/GenTableServiceImpl.java | 4 +- .../java/org/dromara/gen/util/GenUtils.java | 4 +- ruoyi-modules/ruoyi-job/pom.xml | 11 + .../org/dromara/job/service/MultiService.java | 14 +- ruoyi-modules/ruoyi-resource/pom.xml | 4 + .../resource/controller/SysOssController.java | 17 +- .../org/dromara/resource/domain/SysOss.java | 4 +- .../dromara/resource/domain/SysOssConfig.java | 4 +- .../resource/domain/vo/SysOssUploadVo.java | 28 + .../resource/dubbo/RemoteFileServiceImpl.java | 6 +- .../resource/dubbo/RemoteSmsServiceImpl.java | 6 +- .../resource/mapper/SysOssConfigMapper.java | 2 +- .../dromara/resource/mapper/SysOssMapper.java | 2 +- .../service/impl/SysOssConfigServiceImpl.java | 33 +- .../service/impl/SysOssServiceImpl.java | 2 +- ruoyi-modules/ruoyi-system/pom.xml | 12 + .../SysLogininforController.java | 30 +- .../{ => monitor}/SysOperlogController.java | 25 +- .../SysUserOnlineController.java | 28 +- .../{ => system}/SysConfigController.java | 32 +- .../{ => system}/SysDeptController.java | 25 +- .../{ => system}/SysDictDataController.java | 29 +- .../{ => system}/SysDictTypeController.java | 26 +- .../{ => system}/SysMenuController.java | 100 +++- .../{ => system}/SysNoticeController.java | 19 +- .../{ => system}/SysPostController.java | 28 +- .../{ => system}/SysProfileController.java | 72 ++- .../{ => system}/SysRoleController.java | 64 +- .../system/SysTenantController.java | 175 ++++++ .../system/SysTenantPackageController.java | 135 +++++ .../{ => system}/SysUserController.java | 145 +++-- .../org/dromara/system/domain/SysConfig.java | 26 +- .../org/dromara/system}/domain/SysDept.java | 24 +- .../dromara/system/domain/SysDictData.java | 76 +++ .../dromara/system/domain/SysDictType.java | 46 ++ .../dromara/system/domain/SysLogininfor.java | 73 +++ .../org/dromara/system/domain/SysMenu.java | 117 +++- .../org/dromara/system/domain/SysNotice.java | 13 +- .../org/dromara/system/domain/SysOperLog.java | 113 ++++ .../org/dromara/system/domain/SysPost.java | 33 +- .../org/dromara/system/domain/SysRole.java | 79 +++ .../dromara/system/domain/SysRoleDept.java | 2 - .../dromara/system/domain/SysRoleMenu.java | 2 - .../org/dromara/system/domain/SysTenant.java | 101 ++++ .../system/domain/SysTenantPackage.java | 53 ++ .../org/dromara/system/domain/SysUser.java | 115 ++++ .../dromara/system/domain/SysUserOnline.java | 54 ++ .../dromara/system/domain/SysUserPost.java | 2 - .../dromara/system/domain/SysUserRole.java | 2 - .../dromara/system/domain/bo/SysConfigBo.java | 62 ++ .../dromara/system/domain/bo/SysDeptBo.java | 71 +++ .../system/domain/bo/SysDictDataBo.java | 89 +++ .../system/domain/bo/SysDictTypeBo.java | 59 ++ .../system/domain/bo/SysLogininforBo.java | 77 +++ .../dromara/system/domain/bo/SysMenuBo.java | 112 ++++ .../dromara/system/domain/bo/SysNoticeBo.java | 66 +++ .../system/domain/bo/SysOperLogBo.java | 127 ++++ .../dromara/system/domain/bo/SysPostBo.java | 63 ++ .../dromara/system/domain/bo/SysRoleBo.java | 98 ++++ .../dromara/system/domain/bo/SysTenantBo.java | 114 ++++ .../system/domain/bo/SysTenantPackageBo.java | 60 ++ .../dromara/system/domain/bo/SysUserBo.java | 75 +-- .../system/domain/bo/SysUserProfileBo.java | 56 ++ .../dromara/system/domain/vo/AvatarVo.java | 18 + .../system/domain/vo/CacheListInfoVo.java | 23 + .../system/domain/vo/DeptTreeSelectVo.java | 26 + .../system/domain/vo/MenuTreeSelectVo.java | 26 + .../org/dromara/system/domain/vo/MetaVo.java | 6 +- .../dromara/system/domain/vo/ProfileVo.java | 29 + .../dromara/system/domain/vo/RouterVo.java | 4 +- .../dromara/system/domain/vo/SysConfigVo.java | 70 +++ .../dromara/system/domain/vo/SysDeptVo.java | 89 +++ .../system/domain/vo/SysDictDataVo.java | 49 +- .../system/domain/vo/SysDictTypeVo.java | 64 ++ .../system/domain/vo/SysLogininforVo.java | 54 +- .../dromara/system/domain/vo/SysMenuVo.java | 114 ++++ .../dromara/system/domain/vo/SysNoticeVo.java | 71 +++ .../system/domain/vo/SysOperLogVo.java | 46 +- .../dromara/system/domain/vo/SysPostVo.java | 71 +++ .../dromara/system/domain/vo/SysRoleVo.java | 98 ++++ .../system/domain/vo/SysTenantPackageVo.java | 64 ++ .../dromara/system/domain/vo/SysTenantVo.java | 113 ++++ .../system/domain/vo/SysUserExportVo.java | 10 +- .../system/domain/vo/SysUserImportVo.java | 7 +- .../system/domain/vo/SysUserInfoVo.java | 40 ++ .../dromara/system/domain/vo/SysUserVo.java | 135 +++++ .../dromara/system/domain/vo/UserInfoVo.java | 30 + .../dubbo/RemoteDataScopeServiceImpl.java | 6 +- .../system/dubbo/RemoteDictServiceImpl.java | 13 +- .../system/dubbo/RemoteLogServiceImpl.java | 23 +- .../system/dubbo/RemoteTenantServiceImpl.java | 43 ++ .../system/dubbo/RemoteUserServiceImpl.java | 39 +- .../listener/SysUserImportListener.java | 29 +- .../system/mapper/SysConfigMapper.java | 3 +- .../dromara/system/mapper/SysDeptMapper.java | 12 +- .../system/mapper/SysDictDataMapper.java | 10 +- .../system/mapper/SysDictTypeMapper.java | 5 +- .../system/mapper/SysLogininforMapper.java | 5 +- .../dromara/system/mapper/SysMenuMapper.java | 21 +- .../system/mapper/SysNoticeMapper.java | 3 +- .../system/mapper/SysOperLogMapper.java | 5 +- .../dromara/system/mapper/SysPostMapper.java | 5 +- .../system/mapper/SysRoleDeptMapper.java | 2 +- .../dromara/system/mapper/SysRoleMapper.java | 18 +- .../system/mapper/SysRoleMenuMapper.java | 2 +- .../system/mapper/SysTenantMapper.java | 14 + .../system/mapper/SysTenantPackageMapper.java | 14 + .../dromara/system/mapper/SysUserMapper.java | 71 ++- .../system/mapper/SysUserPostMapper.java | 2 +- .../system/mapper/SysUserRoleMapper.java | 2 +- .../runner/SystemApplicationRunner.java | 32 - .../system/service/ISysConfigService.java | 40 +- .../system/service/ISysDataScopeService.java | 26 + .../system/service/ISysDeptService.java | 24 +- .../system/service/ISysDictDataService.java | 20 +- .../system/service/ISysDictTypeService.java | 40 +- .../system/service/ISysLogininforService.java | 14 +- .../system/service/ISysMenuService.java | 33 +- .../system/service/ISysNoticeService.java | 21 +- .../system/service/ISysOperLogService.java | 16 +- .../system/service/ISysPermissionService.java | 16 +- .../system/service/ISysPostService.java | 26 +- .../system/service/ISysRoleService.java | 43 +- .../service/ISysTenantPackageService.java | 57 ++ .../system/service/ISysTenantService.java | 82 +++ .../system/service/ISysUserService.java | 62 +- .../service/impl/SysConfigServiceImpl.java | 108 ++-- .../service/impl/SysDataScopeServiceImpl.java | 61 ++ .../service/impl/SysDeptServiceImpl.java | 111 ++-- .../service/impl/SysDictDataServiceImpl.java | 60 +- .../service/impl/SysDictTypeServiceImpl.java | 180 +++--- .../impl/SysLogininforServiceImpl.java | 86 ++- .../service/impl/SysMenuServiceImpl.java | 215 +++---- .../service/impl/SysNoticeServiceImpl.java | 54 +- .../service/impl/SysOperLogServiceImpl.java | 49 +- .../impl/SysPermissionServiceImpl.java | 26 +- .../service/impl/SysPostServiceImpl.java | 59 +- .../service/impl/SysRoleServiceImpl.java | 140 ++--- .../service/impl/SysSensitiveServiceImpl.java | 3 +- .../impl/SysTenantPackageServiceImpl.java | 146 +++++ .../service/impl/SysTenantServiceImpl.java | 367 ++++++++++++ .../service/impl/SysUserServiceImpl.java | 238 ++++---- .../mapper/system/SysConfigMapper.xml | 16 +- .../resources/mapper/system/SysDeptMapper.xml | 37 +- .../mapper/system/SysDictDataMapper.xml | 20 +- .../mapper/system/SysDictTypeMapper.xml | 15 +- .../mapper/system/SysLogininforMapper.xml | 13 +- .../resources/mapper/system/SysMenuMapper.xml | 98 ++-- .../mapper/system/SysNoticeMapper.xml | 17 +- .../mapper/system/SysOperLogMapper.xml | 22 +- .../resources/mapper/system/SysPostMapper.xml | 44 +- .../mapper/system/SysRoleDeptMapper.xml | 9 +- .../resources/mapper/system/SysRoleMapper.xml | 56 +- .../mapper/system/SysRoleMenuMapper.xml | 9 +- .../mapper/system/SysTenantMapper.xml | 7 + .../mapper/system/SysTenantPackageMapper.xml | 7 + .../resources/mapper/system/SysUserMapper.xml | 138 ++--- .../mapper/system/SysUserPostMapper.xml | 9 +- .../mapper/system/SysUserRoleMapper.xml | 9 +- sql/ry-cloud.sql | 554 +++++++++++------- 207 files changed, 7301 insertions(+), 2437 deletions(-) rename ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/{SysFile.java => RemoteFile.java} (88%) rename ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/{SysSms.java => RemoteSms.java} (90%) create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java delete mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDictType.java delete mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysRole.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java create mode 100644 ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java create mode 100644 ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TenantStatus.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java create mode 100644 ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => monitor}/SysLogininforController.java (74%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => monitor}/SysOperlogController.java (75%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => monitor}/SysUserOnlineController.java (74%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => system}/SysConfigController.java (79%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => system}/SysDeptController.java (82%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => system}/SysDictDataController.java (75%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => system}/SysDictTypeController.java (79%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => system}/SysMenuController.java (58%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => system}/SysNoticeController.java (80%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => system}/SysPostController.java (79%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => system}/SysProfileController.java (65%) rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => system}/SysRoleController.java (76%) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java rename ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/{ => system}/SysUserController.java (61%) rename {ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api => ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system}/domain/SysDept.java (57%) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java rename ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUser.java => ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java (64%) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java rename ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDictData.java => ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java (53%) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java rename ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysLogininfor.java => ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java (58%) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java rename ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysOperLog.java => ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java (79%) create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java index 6e1e1939..6ab788e4 100644 --- a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java @@ -1,7 +1,7 @@ package org.dromara.resource.api; import org.dromara.common.core.exception.ServiceException; -import org.dromara.resource.api.domain.SysFile; +import org.dromara.resource.api.domain.RemoteFile; /** * 文件服务 @@ -16,7 +16,7 @@ public interface RemoteFileService { * @param file 文件信息 * @return 结果 */ - SysFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException; + RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException; /** * 通过ossId查询对应的url diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java index 247f38b9..c1741cc7 100644 --- a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteSmsService.java @@ -1,8 +1,7 @@ package org.dromara.resource.api; import org.dromara.common.core.exception.ServiceException; -import org.dromara.resource.api.domain.SysFile; -import org.dromara.resource.api.domain.SysSms; +import org.dromara.resource.api.domain.RemoteSms; import java.util.Map; @@ -20,6 +19,6 @@ public interface RemoteSmsService { * @param templateId 模板id * @param param 模板对应参数 */ - SysSms send(String phones, String templateId, Map param) throws ServiceException; + RemoteSms send(String phones, String templateId, Map param) throws ServiceException; } diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SysFile.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java similarity index 88% rename from ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SysFile.java rename to ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java index ba966948..0c8881bc 100644 --- a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SysFile.java +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteFile.java @@ -10,7 +10,7 @@ import java.io.Serializable; * @author ruoyi */ @Data -public class SysFile implements Serializable { +public class RemoteFile implements Serializable { private static final long serialVersionUID = 1L; diff --git a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SysSms.java b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java similarity index 90% rename from ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SysSms.java rename to ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java index c5aa4b81..f7e9a892 100644 --- a/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/SysSms.java +++ b/ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/domain/RemoteSms.java @@ -10,7 +10,7 @@ import java.io.Serializable; * @author ruoyi */ @Data -public class SysSms implements Serializable { +public class RemoteSms implements Serializable { private static final long serialVersionUID = 1L; diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java index 2f7f7cb5..142dc45f 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDictService.java @@ -1,6 +1,6 @@ package org.dromara.system.api; -import org.dromara.system.api.domain.SysDictData; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; import java.util.List; @@ -17,5 +17,5 @@ public interface RemoteDictService { * @param dictType 字典类型 * @return 字典数据集合信息 */ - List selectDictDataByType(String dictType); + List selectDictDataByType(String dictType); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java index f233e5a3..d9ee01f6 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteLogService.java @@ -1,7 +1,7 @@ package org.dromara.system.api; -import org.dromara.system.api.domain.SysLogininfor; -import org.dromara.system.api.domain.SysOperLog; +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; /** * 日志服务 @@ -16,7 +16,7 @@ public interface RemoteLogService { * @param sysOperLog 日志实体 * @return 结果 */ - Boolean saveLog(SysOperLog sysOperLog); + void saveLog(RemoteOperLogBo sysOperLog); /** * 保存访问记录 @@ -24,5 +24,5 @@ public interface RemoteLogService { * @param sysLogininfor 访问实体 * @return 结果 */ - Boolean saveLogininfor(SysLogininfor sysLogininfor); + void saveLogininfor(RemoteLogininforBo sysLogininfor); } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java new file mode 100644 index 00000000..5cfcc056 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteTenantService.java @@ -0,0 +1,26 @@ +package org.dromara.system.api; + + +import org.dromara.system.api.domain.vo.RemoteTenantVo; + +import java.util.List; + +/** + * @author zhujie + */ +public interface RemoteTenantService { + + /** + * 根据租户id获取租户详情 + * @param tenantId 租户id + * @return 结果 + */ + RemoteTenantVo queryByTenantId(String tenantId); + + /** + * 获取租户列表 + * @return 结果 + */ + List queryList(); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java index 24ddf4cb..e602d7c9 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java @@ -1,7 +1,7 @@ package org.dromara.system.api; import org.dromara.common.core.exception.user.UserException; -import org.dromara.system.api.domain.SysUser; +import org.dromara.system.api.domain.bo.RemoteUserBo; import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.XcxLoginUser; @@ -47,10 +47,10 @@ public interface RemoteUserService { /** * 注册用户信息 * - * @param sysUser 用户信息 + * @param remoteUserBo 用户信息 * @return 结果 */ - Boolean registerUserInfo(SysUser sysUser); + Boolean registerUserInfo(RemoteUserBo remoteUserBo); /** * 通过userId查询用户账户 diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDictType.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDictType.java deleted file mode 100644 index c50356cf..00000000 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDictType.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.dromara.system.api.domain; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.web.domain.BaseEntity; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Pattern; -import javax.validation.constraints.Size; - -/** - * 字典类型表 sys_dict_type - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -@TableName("sys_dict_type") -@ExcelIgnoreUnannotated -public class SysDictType extends BaseEntity { - - /** - * 字典主键 - */ - @ExcelProperty(value = "字典主键") - @TableId(value = "dict_id") - private Long dictId; - - /** - * 字典名称 - */ - @ExcelProperty(value = "字典名称") - @NotBlank(message = "字典名称不能为空") - @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") - private String dictName; - - /** - * 字典类型 - */ - @ExcelProperty(value = "字典类型") - @NotBlank(message = "字典类型不能为空") - @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") - @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") - private String dictType; - - /** - * 状态(0正常 1停用) - */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_normal_disable") - private String status; - - /** - * 备注 - */ - private String remark; - -} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysRole.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysRole.java deleted file mode 100644 index 5ffeea5a..00000000 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysRole.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.dromara.system.api.domain; - -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.constant.UserConstants; -import org.dromara.common.core.web.domain.BaseEntity; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 角色表 sys_role - * - * @author Lion Li - */ - -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -@TableName("sys_role") -@ExcelIgnoreUnannotated -public class SysRole extends BaseEntity { - - /** - * 角色ID - */ - @ExcelProperty(value = "角色序号") - @TableId(value = "role_id") - private Long roleId; - - /** - * 角色名称 - */ - @ExcelProperty(value = "角色名称") - @NotBlank(message = "角色名称不能为空") - @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符") - private String roleName; - - /** - * 角色权限 - */ - @ExcelProperty(value = "角色权限") - @NotBlank(message = "权限字符不能为空") - @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符") - private String roleKey; - - /** - * 角色排序 - */ - @ExcelProperty(value = "角色排序") - @NotNull(message = "显示顺序不能为空") - private Integer roleSort; - - /** - * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) - */ - @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class) - @ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") - private String dataScope; - - /** - * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) - */ - private Boolean menuCheckStrictly; - - /** - * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) - */ - private Boolean deptCheckStrictly; - - /** - * 角色状态(0正常 1停用) - */ - @ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_normal_disable") - private String status; - - /** - * 删除标志(0代表存在 2代表删除) - */ - @TableLogic - private String delFlag; - - /** - * 备注 - */ - private String remark; - - /** - * 用户是否存在此角色标识 默认不存在 - */ - @TableField(exist = false) - private boolean flag = false; - - /** - * 菜单组 - */ - @TableField(exist = false) - private Long[] menuIds; - - /** - * 部门组(数据权限) - */ - @TableField(exist = false) - private Long[] deptIds; - - public SysRole(Long roleId) { - this.roleId = roleId; - } - - /** - * 是否管理员 - */ - public boolean isAdmin() { - return UserConstants.SUPER_ADMIN_ID.equals(this.roleId); - } - -} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java new file mode 100644 index 00000000..41d0c0ae --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteLogininforBo.java @@ -0,0 +1,75 @@ +package org.dromara.system.api.domain.bo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 系统访问记录表 sys_logininfor + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RemoteLogininforBo implements Serializable { + /** + * 访问ID + */ + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录状态(0成功 1失败) + */ + private String status; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java new file mode 100644 index 00000000..50f01cde --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteOperLogBo.java @@ -0,0 +1,115 @@ +package org.dromara.system.api.domain.bo; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作日志记录表 oper_log + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class RemoteOperLogBo implements Serializable { + /** + * 日志主键 + */ + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 方法名称 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求URL + */ + private String operUrl; + + /** + * 主机地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java new file mode 100644 index 00000000..3d887c66 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/bo/RemoteUserBo.java @@ -0,0 +1,126 @@ +package org.dromara.system.api.domain.bo; + + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.annotation.Sensitive; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.enums.SensitiveStrategy; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.common.core.xss.Xss; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.Date; + +/** + * 用户信息业务对象 sys_user + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class RemoteUserBo extends BaseEntity { + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") + private String userName; + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 头像地址 + */ + private Long avatar; + + /** + * 密码 + */ + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + public RemoteUserBo(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java new file mode 100644 index 00000000..edcddb65 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDictDataVo.java @@ -0,0 +1,74 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典数据视图对象 sys_dict_data + * + * @author Michelle.Chung + */ +@Data +public class RemoteDictDataVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 字典编码 + */ + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java new file mode 100644 index 00000000..927d71c9 --- /dev/null +++ b/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteTenantVo.java @@ -0,0 +1,89 @@ +package org.dromara.system.api.domain.vo; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 租户视图对象 + * + * @author zhujie + */ +@Data +public class RemoteTenantVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + private String contactUserName; + + /** + * 联系电话 + */ + private String contactPhone; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + +} diff --git a/ruoyi-auth/pom.xml b/ruoyi-auth/pom.xml index 7b70da6d..44b47529 100644 --- a/ruoyi-auth/pom.xml +++ b/ruoyi-auth/pom.xml @@ -64,6 +64,16 @@ org.dromara ruoyi-common-seata + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java index 6931f645..0e31ff40 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java @@ -1,22 +1,30 @@ package org.dromara.auth.controller; +import cn.hutool.core.collection.CollUtil; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.auth.domain.vo.LoginTenantVo; +import org.dromara.auth.domain.vo.LoginVo; +import org.dromara.auth.domain.vo.TenantListVo; import org.dromara.auth.form.EmailLoginBody; import org.dromara.auth.form.LoginBody; import org.dromara.auth.form.RegisterBody; import org.dromara.auth.form.SmsLoginBody; import org.dromara.auth.service.SysLoginService; -import org.dromara.common.core.constant.Constants; import org.dromara.common.core.domain.R; -import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.api.RemoteTenantService; +import org.dromara.system.api.domain.vo.RemoteTenantVo; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import javax.validation.constraints.NotBlank; -import java.util.HashMap; -import java.util.Map; +import java.net.URL; +import java.util.List; /** * token 控制 @@ -30,18 +38,22 @@ public class TokenController { private final SysLoginService sysLoginService; + @DubboReference + private final RemoteTenantService remoteTenantService; + /** * 登录方法 */ @PostMapping("login") - public R> login(@Validated @RequestBody LoginBody form) { - // 用户登录 - String accessToken = sysLoginService.login(form.getUsername(), form.getPassword()); - - // 接口返回信息 - Map rspMap = new HashMap<>(); - rspMap.put(Constants.ACCESS_TOKEN, accessToken); - return R.ok(rspMap); + public R login(@Validated @RequestBody LoginBody body) { + LoginVo loginVo = new LoginVo(); + // 生成令牌 + String token = sysLoginService.login( + body.getTenantId(), + body.getUsername(), + body.getPassword()); + loginVo.setToken(token); + return R.ok(loginVo); } /** @@ -51,12 +63,12 @@ public class TokenController { * @return 结果 */ @PostMapping("/smsLogin") - public R> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) { - Map ajax = new HashMap<>(); + public R smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) { + LoginVo loginVo = new LoginVo(); // 生成令牌 - String token = sysLoginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode()); - ajax.put(Constants.ACCESS_TOKEN, token); - return R.ok(ajax); + String token = sysLoginService.smsLogin(smsLoginBody.getTenantId(),smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode()); + loginVo.setToken(token); + return R.ok(loginVo); } /** @@ -66,12 +78,12 @@ public class TokenController { * @return 结果 */ @PostMapping("/emailLogin") - public R> emailLogin(@Validated @RequestBody EmailLoginBody body) { - Map ajax = new HashMap<>(); + public R emailLogin(@Validated @RequestBody EmailLoginBody body) { + LoginVo loginVo = new LoginVo(); // 生成令牌 - String token = sysLoginService.emailLogin(body.getEmail(), body.getEmailCode()); - ajax.put(Constants.ACCESS_TOKEN, token); - return R.ok(ajax); + String token = sysLoginService.emailLogin(body.getTenantId(), body.getEmail(), body.getEmailCode()); + loginVo.setToken(token); + return R.ok(loginVo); } /** @@ -81,12 +93,12 @@ public class TokenController { * @return 结果 */ @PostMapping("/xcxLogin") - public R> xcxLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) { - Map ajax = new HashMap<>(); + public R xcxLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) { + LoginVo loginVo = new LoginVo(); // 生成令牌 String token = sysLoginService.xcxLogin(xcxCode); - ajax.put(Constants.ACCESS_TOKEN, token); - return R.ok(ajax); + loginVo.setToken(token); + return R.ok(loginVo); } /** @@ -108,4 +120,24 @@ public class TokenController { return R.ok(); } + /** + * 登录页面租户下拉框 + * + * @return 租户列表 + */ + @GetMapping("/tenant/list") + public R tenantList(HttpServletRequest request) throws Exception { + List tenantList = remoteTenantService.queryList(); + List voList = MapstructUtils.convert(tenantList, TenantListVo.class); + // 获取域名 + String host = new URL(request.getRequestURL().toString()).getHost(); + // 根据域名进行筛选 + List list = StreamUtils.filter(voList, vo -> StringUtils.equals(vo.getDomain(), host)); + // 返回对象 + LoginTenantVo vo = new LoginTenantVo(); + vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList); + vo.setTenantEnabled(TenantHelper.isEnable()); + return R.ok(vo); + } + } diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java new file mode 100644 index 00000000..fcfdcc3d --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginTenantVo.java @@ -0,0 +1,25 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 登录租户对象 + * + * @author Michelle.Chung + */ +@Data +public class LoginTenantVo { + + /** + * 租户开关 + */ + private Boolean tenantEnabled; + + /** + * 租户对象列表 + */ + private List voList; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java new file mode 100644 index 00000000..42b40522 --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/LoginVo.java @@ -0,0 +1,15 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +/** + * 登录验证信息 + * + * @author Michelle.Chung + */ +@Data +public class LoginVo { + + private String token; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java new file mode 100644 index 00000000..b993b37a --- /dev/null +++ b/ruoyi-auth/src/main/java/org/dromara/auth/domain/vo/TenantListVo.java @@ -0,0 +1,19 @@ +package org.dromara.auth.domain.vo; + +import lombok.Data; + +/** + * 租户列表 + * + * @author zhujie + */ +@Data +public class TenantListVo { + + private String tenantId; + + private String companyName; + + private String domain; + +} diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java index 6fa04953..c3b9ef81 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/EmailLoginBody.java @@ -14,6 +14,12 @@ import javax.validation.constraints.NotBlank; @Data public class EmailLoginBody { + /** + * 租户ID + */ + @NotBlank(message = "{tenant.number.not.blank}") + private String tenantId; + /** * 邮箱 */ diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/LoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/LoginBody.java index 5e107fd0..01657c3b 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/form/LoginBody.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/LoginBody.java @@ -16,6 +16,12 @@ import javax.validation.constraints.NotBlank; @NoArgsConstructor public class LoginBody { + /** + * 租户ID + */ + @NotBlank(message = "{tenant.number.not.blank}") + private String tenantId; + /** * 用户名 */ diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java b/ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java index ab0ca061..05dc40aa 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/form/SmsLoginBody.java @@ -13,6 +13,11 @@ import javax.validation.constraints.NotBlank; @Data public class SmsLoginBody { + /** + * 租户ID + */ + private String tenantId; + /** * 手机号 */ diff --git a/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java b/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java index 56760df4..01c3bed0 100644 --- a/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java +++ b/ruoyi-auth/src/main/java/org/dromara/auth/service/SysLoginService.java @@ -4,14 +4,17 @@ import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.secure.BCrypt; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.useragent.UserAgent; -import cn.hutool.http.useragent.UserAgentUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; import org.dromara.auth.form.RegisterBody; import org.dromara.auth.properties.UserPasswordProperties; import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.enums.DeviceType; import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.TenantStatus; import org.dromara.common.core.enums.UserType; import org.dromara.common.core.exception.user.CaptchaExpireException; import org.dromara.common.core.exception.user.UserException; @@ -19,21 +22,22 @@ import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.core.utils.ip.AddressUtils; import org.dromara.common.log.event.LogininforEvent; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.api.RemoteLogService; +import org.dromara.common.tenant.exception.TenantException; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.api.RemoteTenantService; import org.dromara.system.api.RemoteUserService; -import org.dromara.system.api.domain.SysUser; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.domain.vo.RemoteTenantVo; import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.XcxLoginUser; -import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import javax.servlet.http.HttpServletRequest; import java.time.Duration; +import java.util.Date; import java.util.function.Supplier; /** @@ -41,13 +45,15 @@ import java.util.function.Supplier; * * @author ruoyi */ +@RequiredArgsConstructor @Service +@Slf4j public class SysLoginService { - @DubboReference - private RemoteLogService remoteLogService; @DubboReference private RemoteUserService remoteUserService; + @DubboReference + private RemoteTenantService remoteTenantService; @Autowired private UserPasswordProperties userPasswordProperties; @@ -55,38 +61,43 @@ public class SysLoginService { /** * 登录 */ - public String login(String username, String password) { + public String login(String tenantId, String username, String password) { + // 校验租户 + checkTenant(tenantId); LoginUser userInfo = remoteUserService.getUserInfo(username); - - checkLogin(LoginType.PASSWORD, username, () -> !BCrypt.checkpw(password, userInfo.getPassword())); + checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, userInfo.getPassword())); // 获取登录token LoginHelper.loginByDevice(userInfo, DeviceType.PC); - recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); + recordLogininfor(tenantId, username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); return StpUtil.getTokenValue(); } - public String smsLogin(String phonenumber, String smsCode) { + public String smsLogin(String tenantId, String phonenumber, String smsCode) { + // 校验租户 + checkTenant(tenantId); // 通过手机号查找用户 LoginUser userInfo = remoteUserService.getUserInfoByPhonenumber(phonenumber); - checkLogin(LoginType.SMS, userInfo.getUsername(), () -> !validateSmsCode(phonenumber, smsCode)); + checkLogin(LoginType.SMS, tenantId, userInfo.getUsername(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); // 生成token LoginHelper.loginByDevice(userInfo, DeviceType.APP); - recordLogininfor(userInfo.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); + recordLogininfor(tenantId, userInfo.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); return StpUtil.getTokenValue(); } - public String emailLogin(String email, String emailCode) { + public String emailLogin(String tenantId, String email, String emailCode) { + // 校验租户 + checkTenant(tenantId); // 通过邮箱查找用户 LoginUser userInfo = remoteUserService.getUserInfoByEmail(email); - checkLogin(LoginType.EMAIL, userInfo.getUsername(), () -> !validateEmailCode(email, emailCode)); + checkLogin(LoginType.EMAIL,tenantId, userInfo.getUsername(), () -> !validateEmailCode(tenantId, email, emailCode)); // 生成token LoginHelper.loginByDevice(userInfo, DeviceType.APP); - recordLogininfor(userInfo.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); + recordLogininfor(tenantId, userInfo.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); return StpUtil.getTokenValue(); } @@ -95,10 +106,12 @@ public class SysLoginService { // todo 自行实现 校验 appid + appsrcret + xcxCode 调用登录凭证校验接口 获取 session_key 与 openid String openid = ""; XcxLoginUser userInfo = remoteUserService.getUserInfoByOpenid(openid); + // 校验租户 + checkTenant(userInfo.getTenantId()); // 生成token LoginHelper.loginByDevice(userInfo, DeviceType.XCX); - recordLogininfor(userInfo.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); + recordLogininfor(userInfo.getTenantId(), userInfo.getUsername(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); return StpUtil.getTokenValue(); } @@ -108,8 +121,12 @@ public class SysLoginService { public void logout() { try { LoginUser loginUser = LoginHelper.getLoginUser(); + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 登出清除动态租户 + TenantHelper.clearDynamic(); + } StpUtil.logout(); - recordLogininfor(loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); + recordLogininfor(loginUser.getTenantId(), loginUser.getUsername(), Constants.LOGOUT, MessageUtils.message("user.logout.success")); } catch (NotLoginException ignored) { } } @@ -118,22 +135,23 @@ public class SysLoginService { * 注册 */ public void register(RegisterBody registerBody) { + String tenantId = registerBody.getTenantId(); String username = registerBody.getUsername(); String password = registerBody.getPassword(); // 校验用户类型是否存在 String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); // 注册用户信息 - SysUser sysUser = new SysUser(); - sysUser.setUserName(username); - sysUser.setNickName(username); - sysUser.setPassword(BCrypt.hashpw(password)); - sysUser.setUserType(userType); - boolean regFlag = remoteUserService.registerUserInfo(sysUser); + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setUserName(username); + remoteUserBo.setNickName(username); + remoteUserBo.setPassword(BCrypt.hashpw(password)); + remoteUserBo.setUserType(userType); + boolean regFlag = remoteUserService.registerUserInfo(remoteUserBo); if (!regFlag) { throw new UserException("user.register.error"); } - recordLogininfor(username, Constants.REGISTER, MessageUtils.message("user.register.success")); + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); } /** @@ -144,40 +162,24 @@ public class SysLoginService { * @param message 消息内容 * @return */ - public void recordLogininfor(String username, String status, String message) { - HttpServletRequest request = ServletUtils.getRequest(); - final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); - final String ip = ServletUtils.getClientIP(request); - - String address = AddressUtils.getRealAddressByIP(ip); - // 获取客户端操作系统 - String os = userAgent.getOs().getName(); - // 获取客户端浏览器 - String browser = userAgent.getBrowser().getName(); + public void recordLogininfor(String tenantId, String username, String status, String message) { // 封装对象 - LogininforEvent logininfor = new LogininforEvent(); - logininfor.setUserName(username); - logininfor.setIpaddr(ip); - logininfor.setLoginLocation(address); - logininfor.setBrowser(browser); - logininfor.setOs(os); - logininfor.setMsg(message); - // 日志状态 - if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { - logininfor.setStatus(Constants.LOGIN_SUCCESS_STATUS); - } else if (Constants.LOGIN_FAIL.equals(status)) { - logininfor.setStatus(Constants.LOGIN_FAIL_STATUS); - } - SpringUtils.context().publishEvent(logininfor); + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(tenantId); + logininforEvent.setUsername(username); + logininforEvent.setStatus(status); + logininforEvent.setMessage(message); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); } /** * 校验短信验证码 */ - private boolean validateSmsCode(String phonenumber, String smsCode) { + private boolean validateSmsCode(String tenantId, String phonenumber, String smsCode) { String code = RedisUtils.getCacheObject(CacheConstants.CAPTCHA_CODE_KEY + phonenumber); if (StringUtils.isBlank(code)) { - recordLogininfor(phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); throw new CaptchaExpireException(); } return code.equals(smsCode); @@ -186,10 +188,10 @@ public class SysLoginService { /** * 校验邮箱验证码 */ - private boolean validateEmailCode(String email, String emailCode) { + private boolean validateEmailCode(String tenantId, String email, String emailCode) { String code = RedisUtils.getCacheObject(CacheConstants.CAPTCHA_CODE_KEY + email); if (StringUtils.isBlank(code)) { - recordLogininfor(email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + recordLogininfor(tenantId, email, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); throw new CaptchaExpireException(); } return code.equals(emailCode); @@ -198,7 +200,7 @@ public class SysLoginService { /** * 登录校验 */ - private void checkLogin(LoginType loginType, String username, Supplier supplier) { + private void checkLogin(LoginType loginType, String tenantId, String username, Supplier supplier) { String errorKey = CacheConstants.PWD_ERR_CNT_KEY + username; String loginFail = Constants.LOGIN_FAIL; Integer maxRetryCount = userPasswordProperties.getMaxRetryCount(); @@ -208,7 +210,7 @@ public class SysLoginService { Integer errorNumber = RedisUtils.getCacheObject(errorKey); // 锁定时间内登录 则踢出 if (ObjectUtil.isNotNull(errorNumber) && errorNumber.equals(maxRetryCount)) { - recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); } @@ -218,16 +220,37 @@ public class SysLoginService { // 达到规定错误次数 则锁定登录 if (errorNumber.equals(maxRetryCount)) { RedisUtils.setCacheObject(errorKey, errorNumber, Duration.ofMinutes(lockTime)); - recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitExceed(), maxRetryCount, lockTime)); throw new UserException(loginType.getRetryLimitExceed(), maxRetryCount, lockTime); } else { // 未达到规定错误次数 则递增 RedisUtils.setCacheObject(errorKey, errorNumber); - recordLogininfor(username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); + recordLogininfor(tenantId, username, loginFail, MessageUtils.message(loginType.getRetryLimitCount(), errorNumber)); throw new UserException(loginType.getRetryLimitCount(), errorNumber); } } // 登录成功 清空错误次数 RedisUtils.deleteObject(errorKey); } + + private void checkTenant(String tenantId) { + if (!TenantHelper.isEnable()) { + return; + } + if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + return; + } + RemoteTenantVo tenant = remoteTenantService.queryByTenantId(tenantId); + if (ObjectUtil.isNull(tenant)) { + log.info("登录租户:{} 不存在.", tenantId); + throw new TenantException("tenant.not.exists"); + } else if (TenantStatus.DISABLE.getCode().equals(tenant.getStatus())) { + log.info("登录租户:{} 已被停用.", tenantId); + throw new TenantException("tenant.blocked"); + } else if (ObjectUtil.isNotNull(tenant.getExpireTime()) + && new Date().after(tenant.getExpireTime())) { + log.info("登录租户:{} 已超过有效期.", tenantId); + throw new TenantException("tenant.expired"); + } + } } diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml index 52031d8a..1064d247 100644 --- a/ruoyi-common/ruoyi-common-bom/pom.xml +++ b/ruoyi-common/ruoyi-common-bom/pom.xml @@ -178,7 +178,7 @@ org.dromara ruoyi-common-tenant - ${revision} + ${project.version} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java index 42755838..c3425d0a 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java @@ -30,6 +30,11 @@ public interface CacheNames { */ String SYS_DICT = "sys_dict"; + /** + * 租户 + */ + String SYS_TENANT = GlobalConstants.GLOBAL_REDIS_KEY + "sys_tenant#30d"; + /** * 用户账户 */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java index ef79ba7b..cdbda89f 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java @@ -3,9 +3,10 @@ package org.dromara.common.core.constant; /** * 通用常量信息 * - * @author Lion Li + * @author ruoyi */ public interface Constants { + /** * UTF-8 字符集 */ @@ -32,24 +33,14 @@ public interface Constants { String HTTPS = "https://"; /** - * 成功标记 + * 通用成功标识 */ - Integer SUCCESS = 200; + String SUCCESS = "0"; /** - * 失败标记 + * 通用失败标识 */ - Integer FAIL = 500; - - /** - * 登录成功状态 - */ - String LOGIN_SUCCESS_STATUS = "0"; - - /** - * 登录失败状态 - */ - String LOGIN_FAIL_STATUS = "1"; + String FAIL = "1"; /** * 登录成功 @@ -74,13 +65,17 @@ public interface Constants { /** * 验证码有效期(分钟) */ - long CAPTCHA_EXPIRATION = 2; + Integer CAPTCHA_EXPIRATION = 2; /** - * 防重提交 redis key + * 令牌 */ - String REPEAT_SUBMIT_KEY = "repeat_submit:"; + String TOKEN = "token"; - String ACCESS_TOKEN = "access_token"; + /** + * 顶级部门id + */ + Long TOP_PARENT_ID = 0L; } + diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java index cb5ce13d..4bf265b4 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/R.java @@ -1,9 +1,8 @@ package org.dromara.common.core.domain; -import org.dromara.common.core.constant.Constants; -import org.dromara.common.core.constant.HttpStatus; import lombok.Data; import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.HttpStatus; import java.io.Serializable; @@ -20,12 +19,12 @@ public class R implements Serializable { /** * 成功 */ - public static final int SUCCESS = Constants.SUCCESS; + public static final int SUCCESS = 200; /** * 失败 */ - public static final int FAIL = Constants.FAIL; + public static final int FAIL = 500; /** * 消息状态码 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TenantStatus.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TenantStatus.java new file mode 100644 index 00000000..400a3996 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/TenantStatus.java @@ -0,0 +1,30 @@ +package org.dromara.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 用户状态 + * + * @author LionLi + */ +@Getter +@AllArgsConstructor +public enum TenantStatus { + /** + * 正常 + */ + OK("0", "正常"), + /** + * 停用 + */ + DISABLE("1", "停用"), + /** + * 删除 + */ + DELETED("2", "删除"); + + private final String code; + private final String info; + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java new file mode 100644 index 00000000..a57c1ea7 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/MapstructUtils.java @@ -0,0 +1,92 @@ +package org.dromara.common.core.utils; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ObjectUtil; +import io.github.linpeilie.Converter; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +import java.util.List; +import java.util.Map; + +/** + * Mapstruct 工具类 + *

参考文档:mapstruct-plus

+ * + * @author Michelle.Chung + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class MapstructUtils { + + private final static Converter CONVERTER = SpringUtils.getBean(Converter.class); + + /** + * 将 T 类型对象,转换为 desc 类型的对象并返回 + * + * @param source 数据来源实体 + * @param desc 描述对象 转换后的对象 + * @return desc + */ + public static V convert(T source, Class desc) { + if (ObjectUtil.isNull(source)) { + return null; + } + if (ObjectUtil.isNull(desc)) { + return null; + } + return CONVERTER.convert(source, desc); + } + + /** + * 将 T 类型对象,按照配置的映射字段规则,给 desc 类型的对象赋值并返回 desc 对象 + * + * @param source 数据来源实体 + * @param desc 转换后的对象 + * @return desc + */ + public static V convert(T source, V desc) { + if (ObjectUtil.isNull(source)) { + return null; + } + if (ObjectUtil.isNull(desc)) { + return null; + } + return CONVERTER.convert(source, desc); + } + + /** + * 将 T 类型的集合,转换为 desc 类型的集合并返回 + * + * @param sourceList 数据来源实体列表 + * @param desc 描述对象 转换后的对象 + * @return desc + */ + public static List convert(List sourceList, Class desc) { + if (ObjectUtil.isNull(sourceList)) { + return null; + } + if (CollUtil.isEmpty(sourceList)) { + return CollUtil.newArrayList(); + } + return CONVERTER.convert(sourceList, desc); + } + + /** + * 将 Map 转换为 beanClass 类型的集合并返回 + * + * @param map 数据来源 + * @param beanClass bean类 + * @return bean对象 + */ + public static T convert(Map map, Class beanClass) { + if (MapUtil.isEmpty(map)) { + return null; + } + if (ObjectUtil.isNull(beanClass)) { + return null; + } + return CONVERTER.convert(map, beanClass); + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/web/domain/BaseEntity.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/web/domain/BaseEntity.java index 66ac1478..238c4544 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/web/domain/BaseEntity.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/web/domain/BaseEntity.java @@ -33,7 +33,7 @@ public class BaseEntity implements Serializable { * 创建者 */ @TableField(fill = FieldFill.INSERT) - private String createBy; + private Long createBy; /** * 创建时间 @@ -45,7 +45,7 @@ public class BaseEntity implements Serializable { * 更新者 */ @TableField(fill = FieldFill.INSERT_UPDATE) - private String updateBy; + private Long updateBy; /** * 更新时间 diff --git a/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java b/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java index a74a469e..d0014b79 100644 --- a/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java +++ b/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/service/impl/DictServiceImpl.java @@ -7,8 +7,8 @@ import org.dromara.common.core.service.DictService; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.system.api.RemoteDictService; -import org.dromara.system.api.domain.SysDictData; import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -39,13 +39,13 @@ public class DictServiceImpl implements DictService { @Override public String getDictLabel(String dictType, String dictValue, String separator) { // 优先从本地缓存获取 - List datas = (List) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); + List datas = (List) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); if (ObjectUtil.isNull(datas)) { datas = remoteDictService.selectDictDataByType(dictType); SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas); } - Map map = StreamUtils.toMap(datas, SysDictData::getDictValue, SysDictData::getDictLabel); + Map map = StreamUtils.toMap(datas, RemoteDictDataVo::getDictValue, RemoteDictDataVo::getDictLabel); if (StringUtils.containsAny(dictValue, separator)) { return Arrays.stream(dictValue.split(separator)) .map(v -> map.getOrDefault(v, StringUtils.EMPTY)) @@ -67,13 +67,13 @@ public class DictServiceImpl implements DictService { @Override public String getDictValue(String dictType, String dictLabel, String separator) { // 优先从本地缓存获取 - List datas = (List) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); + List datas = (List) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); if (ObjectUtil.isNull(datas)) { datas = remoteDictService.selectDictDataByType(dictType); SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas); } - Map map = StreamUtils.toMap(datas, SysDictData::getDictLabel, SysDictData::getDictValue); + Map map = StreamUtils.toMap(datas, RemoteDictDataVo::getDictLabel, RemoteDictDataVo::getDictValue); if (StringUtils.containsAny(dictLabel, separator)) { return Arrays.stream(dictLabel.split(separator)) .map(l -> map.getOrDefault(l, StringUtils.EMPTY)) diff --git a/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/utils/DictUtils.java b/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/utils/DictUtils.java index 8a43eeee..93b24037 100644 --- a/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/utils/DictUtils.java +++ b/ruoyi-common/ruoyi-common-dict/src/main/java/org/dromara/common/dict/utils/DictUtils.java @@ -2,7 +2,7 @@ package org.dromara.common.dict.utils; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.redis.utils.CacheUtils; -import org.dromara.system.api.domain.SysDictData; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; import java.util.List; @@ -18,7 +18,7 @@ public class DictUtils { * @param key 参数键 * @param dictDatas 字典数据列表 */ - public static void setDictCache(String key, List dictDatas) { + public static void setDictCache(String key, List dictDatas) { CacheUtils.put(CacheNames.SYS_DICT, key, dictDatas); } @@ -28,7 +28,7 @@ public class DictUtils { * @param key 参数键 * @return dictDatas 字典数据列表 */ - public static List getDictCache(String key) { + public static List getDictCache(String key) { return CacheUtils.get(CacheNames.SYS_DICT, key); } diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogEventListener.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogEventListener.java index e27f7fe8..814ee21c 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogEventListener.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogEventListener.java @@ -1,10 +1,10 @@ package org.dromara.common.log.event; +import org.apache.dubbo.config.annotation.DubboReference; import org.dromara.common.core.utils.BeanCopyUtils; import org.dromara.system.api.RemoteLogService; -import org.dromara.system.api.domain.SysLogininfor; -import org.dromara.system.api.domain.SysOperLog; -import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; import org.springframework.context.event.EventListener; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @@ -26,14 +26,14 @@ public class LogEventListener { @Async @EventListener public void saveLog(OperLogEvent operLogEvent) { - SysOperLog sysOperLog = BeanCopyUtils.copy(operLogEvent, SysOperLog.class); + RemoteOperLogBo sysOperLog = BeanCopyUtils.copy(operLogEvent, RemoteOperLogBo.class); remoteLogService.saveLog(sysOperLog); } @Async @EventListener public void saveLogininfor(LogininforEvent logininforEvent) { - SysLogininfor sysLogininfor = BeanCopyUtils.copy(logininforEvent, SysLogininfor.class); + RemoteLogininforBo sysLogininfor = BeanCopyUtils.copy(logininforEvent, RemoteLogininforBo.class); remoteLogService.saveLogininfor(sysLogininfor); } diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java index 74516e4a..b4e5bfd9 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/LogininforEvent.java @@ -2,6 +2,7 @@ package org.dromara.common.log.event; import lombok.Data; +import javax.servlet.http.HttpServletRequest; import java.io.Serializable; /** @@ -15,39 +16,34 @@ public class LogininforEvent implements Serializable { private static final long serialVersionUID = 1L; + /** + * 租户ID + */ + private String tenantId; + /** * 用户账号 */ - private String userName; + private String username; /** * 登录状态 0成功 1失败 */ private String status; - /** - * ip地址 - */ - private String ipaddr; - - /** - * 登录地点 - */ - private String loginLocation; - - /** - * 浏览器类型 - */ - private String browser; - - /** - * 操作系统 - */ - private String os; - /** * 提示消息 */ - private String msg; + private String message; + + /** + * 请求体 + */ + private HttpServletRequest request; + + /** + * 其他参数 + */ + private Object[] args; } diff --git a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java index e61a0bc7..bd1b0f8b 100644 --- a/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java +++ b/ruoyi-common/ruoyi-common-log/src/main/java/org/dromara/common/log/event/OperLogEvent.java @@ -21,6 +21,11 @@ public class OperLogEvent implements Serializable { */ private Long operId; + /** + * 租户ID + */ + private String tenantId; + /** * 操作模块 */ @@ -101,4 +106,8 @@ public class OperLogEvent implements Serializable { */ private Date operTime; + /** + * 消耗时间 + */ + private Long costTime; } diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java index bf69b48a..fe74d507 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/mapper/BaseMapperPlus.java @@ -6,42 +6,40 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.*; +import com.baomidou.mybatisplus.core.toolkit.ReflectionKit; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.toolkit.Db; -import org.dromara.common.core.utils.BeanCopyUtils; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; +import org.dromara.common.core.utils.MapstructUtils; import java.io.Serializable; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 自定义 Mapper 接口, 实现 自定义扩展 * - * @param mapper 泛型 * @param table 泛型 * @param vo 泛型 * @author Lion Li * @since 2021-05-13 */ @SuppressWarnings("unchecked") -public interface BaseMapperPlus extends BaseMapper { +public interface BaseMapperPlus extends BaseMapper { Log log = LogFactory.getLog(BaseMapperPlus.class); default Class currentVoClass() { - return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 2); + return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 1); } default Class currentModelClass() { - return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 1); - } - - default Class currentMapperClass() { - return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 0); + return (Class) ReflectionKit.getSuperClassGenericType(this.getClass(), BaseMapperPlus.class, 0); } default List selectList() { @@ -109,7 +107,7 @@ public interface BaseMapperPlus extends BaseMapper { if (ObjectUtil.isNull(obj)) { return null; } - return BeanCopyUtils.copy(obj, voClass); + return MapstructUtils.convert(obj, voClass); } default List selectVoBatchIds(Collection idList) { @@ -124,7 +122,7 @@ public interface BaseMapperPlus extends BaseMapper { if (CollUtil.isEmpty(list)) { return CollUtil.newArrayList(); } - return BeanCopyUtils.copyList(list, voClass); + return MapstructUtils.convert(list, voClass); } default List selectVoByMap(Map map) { @@ -139,7 +137,7 @@ public interface BaseMapperPlus extends BaseMapper { if (CollUtil.isEmpty(list)) { return CollUtil.newArrayList(); } - return BeanCopyUtils.copyList(list, voClass); + return MapstructUtils.convert(list, voClass); } default V selectVoOne(Wrapper wrapper) { @@ -154,7 +152,11 @@ public interface BaseMapperPlus extends BaseMapper { if (ObjectUtil.isNull(obj)) { return null; } - return BeanCopyUtils.copy(obj, voClass); + return MapstructUtils.convert(obj, voClass); + } + + default List selectVoList() { + return selectVoList(new QueryWrapper<>(), this.currentVoClass()); } default List selectVoList(Wrapper wrapper) { @@ -169,7 +171,7 @@ public interface BaseMapperPlus extends BaseMapper { if (CollUtil.isEmpty(list)) { return CollUtil.newArrayList(); } - return BeanCopyUtils.copyList(list, voClass); + return MapstructUtils.convert(list, voClass); } default

> P selectVoPage(IPage page, Wrapper wrapper) { @@ -185,8 +187,12 @@ public interface BaseMapperPlus extends BaseMapper { if (CollUtil.isEmpty(pageData.getRecords())) { return (P) voPage; } - voPage.setRecords(BeanCopyUtils.copyList(pageData.getRecords(), voClass)); + voPage.setRecords(MapstructUtils.convert(pageData.getRecords(), voClass)); return (P) voPage; } + default List selectObjs(Wrapper wrapper, Function mapper) { + return this.selectObjs(wrapper).stream().filter(Objects::nonNull).map(mapper).collect(Collectors.toList()); + } + } diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java index 5c781457..44864417 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/config/TenantConfig.java @@ -18,6 +18,7 @@ import org.redisson.config.ClusterServersConfig; import org.redisson.config.SingleServerConfig; import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cache.CacheManager; @@ -33,29 +34,34 @@ import java.util.List; * @author Lion Li */ @EnableConfigurationProperties(TenantProperties.class) -@AutoConfiguration(after = {RedisConfiguration.class, MybatisPlusConfiguration.class}) +@AutoConfiguration(after = {RedisConfiguration.class}) @ConditionalOnProperty(value = "tenant.enable", havingValue = "true") public class TenantConfig { - /** - * 初始化租户配置 - */ - @Bean - public boolean tenantInit(MybatisPlusInterceptor mybatisPlusInterceptor, - TenantProperties tenantProperties) { - List interceptors = new ArrayList<>(); - // 多租户插件 必须放到第一位 - interceptors.add(tenantLineInnerInterceptor(tenantProperties)); - interceptors.addAll(mybatisPlusInterceptor.getInterceptors()); - mybatisPlusInterceptor.setInterceptors(interceptors); - return true; - } + @ConditionalOnBean(MybatisPlusConfiguration.class) + @AutoConfiguration(after = {MybatisPlusConfiguration.class}) + static class MybatisPlusConfig { - /** - * 多租户插件 - */ - public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) { - return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties)); + /** + * 初始化租户配置 + */ + @Bean + public boolean tenantInit(MybatisPlusInterceptor mybatisPlusInterceptor, + TenantProperties tenantProperties) { + List interceptors = new ArrayList<>(); + // 多租户插件 必须放到第一位 + interceptors.add(tenantLineInnerInterceptor(tenantProperties)); + interceptors.addAll(mybatisPlusInterceptor.getInterceptors()); + mybatisPlusInterceptor.setInterceptors(interceptors); + return true; + } + + /** + * 多租户插件 + */ + public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantProperties tenantProperties) { + return new TenantLineInnerInterceptor(new PlusTenantLineHandler(tenantProperties)); + } } @Bean diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java index e1784b57..8d435a36 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java @@ -6,14 +6,16 @@ import cn.hutool.core.convert.Convert; import com.alibaba.ttl.TransmittableThreadLocal; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; + +import java.util.function.Supplier; /** * 租户助手 @@ -49,6 +51,34 @@ public class TenantHelper { InterceptorIgnoreHelper.clearIgnoreStrategy(); } + /** + * 在忽略租户中执行 + * + * @param handle 处理执行方法 + */ + public static void ignore(Runnable handle) { + enableIgnore(); + try { + handle.run(); + } finally { + disableIgnore(); + } + } + + /** + * 在忽略租户中执行 + * + * @param handle 处理执行方法 + */ + public static T ignore(Supplier handle) { + enableIgnore(); + try { + return handle.get(); + } finally { + disableIgnore(); + } + } + /** * 设置动态租户(一直有效 需要手动清理) *

diff --git a/ruoyi-example/ruoyi-demo/pom.xml b/ruoyi-example/ruoyi-demo/pom.xml index 3ac41f2e..34f778cd 100644 --- a/ruoyi-example/ruoyi-demo/pom.xml +++ b/ruoyi-example/ruoyi-demo/pom.xml @@ -79,6 +79,11 @@ ruoyi-common-encrypt + + org.dromara + ruoyi-common-tenant + + diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java index dcd909cd..601f97a3 100644 --- a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoEncryptMapper.java @@ -8,6 +8,6 @@ import org.dromara.demo.domain.TestDemoEncrypt; * * @author Lion Li */ -public interface TestDemoEncryptMapper extends BaseMapperPlus { +public interface TestDemoEncryptMapper extends BaseMapperPlus { } diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java index 82762f96..044d2b6e 100644 --- a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestDemoMapper.java @@ -20,7 +20,7 @@ import java.util.List; * @author Lion Li * @date 2021-07-26 */ -public interface TestDemoMapper extends BaseMapperPlus { +public interface TestDemoMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "dept_id"), diff --git a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java index 685ab98d..e5f4c443 100644 --- a/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java +++ b/ruoyi-example/ruoyi-demo/src/main/java/org/dromara/demo/mapper/TestTreeMapper.java @@ -16,6 +16,6 @@ import org.dromara.demo.domain.vo.TestTreeVo; @DataColumn(key = "deptName", value = "dept_id"), @DataColumn(key = "userName", value = "user_id") }) -public interface TestTreeMapper extends BaseMapperPlus { +public interface TestTreeMapper extends BaseMapperPlus { } diff --git a/ruoyi-gateway/pom.xml b/ruoyi-gateway/pom.xml index 634427c9..f00d299c 100644 --- a/ruoyi-gateway/pom.xml +++ b/ruoyi-gateway/pom.xml @@ -101,6 +101,17 @@ ruoyi-common-redis + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + + diff --git a/ruoyi-modules/ruoyi-gen/pom.xml b/ruoyi-modules/ruoyi-gen/pom.xml index 7b6238c7..01f19676 100644 --- a/ruoyi-modules/ruoyi-gen/pom.xml +++ b/ruoyi-modules/ruoyi-gen/pom.xml @@ -66,6 +66,11 @@ ruoyi-common-seata + + org.dromara + ruoyi-common-tenant + + diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java index 2c1ac9fb..b5935d74 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableColumnMapper.java @@ -12,7 +12,7 @@ import java.util.List; * @author Lion Li */ @InterceptorIgnore(dataPermission = "true") -public interface GenTableColumnMapper extends BaseMapperPlus { +public interface GenTableColumnMapper extends BaseMapperPlus { /** * 根据表名称查询列信息 * diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java index 9d87487e..66564342 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/mapper/GenTableMapper.java @@ -1,12 +1,10 @@ package org.dromara.gen.mapper; import com.baomidou.mybatisplus.annotation.InterceptorIgnore; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.gen.domain.GenTable; -import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,7 +14,7 @@ import java.util.List; * @author Lion Li */ @InterceptorIgnore(dataPermission = "true") -public interface GenTableMapper extends BaseMapperPlus { +public interface GenTableMapper extends BaseMapperPlus { Page selectPageDbTableList(@Param("page") Page page, @Param("genTable") GenTable genTable); diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java index 4d42c788..457fb208 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java @@ -172,11 +172,11 @@ public class GenTableServiceImpl implements IGenTableService { @Transactional(rollbackFor = Exception.class) @Override public void importGenTable(List tableList) { - String operName = LoginHelper.getUsername(); + Long operId = LoginHelper.getUserId(); try { for (GenTable table : tableList) { String tableName = table.getTableName(); - GenUtils.initTable(table, operName); + GenUtils.initTable(table, operId); int row = baseMapper.insert(table); if (row > 0) { // 保存列信息 diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java index 51666d8a..13304684 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/GenUtils.java @@ -21,14 +21,14 @@ public class GenUtils { /** * 初始化表信息 */ - public static void initTable(GenTable genTable, String operName) { + public static void initTable(GenTable genTable, Long operId) { genTable.setClassName(convertClassName(genTable.getTableName())); genTable.setPackageName(GenConfig.getPackageName()); genTable.setModuleName(getModuleName(GenConfig.getPackageName())); genTable.setBusinessName(getBusinessName(genTable.getTableName())); genTable.setFunctionName(replaceText(genTable.getTableComment())); genTable.setFunctionAuthor(GenConfig.getAuthor()); - genTable.setCreateBy(operName); + genTable.setCreateBy(operId); } /** diff --git a/ruoyi-modules/ruoyi-job/pom.xml b/ruoyi-modules/ruoyi-job/pom.xml index 145b718c..020a7e47 100644 --- a/ruoyi-modules/ruoyi-job/pom.xml +++ b/ruoyi-modules/ruoyi-job/pom.xml @@ -71,6 +71,17 @@ ruoyi-api-system + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-mybatis + + + + diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/service/MultiService.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/service/MultiService.java index 217dd4da..5df7eaaf 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/service/MultiService.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/service/MultiService.java @@ -1,13 +1,13 @@ package org.dromara.job.service; -import org.dromara.system.api.RemoteUserService; -import org.dromara.system.api.domain.SysUser; -import org.dromara.system.api.model.LoginUser; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import io.seata.spring.annotation.GlobalTransactional; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.bo.RemoteUserBo; +import org.dromara.system.api.model.LoginUser; import org.springframework.stereotype.Service; /** @@ -30,10 +30,10 @@ public class MultiService { public void multiServiceHandler() throws Exception { LoginUser admin = remoteUserService.getUserInfo("admin"); XxlJobHelper.log("XXL-JOB, multiServiceHandler result: {}", admin.toString()); - SysUser sysUser = new SysUser(); - sysUser.setUserName("test"); - sysUser.setNickName("test"); - remoteUserService.registerUserInfo(sysUser); + RemoteUserBo remoteUserBo = new RemoteUserBo(); + remoteUserBo.setUserName("test"); + remoteUserBo.setNickName("test"); + remoteUserService.registerUserInfo(remoteUserBo); } } diff --git a/ruoyi-modules/ruoyi-resource/pom.xml b/ruoyi-modules/ruoyi-resource/pom.xml index f3c8ae7e..eac78e98 100644 --- a/ruoyi-modules/ruoyi-resource/pom.xml +++ b/ruoyi-modules/ruoyi-resource/pom.xml @@ -100,6 +100,10 @@ org.dromara ruoyi-api-resource + + org.dromara + ruoyi-common-tenant + diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java index 48a749bf..e36ea0ca 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/controller/SysOssController.java @@ -3,6 +3,7 @@ package org.dromara.resource.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.QueryGroup; import org.dromara.common.core.web.controller.BaseController; @@ -11,9 +12,9 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.resource.domain.bo.SysOssBo; +import org.dromara.resource.domain.vo.SysOssUploadVo; import org.dromara.resource.domain.vo.SysOssVo; import org.dromara.resource.service.ISysOssService; -import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -23,9 +24,7 @@ import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotEmpty; import java.io.IOException; import java.util.Arrays; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * 文件上传 控制层 @@ -69,16 +68,16 @@ public class SysOssController extends BaseController { @SaCheckPermission("system:oss:upload") @Log(title = "OSS对象存储", businessType = BusinessType.INSERT) @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public R> upload(@RequestPart("file") MultipartFile file) { + public R upload(@RequestPart("file") MultipartFile file) { if (ObjectUtil.isNull(file)) { return R.fail("上传文件不能为空"); } SysOssVo oss = iSysOssService.upload(file); - Map map = new HashMap<>(2); - map.put("url", oss.getUrl()); - map.put("fileName", oss.getOriginalName()); - map.put("ossId", oss.getOssId().toString()); - return R.ok(map); + SysOssUploadVo uploadVo = new SysOssUploadVo(); + uploadVo.setUrl(oss.getUrl()); + uploadVo.setFileName(oss.getOriginalName()); + uploadVo.setOssId(oss.getOssId().toString()); + return R.ok(uploadVo); } /** diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java index cf110010..8a1cc4f2 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOss.java @@ -2,9 +2,9 @@ package org.dromara.resource.domain; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.web.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; /** * OSS对象存储对象 @@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) @TableName("sys_oss") -public class SysOss extends BaseEntity { +public class SysOss extends TenantEntity { /** * 对象存储主键 diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java index 38034696..b720ed02 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/SysOssConfig.java @@ -2,9 +2,9 @@ package org.dromara.resource.domain; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.web.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; /** * 对象存储配置对象 sys_oss_config @@ -14,7 +14,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = true) @TableName("sys_oss_config") -public class SysOssConfig extends BaseEntity { +public class SysOssConfig extends TenantEntity { /** * 主建 diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java new file mode 100644 index 00000000..9e8ca2d0 --- /dev/null +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/domain/vo/SysOssUploadVo.java @@ -0,0 +1,28 @@ +package org.dromara.resource.domain.vo; + +import lombok.Data; + +/** + * 上传对象信息 + * + * @author Michelle.Chung + */ +@Data +public class SysOssUploadVo { + + /** + * URL地址 + */ + private String url; + + /** + * 文件名 + */ + private String fileName; + + /** + * 对象存储主键 + */ + private String ossId; + +} diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java index 29c96d24..0159d45d 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java @@ -6,7 +6,7 @@ import org.dromara.common.oss.core.OssClient; import org.dromara.common.oss.entity.UploadResult; import org.dromara.common.oss.factory.OssFactory; import org.dromara.resource.api.RemoteFileService; -import org.dromara.resource.api.domain.SysFile; +import org.dromara.resource.api.domain.RemoteFile; import org.dromara.resource.domain.bo.SysOssBo; import org.dromara.resource.service.ISysOssService; import lombok.RequiredArgsConstructor; @@ -33,7 +33,7 @@ public class RemoteFileServiceImpl implements RemoteFileService { */ @Transactional(rollbackFor = Exception.class) @Override - public SysFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException { + public RemoteFile upload(String name, String originalFilename, String contentType, byte[] file) throws ServiceException { try { String suffix = StringUtils.substring(originalFilename, originalFilename.lastIndexOf("."), originalFilename.length()); OssClient storage = OssFactory.instance(); @@ -46,7 +46,7 @@ public class RemoteFileServiceImpl implements RemoteFileService { oss.setOriginalName(originalFilename); oss.setService(storage.getConfigKey()); sysOssService.insertByBo(oss); - SysFile sysFile = new SysFile(); + RemoteFile sysFile = new RemoteFile(); sysFile.setOssId(oss.getOssId()); sysFile.setName(uploadResult.getFilename()); sysFile.setUrl(uploadResult.getUrl()); diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java index 3009854b..fa105bcf 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteSmsServiceImpl.java @@ -7,7 +7,7 @@ import org.dromara.common.sms.config.properties.SmsProperties; import org.dromara.common.sms.core.SmsTemplate; import org.dromara.common.sms.entity.SmsResult; import org.dromara.resource.api.RemoteSmsService; -import org.dromara.resource.api.domain.SysSms; +import org.dromara.resource.api.domain.RemoteSms; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboService; @@ -35,13 +35,13 @@ public class RemoteSmsServiceImpl implements RemoteSmsService { * @param templateId 模板id * @param param 模板对应参数 */ - public SysSms send(String phones, String templateId, Map param) throws ServiceException { + public RemoteSms send(String phones, String templateId, Map param) throws ServiceException { if (!smsProperties.getEnabled()) { throw new ServiceException("当前系统没有开启短信功能!"); } SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class); SmsResult smsResult = smsTemplate.send(phones, templateId, param); - return BeanUtil.toBean(smsResult, SysSms.class); + return BeanUtil.toBean(smsResult, RemoteSms.class); } } diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java index a6974c24..aad7d40e 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssConfigMapper.java @@ -12,6 +12,6 @@ import org.dromara.resource.domain.vo.SysOssConfigVo; * @author 孤舟烟雨 * @date 2021-08-13 */ -public interface SysOssConfigMapper extends BaseMapperPlus { +public interface SysOssConfigMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java index 12d51ae1..629ad200 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/mapper/SysOssMapper.java @@ -9,5 +9,5 @@ import org.dromara.resource.domain.vo.SysOssVo; * * @author Lion Li */ -public interface SysOssMapper extends BaseMapperPlus { +public interface SysOssMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java index 96f30702..8605336d 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssConfigServiceImpl.java @@ -7,27 +7,31 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.JsonUtils; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.oss.constant.OssConstant; import org.dromara.common.redis.utils.CacheUtils; import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.tenant.core.TenantEntity; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.resource.domain.SysOssConfig; import org.dromara.resource.domain.bo.SysOssConfigBo; import org.dromara.resource.domain.vo.SysOssConfigVo; import org.dromara.resource.mapper.SysOssConfigMapper; import org.dromara.resource.service.ISysOssConfigService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Collection; import java.util.List; +import java.util.Map; /** * 对象存储配置Service业务层处理 @@ -48,14 +52,25 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService { */ @Override public void init() { - List list = baseMapper.selectList(); - // 加载OSS初始化配置 - for (SysOssConfig config : list) { - String configKey = config.getConfigKey(); - if ("0".equals(config.getStatus())) { - RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey); + List list = TenantHelper.ignore(() -> + baseMapper.selectList( + new LambdaQueryWrapper().orderByAsc(TenantEntity::getTenantId)) + ); + Map> map = StreamUtils.groupByKey(list, SysOssConfig::getTenantId); + try { + for (String tenantId : map.keySet()) { + TenantHelper.setDynamic(tenantId); + // 加载OSS初始化配置 + for (SysOssConfig config : map.get(tenantId)) { + String configKey = config.getConfigKey(); + if ("0".equals(config.getStatus())) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, configKey); + } + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } } - CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } finally { + TenantHelper.clearDynamic(); } } diff --git a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java index d7736499..db98dc35 100644 --- a/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java +++ b/ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/service/impl/SysOssServiceImpl.java @@ -89,7 +89,7 @@ public class SysOssServiceImpl implements ISysOssService { lqw.eq(StringUtils.isNotBlank(bo.getUrl()), SysOss::getUrl, bo.getUrl()); lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, SysOss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); - lqw.eq(StringUtils.isNotBlank(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); + lqw.eq(ObjectUtil.isNotNull(bo.getCreateBy()), SysOss::getCreateBy, bo.getCreateBy()); lqw.eq(StringUtils.isNotBlank(bo.getService()), SysOss::getService, bo.getService()); return lqw; } diff --git a/ruoyi-modules/ruoyi-system/pom.xml b/ruoyi-modules/ruoyi-system/pom.xml index dd2c982c..72f91c2f 100644 --- a/ruoyi-modules/ruoyi-system/pom.xml +++ b/ruoyi-modules/ruoyi-system/pom.xml @@ -80,6 +80,18 @@ org.dromara ruoyi-api-resource + + org.dromara + ruoyi-common-idempotent + + + org.dromara + ruoyi-common-tenant + + + org.dromara + ruoyi-common-translation + diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysLogininforController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java similarity index 74% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysLogininforController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java index 4b0bacf8..1dda4651 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysLogininforController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysLogininforController.java @@ -1,7 +1,8 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.dromara.common.core.constant.CacheConstants; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.web.controller.BaseController; import org.dromara.common.excel.utils.ExcelUtil; @@ -10,9 +11,9 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.redis.utils.RedisUtils; -import org.dromara.system.api.domain.SysLogininfor; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; import org.dromara.system.service.ISysLogininforService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -33,11 +34,11 @@ public class SysLogininforController extends BaseController { private final ISysLogininforService logininforService; /** - * 查询系统访问记录列表 + * 获取系统访问记录列表 */ @SaCheckPermission("system:logininfor:list") @GetMapping("/list") - public TableDataInfo list(SysLogininfor logininfor, PageQuery pageQuery) { + public TableDataInfo list(SysLogininforBo logininfor, PageQuery pageQuery) { return logininforService.selectPageLogininforList(logininfor, pageQuery); } @@ -47,15 +48,14 @@ public class SysLogininforController extends BaseController { @Log(title = "登录日志", businessType = BusinessType.EXPORT) @SaCheckPermission("system:logininfor:export") @PostMapping("/export") - public void export(HttpServletResponse response, SysLogininfor logininfor) { - List list = logininforService.selectLogininforList(logininfor); - ExcelUtil.exportExcel(list, "登录日志", SysLogininfor.class, response); + public void export(SysLogininforBo logininfor, HttpServletResponse response) { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil.exportExcel(list, "登录日志", SysLogininforVo.class, response); } /** - * 删除系统访问记录 - * - * @param infoIds 记录ID串 + * 批量删除登录日志 + * @param infoIds 日志ids */ @SaCheckPermission("system:logininfor:remove") @Log(title = "登录日志", businessType = BusinessType.DELETE) @@ -65,10 +65,10 @@ public class SysLogininforController extends BaseController { } /** - * 清空系统访问记录 + * 清理系统访问记录 */ @SaCheckPermission("system:logininfor:remove") - @Log(title = "登录日志", businessType = BusinessType.DELETE) + @Log(title = "登录日志", businessType = BusinessType.CLEAN) @DeleteMapping("/clean") public R clean() { logininforService.cleanLogininfor(); @@ -79,7 +79,7 @@ public class SysLogininforController extends BaseController { @Log(title = "账户解锁", businessType = BusinessType.OTHER) @GetMapping("/unlock/{userName}") public R unlock(@PathVariable("userName") String userName) { - String loginName = CacheConstants.PWD_ERR_CNT_KEY + userName; + String loginName = GlobalConstants.PWD_ERR_CNT_KEY + userName; if (RedisUtils.hasKey(loginName)) { RedisUtils.deleteObject(loginName); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysOperlogController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java similarity index 75% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysOperlogController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java index 22b620cc..944f326e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysOperlogController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysOperlogController.java @@ -1,6 +1,7 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.web.controller.BaseController; import org.dromara.common.excel.utils.ExcelUtil; @@ -8,9 +9,9 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysOperLog; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; import org.dromara.system.service.ISysOperLogService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -31,11 +32,11 @@ public class SysOperlogController extends BaseController { private final ISysOperLogService operLogService; /** - * 查询操作日志记录列表 + * 获取操作日志记录列表 */ @SaCheckPermission("system:operlog:list") @GetMapping("/list") - public TableDataInfo list(SysOperLog operLog, PageQuery pageQuery) { + public TableDataInfo list(SysOperLogBo operLog, PageQuery pageQuery) { return operLogService.selectPageOperLogList(operLog, pageQuery); } @@ -45,15 +46,14 @@ public class SysOperlogController extends BaseController { @Log(title = "操作日志", businessType = BusinessType.EXPORT) @SaCheckPermission("system:operlog:export") @PostMapping("/export") - public void export(HttpServletResponse response, SysOperLog operLog) { - List list = operLogService.selectOperLogList(operLog); - ExcelUtil.exportExcel(list, "操作日志", SysOperLog.class, response); + public void export(SysOperLogBo operLog, HttpServletResponse response) { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil.exportExcel(list, "操作日志", SysOperLogVo.class, response); } /** - * 删除操作日志记录 - * - * @param operIds 操作日志ID串 + * 批量删除操作日志记录 + * @param operIds 日志ids */ @Log(title = "操作日志", businessType = BusinessType.DELETE) @SaCheckPermission("system:operlog:remove") @@ -63,7 +63,7 @@ public class SysOperlogController extends BaseController { } /** - * 清空操作日志记录 + * 清理操作日志记录 */ @SaCheckPermission("system:operlog:remove") @Log(title = "操作日志", businessType = BusinessType.CLEAN) @@ -72,5 +72,4 @@ public class SysOperlogController extends BaseController { operLogService.cleanOperLog(); return R.ok(); } - } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysUserOnlineController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java similarity index 74% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysUserOnlineController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java index c0d32dfa..652b22e8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysUserOnlineController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/monitor/SysUserOnlineController.java @@ -1,8 +1,10 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.monitor; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StreamUtils; @@ -13,7 +15,6 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.system.api.domain.SysUserOnline; -import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; @@ -31,9 +32,9 @@ import java.util.List; public class SysUserOnlineController extends BaseController { /** - * 在线用户列表 + * 获取在线用户监控列表 * - * @param ipaddr ip地址 + * @param ipaddr IP地址 * @param userName 用户名 */ @SaCheckPermission("monitor:online:list") @@ -41,36 +42,39 @@ public class SysUserOnlineController extends BaseController { public TableDataInfo list(String ipaddr, String userName) { // 获取所有未过期的 token List keys = StpUtil.searchTokenValue("", 0, -1, false); - List userOnlineList = new ArrayList(); + List userOnlineDTOList = new ArrayList<>(); for (String key : keys) { String token = StringUtils.substringAfterLast(key, ":"); - // 如果已经过期则踢下线 + // 如果已经过期则跳过 if (StpUtil.stpLogic.getTokenActivityTimeoutByToken(token) < -1) { continue; } - userOnlineList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); + userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); } if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { - userOnlineList = StreamUtils.filter(userOnlineList, userOnline -> + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> StringUtils.equals(ipaddr, userOnline.getIpaddr()) && StringUtils.equals(userName, userOnline.getUserName()) ); } else if (StringUtils.isNotEmpty(ipaddr)) { - userOnlineList = StreamUtils.filter(userOnlineList, userOnline -> + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> StringUtils.equals(ipaddr, userOnline.getIpaddr()) ); } else if (StringUtils.isNotEmpty(userName)) { - userOnlineList = StreamUtils.filter(userOnlineList, userOnline -> + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> StringUtils.equals(userName, userOnline.getUserName()) ); } - Collections.reverse(userOnlineList); - userOnlineList.removeAll(Collections.singleton(null)); + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class); return TableDataInfo.build(userOnlineList); } /** * 强退用户 + * + * @param tokenId token值 */ @SaCheckPermission("monitor:online:forceLogout") @Log(title = "在线用户", businessType = BusinessType.FORCE) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java similarity index 79% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysConfigController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java index ce61078e..b5571c80 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysConfigController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysConfigController.java @@ -1,6 +1,7 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.web.controller.BaseController; import org.dromara.common.excel.utils.ExcelUtil; @@ -8,9 +9,9 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; import org.dromara.system.service.ISysConfigService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,35 +36,36 @@ public class SysConfigController extends BaseController { */ @SaCheckPermission("system:config:list") @GetMapping("/list") - public TableDataInfo list(SysConfig config, PageQuery pageQuery) { + public TableDataInfo list(SysConfigBo config, PageQuery pageQuery) { return configService.selectPageConfigList(config, pageQuery); } /** - * 导出参数配置 + * 导出参数配置列表 */ @Log(title = "参数管理", businessType = BusinessType.EXPORT) @SaCheckPermission("system:config:export") @PostMapping("/export") - public void export(HttpServletResponse response, SysConfig config) { - List list = configService.selectConfigList(config); - ExcelUtil.exportExcel(list, "参数数据", SysConfig.class, response); + public void export(SysConfigBo config, HttpServletResponse response) { + List list = configService.selectConfigList(config); + ExcelUtil.exportExcel(list, "参数数据", SysConfigVo.class, response); } /** * 根据参数编号获取详细信息 * - * @param configId 配置ID + * @param configId 参数ID */ + @SaCheckPermission("system:config:query") @GetMapping(value = "/{configId}") - public R getInfo(@PathVariable Long configId) { + public R getInfo(@PathVariable Long configId) { return R.ok(configService.selectConfigById(configId)); } /** * 根据参数键名查询参数值 * - * @param configKey 配置key + * @param configKey 参数Key */ @GetMapping(value = "/configKey/{configKey}") public R getConfigKey(@PathVariable String configKey) { @@ -76,7 +78,7 @@ public class SysConfigController extends BaseController { @SaCheckPermission("system:config:add") @Log(title = "参数管理", businessType = BusinessType.INSERT) @PostMapping - public R add(@Validated @RequestBody SysConfig config) { + public R add(@Validated @RequestBody SysConfigBo config) { if (!configService.checkConfigKeyUnique(config)) { return R.fail("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); } @@ -90,7 +92,7 @@ public class SysConfigController extends BaseController { @SaCheckPermission("system:config:edit") @Log(title = "参数管理", businessType = BusinessType.UPDATE) @PutMapping - public R edit(@Validated @RequestBody SysConfig config) { + public R edit(@Validated @RequestBody SysConfigBo config) { if (!configService.checkConfigKeyUnique(config)) { return R.fail("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); } @@ -104,7 +106,7 @@ public class SysConfigController extends BaseController { @SaCheckPermission("system:config:edit") @Log(title = "参数管理", businessType = BusinessType.UPDATE) @PutMapping("/updateByKey") - public R updateByKey(@RequestBody SysConfig config) { + public R updateByKey(@RequestBody SysConfigBo config) { configService.updateConfig(config); return R.ok(); } @@ -112,7 +114,7 @@ public class SysConfigController extends BaseController { /** * 删除参数配置 * - * @param configIds 配置ID串 + * @param configIds 参数ID串 */ @SaCheckPermission("system:config:remove") @Log(title = "参数管理", businessType = BusinessType.DELETE) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysDeptController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java similarity index 82% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysDeptController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java index 625551d7..ee6c84e8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysDeptController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDeptController.java @@ -1,16 +1,17 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.convert.Convert; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.web.controller.BaseController; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; -import org.dromara.system.api.domain.SysDept; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.service.ISysDeptService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -34,8 +35,8 @@ public class SysDeptController extends BaseController { */ @SaCheckPermission("system:dept:list") @GetMapping("/list") - public R> list(SysDept dept) { - List depts = deptService.selectDeptList(dept); + public R> list(SysDeptBo dept) { + List depts = deptService.selectDeptList(dept); return R.ok(depts); } @@ -46,9 +47,9 @@ public class SysDeptController extends BaseController { */ @SaCheckPermission("system:dept:list") @GetMapping("/list/exclude/{deptId}") - public R> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { - List depts = deptService.selectDeptList(new SysDept()); - depts.removeIf(d -> d.getDeptId().intValue() == deptId + public R> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { + List depts = deptService.selectDeptList(new SysDeptBo()); + depts.removeIf(d -> d.getDeptId().equals(deptId) || StringUtils.splitList(d.getAncestors()).contains(Convert.toStr(deptId))); return R.ok(depts); } @@ -60,7 +61,7 @@ public class SysDeptController extends BaseController { */ @SaCheckPermission("system:dept:query") @GetMapping(value = "/{deptId}") - public R getInfo(@PathVariable Long deptId) { + public R getInfo(@PathVariable Long deptId) { deptService.checkDeptDataScope(deptId); return R.ok(deptService.selectDeptById(deptId)); } @@ -71,7 +72,7 @@ public class SysDeptController extends BaseController { @SaCheckPermission("system:dept:add") @Log(title = "部门管理", businessType = BusinessType.INSERT) @PostMapping - public R add(@Validated @RequestBody SysDept dept) { + public R add(@Validated @RequestBody SysDeptBo dept) { if (!deptService.checkDeptNameUnique(dept)) { return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); } @@ -84,7 +85,7 @@ public class SysDeptController extends BaseController { @SaCheckPermission("system:dept:edit") @Log(title = "部门管理", businessType = BusinessType.UPDATE) @PutMapping - public R edit(@Validated @RequestBody SysDept dept) { + public R edit(@Validated @RequestBody SysDeptBo dept) { Long deptId = dept.getDeptId(); deptService.checkDeptDataScope(deptId); if (!deptService.checkDeptNameUnique(dept)) { @@ -100,6 +101,8 @@ public class SysDeptController extends BaseController { /** * 删除部门 + * + * @param deptId 部门ID */ @SaCheckPermission("system:dept:remove") @Log(title = "部门管理", businessType = BusinessType.DELETE) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysDictDataController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java similarity index 75% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysDictDataController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java index 26857786..67f5cad3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysDictDataController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java @@ -1,7 +1,8 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.web.controller.BaseController; import org.dromara.common.excel.utils.ExcelUtil; @@ -9,10 +10,10 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysDictData; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; import org.dromara.system.service.ISysDictDataService; import org.dromara.system.service.ISysDictTypeService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -39,7 +40,7 @@ public class SysDictDataController extends BaseController { */ @SaCheckPermission("system:dict:list") @GetMapping("/list") - public TableDataInfo list(SysDictData dictData, PageQuery pageQuery) { + public TableDataInfo list(SysDictDataBo dictData, PageQuery pageQuery) { return dictDataService.selectPageDictDataList(dictData, pageQuery); } @@ -49,9 +50,9 @@ public class SysDictDataController extends BaseController { @Log(title = "字典数据", businessType = BusinessType.EXPORT) @SaCheckPermission("system:dict:export") @PostMapping("/export") - public void export(HttpServletResponse response, SysDictData dictData) { - List list = dictDataService.selectDictDataList(dictData); - ExcelUtil.exportExcel(list, "字典数据", SysDictData.class, response); + public void export(SysDictDataBo dictData, HttpServletResponse response) { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil.exportExcel(list, "字典数据", SysDictDataVo.class, response); } /** @@ -61,7 +62,7 @@ public class SysDictDataController extends BaseController { */ @SaCheckPermission("system:dict:query") @GetMapping(value = "/{dictCode}") - public R getInfo(@PathVariable Long dictCode) { + public R getInfo(@PathVariable Long dictCode) { return R.ok(dictDataService.selectDictDataById(dictCode)); } @@ -71,10 +72,10 @@ public class SysDictDataController extends BaseController { * @param dictType 字典类型 */ @GetMapping(value = "/type/{dictType}") - public R> dictType(@PathVariable String dictType) { - List data = dictTypeService.selectDictDataByType(dictType); + public R> dictType(@PathVariable String dictType) { + List data = dictTypeService.selectDictDataByType(dictType); if (ObjectUtil.isNull(data)) { - data = new ArrayList(); + data = new ArrayList<>(); } return R.ok(data); } @@ -85,7 +86,7 @@ public class SysDictDataController extends BaseController { @SaCheckPermission("system:dict:add") @Log(title = "字典数据", businessType = BusinessType.INSERT) @PostMapping - public R add(@Validated @RequestBody SysDictData dict) { + public R add(@Validated @RequestBody SysDictDataBo dict) { dictDataService.insertDictData(dict); return R.ok(); } @@ -96,7 +97,7 @@ public class SysDictDataController extends BaseController { @SaCheckPermission("system:dict:edit") @Log(title = "字典数据", businessType = BusinessType.UPDATE) @PutMapping - public R edit(@Validated @RequestBody SysDictData dict) { + public R edit(@Validated @RequestBody SysDictDataBo dict) { dictDataService.updateDictData(dict); return R.ok(); } @@ -104,7 +105,7 @@ public class SysDictDataController extends BaseController { /** * 删除字典类型 * - * @param dictCodes 字典Code串 + * @param dictCodes 字典code串 */ @SaCheckPermission("system:dict:remove") @Log(title = "字典类型", businessType = BusinessType.DELETE) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysDictTypeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java similarity index 79% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysDictTypeController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java index 07729adc..fe5c71d8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysDictTypeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysDictTypeController.java @@ -1,7 +1,7 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.dromara.common.core.constant.UserConstants; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.web.controller.BaseController; import org.dromara.common.excel.utils.ExcelUtil; @@ -9,9 +9,9 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysDictType; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictTypeVo; import org.dromara.system.service.ISysDictTypeService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -36,7 +36,7 @@ public class SysDictTypeController extends BaseController { */ @SaCheckPermission("system:dict:list") @GetMapping("/list") - public TableDataInfo list(SysDictType dictType, PageQuery pageQuery) { + public TableDataInfo list(SysDictTypeBo dictType, PageQuery pageQuery) { return dictTypeService.selectPageDictTypeList(dictType, pageQuery); } @@ -46,9 +46,9 @@ public class SysDictTypeController extends BaseController { @Log(title = "字典类型", businessType = BusinessType.EXPORT) @SaCheckPermission("system:dict:export") @PostMapping("/export") - public void export(HttpServletResponse response, SysDictType dictType) { - List list = dictTypeService.selectDictTypeList(dictType); - ExcelUtil.exportExcel(list, "字典类型", SysDictType.class, response); + public void export(SysDictTypeBo dictType, HttpServletResponse response) { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil.exportExcel(list, "字典类型", SysDictTypeVo.class, response); } /** @@ -58,7 +58,7 @@ public class SysDictTypeController extends BaseController { */ @SaCheckPermission("system:dict:query") @GetMapping(value = "/{dictId}") - public R getInfo(@PathVariable Long dictId) { + public R getInfo(@PathVariable Long dictId) { return R.ok(dictTypeService.selectDictTypeById(dictId)); } @@ -68,7 +68,7 @@ public class SysDictTypeController extends BaseController { @SaCheckPermission("system:dict:add") @Log(title = "字典类型", businessType = BusinessType.INSERT) @PostMapping - public R add(@Validated @RequestBody SysDictType dict) { + public R add(@Validated @RequestBody SysDictTypeBo dict) { if (!dictTypeService.checkDictTypeUnique(dict)) { return R.fail("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); } @@ -82,7 +82,7 @@ public class SysDictTypeController extends BaseController { @SaCheckPermission("system:dict:edit") @Log(title = "字典类型", businessType = BusinessType.UPDATE) @PutMapping - public R edit(@Validated @RequestBody SysDictType dict) { + public R edit(@Validated @RequestBody SysDictTypeBo dict) { if (!dictTypeService.checkDictTypeUnique(dict)) { return R.fail("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); } @@ -118,8 +118,8 @@ public class SysDictTypeController extends BaseController { * 获取字典选择框列表 */ @GetMapping("/optionselect") - public R> optionselect() { - List dictTypes = dictTypeService.selectDictTypeAll(); + public R> optionselect() { + List dictTypes = dictTypeService.selectDictTypeAll(); return R.ok(dictTypes); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysMenuController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java similarity index 58% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysMenuController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java index 8b280659..fd9ba9f0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysMenuController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysMenuController.java @@ -1,7 +1,11 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import cn.dev33.satoken.annotation.SaMode; import cn.hutool.core.lang.tree.Tree; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; @@ -10,15 +14,15 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.bo.SysMenuBo; +import org.dromara.system.domain.vo.MenuTreeSelectVo; import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; import org.dromara.system.service.ISysMenuService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * 菜单信息 @@ -33,14 +37,28 @@ public class SysMenuController extends BaseController { private final ISysMenuService menuService; + /** + * 获取路由信息 + * + * @return 路由信息 + */ + @GetMapping("/getRouters") + public R> getRouters() { + List menus = menuService.selectMenuTreeByUserId(LoginHelper.getUserId()); + return R.ok(menuService.buildMenus(menus)); + } + /** * 获取菜单列表 */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) @SaCheckPermission("system:menu:list") @GetMapping("/list") - public R> list(SysMenu menu) { - Long userId = LoginHelper.getUserId(); - List menus = menuService.selectMenuList(menu, userId); + public R> list(SysMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); return R.ok(menus); } @@ -49,19 +67,27 @@ public class SysMenuController extends BaseController { * * @param menuId 菜单ID */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) @SaCheckPermission("system:menu:query") @GetMapping(value = "/{menuId}") - public R getInfo(@PathVariable Long menuId) { + public R getInfo(@PathVariable Long menuId) { return R.ok(menuService.selectMenuById(menuId)); } /** * 获取菜单下拉树列表 */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:query") @GetMapping("/treeselect") - public R>> treeselect(SysMenu menu) { - Long userId = LoginHelper.getUserId(); - List menus = menuService.selectMenuList(menu, userId); + public R>> treeselect(SysMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); return R.ok(menuService.buildMenuTreeSelect(menus)); } @@ -70,23 +96,44 @@ public class SysMenuController extends BaseController { * * @param roleId 角色ID */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) + @SaCheckPermission("system:menu:query") @GetMapping(value = "/roleMenuTreeselect/{roleId}") - public R> roleMenuTreeselect(@PathVariable("roleId") Long roleId) { - Long userId = LoginHelper.getUserId(); - List menus = menuService.selectMenuList(userId); - Map ajax = new HashMap<>(); - ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId)); - ajax.put("menus", menuService.buildMenuTreeSelect(menus)); - return R.ok(ajax); + public R roleMenuTreeselect(@PathVariable("roleId") Long roleId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId()); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByRoleId(roleId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 加载对应租户套餐菜单列表树 + * + * @param packageId 租户套餐ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:menu:query") + @GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}") + public R tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId()); + MenuTreeSelectVo selectVo = new MenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByPackageId(packageId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); } /** * 新增菜单 */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) @SaCheckPermission("system:menu:add") @Log(title = "菜单管理", businessType = BusinessType.INSERT) @PostMapping - public R add(@Validated @RequestBody SysMenu menu) { + public R add(@Validated @RequestBody SysMenuBo menu) { if (!menuService.checkMenuNameUnique(menu)) { return R.fail("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { @@ -98,10 +145,11 @@ public class SysMenuController extends BaseController { /** * 修改菜单 */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) @SaCheckPermission("system:menu:edit") @Log(title = "菜单管理", businessType = BusinessType.UPDATE) @PutMapping - public R edit(@Validated @RequestBody SysMenu menu) { + public R edit(@Validated @RequestBody SysMenuBo menu) { if (!menuService.checkMenuNameUnique(menu)) { return R.fail("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { @@ -117,6 +165,7 @@ public class SysMenuController extends BaseController { * * @param menuId 菜单ID */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) @SaCheckPermission("system:menu:remove") @Log(title = "菜单管理", businessType = BusinessType.DELETE) @DeleteMapping("/{menuId}") @@ -130,15 +179,4 @@ public class SysMenuController extends BaseController { return toAjax(menuService.deleteMenuById(menuId)); } - /** - * 获取路由信息 - * - * @return 路由信息 - */ - @GetMapping("getRouters") - public R> getRouters() { - Long userId = LoginHelper.getUserId(); - List menus = menuService.selectMenuTreeByUserId(userId); - return R.ok(menuService.buildMenus(menus)); - } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysNoticeController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java similarity index 80% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysNoticeController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java index 5bd652f7..585a7813 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysNoticeController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysNoticeController.java @@ -1,15 +1,16 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.web.controller.BaseController; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; import org.dromara.system.service.ISysNoticeService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -31,18 +32,18 @@ public class SysNoticeController extends BaseController { */ @SaCheckPermission("system:notice:list") @GetMapping("/list") - public TableDataInfo list(SysNotice notice, PageQuery pageQuery) { + public TableDataInfo list(SysNoticeBo notice, PageQuery pageQuery) { return noticeService.selectPageNoticeList(notice, pageQuery); } /** * 根据通知公告编号获取详细信息 * - * @param noticeId 通知ID + * @param noticeId 公告ID */ @SaCheckPermission("system:notice:query") @GetMapping(value = "/{noticeId}") - public R getInfo(@PathVariable Long noticeId) { + public R getInfo(@PathVariable Long noticeId) { return R.ok(noticeService.selectNoticeById(noticeId)); } @@ -52,7 +53,7 @@ public class SysNoticeController extends BaseController { @SaCheckPermission("system:notice:add") @Log(title = "通知公告", businessType = BusinessType.INSERT) @PostMapping - public R add(@Validated @RequestBody SysNotice notice) { + public R add(@Validated @RequestBody SysNoticeBo notice) { return toAjax(noticeService.insertNotice(notice)); } @@ -62,14 +63,14 @@ public class SysNoticeController extends BaseController { @SaCheckPermission("system:notice:edit") @Log(title = "通知公告", businessType = BusinessType.UPDATE) @PutMapping - public R edit(@Validated @RequestBody SysNotice notice) { + public R edit(@Validated @RequestBody SysNoticeBo notice) { return toAjax(noticeService.updateNotice(notice)); } /** * 删除通知公告 * - * @param noticeIds 通知ID串 + * @param noticeIds 公告ID串 */ @SaCheckPermission("system:notice:remove") @Log(title = "通知公告", businessType = BusinessType.DELETE) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysPostController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java similarity index 79% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysPostController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java index 755c8e03..7a2b22f7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysPostController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPostController.java @@ -1,6 +1,7 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.web.controller.BaseController; import org.dromara.common.excel.utils.ExcelUtil; @@ -8,9 +9,9 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.service.ISysPostService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,16 +36,19 @@ public class SysPostController extends BaseController { */ @SaCheckPermission("system:post:list") @GetMapping("/list") - public TableDataInfo list(SysPost post, PageQuery pageQuery) { + public TableDataInfo list(SysPostBo post, PageQuery pageQuery) { return postService.selectPagePostList(post, pageQuery); } + /** + * 导出岗位列表 + */ @Log(title = "岗位管理", businessType = BusinessType.EXPORT) @SaCheckPermission("system:post:export") @PostMapping("/export") - public void export(HttpServletResponse response, SysPost post) { - List list = postService.selectPostList(post); - ExcelUtil.exportExcel(list, "岗位数据", SysPost.class, response); + public void export(SysPostBo post, HttpServletResponse response) { + List list = postService.selectPostList(post); + ExcelUtil.exportExcel(list, "岗位数据", SysPostVo.class, response); } /** @@ -54,7 +58,7 @@ public class SysPostController extends BaseController { */ @SaCheckPermission("system:post:query") @GetMapping(value = "/{postId}") - public R getInfo(@PathVariable Long postId) { + public R getInfo(@PathVariable Long postId) { return R.ok(postService.selectPostById(postId)); } @@ -64,7 +68,7 @@ public class SysPostController extends BaseController { @SaCheckPermission("system:post:add") @Log(title = "岗位管理", businessType = BusinessType.INSERT) @PostMapping - public R add(@Validated @RequestBody SysPost post) { + public R add(@Validated @RequestBody SysPostBo post) { if (!postService.checkPostNameUnique(post)) { return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); } else if (!postService.checkPostCodeUnique(post)) { @@ -79,7 +83,7 @@ public class SysPostController extends BaseController { @SaCheckPermission("system:post:edit") @Log(title = "岗位管理", businessType = BusinessType.UPDATE) @PutMapping - public R edit(@Validated @RequestBody SysPost post) { + public R edit(@Validated @RequestBody SysPostBo post) { if (!postService.checkPostNameUnique(post)) { return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); } else if (!postService.checkPostCodeUnique(post)) { @@ -104,8 +108,8 @@ public class SysPostController extends BaseController { * 获取岗位选择框列表 */ @GetMapping("/optionselect") - public R> optionselect() { - List posts = postService.selectPostAll(); + public R> optionselect() { + List posts = postService.selectPostAll(); return R.ok(posts); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysProfileController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java similarity index 65% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysProfileController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java index 3d406f3c..4bc272b3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysProfileController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysProfileController.java @@ -1,9 +1,11 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.system; import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.io.FileUtil; -import cn.hutool.core.util.ObjectUtil; -import org.dromara.common.core.constant.UserConstants; +import io.seata.spring.annotation.GlobalTransactional; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboReference; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.file.MimeTypeUtils; @@ -12,12 +14,13 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.resource.api.RemoteFileService; -import org.dromara.resource.api.domain.SysFile; -import org.dromara.system.api.domain.SysUser; +import org.dromara.resource.api.domain.RemoteFile; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.bo.SysUserProfileBo; +import org.dromara.system.domain.vo.AvatarVo; +import org.dromara.system.domain.vo.ProfileVo; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysUserService; -import io.seata.spring.annotation.GlobalTransactional; -import lombok.RequiredArgsConstructor; -import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -25,8 +28,6 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; /** * 个人信息 业务处理 @@ -48,14 +49,13 @@ public class SysProfileController extends BaseController { * 个人信息 */ @GetMapping - public R> profile() { - String username = LoginHelper.getUsername(); - SysUser user = userService.selectUserByUserName(username); - Map ajax = new HashMap<>(); - ajax.put("user", user); - ajax.put("roleGroup", userService.selectUserRoleGroup(username)); - ajax.put("postGroup", userService.selectUserPostGroup(username)); - return R.ok(ajax); + public R profile() { + SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); + ProfileVo profileVo = new ProfileVo(); + profileVo.setUser(user); + profileVo.setRoleGroup(userService.selectUserRoleGroup(user.getUserName())); + profileVo.setPostGroup(userService.selectUserPostGroup(user.getUserName())); + return R.ok(profileVo); } /** @@ -63,17 +63,15 @@ public class SysProfileController extends BaseController { */ @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PutMapping - public R updateProfile(@RequestBody SysUser user) { + public R updateProfile(@RequestBody SysUserProfileBo profile) { + SysUserBo user = BeanUtil.toBean(profile, SysUserBo.class); if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); - } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + } + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } user.setUserId(LoginHelper.getUserId()); - user.setUserName(null); - user.setPassword(null); - user.setAvatar(null); - user.setDeptId(null); if (userService.updateUserProfile(user) > 0) { return R.ok(); } @@ -83,13 +81,13 @@ public class SysProfileController extends BaseController { /** * 重置密码 * - * @param oldPassword 旧密码 - * @param newPassword 新密码 + * @param newPassword 旧密码 + * @param oldPassword 新密码 */ @Log(title = "个人信息", businessType = BusinessType.UPDATE) @PutMapping("/updatePwd") public R updatePwd(String oldPassword, String newPassword) { - SysUser user = userService.selectUserById(LoginHelper.getUserId()); + SysUserVo user = userService.selectUserById(LoginHelper.getUserId()); String password = user.getPassword(); if (!BCrypt.checkpw(oldPassword, password)) { return R.fail("修改密码失败,旧密码错误"); @@ -97,7 +95,8 @@ public class SysProfileController extends BaseController { if (BCrypt.checkpw(newPassword, password)) { return R.fail("新密码不能与旧密码相同"); } - if (userService.resetUserPwd(user.getUserName(), BCrypt.hashpw(newPassword)) > 0) { + + if (userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(newPassword)) > 0) { return R.ok(); } return R.fail("修改密码异常,请联系管理员"); @@ -111,21 +110,18 @@ public class SysProfileController extends BaseController { @GlobalTransactional(rollbackFor = Exception.class) @Log(title = "用户头像", businessType = BusinessType.UPDATE) @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public R> avatar(@RequestPart("avatarfile") MultipartFile avatarfile) throws IOException { + public R avatar(@RequestPart("avatarfile") MultipartFile avatarfile) throws IOException { if (!avatarfile.isEmpty()) { String extension = FileUtil.extName(avatarfile.getOriginalFilename()); if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) { return R.fail("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式"); } - SysFile sysFile = remoteFileService.upload(avatarfile.getName(), avatarfile.getOriginalFilename(), avatarfile.getContentType(), avatarfile.getBytes()); - if (ObjectUtil.isNull(sysFile)) { - return R.fail("文件服务异常,请联系管理员"); - } - String url = sysFile.getUrl(); - if (userService.updateUserAvatar(LoginHelper.getUsername(), url)) { - Map ajax = new HashMap<>(); - ajax.put("imgUrl", url); - return R.ok(ajax); + RemoteFile oss = remoteFileService.upload(avatarfile.getName(), avatarfile.getOriginalFilename(), avatarfile.getContentType(), avatarfile.getBytes()); + String avatar = oss.getUrl(); + if (userService.updateUserAvatar(LoginHelper.getUserId(), oss.getOssId())) { + AvatarVo avatarVo = new AvatarVo(); + avatarVo.setImgUrl(avatar); + return R.ok(avatarVo); } } return R.fail("上传图片异常,请联系管理员"); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysRoleController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java similarity index 76% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysRoleController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java index 1688a803..4ce5e77f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysRoleController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java @@ -1,6 +1,7 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.web.controller.BaseController; import org.dromara.common.excel.utils.ExcelUtil; @@ -8,22 +9,21 @@ import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysDept; -import org.dromara.system.api.domain.SysRole; -import org.dromara.system.api.domain.SysUser; import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.DeptTreeSelectVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysDeptService; -import org.dromara.system.service.ISysPermissionService; import org.dromara.system.service.ISysRoleService; import org.dromara.system.service.ISysUserService; -import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * 角色信息 @@ -39,14 +39,13 @@ public class SysRoleController extends BaseController { private final ISysRoleService roleService; private final ISysUserService userService; private final ISysDeptService deptService; - private final ISysPermissionService permissionService; /** - * 查询角色信息列表 + * 获取角色信息列表 */ @SaCheckPermission("system:role:list") @GetMapping("/list") - public TableDataInfo list(SysRole role, PageQuery pageQuery) { + public TableDataInfo list(SysRoleBo role, PageQuery pageQuery) { return roleService.selectPageRoleList(role, pageQuery); } @@ -56,9 +55,9 @@ public class SysRoleController extends BaseController { @Log(title = "角色管理", businessType = BusinessType.EXPORT) @SaCheckPermission("system:role:export") @PostMapping("/export") - public void export(HttpServletResponse response, SysRole role) { - List list = roleService.selectRoleList(role); - ExcelUtil.exportExcel(list, "角色数据", SysRole.class, response); + public void export(SysRoleBo role, HttpServletResponse response) { + List list = roleService.selectRoleList(role); + ExcelUtil.exportExcel(list, "角色数据", SysRoleVo.class, response); } /** @@ -68,7 +67,7 @@ public class SysRoleController extends BaseController { */ @SaCheckPermission("system:role:query") @GetMapping(value = "/{roleId}") - public R getInfo(@PathVariable Long roleId) { + public R getInfo(@PathVariable Long roleId) { roleService.checkRoleDataScope(roleId); return R.ok(roleService.selectRoleById(roleId)); } @@ -79,7 +78,7 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:add") @Log(title = "角色管理", businessType = BusinessType.INSERT) @PostMapping - public R add(@Validated @RequestBody SysRole role) { + public R add(@Validated @RequestBody SysRoleBo role) { if (!roleService.checkRoleNameUnique(role)) { return R.fail("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); } else if (!roleService.checkRoleKeyUnique(role)) { @@ -95,14 +94,15 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping - public R edit(@Validated @RequestBody SysRole role) { - roleService.checkRoleAllowed(role); + public R edit(@Validated @RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role.getRoleId()); roleService.checkRoleDataScope(role.getRoleId()); if (!roleService.checkRoleNameUnique(role)) { return R.fail("修改角色'" + role.getRoleName() + "'失败,角色名称已存在"); } else if (!roleService.checkRoleKeyUnique(role)) { return R.fail("修改角色'" + role.getRoleName() + "'失败,角色权限已存在"); } + if (roleService.updateRole(role) > 0) { roleService.cleanOnlineUserByRole(role.getRoleId()); return R.ok(); @@ -116,8 +116,8 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping("/dataScope") - public R dataScope(@RequestBody SysRole role) { - roleService.checkRoleAllowed(role); + public R dataScope(@RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role.getRoleId()); roleService.checkRoleDataScope(role.getRoleId()); return toAjax(roleService.authDataScope(role)); } @@ -128,10 +128,10 @@ public class SysRoleController extends BaseController { @SaCheckPermission("system:role:edit") @Log(title = "角色管理", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") - public R changeStatus(@RequestBody SysRole role) { - roleService.checkRoleAllowed(role); + public R changeStatus(@RequestBody SysRoleBo role) { + roleService.checkRoleAllowed(role.getRoleId()); roleService.checkRoleDataScope(role.getRoleId()); - return toAjax(roleService.updateRoleStatus(role)); + return toAjax(roleService.updateRoleStatus(role.getRoleId(), role.getStatus())); } /** @@ -151,7 +151,7 @@ public class SysRoleController extends BaseController { */ @SaCheckPermission("system:role:query") @GetMapping("/optionselect") - public R> optionselect() { + public R> optionselect() { return R.ok(roleService.selectRoleAll()); } @@ -160,7 +160,7 @@ public class SysRoleController extends BaseController { */ @SaCheckPermission("system:role:list") @GetMapping("/authUser/allocatedList") - public TableDataInfo allocatedList(SysUser user, PageQuery pageQuery) { + public TableDataInfo allocatedList(SysUserBo user, PageQuery pageQuery) { return userService.selectAllocatedList(user, pageQuery); } @@ -169,7 +169,7 @@ public class SysRoleController extends BaseController { */ @SaCheckPermission("system:role:list") @GetMapping("/authUser/unallocatedList") - public TableDataInfo unallocatedList(SysUser user, PageQuery pageQuery) { + public TableDataInfo unallocatedList(SysUserBo user, PageQuery pageQuery) { return userService.selectUnallocatedList(user, pageQuery); } @@ -215,13 +215,13 @@ public class SysRoleController extends BaseController { * * @param roleId 角色ID */ - @SaCheckPermission("system:role:query") + @SaCheckPermission("system:role:list") @GetMapping(value = "/deptTree/{roleId}") - public R> deptTree(@PathVariable("roleId") Long roleId) { - Map ajax = new HashMap<>(); - ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId)); - ajax.put("depts", deptService.selectDeptTreeList(new SysDept())); - return R.ok(ajax); + public R roleDeptTreeselect(@PathVariable("roleId") Long roleId) { + DeptTreeSelectVo selectVo = new DeptTreeSelectVo(); + selectVo.setCheckedKeys(deptService.selectDeptListByRoleId(roleId)); + selectVo.setDepts(deptService.selectDeptTreeList(new SysDeptBo())); + return R.ok(selectVo); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java new file mode 100644 index 00000000..ca11ee98 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java @@ -0,0 +1,175 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import com.baomidou.lock.annotation.Lock4j; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.controller.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.service.ISysTenantService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 租户管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/tenant") +public class SysTenantController extends BaseController { + + private final ISysTenantService tenantService; + + /** + * 查询租户列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:list") + @GetMapping("/list") + public TableDataInfo list(SysTenantBo bo, PageQuery pageQuery) { + return tenantService.queryPageList(bo, pageQuery); + } + + /** + * 导出租户列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:export") + @Log(title = "租户", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysTenantBo bo, HttpServletResponse response) { + List list = tenantService.queryList(bo); + ExcelUtil.exportExcel(list, "租户", SysTenantVo.class, response); + } + + /** + * 获取租户详细信息 + * + * @param id 主键 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(tenantService.queryById(id)); + } + + /** + * 新增租户 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:add") + @Log(title = "租户", businessType = BusinessType.INSERT) + @Lock4j + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysTenantBo bo) { + if (!tenantService.checkCompanyNameUnique(bo)) { + return R.fail("新增租户'" + bo.getCompanyName() + "'失败,企业名称已存在"); + } + return toAjax(TenantHelper.ignore(() -> tenantService.insertByBo(bo))); + } + + /** + * 修改租户 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysTenantBo bo) { + tenantService.checkTenantAllowed(bo.getTenantId()); + if (!tenantService.checkCompanyNameUnique(bo)) { + return R.fail("修改租户'" + bo.getCompanyName() + "'失败,公司名称已存在"); + } + return toAjax(tenantService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysTenantBo bo) { + tenantService.checkTenantAllowed(bo.getTenantId()); + return toAjax(tenantService.updateTenantStatus(bo)); + } + + /** + * 删除租户 + * + * @param ids 主键串 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:remove") + @Log(title = "租户", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(tenantService.deleteWithValidByIds(Arrays.asList(ids), true)); + } + + /** + * 动态切换租户 + * + * @param tenantId 租户ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @GetMapping("/dynamic/{tenantId}") + public R dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) { + TenantHelper.setDynamic(tenantId); + return R.ok(); + } + + /** + * 清除动态租户 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @GetMapping("/dynamic/clear") + public R dynamicClear() { + TenantHelper.clearDynamic(); + return R.ok(); + } + + + /** + * 同步租户套餐 + * + * @param tenantId 租户id + * @param packageId 套餐id + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:edit") + @Log(title = "租户", businessType = BusinessType.UPDATE) + @GetMapping("/syncTenantPackage") + public R syncTenantPackage(@NotBlank(message = "租户ID不能为空") String tenantId, @NotBlank(message = "套餐ID不能为空") String packageId) { + return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java new file mode 100644 index 00000000..585df02b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantPackageController.java @@ -0,0 +1,135 @@ +package org.dromara.system.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.controller.BaseController; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.service.ISysTenantPackageService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 租户套餐管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/tenant/package") +public class SysTenantPackageController extends BaseController { + + private final ISysTenantPackageService tenantPackageService; + + /** + * 查询租户套餐列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:list") + @GetMapping("/list") + public TableDataInfo list(SysTenantPackageBo bo, PageQuery pageQuery) { + return tenantPackageService.queryPageList(bo, pageQuery); + } + + /** + * 查询租户套餐下拉选列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:list") + @GetMapping("/selectList") + public R> selectList() { + return R.ok(tenantPackageService.selectList()); + } + + /** + * 导出租户套餐列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:export") + @Log(title = "租户套餐", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(SysTenantPackageBo bo, HttpServletResponse response) { + List list = tenantPackageService.queryList(bo); + ExcelUtil.exportExcel(list, "租户套餐", SysTenantPackageVo.class, response); + } + + /** + * 获取租户套餐详细信息 + * + * @param packageId 主键 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:query") + @GetMapping("/{packageId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long packageId) { + return R.ok(tenantPackageService.queryById(packageId)); + } + + /** + * 新增租户套餐 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:add") + @Log(title = "租户套餐", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody SysTenantPackageBo bo) { + return toAjax(tenantPackageService.insertByBo(bo)); + } + + /** + * 修改租户套餐 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:edit") + @Log(title = "租户套餐", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody SysTenantPackageBo bo) { + return toAjax(tenantPackageService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:edit") + @Log(title = "租户套餐", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody SysTenantPackageBo bo) { + return toAjax(tenantPackageService.updatePackageStatus(bo)); + } + + /** + * 删除租户套餐 + * + * @param packageIds 主键串 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:remove") + @Log(title = "租户套餐", businessType = BusinessType.DELETE) + @DeleteMapping("/{packageIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] packageIds) { + return toAjax(tenantPackageService.deleteWithValidByIds(Arrays.asList(packageIds), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java similarity index 61% rename from ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysUserController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java index c54c2f64..5520a085 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/SysUserController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java @@ -1,11 +1,13 @@ -package org.dromara.system.controller; +package org.dromara.system.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.secure.BCrypt; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.web.controller.BaseController; @@ -16,27 +18,21 @@ import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.api.domain.SysDept; -import org.dromara.system.api.domain.SysRole; -import org.dromara.system.api.domain.SysUser; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.api.model.LoginUser; -import org.dromara.system.domain.vo.SysUserExportVo; -import org.dromara.system.domain.vo.SysUserImportVo; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.*; import org.dromara.system.listener.SysUserImportListener; import org.dromara.system.service.*; -import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.ArrayUtils; import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * 用户信息 @@ -52,15 +48,15 @@ public class SysUserController extends BaseController { private final ISysUserService userService; private final ISysRoleService roleService; private final ISysPostService postService; - private final ISysPermissionService permissionService; private final ISysDeptService deptService; + private final ISysTenantService tenantService; /** * 获取用户列表 */ @SaCheckPermission("system:user:list") @GetMapping("/list") - public TableDataInfo list(SysUser user, PageQuery pageQuery) { + public TableDataInfo list(SysUserBo user, PageQuery pageQuery) { return userService.selectPageUserList(user, pageQuery); } @@ -70,39 +66,31 @@ public class SysUserController extends BaseController { @Log(title = "用户管理", businessType = BusinessType.EXPORT) @SaCheckPermission("system:user:export") @PostMapping("/export") - public void export(HttpServletResponse response, SysUser user) { - List list = userService.selectUserList(user); - List listVo = BeanUtil.copyToList(list, SysUserExportVo.class); - for (int i = 0; i < list.size(); i++) { - SysDept dept = list.get(i).getDept(); - SysUserExportVo vo = listVo.get(i); - if (ObjectUtil.isNotEmpty(dept)) { - vo.setDeptName(dept.getDeptName()); - vo.setLeader(dept.getLeader()); - } - } + public void export(SysUserBo user, HttpServletResponse response) { + List list = userService.selectUserList(user); + List listVo = MapstructUtils.convert(list, SysUserExportVo.class); ExcelUtil.exportExcel(listVo, "用户数据", SysUserExportVo.class, response); } /** - * 导入用户列表 + * 导入数据 * * @param file 导入文件 - * @param updateSupport 更新已有数据 + * @param updateSupport 是否更新已存在数据 */ @Log(title = "用户管理", businessType = BusinessType.IMPORT) @SaCheckPermission("system:user:import") @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - public R importData(MultipartFile file, boolean updateSupport) throws Exception { + public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); return R.ok(result.getAnalysis()); } /** - * 下载导入模板 + * 获取导入模板 */ @PostMapping("/importTemplate") - public void importTemplate(HttpServletResponse response) throws IOException { + public void importTemplate(HttpServletResponse response) { ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response); } @@ -111,15 +99,19 @@ public class SysUserController extends BaseController { * * @return 用户信息 */ - @GetMapping("getInfo") - public R> getInfo() { + @GetMapping("/getInfo") + public R getInfo() { + UserInfoVo userInfoVo = new UserInfoVo(); LoginUser loginUser = LoginHelper.getLoginUser(); - SysUser user = userService.selectUserById(loginUser.getUserId()); - Map ajax = new HashMap<>(); - ajax.put("user", user); - ajax.put("roles", loginUser.getRolePermission()); - ajax.put("permissions", loginUser.getMenuPermission()); - return R.ok(ajax); + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 如果重新加载用户信息需清除动态租户 + TenantHelper.clearDynamic(); + } + SysUserVo user = userService.selectUserById(loginUser.getUserId()); + userInfoVo.setUser(user); + userInfoVo.setPermissions(loginUser.getMenuPermission()); + userInfoVo.setRoles(loginUser.getRolePermission()); + return R.ok(userInfoVo); } /** @@ -129,19 +121,19 @@ public class SysUserController extends BaseController { */ @SaCheckPermission("system:user:query") @GetMapping(value = {"/", "/{userId}"}) - public R> getInfo(@PathVariable(value = "userId", required = false) Long userId) { + public R getInfo(@PathVariable(value = "userId", required = false) Long userId) { userService.checkUserDataScope(userId); - Map ajax = new HashMap<>(); - List roles = roleService.selectRoleAll(); - ajax.put("roles", LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isAdmin())); - ajax.put("posts", postService.selectPostAll()); + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + List roles = roleService.selectRoleAll(); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + userInfoVo.setPosts(postService.selectPostAll()); if (ObjectUtil.isNotNull(userId)) { - SysUser sysUser = userService.selectUserById(userId); - ajax.put("user", sysUser); - ajax.put("postIds", postService.selectPostListByUserId(userId)); - ajax.put("roleIds", StreamUtils.toList(sysUser.getRoles(), SysRole::getRoleId)); + SysUserVo sysUser = userService.selectUserById(userId); + userInfoVo.setUser(sysUser); + userInfoVo.setRoleIds(StreamUtils.toList(sysUser.getRoles(), SysRoleVo::getRoleId)); + userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); } - return R.ok(ajax); + return R.ok(userInfoVo); } /** @@ -150,16 +142,19 @@ public class SysUserController extends BaseController { @SaCheckPermission("system:user:add") @Log(title = "用户管理", businessType = BusinessType.INSERT) @PostMapping - public R add(@Validated @RequestBody SysUser user) { + public R add(@Validated @RequestBody SysUserBo user) { if (!userService.checkUserNameUnique(user)) { return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); - } else if (StringUtils.isNotEmpty(user.getPhonenumber()) - && !userService.checkPhoneUnique(user)) { + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); - } else if (StringUtils.isNotEmpty(user.getEmail()) - && !userService.checkEmailUnique(user)) { + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } + if (TenantHelper.isEnable()) { + if (!tenantService.checkAccountBalance(TenantHelper.getTenantId())) { + return R.fail("当前租户下用户名额不足,请联系管理员"); + } + } user.setPassword(BCrypt.hashpw(user.getPassword())); return toAjax(userService.insertUser(user)); } @@ -170,16 +165,14 @@ public class SysUserController extends BaseController { @SaCheckPermission("system:user:edit") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping - public R edit(@Validated @RequestBody SysUser user) { - userService.checkUserAllowed(user); + public R edit(@Validated @RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); userService.checkUserDataScope(user.getUserId()); if (!userService.checkUserNameUnique(user)) { return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); - } else if (StringUtils.isNotEmpty(user.getPhonenumber()) - && !userService.checkPhoneUnique(user)) { + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); - } else if (StringUtils.isNotEmpty(user.getEmail()) - && !userService.checkEmailUnique(user)) { + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); } return toAjax(userService.updateUser(user)); @@ -188,13 +181,13 @@ public class SysUserController extends BaseController { /** * 删除用户 * - * @param userIds 用户ID串 + * @param userIds 角色ID串 */ @SaCheckPermission("system:user:remove") @Log(title = "用户管理", businessType = BusinessType.DELETE) @DeleteMapping("/{userIds}") public R remove(@PathVariable Long[] userIds) { - if (ArrayUtils.contains(userIds, LoginHelper.getUserId())) { + if (ArrayUtil.contains(userIds, LoginHelper.getUserId())) { return R.fail("当前用户不能删除"); } return toAjax(userService.deleteUserByIds(userIds)); @@ -203,14 +196,14 @@ public class SysUserController extends BaseController { /** * 重置密码 */ - @SaCheckPermission("system:user:edit") + @SaCheckPermission("system:user:resetPwd") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping("/resetPwd") - public R resetPwd(@RequestBody SysUser user) { - userService.checkUserAllowed(user); + public R resetPwd(@RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); userService.checkUserDataScope(user.getUserId()); user.setPassword(BCrypt.hashpw(user.getPassword())); - return toAjax(userService.resetPwd(user)); + return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); } /** @@ -219,10 +212,10 @@ public class SysUserController extends BaseController { @SaCheckPermission("system:user:edit") @Log(title = "用户管理", businessType = BusinessType.UPDATE) @PutMapping("/changeStatus") - public R changeStatus(@RequestBody SysUser user) { - userService.checkUserAllowed(user); + public R changeStatus(@RequestBody SysUserBo user) { + userService.checkUserAllowed(user.getUserId()); userService.checkUserDataScope(user.getUserId()); - return toAjax(userService.updateUserStatus(user)); + return toAjax(userService.updateUserStatus(user.getUserId(), user.getStatus())); } /** @@ -232,13 +225,13 @@ public class SysUserController extends BaseController { */ @SaCheckPermission("system:user:query") @GetMapping("/authRole/{userId}") - public R> authRole(@PathVariable("userId") Long userId) { - Map ajax = new HashMap<>(); - SysUser user = userService.selectUserById(userId); - List roles = roleService.selectRolesByUserId(userId); - ajax.put("user", user); - ajax.put("roles", LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isAdmin())); - return R.ok(ajax); + public R authRole(@PathVariable Long userId) { + SysUserVo user = userService.selectUserById(userId); + List roles = roleService.selectRolesByUserId(userId); + SysUserInfoVo userInfoVo = new SysUserInfoVo(); + userInfoVo.setUser(user); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + return R.ok(userInfoVo); } /** @@ -261,7 +254,7 @@ public class SysUserController extends BaseController { */ @SaCheckPermission("system:user:list") @GetMapping("/deptTree") - public R>> deptTree(SysDept dept) { + public R>> deptTree(SysDeptBo dept) { return R.ok(deptService.selectDeptTreeList(dept)); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java index e2b7f250..df1355c5 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysConfig.java @@ -1,18 +1,10 @@ package org.dromara.system.domain; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.web.domain.BaseEntity; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; +import org.dromara.common.tenant.core.TenantEntity; /** * 参数配置表 sys_config @@ -22,47 +14,33 @@ import javax.validation.constraints.Size; @Data @EqualsAndHashCode(callSuper = true) -@NoArgsConstructor @TableName("sys_config") -@ExcelIgnoreUnannotated -public class SysConfig extends BaseEntity { +public class SysConfig extends TenantEntity { /** * 参数主键 */ - @ExcelProperty(value = "参数主键") @TableId(value = "config_id") private Long configId; /** * 参数名称 */ - @ExcelProperty(value = "参数名称") - @NotBlank(message = "参数名称不能为空") - @Size(min = 0, max = 100, message = "参数名称不能超过100个字符") private String configName; /** * 参数键名 */ - @ExcelProperty(value = "参数键名") - @NotBlank(message = "参数键名长度不能为空") - @Size(min = 0, max = 100, message = "参数键名长度不能超过100个字符") private String configKey; /** * 参数键值 */ - @ExcelProperty(value = "参数键值") - @NotBlank(message = "参数键值不能为空") - @Size(min = 0, max = 500, message = "参数键值长度不能超过500个字符") private String configValue; /** * 系统内置(Y是 N否) */ - @ExcelProperty(value = "系统内置", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_yes_no") private String configType; /** diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java similarity index 57% rename from ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDept.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java index 780e8ee8..a1ca0956 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDept.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java @@ -1,17 +1,12 @@ -package org.dromara.system.api.domain; +package org.dromara.system.domain; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.web.domain.TreeEntity; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; +import org.dromara.common.tenant.core.TenantEntity; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; /** * 部门表 sys_dept @@ -21,9 +16,9 @@ import javax.validation.constraints.Size; @Data @EqualsAndHashCode(callSuper = true) -@NoArgsConstructor @TableName("sys_dept") -public class SysDept extends TreeEntity { +public class SysDept extends TenantEntity { + private static final long serialVersionUID = 1L; /** @@ -32,17 +27,19 @@ public class SysDept extends TreeEntity { @TableId(value = "dept_id") private Long deptId; + /** + * 父部门ID + */ + private Long parentId; + /** * 部门名称 */ - @NotBlank(message = "部门名称不能为空") - @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符") private String deptName; /** * 显示顺序 */ - @NotNull(message = "显示顺序不能为空") private Integer orderNum; /** @@ -53,14 +50,11 @@ public class SysDept extends TreeEntity { /** * 联系电话 */ - @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符") private String phone; /** * 邮箱 */ - @Email(message = "邮箱格式不正确") - @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") private String email; /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java new file mode 100644 index 00000000..2e46b0ad --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictData.java @@ -0,0 +1,76 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 字典数据表 sys_dict_data + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dict_data") +public class SysDictData extends TenantEntity { + + /** + * 字典编码 + */ + @TableId(value = "dict_code") + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + private String dictLabel; + + /** + * 字典键值 + */ + private String dictValue; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格字典样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + public boolean getDefault() { + return UserConstants.YES.equals(this.isDefault); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java new file mode 100644 index 00000000..24e4d0d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDictType.java @@ -0,0 +1,46 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 字典类型表 sys_dict_type + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_dict_type") +public class SysDictType extends TenantEntity { + + /** + * 字典主键 + */ + @TableId(value = "dict_id") + private Long dictId; + + /** + * 字典名称 + */ + private String dictName; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java new file mode 100644 index 00000000..8f08bbd3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysLogininfor.java @@ -0,0 +1,73 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 系统访问记录表 sys_logininfor + * + * @author Lion Li + */ + +@Data +@TableName("sys_logininfor") +public class SysLogininfor implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "info_id") + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 登录状态 0成功 1失败 + */ + private String status; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java index bc3cc488..3bc3671c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysMenu.java @@ -1,16 +1,17 @@ package org.dromara.system.domain; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.annotation.JsonInclude; -import org.dromara.common.core.web.domain.TreeEntity; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.web.domain.BaseEntity; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; +import java.util.ArrayList; +import java.util.List; /** * 菜单权限表 sys_menu @@ -20,9 +21,8 @@ import javax.validation.constraints.Size; @Data @EqualsAndHashCode(callSuper = true) -@NoArgsConstructor @TableName("sys_menu") -public class SysMenu extends TreeEntity { +public class SysMenu extends BaseEntity { /** * 菜单ID @@ -30,29 +30,29 @@ public class SysMenu extends TreeEntity { @TableId(value = "menu_id") private Long menuId; + /** + * 父菜单ID + */ + private Long parentId; + /** * 菜单名称 */ - @NotBlank(message = "菜单名称不能为空") - @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符") private String menuName; /** * 显示顺序 */ - @NotNull(message = "显示顺序不能为空") private Integer orderNum; /** * 路由地址 */ - @Size(min = 0, max = 200, message = "路由地址不能超过200个字符") private String path; /** * 组件路径 */ - @Size(min = 0, max = 200, message = "组件路径不能超过255个字符") private String component; /** @@ -73,7 +73,6 @@ public class SysMenu extends TreeEntity { /** * 类型(M目录 C菜单 F按钮) */ - @NotBlank(message = "菜单类型不能为空") private String menuType; /** @@ -89,8 +88,6 @@ public class SysMenu extends TreeEntity { /** * 权限字符串 */ - @JsonInclude(JsonInclude.Include.NON_NULL) - @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符") private String perms; /** @@ -103,4 +100,92 @@ public class SysMenu extends TreeEntity { */ private String remark; + /** + * 父菜单名称 + */ + @TableField(exist = false) + private String parentName; + + /** + * 子菜单 + */ + @TableField(exist = false) + private List children = new ArrayList<>(); + + /** + * 获取路由名称 + */ + public String getRouteName() { + String routerName = StringUtils.capitalize(path); + // 非外链并且是一级目录(类型为目录) + if (isMenuFrame()) { + routerName = StringUtils.EMPTY; + } + return routerName; + } + + /** + * 获取路由地址 + */ + public String getRouterPath() { + String routerPath = this.path; + // 内链打开外网方式 + if (getParentId() != 0L && isInnerLink()) { + routerPath = innerLinkReplaceEach(routerPath); + } + // 非外链并且是一级目录(类型为目录) + if (0L == getParentId() && UserConstants.TYPE_DIR.equals(getMenuType()) + && UserConstants.NO_FRAME.equals(getIsFrame())) { + routerPath = "/" + this.path; + } + // 非外链并且是一级目录(类型为菜单) + else if (isMenuFrame()) { + routerPath = "/"; + } + return routerPath; + } + + /** + * 获取组件信息 + */ + public String getComponentInfo() { + String component = UserConstants.LAYOUT; + if (StringUtils.isNotEmpty(this.component) && !isMenuFrame()) { + component = this.component; + } else if (StringUtils.isEmpty(this.component) && getParentId() != 0L && isInnerLink()) { + component = UserConstants.INNER_LINK; + } else if (StringUtils.isEmpty(this.component) && isParentView()) { + component = UserConstants.PARENT_VIEW; + } + return component; + } + + /** + * 是否为菜单内部跳转 + */ + public boolean isMenuFrame() { + return getParentId() == 0L && UserConstants.TYPE_MENU.equals(menuType) && isFrame.equals(UserConstants.NO_FRAME); + } + + /** + * 是否为内链组件 + */ + public boolean isInnerLink() { + return isFrame.equals(UserConstants.NO_FRAME) && StringUtils.ishttp(path); + } + + /** + * 是否为parent_view组件 + */ + public boolean isParentView() { + return getParentId() != 0L && UserConstants.TYPE_DIR.equals(menuType); + } + + /** + * 内链域名特殊字符替换 + */ + public static String innerLinkReplaceEach(String path) { + return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, "."}, + new String[]{"", "", "", "/"}); + } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java index 384d2cbd..fb1df87e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysNotice.java @@ -2,14 +2,9 @@ package org.dromara.system.domain; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.web.domain.BaseEntity; -import org.dromara.common.core.xss.Xss; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; +import org.dromara.common.tenant.core.TenantEntity; /** @@ -19,9 +14,8 @@ import javax.validation.constraints.Size; */ @Data @EqualsAndHashCode(callSuper = true) -@NoArgsConstructor @TableName("sys_notice") -public class SysNotice extends BaseEntity { +public class SysNotice extends TenantEntity { /** * 公告ID @@ -32,9 +26,6 @@ public class SysNotice extends BaseEntity { /** * 公告标题 */ - @Xss(message = "公告标题不能包含脚本字符") - @NotBlank(message = "公告标题不能为空") - @Size(min = 0, max = 50, message = "公告标题不能超过50个字符") private String noticeTitle; /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java new file mode 100644 index 00000000..b1e44ba2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysOperLog.java @@ -0,0 +1,113 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 操作日志记录表 oper_log + * + * @author Lion Li + */ + +@Data +@TableName("sys_oper_log") +public class SysOperLog implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + @TableId(value = "oper_id") + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 操作模块 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 请求方法 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求url + */ + private String operUrl; + + /** + * 操作地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java index 40345874..7fe70397 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java @@ -1,20 +1,10 @@ package org.dromara.system.domain; -import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; -import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.web.domain.BaseEntity; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.common.tenant.core.TenantEntity; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; /** * 岗位表 sys_post @@ -24,46 +14,33 @@ import javax.validation.constraints.Size; @Data @EqualsAndHashCode(callSuper = true) -@NoArgsConstructor @TableName("sys_post") -@ExcelIgnoreUnannotated -public class SysPost extends BaseEntity { +public class SysPost extends TenantEntity { /** * 岗位序号 */ - @ExcelProperty(value = "岗位序号") @TableId(value = "post_id") private Long postId; /** * 岗位编码 */ - @ExcelProperty(value = "岗位编码") - @NotBlank(message = "岗位编码不能为空") - @Size(min = 0, max = 64, message = "岗位编码长度不能超过64个字符") private String postCode; /** * 岗位名称 */ - @ExcelProperty(value = "岗位名称") - @NotBlank(message = "岗位名称不能为空") - @Size(min = 0, max = 50, message = "岗位名称长度不能超过50个字符") private String postName; /** * 岗位排序 */ - @ExcelProperty(value = "岗位排序") - @NotNull(message = "显示顺序不能为空") private Integer postSort; /** * 状态(0正常 1停用) */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) - @ExcelDictFormat(dictType = "sys_normal_disable") private String status; /** @@ -71,10 +48,4 @@ public class SysPost extends BaseEntity { */ private String remark; - /** - * 用户是否存在此岗位标识 默认不存在 - */ - @TableField(exist = false) - private boolean flag = false; - } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java new file mode 100644 index 00000000..1b262a5d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRole.java @@ -0,0 +1,79 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.tenant.core.TenantEntity; + +/** + * 角色表 sys_role + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_role") +public class SysRole extends TenantEntity { + + /** + * 角色ID + */ + @TableId(value = "role_id") + private Long roleId; + + /** + * 角色名称 + */ + private String roleName; + + /** + * 角色权限 + */ + private String roleKey; + + /** + * 角色排序 + */ + private Integer roleSort; + + /** + * 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 备注 + */ + private String remark; + + public SysRole(Long roleId) { + this.roleId = roleId; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java index 673681da..ba77694e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleDept.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; -import lombok.NoArgsConstructor; /** * 角色和部门关联 sys_role_dept @@ -13,7 +12,6 @@ import lombok.NoArgsConstructor; */ @Data -@NoArgsConstructor @TableName("sys_role_dept") public class SysRoleDept { diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java index a1222d6e..ba28f172 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysRoleMenu.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; -import lombok.NoArgsConstructor; /** * 角色和菜单关联 sys_role_menu @@ -13,7 +12,6 @@ import lombok.NoArgsConstructor; */ @Data -@NoArgsConstructor @TableName("sys_role_menu") public class SysRoleMenu { diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java new file mode 100644 index 00000000..7b9597e1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenant.java @@ -0,0 +1,101 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.web.domain.BaseEntity; + +import java.util.Date; + +/** + * 租户对象 sys_tenant + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_tenant") +public class SysTenant extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + private String contactUserName; + + /** + * 联系电话 + */ + private String contactPhone; + + /** + * 企业名称 + */ + private String companyName; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java new file mode 100644 index 00000000..dce897d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantPackage.java @@ -0,0 +1,53 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.web.domain.BaseEntity; + +/** + * 租户套餐对象 sys_tenant_package + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_tenant_package") +public class SysTenantPackage extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 租户套餐id + */ + @TableId(value = "package_id") + private Long packageId; + /** + * 套餐名称 + */ + private String packageName; + /** + * 关联菜单id + */ + private String menuIds; + /** + * 备注 + */ + private String remark; + /** + * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) + */ + private Boolean menuCheckStrictly; + /** + * 状态(0正常 1停用) + */ + private String status; + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java new file mode 100644 index 00000000..2a4ddbd8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUser.java @@ -0,0 +1,115 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.tenant.core.TenantEntity; + +import java.util.Date; + +/** + * 用户对象 sys_user + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys_user") +public class SysUser extends TenantEntity { + + /** + * 用户ID + */ + @TableId(value = "user_id") + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别 + */ + private String sex; + + /** + * 用户头像 + */ + private Long avatar; + + /** + * 密码 + */ + @TableField( + insertStrategy = FieldStrategy.NOT_EMPTY, + updateStrategy = FieldStrategy.NOT_EMPTY, + whereStrategy = FieldStrategy.NOT_EMPTY + ) + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + + public SysUser(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java new file mode 100644 index 00000000..fca680a3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserOnline.java @@ -0,0 +1,54 @@ +package org.dromara.system.domain; + +import lombok.Data; + +/** + * 当前在线会话 + * + * @author Lion Li + */ + +@Data +public class SysUserOnline { + + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java index d7a655ee..119c1171 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserPost.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; -import lombok.NoArgsConstructor; /** * 用户和岗位关联 sys_user_post @@ -13,7 +12,6 @@ import lombok.NoArgsConstructor; */ @Data -@NoArgsConstructor @TableName("sys_user_post") public class SysUserPost { diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java index 4ab7d484..0a50e807 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserRole.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; -import lombok.NoArgsConstructor; /** * 用户和角色关联 sys_user_role @@ -13,7 +12,6 @@ import lombok.NoArgsConstructor; */ @Data -@NoArgsConstructor @TableName("sys_user_role") public class SysUserRole { diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java new file mode 100644 index 00000000..e1b573e6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysConfigBo.java @@ -0,0 +1,62 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.system.domain.SysConfig; + +import javax.validation.constraints.*; + +/** + * 参数配置业务对象 sys_config + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysConfig.class, reverseConvertGenerate = false) +public class SysConfigBo extends BaseEntity { + + /** + * 参数主键 + */ + @NotNull(message = "参数主键不能为空", groups = { EditGroup.class }) + private Long configId; + + /** + * 参数名称 + */ + @NotBlank(message = "参数名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 100, message = "参数名称不能超过{max}个字符") + private String configName; + + /** + * 参数键名 + */ + @NotBlank(message = "参数键名不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 100, message = "参数键名长度不能超过{max}个字符") + private String configKey; + + /** + * 参数键值 + */ + @NotBlank(message = "参数键值不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 500, message = "参数键值长度不能超过{max}个字符") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + private String configType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java new file mode 100644 index 00000000..d799b295 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java @@ -0,0 +1,71 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.system.domain.SysDept; + +import javax.validation.constraints.*; + +/** + * 部门业务对象 sys_dept + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDept.class, reverseConvertGenerate = false) +public class SysDeptBo extends BaseEntity { + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空", groups = { EditGroup.class }) + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + @NotBlank(message = "部门名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 30, message = "部门名称长度不能超过{max}个字符") + private String deptName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer orderNum; + + /** + * 负责人 + */ + private String leader; + + /** + * 联系电话 + */ + @Size(min = 0, max = 11, message = "联系电话长度不能超过{max}个字符") + private String phone; + + /** + * 邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 部门状态(0正常 1停用) + */ + private String status; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java new file mode 100644 index 00000000..187c337b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictDataBo.java @@ -0,0 +1,89 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.system.domain.SysDictData; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 字典数据业务对象 sys_dict_data + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDictData.class, reverseConvertGenerate = false) +public class SysDictDataBo extends BaseEntity { + + /** + * 字典编码 + */ + @NotNull(message = "字典编码不能为空", groups = { EditGroup.class }) + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + @NotBlank(message = "字典标签不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 100, message = "字典标签长度不能超过{max}个字符") + private String dictLabel; + + /** + * 字典键值 + */ + @NotBlank(message = "字典键值不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 100, message = "字典键值长度不能超过{max}个字符") + private String dictValue; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 100, message = "字典类型长度不能超过{max}个字符") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + @Size(min = 0, max = 100, message = "样式属性长度不能超过{max}个字符") + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + private String isDefault; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 创建部门 + */ + private Long createDept; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java new file mode 100644 index 00000000..2ac7f294 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDictTypeBo.java @@ -0,0 +1,59 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.system.domain.SysDictType; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; +import javax.validation.constraints.Size; + +/** + * 字典类型业务对象 sys_dict_type + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysDictType.class, reverseConvertGenerate = false) +public class SysDictTypeBo extends BaseEntity { + + /** + * 字典主键 + */ + @NotNull(message = "字典主键不能为空", groups = { EditGroup.class }) + private Long dictId; + + /** + * 字典名称 + */ + @NotBlank(message = "字典名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过{max}个字符") + private String dictName; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过{max}个字符") + @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + private String dictType; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java new file mode 100644 index 00000000..71fb2ad9 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysLogininforBo.java @@ -0,0 +1,77 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysLogininfor; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 系统访问记录业务对象 sys_logininfor + * + * @author Michelle.Chung + */ + +@Data +@AutoMapper(target = SysLogininfor.class, reverseConvertGenerate = false) +public class SysLogininforBo { + + /** + * 访问ID + */ + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地点 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录状态(0成功 1失败) + */ + private String status; + + /** + * 提示消息 + */ + private String msg; + + /** + * 访问时间 + */ + private Date loginTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java new file mode 100644 index 00000000..2ff618e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysMenuBo.java @@ -0,0 +1,112 @@ +package org.dromara.system.domain.bo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.system.domain.SysMenu; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 菜单权限业务对象 sys_menu + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysMenu.class, reverseConvertGenerate = false) +public class SysMenuBo extends BaseEntity { + + /** + * 菜单ID + */ + @NotNull(message = "菜单ID不能为空", groups = { EditGroup.class }) + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + @NotBlank(message = "菜单名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 50, message = "菜单名称长度不能超过{max}个字符") + private String menuName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer orderNum; + + /** + * 路由地址 + */ + @Size(min = 0, max = 200, message = "路由地址不能超过{max}个字符") + private String path; + + /** + * 组件路径 + */ + @Size(min = 0, max = 200, message = "组件路径不能超过{max}个字符") + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + @NotBlank(message = "菜单类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限标识 + */ + @JsonInclude(JsonInclude.Include.NON_NULL) + @Size(min = 0, max = 100, message = "权限标识长度不能超过{max}个字符") + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java new file mode 100644 index 00000000..ed30f16c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysNoticeBo.java @@ -0,0 +1,66 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.common.core.xss.Xss; +import org.dromara.system.domain.SysNotice; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 通知公告业务对象 sys_notice + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysNotice.class, reverseConvertGenerate = false) +public class SysNoticeBo extends BaseEntity { + + /** + * 公告ID + */ + @NotNull(message = "公告ID不能为空", groups = { EditGroup.class }) + private Long noticeId; + + /** + * 公告标题 + */ + @Xss(message = "公告标题不能包含脚本字符") + @NotBlank(message = "公告标题不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 50, message = "公告标题不能超过{max}个字符") + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建人名称 + */ + private String createByName; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java new file mode 100644 index 00000000..407947cb --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysOperLogBo.java @@ -0,0 +1,127 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMappers; +import lombok.Data; +import org.dromara.common.log.event.OperLogEvent; +import org.dromara.system.domain.SysOperLog; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作日志记录业务对象 sys_oper_log + * + * @author Michelle.Chung + * @date 2023-02-07 + */ + +@Data +@AutoMappers({ + @AutoMapper(target = SysOperLog.class, reverseConvertGenerate = false), + @AutoMapper(target = OperLogEvent.class) +}) +public class SysOperLogBo { + + /** + * 日志主键 + */ + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 方法名称 + */ + private String method; + + /** + * 请求方式 + */ + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + private Integer operatorType; + + /** + * 操作人员 + */ + private String operName; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 请求URL + */ + private String operUrl; + + /** + * 主机地址 + */ + private String operIp; + + /** + * 操作地点 + */ + private String operLocation; + + /** + * 请求参数 + */ + private String operParam; + + /** + * 返回参数 + */ + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + private Integer status; + + /** + * 错误消息 + */ + private String errorMsg; + + /** + * 操作时间 + */ + private Date operTime; + + /** + * 消耗时间 + */ + private Long costTime; + + /** + * 请求参数 + */ + private Map params = new HashMap<>(); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java new file mode 100644 index 00000000..38bc5c75 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysPostBo.java @@ -0,0 +1,63 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.system.domain.SysPost; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 岗位信息业务对象 sys_post + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysPost.class, reverseConvertGenerate = false) +public class SysPostBo extends BaseEntity { + + /** + * 岗位ID + */ + @NotNull(message = "岗位ID不能为空", groups = { EditGroup.class }) + private Long postId; + + /** + * 岗位编码 + */ + @NotBlank(message = "岗位编码不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 64, message = "岗位编码长度不能超过{max}个字符") + private String postCode; + + /** + * 岗位名称 + */ + @NotBlank(message = "岗位名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 50, message = "岗位名称长度不能超过{max}个字符") + private String postName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java new file mode 100644 index 00000000..df57bd68 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysRoleBo.java @@ -0,0 +1,98 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.system.domain.SysRole; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +/** + * 角色信息业务对象 sys_role + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysRole.class, reverseConvertGenerate = false) +public class SysRoleBo extends BaseEntity { + + /** + * 角色ID + */ + @NotNull(message = "角色ID不能为空", groups = { EditGroup.class }) + private Long roleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 30, message = "角色名称长度不能超过{max}个字符") + private String roleName; + + /** + * 角色权限字符串 + */ + @NotBlank(message = "角色权限字符串不能为空", groups = { AddGroup.class, EditGroup.class }) + @Size(min = 0, max = 100, message = "权限字符长度不能超过{max}个字符") + private String roleKey; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空", groups = { AddGroup.class, EditGroup.class }) + private Integer roleSort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + private String dataScope; + + /** + * 菜单树选择项是否关联显示 + */ + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示 + */ + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 菜单组 + */ + private Long[] menuIds; + + /** + * 部门组(数据权限) + */ + private Long[] deptIds; + + public SysRoleBo(Long roleId) { + this.roleId = roleId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.roleId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java new file mode 100644 index 00000000..a693b46f --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java @@ -0,0 +1,114 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.system.domain.SysTenant; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * 租户业务对象 sys_tenant + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysTenant.class, reverseConvertGenerate = false) +public class SysTenantBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 联系人 + */ + @NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactUserName; + + /** + * 联系电话 + */ + @NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class }) + private String contactPhone; + + /** + * 企业名称 + */ + @NotBlank(message = "企业名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String companyName; + + /** + * 用户名(创建系统用户) + */ + @NotBlank(message = "用户名不能为空", groups = { AddGroup.class }) + private String username; + + /** + * 密码(创建系统用户) + */ + @NotBlank(message = "密码不能为空", groups = { AddGroup.class }) + private String password; + + /** + * 统一社会信用代码 + */ + private String licenseNumber; + + /** + * 地址 + */ + private String address; + + /** + * 域名 + */ + private String domain; + + /** + * 企业简介 + */ + private String intro; + + /** + * 备注 + */ + private String remark; + + /** + * 租户套餐编号 + */ + @NotNull(message = "租户套餐不能为空", groups = { AddGroup.class }) + private Long packageId; + + /** + * 过期时间 + */ + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java new file mode 100644 index 00000000..f44bdf44 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantPackageBo.java @@ -0,0 +1,60 @@ +package org.dromara.system.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMapping; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.system.domain.SysTenantPackage; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 租户套餐业务对象 sys_tenant_package + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysTenantPackage.class, reverseConvertGenerate = false) +public class SysTenantPackageBo extends BaseEntity { + + /** + * 租户套餐id + */ + @NotNull(message = "租户套餐id不能为空", groups = { EditGroup.class }) + private Long packageId; + + /** + * 套餐名称 + */ + @NotBlank(message = "套餐名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String packageName; + + /** + * 关联菜单id + */ + @AutoMapping(target = "menuIds", expression = "java(org.dromara.common.core.utils.StringUtils.join(source.getMenuIds(), \",\"))") + private Long[] menuIds; + + /** + * 备注 + */ + private String remark; + + /** + * 菜单树选择项是否关联显示 + */ + private Boolean menuCheckStrictly; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java similarity index 64% rename from ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUser.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java index 041dab07..0c3cda25 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysUser.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -1,39 +1,36 @@ -package org.dromara.system.api.domain; +package org.dromara.system.domain.bo; -import com.baomidou.mybatisplus.annotation.*; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; import org.dromara.common.core.annotation.Sensitive; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.enums.SensitiveStrategy; import org.dromara.common.core.web.domain.BaseEntity; import org.dromara.common.core.xss.Xss; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; +import org.dromara.system.domain.SysUser; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import java.util.Date; -import java.util.List; /** - * 用户对象 sys_user + * 用户信息业务对象 sys_user * - * @author Lion Li + * @author Michelle.Chung */ @Data @NoArgsConstructor @EqualsAndHashCode(callSuper = true) -@TableName("sys_user") -public class SysUser extends BaseEntity { +@AutoMapper(target = SysUser.class, reverseConvertGenerate = false) +public class SysUserBo extends BaseEntity { /** * 用户ID */ - @TableId(value = "user_id") private Long userId; /** @@ -46,14 +43,14 @@ public class SysUser extends BaseEntity { */ @Xss(message = "用户账号不能包含脚本字符") @NotBlank(message = "用户账号不能为空") - @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符") + @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") private String userName; /** * 用户昵称 */ @Xss(message = "用户昵称不能包含脚本字符") - @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") private String nickName; /** @@ -66,7 +63,7 @@ public class SysUser extends BaseEntity { */ @Sensitive(strategy = SensitiveStrategy.EMAIL) @Email(message = "邮箱格式不正确") - @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") private String email; /** @@ -76,42 +73,25 @@ public class SysUser extends BaseEntity { private String phonenumber; /** - * 用户性别 + * 用户性别(0男 1女 2未知) */ private String sex; /** - * 用户头像 + * 头像地址 */ - private String avatar; + private Long avatar; /** * 密码 */ - @TableField( - insertStrategy = FieldStrategy.NOT_EMPTY, - updateStrategy = FieldStrategy.NOT_EMPTY, - whereStrategy = FieldStrategy.NOT_EMPTY - ) private String password; - @JsonIgnore - @JsonProperty - public String getPassword() { - return password; - } - /** * 帐号状态(0正常 1停用) */ private String status; - /** - * 删除标志(0代表存在 2代表删除) - */ - @TableLogic - private String delFlag; - /** * 最后登录IP */ @@ -127,44 +107,27 @@ public class SysUser extends BaseEntity { */ private String remark; - /** - * 部门对象 - */ - @TableField(exist = false) - private SysDept dept; - - /** - * 角色对象 - */ - @TableField(exist = false) - private List roles; - /** * 角色组 */ - @TableField(exist = false) + @Size(min = 1, message = "用户角色不能为空") private Long[] roleIds; /** * 岗位组 */ - @TableField(exist = false) private Long[] postIds; /** * 数据权限 当前角色ID */ - @TableField(exist = false) private Long roleId; - public SysUser(Long userId) { + public SysUserBo(Long userId) { this.userId = userId; } - /** - * 是否管理员 - */ - public boolean isAdmin() { + public boolean isSuperAdmin() { return UserConstants.SUPER_ADMIN_ID.equals(this.userId); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java new file mode 100644 index 00000000..93a5f85e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserProfileBo.java @@ -0,0 +1,56 @@ +package org.dromara.system.domain.bo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.annotation.Sensitive; +import org.dromara.common.core.enums.SensitiveStrategy; +import org.dromara.common.core.web.domain.BaseEntity; +import org.dromara.common.core.xss.Xss; + +import javax.validation.constraints.Email; +import javax.validation.constraints.Size; + +/** + * 个人信息业务处理 + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class SysUserProfileBo extends BaseEntity { + + /** + * 用户ID + */ + private Long userId; + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL) + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java new file mode 100644 index 00000000..46c020b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AvatarVo.java @@ -0,0 +1,18 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +/** + * 用户头像信息 + * + * @author Michelle.Chung + */ +@Data +public class AvatarVo { + + /** + * 头像地址 + */ + private String imgUrl; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java new file mode 100644 index 00000000..f827cba0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CacheListInfoVo.java @@ -0,0 +1,23 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +/** + * 缓存监控列表信息 + * + * @author Michelle.Chung + */ +@Data +public class CacheListInfoVo { + + private Properties info; + + private Long dbSize; + + private List> commandStats; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java new file mode 100644 index 00000000..6f7db286 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/DeptTreeSelectVo.java @@ -0,0 +1,26 @@ +package org.dromara.system.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.util.List; + +/** + * 角色部门列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class DeptTreeSelectVo { + + /** + * 选中部门列表 + */ + private List checkedKeys; + + /** + * 下拉树结构列表 + */ + private List> depts; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java new file mode 100644 index 00000000..07245385 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MenuTreeSelectVo.java @@ -0,0 +1,26 @@ +package org.dromara.system.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.util.List; + +/** + * 角色菜单列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class MenuTreeSelectVo { + + /** + * 选中菜单列表 + */ + private List checkedKeys; + + /** + * 菜单下拉树结构列表 + */ + private List> menus; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java index 7bbaba75..e740a97b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MetaVo.java @@ -1,16 +1,15 @@ package org.dromara.system.domain.vo; -import org.dromara.common.core.utils.StringUtils; import lombok.Data; -import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.StringUtils; /** * 路由显示信息 * * @author ruoyi */ + @Data -@NoArgsConstructor public class MetaVo { /** @@ -58,4 +57,5 @@ public class MetaVo { this.link = link; } } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java new file mode 100644 index 00000000..c0476519 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/ProfileVo.java @@ -0,0 +1,29 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +/** + * 用户个人信息 + * + * @author Michelle.Chung + */ +@Data +public class ProfileVo { + + /** + * 用户信息 + */ + private SysUserVo user; + + /** + * 用户所属角色组 + */ + private String roleGroup; + + /** + * 用户所属岗位组 + */ + private String postGroup; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java index d91d46b1..0d576ef1 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/RouterVo.java @@ -2,17 +2,15 @@ package org.dromara.system.domain.vo; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; -import lombok.NoArgsConstructor; import java.util.List; /** * 路由配置信息 * - * @author ruoyi + * @author Lion Li */ @Data -@NoArgsConstructor @JsonInclude(JsonInclude.Include.NON_EMPTY) public class RouterVo { diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java new file mode 100644 index 00000000..620d21ab --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysConfigVo.java @@ -0,0 +1,70 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysConfig; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 参数配置视图对象 sys_config + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysConfig.class) +public class SysConfigVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 参数主键 + */ + @ExcelProperty(value = "参数主键") + private Long configId; + + /** + * 参数名称 + */ + @ExcelProperty(value = "参数名称") + private String configName; + + /** + * 参数键名 + */ + @ExcelProperty(value = "参数键名") + private String configKey; + + /** + * 参数键值 + */ + @ExcelProperty(value = "参数键值") + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + @ExcelProperty(value = "系统内置", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_yes_no") + private String configType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java new file mode 100644 index 00000000..cbb62425 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java @@ -0,0 +1,89 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDept; + +import java.io.Serializable; +import java.util.Date; + +/** + * 部门视图对象 sys_dept + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDept.class) +public class SysDeptVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 父部门id + */ + private Long parentId; + + /** + * 父部门名称 + */ + private String parentName; + + /** + * 祖级列表 + */ + private String ancestors; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人 + */ + @ExcelProperty(value = "负责人") + private String leader; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String phone; + + /** + * 邮箱 + */ + @ExcelProperty(value = "邮箱") + private String email; + + /** + * 部门状态(0正常 1停用) + */ + @ExcelProperty(value = "部门状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDictData.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java similarity index 53% rename from ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDictData.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java index 27b0524a..db37b741 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysDictData.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictDataVo.java @@ -1,38 +1,33 @@ -package org.dromara.system.api.domain; +package org.dromara.system.domain.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import org.dromara.common.core.constant.UserConstants; -import org.dromara.common.core.web.domain.BaseEntity; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; +import org.dromara.system.domain.SysDictData; + +import java.io.Serializable; +import java.util.Date; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; /** - * 字典数据表 sys_dict_data + * 字典数据视图对象 sys_dict_data * - * @author Lion Li + * @author Michelle.Chung */ - @Data -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -@TableName("sys_dict_data") @ExcelIgnoreUnannotated -public class SysDictData extends BaseEntity { +@AutoMapper(target = SysDictData.class) +public class SysDictDataVo implements Serializable { + + private static final long serialVersionUID = 1L; /** * 字典编码 */ @ExcelProperty(value = "字典编码") - @TableId(value = "dict_code") private Long dictCode; /** @@ -45,34 +40,27 @@ public class SysDictData extends BaseEntity { * 字典标签 */ @ExcelProperty(value = "字典标签") - @NotBlank(message = "字典标签不能为空") - @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符") private String dictLabel; /** * 字典键值 */ @ExcelProperty(value = "字典键值") - @NotBlank(message = "字典键值不能为空") - @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符") private String dictValue; /** * 字典类型 */ @ExcelProperty(value = "字典类型") - @NotBlank(message = "字典类型不能为空") - @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符") private String dictType; /** * 样式属性(其他样式扩展) */ - @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符") private String cssClass; /** - * 表格字典样式 + * 表格回显样式 */ private String listClass; @@ -93,10 +81,13 @@ public class SysDictData extends BaseEntity { /** * 备注 */ + @ExcelProperty(value = "备注") private String remark; - public boolean getDefault() { - return UserConstants.YES.equals(this.isDefault); - } + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java new file mode 100644 index 00000000..f1f53a56 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDictTypeVo.java @@ -0,0 +1,64 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysDictType; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典类型视图对象 sys_dict_type + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysDictType.class) +public class SysDictTypeVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 字典主键 + */ + @ExcelProperty(value = "字典主键") + private Long dictId; + + /** + * 字典名称 + */ + @ExcelProperty(value = "字典名称") + private String dictName; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysLogininfor.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java similarity index 58% rename from ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysLogininfor.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java index d96d4696..24e945f8 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysLogininfor.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysLogininforVo.java @@ -1,40 +1,42 @@ -package org.dromara.system.api.domain; +package org.dromara.system.domain.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; -import lombok.Data; -import lombok.NoArgsConstructor; +import org.dromara.system.domain.SysLogininfor; import java.io.Serializable; import java.util.Date; -import java.util.HashMap; -import java.util.Map; + + /** - * 系统访问记录表 sys_logininfor + * 系统访问记录视图对象 sys_logininfor * - * @author Lion Li + * @author Michelle.Chung + * @date 2023-02-07 */ - @Data -@NoArgsConstructor -@TableName("sys_logininfor") @ExcelIgnoreUnannotated -public class SysLogininfor implements Serializable { +@AutoMapper(target = SysLogininfor.class) +public class SysLogininforVo implements Serializable { + private static final long serialVersionUID = 1L; /** - * ID + * 访问ID */ @ExcelProperty(value = "序号") - @TableId(value = "info_id") private Long infoId; + /** + * 租户编号 + */ + private String tenantId; + /** * 用户账号 */ @@ -42,16 +44,16 @@ public class SysLogininfor implements Serializable { private String userName; /** - * 状态 0成功 1失败 + * 登录状态(0成功 1失败) */ - @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelProperty(value = "登录状态", converter = ExcelDictConvert.class) @ExcelDictFormat(dictType = "sys_common_status") private String status; /** - * 地址 + * 登录IP地址 */ - @ExcelProperty(value = "地址") + @ExcelProperty(value = "登录地址") private String ipaddr; /** @@ -63,7 +65,7 @@ public class SysLogininfor implements Serializable { /** * 浏览器类型 */ - @ExcelProperty(value = "浏览器类型") + @ExcelProperty(value = "浏览器") private String browser; /** @@ -72,10 +74,11 @@ public class SysLogininfor implements Serializable { @ExcelProperty(value = "操作系统") private String os; + /** - * 描述 + * 提示消息 */ - @ExcelProperty(value = "描述") + @ExcelProperty(value = "提示消息") private String msg; /** @@ -84,10 +87,5 @@ public class SysLogininfor implements Serializable { @ExcelProperty(value = "访问时间") private Date loginTime; - /** - * 请求参数 - */ - @TableField(exist = false) - private Map params = new HashMap<>(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java new file mode 100644 index 00000000..7de51f3d --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysMenuVo.java @@ -0,0 +1,114 @@ +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.domain.SysMenu; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + * 菜单权限视图对象 sys_menu + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysMenu.class) +public class SysMenuVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 路由地址 + */ + private String path; + + /** + * 组件路径 + */ + private String component; + + /** + * 路由参数 + */ + private String queryParam; + + /** + * 是否为外链(0是 1否) + */ + private String isFrame; + + /** + * 是否缓存(0缓存 1不缓存) + */ + private String isCache; + + /** + * 菜单类型(M目录 C菜单 F按钮) + */ + private String menuType; + + /** + * 显示状态(0显示 1隐藏) + */ + private String visible; + + /** + * 菜单状态(0正常 1停用) + */ + private String status; + + /** + * 权限标识 + */ + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 创建部门 + */ + private Long createDept; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 子菜单 + */ + private List children = new ArrayList<>(); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java new file mode 100644 index 00000000..1662ac8a --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysNoticeVo.java @@ -0,0 +1,71 @@ +package org.dromara.system.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysNotice; + +import java.io.Serializable; +import java.util.Date; + + + +/** + * 通知公告视图对象 sys_notice + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysNotice.class) +public class SysNoticeVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 公告ID + */ + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建者 + */ + private Long createBy; + + /** + * 创建人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") + private String createByName; + + /** + * 创建时间 + */ + private Date createTime; + +} diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysOperLog.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java similarity index 79% rename from ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysOperLog.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java index d35cd2de..a64ee51e 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/SysOperLog.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysOperLogVo.java @@ -1,31 +1,27 @@ -package org.dromara.system.api.domain; +package org.dromara.system.domain.vo; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelProperty; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; -import lombok.Data; -import lombok.NoArgsConstructor; +import org.dromara.system.domain.SysOperLog; import java.io.Serializable; import java.util.Date; -import java.util.HashMap; -import java.util.Map; + /** - * 操作日志记录表 oper_log + * 操作日志记录视图对象 sys_oper_log * - * @author Lion Li + * @author Michelle.Chung + * @date 2023-02-07 */ - @Data -@NoArgsConstructor -@TableName("sys_oper_log") @ExcelIgnoreUnannotated -public class SysOperLog implements Serializable { +@AutoMapper(target = SysOperLog.class) +public class SysOperLogVo implements Serializable { private static final long serialVersionUID = 1L; @@ -33,11 +29,15 @@ public class SysOperLog implements Serializable { * 日志主键 */ @ExcelProperty(value = "日志主键") - @TableId(value = "oper_id") private Long operId; /** - * 操作模块 + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 */ @ExcelProperty(value = "操作模块") private String title; @@ -52,11 +52,10 @@ public class SysOperLog implements Serializable { /** * 业务类型数组 */ - @TableField(exist = false) private Integer[] businessTypes; /** - * 请求方法 + * 方法名称 */ @ExcelProperty(value = "请求方法") private String method; @@ -87,13 +86,13 @@ public class SysOperLog implements Serializable { private String deptName; /** - * 请求url + * 请求URL */ @ExcelProperty(value = "请求地址") private String operUrl; /** - * 操作地址 + * 主机地址 */ @ExcelProperty(value = "操作地址") private String operIp; @@ -136,9 +135,8 @@ public class SysOperLog implements Serializable { private Date operTime; /** - * 请求参数 + * 消耗时间 */ - @TableField(exist = false) - private Map params = new HashMap<>(); - + @ExcelProperty(value = "消耗时间") + private Long costTime; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java new file mode 100644 index 00000000..55bd80da --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPostVo.java @@ -0,0 +1,71 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysPost; + +import java.io.Serializable; +import java.util.Date; + + + +/** + * 岗位信息视图对象 sys_post + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysPost.class) +public class SysPostVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 岗位ID + */ + @ExcelProperty(value = "岗位序号") + private Long postId; + + /** + * 岗位编码 + */ + @ExcelProperty(value = "岗位编码") + private String postCode; + + /** + * 岗位名称 + */ + @ExcelProperty(value = "岗位名称") + private String postName; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "岗位排序") + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java new file mode 100644 index 00000000..fd3ba063 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleVo.java @@ -0,0 +1,98 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysRole; + +import java.io.Serializable; +import java.util.Date; + +/** + * 角色信息视图对象 sys_role + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysRole.class) +public class SysRoleVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 角色ID + */ + @ExcelProperty(value = "角色序号") + private Long roleId; + + /** + * 角色名称 + */ + @ExcelProperty(value = "角色名称") + private String roleName; + + /** + * 角色权限字符串 + */ + @ExcelProperty(value = "角色权限") + private String roleKey; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "角色排序") + private Integer roleSort; + + /** + * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) + */ + @ExcelProperty(value = "数据范围", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限") + private String dataScope; + + /** + * 菜单树选择项是否关联显示 + */ + @ExcelProperty(value = "菜单树选择项是否关联显示") + private Boolean menuCheckStrictly; + + /** + * 部门树选择项是否关联显示 + */ + @ExcelProperty(value = "部门树选择项是否关联显示") + private Boolean deptCheckStrictly; + + /** + * 角色状态(0正常 1停用) + */ + @ExcelProperty(value = "角色状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 用户是否存在此角色标识 默认不存在 + */ + private boolean flag = false; + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.roleId); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java new file mode 100644 index 00000000..a56a0223 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantPackageVo.java @@ -0,0 +1,64 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysTenantPackage; + +import java.io.Serializable; + + +/** + * 租户套餐视图对象 sys_tenant_package + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysTenantPackage.class) +public class SysTenantPackageVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 租户套餐id + */ + @ExcelProperty(value = "租户套餐id") + private Long packageId; + + /** + * 套餐名称 + */ + @ExcelProperty(value = "套餐名称") + private String packageName; + + /** + * 关联菜单id + */ + @ExcelProperty(value = "关联菜单id") + private String menuIds; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 菜单树选择项是否关联显示 + */ + @ExcelProperty(value = "菜单树选择项是否关联显示") + private Boolean menuCheckStrictly; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java new file mode 100644 index 00000000..ad4cbb48 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantVo.java @@ -0,0 +1,113 @@ +package org.dromara.system.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.domain.SysTenant; + +import java.io.Serializable; +import java.util.Date; + + +/** + * 租户视图对象 sys_tenant + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = SysTenant.class) +public class SysTenantVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 租户编号 + */ + @ExcelProperty(value = "租户编号") + private String tenantId; + + /** + * 联系人 + */ + @ExcelProperty(value = "联系人") + private String contactUserName; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String contactPhone; + + /** + * 企业名称 + */ + @ExcelProperty(value = "企业名称") + private String companyName; + + /** + * 统一社会信用代码 + */ + @ExcelProperty(value = "统一社会信用代码") + private String licenseNumber; + + /** + * 地址 + */ + @ExcelProperty(value = "地址") + private String address; + + /** + * 域名 + */ + @ExcelProperty(value = "域名") + private String domain; + + /** + * 企业简介 + */ + @ExcelProperty(value = "企业简介") + private String intro; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 租户套餐编号 + */ + @ExcelProperty(value = "租户套餐编号") + private Long packageId; + + /** + * 过期时间 + */ + @ExcelProperty(value = "过期时间") + private Date expireTime; + + /** + * 用户数量(-1不限制) + */ + @ExcelProperty(value = "用户数量") + private Long accountCount; + + /** + * 租户状态(0正常 1停用) + */ + @ExcelProperty(value = "租户状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java index a6e8dcf0..49feee17 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserExportVo.java @@ -1,10 +1,12 @@ package org.dromara.system.domain.vo; import com.alibaba.excel.annotation.ExcelProperty; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.ReverseAutoMapping; import lombok.Data; import lombok.NoArgsConstructor; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; import java.io.Serializable; import java.util.Date; @@ -17,7 +19,9 @@ import java.util.Date; @Data @NoArgsConstructor +@AutoMapper(target = SysUserVo.class, convertGenerate = false) public class SysUserExportVo implements Serializable { + private static final long serialVersionUID = 1L; /** @@ -79,12 +83,14 @@ public class SysUserExportVo implements Serializable { /** * 部门名称 */ + @ReverseAutoMapping(target = "deptName", source = "dept.deptName") @ExcelProperty(value = "部门名称") private String deptName; /** * 负责人 */ + @ReverseAutoMapping(target = "leader", source = "dept.leader") @ExcelProperty(value = "部门负责人") private String leader; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java index 034d1aa2..6183aba9 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java @@ -1,13 +1,14 @@ package org.dromara.system.domain.vo; import com.alibaba.excel.annotation.ExcelProperty; -import org.dromara.common.excel.annotation.ExcelDictFormat; -import org.dromara.common.excel.convert.ExcelDictConvert; import lombok.Data; import lombok.NoArgsConstructor; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; import java.io.Serializable; + /** * 用户对象导入VO * @@ -16,7 +17,9 @@ import java.io.Serializable; @Data @NoArgsConstructor +// @Accessors(chain = true) // 导入不允许使用 会找不到set方法 public class SysUserImportVo implements Serializable { + private static final long serialVersionUID = 1L; /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java new file mode 100644 index 00000000..e41355d0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserInfoVo.java @@ -0,0 +1,40 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 用户信息 + * + * @author Michelle.Chung + */ +@Data +public class SysUserInfoVo { + + /** + * 用户信息 + */ + private SysUserVo user; + + /** + * 角色ID列表 + */ + private List roleIds; + + /** + * 角色列表 + */ + private List roles; + + /** + * 岗位ID列表 + */ + private List postIds; + + /** + * 岗位列表 + */ + private List posts; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java new file mode 100644 index 00000000..8f11e8d3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java @@ -0,0 +1,135 @@ +package org.dromara.system.domain.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.domain.SysUser; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 用户信息视图对象 sys_user + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysUser.class) +public class SysUserVo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 头像地址 + */ + @Translation(type = TransConstant.OSS_ID_TO_URL) + private Long avatar; + + /** + * 密码 + */ + @JsonIgnore + @JsonProperty + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 最后登录IP + */ + private String loginIp; + + /** + * 最后登录时间 + */ + private Date loginDate; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 部门对象 + */ + private SysDeptVo dept; + + /** + * 角色对象 + */ + private List roles; + + /** + * 角色组 + */ + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java new file mode 100644 index 00000000..48fa92a5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/UserInfoVo.java @@ -0,0 +1,30 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; + +import java.util.Set; + +/** + * 登录用户信息 + * + * @author Michelle.Chung + */ +@Data +public class UserInfoVo { + + /** + * 用户基本信息 + */ + private SysUserVo user; + + /** + * 菜单权限 + */ + private Set permissions; + + /** + * 角色权限 + */ + private Set roles; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java index 6ab1ffcf..a27ee32f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDataScopeServiceImpl.java @@ -3,15 +3,15 @@ package org.dromara.system.dubbo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.system.api.RemoteDataScopeService; -import org.dromara.system.api.domain.SysDept; +import org.dromara.system.domain.SysDept; import org.dromara.system.domain.SysRoleDept; import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysRoleDeptMapper; -import lombok.RequiredArgsConstructor; -import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; import java.util.List; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java index 49790ec8..b8a9519d 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteDictServiceImpl.java @@ -1,10 +1,12 @@ package org.dromara.system.dubbo; -import org.dromara.system.api.RemoteDictService; -import org.dromara.system.api.domain.SysDictData; -import org.dromara.system.service.ISysDictTypeService; import lombok.RequiredArgsConstructor; import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.BeanCopyUtils; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.service.ISysDictTypeService; import org.springframework.stereotype.Service; import java.util.List; @@ -23,8 +25,9 @@ public class RemoteDictServiceImpl implements RemoteDictService { @Override - public List selectDictDataByType(String dictType) { - return sysDictTypeService.selectDictDataByType(dictType); + public List selectDictDataByType(String dictType) { + List sysDictDataVos = sysDictTypeService.selectDictDataByType(dictType); + return BeanCopyUtils.copyList(sysDictDataVos, RemoteDictDataVo.class); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java index e5316079..88fa2ab6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteLogServiceImpl.java @@ -1,12 +1,15 @@ package org.dromara.system.dubbo; -import org.dromara.system.api.RemoteLogService; -import org.dromara.system.api.domain.SysLogininfor; -import org.dromara.system.api.domain.SysOperLog; -import org.dromara.system.service.ISysLogininforService; -import org.dromara.system.service.ISysOperLogService; import lombok.RequiredArgsConstructor; import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.BeanCopyUtils; +import org.dromara.system.api.RemoteLogService; +import org.dromara.system.api.domain.bo.RemoteLogininforBo; +import org.dromara.system.api.domain.bo.RemoteOperLogBo; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.service.ISysLogininforService; +import org.dromara.system.service.ISysOperLogService; import org.springframework.stereotype.Service; /** @@ -23,12 +26,14 @@ public class RemoteLogServiceImpl implements RemoteLogService { private final ISysLogininforService logininforService; @Override - public Boolean saveLog(SysOperLog sysOperLog) { - return operLogService.insertOperlog(sysOperLog) > 0; + public void saveLog(RemoteOperLogBo remoteOperLogBo) { + SysOperLogBo sysOperLogBo = BeanCopyUtils.copy(remoteOperLogBo, SysOperLogBo.class); + operLogService.insertOperlog(sysOperLogBo); } @Override - public Boolean saveLogininfor(SysLogininfor sysLogininfor) { - return logininforService.insertLogininfor(sysLogininfor) > 0; + public void saveLogininfor(RemoteLogininforBo remoteLogininforBo) { + SysLogininforBo sysLogininforBo = BeanCopyUtils.copy(remoteLogininforBo, SysLogininforBo.class); + logininforService.insertLogininfor(sysLogininforBo); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java new file mode 100644 index 00000000..a054bbf0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteTenantServiceImpl.java @@ -0,0 +1,43 @@ +package org.dromara.system.dubbo; + +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.BeanCopyUtils; +import org.dromara.system.api.RemoteTenantService; +import org.dromara.system.api.domain.vo.RemoteTenantVo; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.service.ISysTenantService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author zhujie + */ +@RequiredArgsConstructor +@Service +@DubboService +public class RemoteTenantServiceImpl implements RemoteTenantService { + + private final ISysTenantService tenantService; + + /** + * 根据租户id获取租户详情 + */ + @Override + public RemoteTenantVo queryByTenantId(String tenantId) { + SysTenantVo sysTenantVo = tenantService.queryByTenantId(tenantId); + return BeanCopyUtils.copy(sysTenantVo, RemoteTenantVo.class); + } + + /** + * 获取租户列表 + */ + @Override + public List queryList() { + List sysTenantVos = tenantService.queryList(new SysTenantBo()); + return BeanCopyUtils.copyList(sysTenantVos, RemoteTenantVo.class); + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java index 5ffee29f..b365a646 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java @@ -3,20 +3,24 @@ package org.dromara.system.dubbo; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.apache.dubbo.config.annotation.DubboService; import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.BeanCopyUtils; import org.dromara.system.api.RemoteUserService; -import org.dromara.system.api.domain.SysUser; +import org.dromara.system.api.domain.bo.RemoteUserBo; import org.dromara.system.api.model.LoginUser; import org.dromara.system.api.model.RoleDTO; import org.dromara.system.api.model.XcxLoginUser; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysConfigService; import org.dromara.system.service.ISysPermissionService; import org.dromara.system.service.ISysUserService; -import lombok.RequiredArgsConstructor; -import org.apache.dubbo.config.annotation.DubboService; import org.springframework.stereotype.Service; import java.util.List; @@ -101,15 +105,16 @@ public class RemoteUserServiceImpl implements RemoteUserService { } @Override - public Boolean registerUserInfo(SysUser sysUser) { - String username = sysUser.getUserName(); + public Boolean registerUserInfo(RemoteUserBo remoteUserBo) { + SysUserBo sysUserBo = BeanCopyUtils.copy(remoteUserBo, SysUserBo.class); + String username = sysUserBo.getUserName(); if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser")))) { throw new ServiceException("当前系统没有开启注册功能"); } - if (!userService.checkUserNameUnique(sysUser)) { + if (!userService.checkUserNameUnique(sysUserBo)) { throw new UserException("user.register.save.error", username); } - return userService.registerUser(sysUser); + return userService.registerUser(sysUserBo, remoteUserBo.getTenantId()); } @Override @@ -120,17 +125,17 @@ public class RemoteUserServiceImpl implements RemoteUserService { /** * 构建登录用户 */ - private LoginUser buildLoginUser(SysUser user) { + private LoginUser buildLoginUser(SysUserVo userVo) { LoginUser loginUser = new LoginUser(); - loginUser.setUserId(user.getUserId()); - loginUser.setDeptId(user.getDeptId()); - loginUser.setUsername(user.getUserName()); - loginUser.setPassword(user.getPassword()); - loginUser.setUserType(user.getUserType()); - loginUser.setMenuPermission(permissionService.getMenuPermission(user)); - loginUser.setRolePermission(permissionService.getRolePermission(user)); - loginUser.setDeptName(ObjectUtil.isNull(user.getDept()) ? "" : user.getDept().getDeptName()); - List roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class); + loginUser.setUserId(userVo.getUserId()); + loginUser.setDeptId(userVo.getDeptId()); + loginUser.setUsername(userVo.getUserName()); + loginUser.setPassword(userVo.getPassword()); + loginUser.setUserType(userVo.getUserType()); + loginUser.setMenuPermission(permissionService.getMenuPermission(userVo.getUserId())); + loginUser.setRolePermission(permissionService.getRolePermission(userVo.getUserId())); + loginUser.setDeptName(ObjectUtil.isNull(userVo.getDept()) ? "" : userVo.getDept().getDeptName()); + List roles = BeanUtil.copyToList(userVo.getRoles(), RoleDTO.class); loginUser.setRoles(roles); return loginUser; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java index 0388f901..96d713d7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/listener/SysUserImportListener.java @@ -1,8 +1,8 @@ package org.dromara.system.listener; -import cn.dev33.satoken.secure.BCrypt; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.digest.BCrypt; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import org.dromara.common.core.exception.ServiceException; @@ -11,8 +11,9 @@ import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.excel.core.ExcelListener; import org.dromara.common.excel.core.ExcelResult; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.api.domain.SysUser; +import org.dromara.system.domain.bo.SysUserBo; import org.dromara.system.domain.vo.SysUserImportVo; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.service.ISysConfigService; import org.dromara.system.service.ISysUserService; import lombok.extern.slf4j.Slf4j; @@ -33,7 +34,7 @@ public class SysUserImportListener extends AnalysisEventListener").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功"); } else if (isUpdateSupport) { - Long userId = user.getUserId(); - user = BeanUtil.toBean(userVo, SysUser.class); + Long userId = sysUser.getUserId(); + SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class); user.setUserId(userId); ValidatorUtils.validate(user); - user.setUpdateBy(operName); + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + user.setUpdateBy(operUserId); userService.updateUser(user); successNum++; successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 更新成功"); } else { failureNum++; - failureMsg.append("
").append(failureNum).append("、账号 ").append(user.getUserName()).append(" 已存在"); + failureMsg.append("
").append(failureNum).append("、账号 ").append(sysUser.getUserName()).append(" 已存在"); } } catch (Exception e) { failureNum++; - String msg = "
" + failureNum + "、账号 " + user.getUserName() + " 导入失败:"; + String msg = "
" + failureNum + "、账号 " + sysUser.getUserName() + " 导入失败:"; failureMsg.append(msg).append(e.getMessage()); log.error(msg, e); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java index 2dda20be..0eaaee8f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysConfigMapper.java @@ -2,12 +2,13 @@ package org.dromara.system.mapper; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.vo.SysConfigVo; /** * 参数配置 数据层 * * @author Lion Li */ -public interface SysConfigMapper extends BaseMapperPlus { +public interface SysConfigMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index 81a0b782..45ad77e9 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -5,7 +5,8 @@ import com.baomidou.mybatisplus.core.toolkit.Constants; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.api.domain.SysDept; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.vo.SysDeptVo; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -15,7 +16,7 @@ import java.util.List; * * @author Lion Li */ -public interface SysDeptMapper extends BaseMapperPlus { +public interface SysDeptMapper extends BaseMapperPlus { /** * 查询部门管理数据 @@ -26,7 +27,12 @@ public interface SysDeptMapper extends BaseMapperPlus selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + SysDeptVo selectDeptById(Long deptId); /** * 根据角色ID查询部门树信息 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java index 78cf6d73..5c856537 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictDataMapper.java @@ -2,8 +2,9 @@ package org.dromara.system.mapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.dromara.common.core.constant.UserConstants; +import org.dromara.system.domain.SysDictData; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.api.domain.SysDictData; +import org.dromara.system.domain.vo.SysDictDataVo; import java.util.List; @@ -12,14 +13,13 @@ import java.util.List; * * @author Lion Li */ -public interface SysDictDataMapper extends BaseMapperPlus { +public interface SysDictDataMapper extends BaseMapperPlus { - default List selectDictDataByType(String dictType) { - return selectList( + default List selectDictDataByType(String dictType) { + return selectVoList( new LambdaQueryWrapper() .eq(SysDictData::getStatus, UserConstants.DICT_NORMAL) .eq(SysDictData::getDictType, dictType) .orderByAsc(SysDictData::getDictSort)); } - } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java index 12731909..9a9bdd52 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysDictTypeMapper.java @@ -1,13 +1,14 @@ package org.dromara.system.mapper; +import org.dromara.system.domain.SysDictType; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.api.domain.SysDictType; +import org.dromara.system.domain.vo.SysDictTypeVo; /** * 字典表 数据层 * * @author Lion Li */ -public interface SysDictTypeMapper extends BaseMapperPlus { +public interface SysDictTypeMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java index 487842d5..85edd1df 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysLogininforMapper.java @@ -1,13 +1,14 @@ package org.dromara.system.mapper; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.api.domain.SysLogininfor; +import org.dromara.system.domain.SysLogininfor; +import org.dromara.system.domain.vo.SysLogininforVo; /** * 系统访问日志情况信息 数据层 * * @author Lion Li */ -public interface SysLogininforMapper extends BaseMapperPlus { +public interface SysLogininforMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java index 8672798e..b2be0e98 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysMenuMapper.java @@ -4,8 +4,9 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import org.dromara.common.core.constant.UserConstants; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.system.domain.SysMenu; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.vo.SysMenuVo; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -15,7 +16,7 @@ import java.util.List; * * @author Lion Li */ -public interface SysMenuMapper extends BaseMapperPlus { +public interface SysMenuMapper extends BaseMapperPlus { /** * 根据用户所有权限 @@ -32,14 +33,6 @@ public interface SysMenuMapper extends BaseMapperPlus selectMenuListByUserId(@Param(Constants.WRAPPER) Wrapper queryWrapper); - /** - * 根据角色ID查询权限 - * - * @param roleId 角色ID - * @return 权限列表 - */ - public List selectMenuPermsByRoleId(Long roleId); - /** * 根据用户ID查询权限 * @@ -48,6 +41,14 @@ public interface SysMenuMapper extends BaseMapperPlus selectMenuPermsByUserId(Long userId); + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + List selectMenuPermsByRoleId(Long roleId); + /** * 根据用户ID查询菜单 * diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java index 9a61f5f9..1e27b778 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysNoticeMapper.java @@ -2,12 +2,13 @@ package org.dromara.system.mapper; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.vo.SysNoticeVo; /** * 通知公告表 数据层 * * @author Lion Li */ -public interface SysNoticeMapper extends BaseMapperPlus { +public interface SysNoticeMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java index 1f10f4dd..5d204041 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysOperLogMapper.java @@ -1,13 +1,14 @@ package org.dromara.system.mapper; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.api.domain.SysOperLog; +import org.dromara.system.domain.SysOperLog; +import org.dromara.system.domain.vo.SysOperLogVo; /** * 操作日志 数据层 * * @author Lion Li */ -public interface SysOperLogMapper extends BaseMapperPlus { +public interface SysOperLogMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java index 714a6850..48e6a121 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysPostMapper.java @@ -2,6 +2,7 @@ package org.dromara.system.mapper; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.vo.SysPostVo; import java.util.List; @@ -10,7 +11,7 @@ import java.util.List; * * @author Lion Li */ -public interface SysPostMapper extends BaseMapperPlus { +public interface SysPostMapper extends BaseMapperPlus { /** * 根据用户ID获取岗位选择框列表 @@ -26,6 +27,6 @@ public interface SysPostMapper extends BaseMapperPlus selectPostsByUserName(String userName); + List selectPostsByUserName(String userName); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java index 024cfd20..3de0bb67 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleDeptMapper.java @@ -8,6 +8,6 @@ import org.dromara.system.domain.SysRoleDept; * * @author Lion Li */ -public interface SysRoleDeptMapper extends BaseMapperPlus { +public interface SysRoleDeptMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java index 43251077..a0a29b1a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMapper.java @@ -6,7 +6,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.api.domain.SysRole; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.vo.SysRoleVo; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,12 +17,12 @@ import java.util.List; * * @author Lion Li */ -public interface SysRoleMapper extends BaseMapperPlus { +public interface SysRoleMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "d.dept_id") }) - Page selectPageRoleList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + Page selectPageRoleList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); /** * 根据条件分页查询角色数据 @@ -32,7 +33,12 @@ public interface SysRoleMapper extends BaseMapperPlus selectRoleList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + List selectRoleList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id") + }) + SysRoleVo selectRoleById(Long roleId); /** * 根据用户ID查询角色 @@ -40,7 +46,7 @@ public interface SysRoleMapper extends BaseMapperPlus selectRolePermissionByUserId(Long userId); + List selectRolePermissionByUserId(Long userId); /** @@ -57,6 +63,6 @@ public interface SysRoleMapper extends BaseMapperPlus selectRolesByUserName(String userName); + List selectRolesByUserName(String userName); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java index e95d60ac..0a657b42 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysRoleMenuMapper.java @@ -8,6 +8,6 @@ import org.dromara.system.domain.SysRoleMenu; * * @author Lion Li */ -public interface SysRoleMenuMapper extends BaseMapperPlus { +public interface SysRoleMenuMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java new file mode 100644 index 00000000..7e1167aa --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.system.domain.SysTenant; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 租户Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysTenantMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java new file mode 100644 index 00000000..10ca1700 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantPackageMapper.java @@ -0,0 +1,14 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.vo.SysTenantPackageVo; + +/** + * 租户套餐Mapper接口 + * + * @author Michelle.Chung + */ +public interface SysTenantPackageMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java index 8056f673..81bd1ff3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java @@ -1,12 +1,14 @@ package org.dromara.system.mapper; +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.dromara.common.mybatis.annotation.DataColumn; import org.dromara.common.mybatis.annotation.DataPermission; import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.api.domain.SysUser; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysUserVo; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -16,13 +18,13 @@ import java.util.List; * * @author Lion Li */ -public interface SysUserMapper extends BaseMapperPlus { +public interface SysUserMapper extends BaseMapperPlus { @DataPermission({ @DataColumn(key = "deptName", value = "d.dept_id"), @DataColumn(key = "userName", value = "u.user_id") }) - Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); /** * 根据条件分页查询用户列表 @@ -34,7 +36,7 @@ public interface SysUserMapper extends BaseMapperPlus selectUserList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + List selectUserList(@Param(Constants.WRAPPER) Wrapper queryWrapper); /** * 根据条件分页查询已配用户角色列表 @@ -46,7 +48,7 @@ public interface SysUserMapper extends BaseMapperPlus selectAllocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + Page selectAllocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); /** * 根据条件分页查询未分配用户角色列表 @@ -58,8 +60,7 @@ public interface SysUserMapper extends BaseMapperPlus selectUnallocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); - + Page selectUnallocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); /** * 通过用户名查询用户 @@ -67,7 +68,7 @@ public interface SysUserMapper extends BaseMapperPlus updateWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int updateById(@Param(Constants.ENTITY) SysUser user); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java index 4e7fbc66..07c13711 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserPostMapper.java @@ -8,6 +8,6 @@ import org.dromara.system.domain.SysUserPost; * * @author Lion Li */ -public interface SysUserPostMapper extends BaseMapperPlus { +public interface SysUserPostMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java index a6523aa2..e2f706c8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserRoleMapper.java @@ -10,7 +10,7 @@ import java.util.List; * * @author Lion Li */ -public interface SysUserRoleMapper extends BaseMapperPlus { +public interface SysUserRoleMapper extends BaseMapperPlus { List selectUserIdsByRoleId(Long roleId); diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java deleted file mode 100644 index c59d35b9..00000000 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/runner/SystemApplicationRunner.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.dromara.system.runner; - -import org.dromara.system.service.ISysConfigService; -import org.dromara.system.service.ISysDictTypeService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.stereotype.Component; - -/** - * 初始化 system 模块对应业务数据 - * - * @author Lion Li - */ -@Slf4j -@RequiredArgsConstructor -@Component -public class SystemApplicationRunner implements ApplicationRunner { - - private final ISysConfigService configService; - private final ISysDictTypeService dictTypeService; - - @Override - public void run(ApplicationArguments args) throws Exception { - configService.loadingConfigCache(); - log.info("加载参数缓存数据成功"); - dictTypeService.loadingDictCache(); - log.info("加载字典缓存数据成功"); - } - -} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java index 1d3b9bdd..f7efda7a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysConfigService.java @@ -2,18 +2,20 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; import java.util.List; /** * 参数配置 服务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysConfigService { - TableDataInfo selectPageConfigList(SysConfig config, PageQuery pageQuery); + + TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery); /** * 查询参数配置信息 @@ -21,7 +23,7 @@ public interface ISysConfigService { * @param configId 参数配置ID * @return 参数配置信息 */ - SysConfig selectConfigById(Long configId); + SysConfigVo selectConfigById(Long configId); /** * 根据键名查询参数配置信息 @@ -31,29 +33,36 @@ public interface ISysConfigService { */ String selectConfigByKey(String configKey); + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + boolean selectRegisterEnabled(String tenantId); + /** * 查询参数配置列表 * * @param config 参数配置信息 * @return 参数配置集合 */ - List selectConfigList(SysConfig config); + List selectConfigList(SysConfigBo config); /** * 新增参数配置 * - * @param config 参数配置信息 + * @param bo 参数配置信息 * @return 结果 */ - String insertConfig(SysConfig config); + String insertConfig(SysConfigBo bo); /** * 修改参数配置 * - * @param config 参数配置信息 + * @param bo 参数配置信息 * @return 结果 */ - String updateConfig(SysConfig config); + String updateConfig(SysConfigBo bo); /** * 批量删除参数信息 @@ -62,16 +71,6 @@ public interface ISysConfigService { */ void deleteConfigByIds(Long[] configIds); - /** - * 加载参数缓存数据 - */ - void loadingConfigCache(); - - /** - * 清空参数缓存数据 - */ - void clearConfigCache(); - /** * 重置参数缓存数据 */ @@ -83,5 +82,6 @@ public interface ISysConfigService { * @param config 参数信息 * @return 结果 */ - boolean checkConfigKeyUnique(SysConfig config); + boolean checkConfigKeyUnique(SysConfigBo config); + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java new file mode 100644 index 00000000..3f252f7e --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDataScopeService.java @@ -0,0 +1,26 @@ +package org.dromara.system.service; + +/** + * 通用 数据权限 服务 + * + * @author Lion Li + */ +public interface ISysDataScopeService { + + /** + * 获取角色自定义权限 + * + * @param roleId 角色id + * @return 部门id组 + */ + String getRoleCustom(Long roleId); + + /** + * 获取部门及以下权限 + * + * @param deptId 部门id + * @return 部门id组 + */ + String getDeptAndChild(Long deptId); + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java index 8c22ad21..f3aec22f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -1,14 +1,16 @@ package org.dromara.system.service; import cn.hutool.core.lang.tree.Tree; -import org.dromara.system.api.domain.SysDept; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; import java.util.List; /** * 部门管理 服务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysDeptService { /** @@ -17,7 +19,7 @@ public interface ISysDeptService { * @param dept 部门信息 * @return 部门信息集合 */ - List selectDeptList(SysDept dept); + List selectDeptList(SysDeptBo dept); /** * 查询部门树结构信息 @@ -25,7 +27,7 @@ public interface ISysDeptService { * @param dept 部门信息 * @return 部门树信息集合 */ - public List> selectDeptTreeList(SysDept dept); + List> selectDeptTreeList(SysDeptBo dept); /** * 构建前端所需要下拉树结构 @@ -49,7 +51,7 @@ public interface ISysDeptService { * @param deptId 部门ID * @return 部门信息 */ - SysDept selectDeptById(Long deptId); + SysDeptVo selectDeptById(Long deptId); /** * 通过部门ID查询部门名称 @@ -60,7 +62,7 @@ public interface ISysDeptService { String selectDeptNameByIds(String deptIds); /** - * 根据ID查询所有子部门(正常状态) + * 根据ID查询所有子部门数(正常状态) * * @param deptId 部门ID * @return 子部门数 @@ -89,7 +91,7 @@ public interface ISysDeptService { * @param dept 部门信息 * @return 结果 */ - boolean checkDeptNameUnique(SysDept dept); + boolean checkDeptNameUnique(SysDeptBo dept); /** * 校验部门是否有数据权限 @@ -101,18 +103,18 @@ public interface ISysDeptService { /** * 新增保存部门信息 * - * @param dept 部门信息 + * @param bo 部门信息 * @return 结果 */ - int insertDept(SysDept dept); + int insertDept(SysDeptBo bo); /** * 修改保存部门信息 * - * @param dept 部门信息 + * @param bo 部门信息 * @return 结果 */ - int updateDept(SysDept dept); + int updateDept(SysDeptBo bo); /** * 删除部门管理信息 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java index 5ba79a11..30442cec 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictDataService.java @@ -2,18 +2,20 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysDictData; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; import java.util.List; /** * 字典 业务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysDictDataService { - TableDataInfo selectPageDictDataList(SysDictData dictData, PageQuery pageQuery); + + TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery); /** * 根据条件分页查询字典数据 @@ -21,7 +23,7 @@ public interface ISysDictDataService { * @param dictData 字典数据信息 * @return 字典数据集合信息 */ - List selectDictDataList(SysDictData dictData); + List selectDictDataList(SysDictDataBo dictData); /** * 根据字典类型和字典键值查询字典数据信息 @@ -38,7 +40,7 @@ public interface ISysDictDataService { * @param dictCode 字典数据ID * @return 字典数据 */ - SysDictData selectDictDataById(Long dictCode); + SysDictDataVo selectDictDataById(Long dictCode); /** * 批量删除字典数据信息 @@ -50,16 +52,16 @@ public interface ISysDictDataService { /** * 新增保存字典数据信息 * - * @param dictData 字典数据信息 + * @param bo 字典数据信息 * @return 结果 */ - List insertDictData(SysDictData dictData); + List insertDictData(SysDictDataBo bo); /** * 修改保存字典数据信息 * - * @param dictData 字典数据信息 + * @param bo 字典数据信息 * @return 结果 */ - List updateDictData(SysDictData dictData); + List updateDictData(SysDictDataBo bo); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java index d2bdbca5..52cdd2b0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDictTypeService.java @@ -2,19 +2,21 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysDictData; -import org.dromara.system.api.domain.SysDictType; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysDictTypeVo; import java.util.List; /** * 字典 业务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysDictTypeService { - TableDataInfo selectPageDictTypeList(SysDictType dictType, PageQuery pageQuery); + + TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery); /** * 根据条件分页查询字典类型 @@ -22,14 +24,14 @@ public interface ISysDictTypeService { * @param dictType 字典类型信息 * @return 字典类型集合信息 */ - List selectDictTypeList(SysDictType dictType); + List selectDictTypeList(SysDictTypeBo dictType); /** * 根据所有字典类型 * * @return 字典类型集合信息 */ - List selectDictTypeAll(); + List selectDictTypeAll(); /** * 根据字典类型查询字典数据 @@ -37,7 +39,7 @@ public interface ISysDictTypeService { * @param dictType 字典类型 * @return 字典数据集合信息 */ - List selectDictDataByType(String dictType); + List selectDictDataByType(String dictType); /** * 根据字典类型ID查询信息 @@ -45,7 +47,7 @@ public interface ISysDictTypeService { * @param dictId 字典类型ID * @return 字典类型 */ - SysDictType selectDictTypeById(Long dictId); + SysDictTypeVo selectDictTypeById(Long dictId); /** * 根据字典类型查询信息 @@ -53,7 +55,7 @@ public interface ISysDictTypeService { * @param dictType 字典类型 * @return 字典类型 */ - SysDictType selectDictTypeByType(String dictType); + SysDictTypeVo selectDictTypeByType(String dictType); /** * 批量删除字典信息 @@ -62,16 +64,6 @@ public interface ISysDictTypeService { */ void deleteDictTypeByIds(Long[] dictIds); - /** - * 加载字典缓存数据 - */ - void loadingDictCache(); - - /** - * 清空字典缓存数据 - */ - void clearDictCache(); - /** * 重置字典缓存数据 */ @@ -80,18 +72,18 @@ public interface ISysDictTypeService { /** * 新增保存字典类型信息 * - * @param dictType 字典类型信息 + * @param bo 字典类型信息 * @return 结果 */ - List insertDictType(SysDictType dictType); + List insertDictType(SysDictTypeBo bo); /** * 修改保存字典类型信息 * - * @param dictType 字典类型信息 + * @param bo 字典类型信息 * @return 结果 */ - List updateDictType(SysDictType dictType); + List updateDictType(SysDictTypeBo bo); /** * 校验字典类型称是否唯一 @@ -99,5 +91,5 @@ public interface ISysDictTypeService { * @param dictType 字典类型 * @return 结果 */ - boolean checkDictTypeUnique(SysDictType dictType); + boolean checkDictTypeUnique(SysDictTypeBo dictType); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java index 57e26d20..6b3b7a6b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysLogininforService.java @@ -2,25 +2,27 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysLogininfor; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; import java.util.List; /** * 系统访问日志情况信息 服务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysLogininforService { - TableDataInfo selectPageLogininforList(SysLogininfor logininfor, PageQuery pageQuery); + + TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery); /** * 新增系统登录日志 * - * @param logininfor 访问日志对象 + * @param bo 访问日志对象 */ - int insertLogininfor(SysLogininfor logininfor); + void insertLogininfor(SysLogininforBo bo); /** * 查询系统登录日志集合 @@ -28,7 +30,7 @@ public interface ISysLogininforService { * @param logininfor 访问日志对象 * @return 登录记录集合 */ - List selectLogininforList(SysLogininfor logininfor); + List selectLogininforList(SysLogininforBo logininfor); /** * 批量删除系统登录日志 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java index 3cf53d1f..72d705e9 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysMenuService.java @@ -2,7 +2,9 @@ package org.dromara.system.service; import cn.hutool.core.lang.tree.Tree; import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.bo.SysMenuBo; import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; import java.util.List; import java.util.Set; @@ -10,16 +12,17 @@ import java.util.Set; /** * 菜单 业务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysMenuService { + /** * 根据用户查询系统菜单列表 * * @param userId 用户ID * @return 菜单列表 */ - List selectMenuList(Long userId); + List selectMenuList(Long userId); /** * 根据用户查询系统菜单列表 @@ -28,7 +31,7 @@ public interface ISysMenuService { * @param userId 用户ID * @return 菜单列表 */ - List selectMenuList(SysMenu menu, Long userId); + List selectMenuList(SysMenuBo menu, Long userId); /** * 根据用户ID查询权限 @@ -44,7 +47,7 @@ public interface ISysMenuService { * @param roleId 角色ID * @return 权限列表 */ - public Set selectMenuPermsByRoleId(Long roleId); + Set selectMenuPermsByRoleId(Long roleId); /** * 根据用户ID查询菜单树信息 @@ -62,6 +65,14 @@ public interface ISysMenuService { */ List selectMenuListByRoleId(Long roleId); + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + List selectMenuListByPackageId(Long packageId); + /** * 构建前端路由所需要的菜单 * @@ -76,7 +87,7 @@ public interface ISysMenuService { * @param menus 菜单列表 * @return 下拉树结构列表 */ - List> buildMenuTreeSelect(List menus); + List> buildMenuTreeSelect(List menus); /** * 根据菜单ID查询信息 @@ -84,7 +95,7 @@ public interface ISysMenuService { * @param menuId 菜单ID * @return 菜单信息 */ - SysMenu selectMenuById(Long menuId); + SysMenuVo selectMenuById(Long menuId); /** * 是否存在菜单子节点 @@ -105,18 +116,18 @@ public interface ISysMenuService { /** * 新增保存菜单信息 * - * @param menu 菜单信息 + * @param bo 菜单信息 * @return 结果 */ - int insertMenu(SysMenu menu); + int insertMenu(SysMenuBo bo); /** * 修改保存菜单信息 * - * @param menu 菜单信息 + * @param bo 菜单信息 * @return 结果 */ - int updateMenu(SysMenu menu); + int updateMenu(SysMenuBo bo); /** * 删除菜单管理信息 @@ -132,5 +143,5 @@ public interface ISysMenuService { * @param menu 菜单信息 * @return 结果 */ - boolean checkMenuNameUnique(SysMenu menu); + boolean checkMenuNameUnique(SysMenuBo menu); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java index 62c37078..8ec999d0 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysNoticeService.java @@ -2,17 +2,20 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; import java.util.List; /** * 公告 服务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysNoticeService { - TableDataInfo selectPageNoticeList(SysNotice notice, PageQuery pageQuery); + + + TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery); /** * 查询公告信息 @@ -20,7 +23,7 @@ public interface ISysNoticeService { * @param noticeId 公告ID * @return 公告信息 */ - SysNotice selectNoticeById(Long noticeId); + SysNoticeVo selectNoticeById(Long noticeId); /** * 查询公告列表 @@ -28,23 +31,23 @@ public interface ISysNoticeService { * @param notice 公告信息 * @return 公告集合 */ - List selectNoticeList(SysNotice notice); + List selectNoticeList(SysNoticeBo notice); /** * 新增公告 * - * @param notice 公告信息 + * @param bo 公告信息 * @return 结果 */ - int insertNotice(SysNotice notice); + int insertNotice(SysNoticeBo bo); /** * 修改公告 * - * @param notice 公告信息 + * @param bo 公告信息 * @return 结果 */ - int updateNotice(SysNotice notice); + int updateNotice(SysNoticeBo bo); /** * 删除公告信息 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java index 9d02c78e..95735102 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysOperLogService.java @@ -2,26 +2,26 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysOperLog; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; import java.util.List; /** * 操作日志 服务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysOperLogService { - TableDataInfo selectPageOperLogList(SysOperLog operLog, PageQuery pageQuery); + TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery); /** * 新增操作日志 * - * @param operLog 操作日志对象 - * @return 结果 + * @param bo 操作日志对象 */ - int insertOperlog(SysOperLog operLog); + void insertOperlog(SysOperLogBo bo); /** * 查询系统操作日志集合 @@ -29,7 +29,7 @@ public interface ISysOperLogService { * @param operLog 操作日志对象 * @return 操作日志集合 */ - List selectOperLogList(SysOperLog operLog); + List selectOperLogList(SysOperLogBo operLog); /** * 批量删除系统操作日志 @@ -45,7 +45,7 @@ public interface ISysOperLogService { * @param operId 操作ID * @return 操作日志对象 */ - SysOperLog selectOperLogById(Long operId); + SysOperLogVo selectOperLogById(Long operId); /** * 清空操作日志 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java index d1dcf4e4..0116df54 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPermissionService.java @@ -2,27 +2,27 @@ package org.dromara.system.service; import java.util.Set; -import org.dromara.system.api.domain.SysUser; - /** - * 权限信息 服务层 + * 用户权限处理 * - * @author ruoyi + * @author Lion Li */ public interface ISysPermissionService { + /** * 获取角色数据权限 * - * @param userId 用户Id + * @param userId 用户id * @return 角色权限信息 */ - Set getRolePermission(SysUser user); + Set getRolePermission(Long userId); /** * 获取菜单数据权限 * - * @param userId 用户Id + * @param userId 用户id * @return 菜单权限信息 */ - Set getMenuPermission(SysUser user); + Set getMenuPermission(Long userId); + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java index f18f0206..c6409c86 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPostService.java @@ -2,18 +2,20 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; import java.util.List; /** * 岗位信息 服务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysPostService { - TableDataInfo selectPagePostList(SysPost post, PageQuery pageQuery); + + TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery); /** * 查询岗位信息集合 @@ -21,14 +23,14 @@ public interface ISysPostService { * @param post 岗位信息 * @return 岗位列表 */ - List selectPostList(SysPost post); + List selectPostList(SysPostBo post); /** * 查询所有岗位 * * @return 岗位列表 */ - List selectPostAll(); + List selectPostAll(); /** * 通过岗位ID查询岗位信息 @@ -36,7 +38,7 @@ public interface ISysPostService { * @param postId 岗位ID * @return 角色对象信息 */ - SysPost selectPostById(Long postId); + SysPostVo selectPostById(Long postId); /** * 根据用户ID获取岗位选择框列表 @@ -52,7 +54,7 @@ public interface ISysPostService { * @param post 岗位信息 * @return 结果 */ - boolean checkPostNameUnique(SysPost post); + boolean checkPostNameUnique(SysPostBo post); /** * 校验岗位编码 @@ -60,7 +62,7 @@ public interface ISysPostService { * @param post 岗位信息 * @return 结果 */ - boolean checkPostCodeUnique(SysPost post); + boolean checkPostCodeUnique(SysPostBo post); /** * 通过岗位ID查询岗位使用数量 @@ -89,16 +91,16 @@ public interface ISysPostService { /** * 新增保存岗位信息 * - * @param post 岗位信息 + * @param bo 岗位信息 * @return 结果 */ - int insertPost(SysPost post); + int insertPost(SysPostBo bo); /** * 修改保存岗位信息 * - * @param post 岗位信息 + * @param bo 岗位信息 * @return 结果 */ - int updatePost(SysPost post); + int updatePost(SysPostBo bo); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java index f41826df..c073ce9a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java @@ -2,8 +2,9 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysRole; import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.vo.SysRoleVo; import java.util.List; import java.util.Set; @@ -11,10 +12,12 @@ import java.util.Set; /** * 角色业务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysRoleService { - TableDataInfo selectPageRoleList(SysRole role, PageQuery pageQuery); + + + TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery); /** * 根据条件分页查询角色数据 @@ -22,7 +25,7 @@ public interface ISysRoleService { * @param role 角色信息 * @return 角色数据集合信息 */ - List selectRoleList(SysRole role); + List selectRoleList(SysRoleBo role); /** * 根据用户ID查询角色列表 @@ -30,7 +33,7 @@ public interface ISysRoleService { * @param userId 用户ID * @return 角色列表 */ - List selectRolesByUserId(Long userId); + List selectRolesByUserId(Long userId); /** * 根据用户ID查询角色权限 @@ -45,7 +48,7 @@ public interface ISysRoleService { * * @return 角色列表 */ - List selectRoleAll(); + List selectRoleAll(); /** * 根据用户ID获取角色选择框列表 @@ -61,7 +64,7 @@ public interface ISysRoleService { * @param roleId 角色ID * @return 角色对象信息 */ - SysRole selectRoleById(Long roleId); + SysRoleVo selectRoleById(Long roleId); /** * 校验角色名称是否唯一 @@ -69,7 +72,7 @@ public interface ISysRoleService { * @param role 角色信息 * @return 结果 */ - boolean checkRoleNameUnique(SysRole role); + boolean checkRoleNameUnique(SysRoleBo role); /** * 校验角色权限是否唯一 @@ -77,14 +80,14 @@ public interface ISysRoleService { * @param role 角色信息 * @return 结果 */ - boolean checkRoleKeyUnique(SysRole role); + boolean checkRoleKeyUnique(SysRoleBo role); /** * 校验角色是否允许操作 * - * @param role 角色信息 + * @param roleId 角色ID */ - void checkRoleAllowed(SysRole role); + void checkRoleAllowed(Long roleId); /** * 校验角色是否有数据权限 @@ -104,34 +107,35 @@ public interface ISysRoleService { /** * 新增保存角色信息 * - * @param role 角色信息 + * @param bo 角色信息 * @return 结果 */ - int insertRole(SysRole role); + int insertRole(SysRoleBo bo); /** * 修改保存角色信息 * - * @param role 角色信息 + * @param bo 角色信息 * @return 结果 */ - int updateRole(SysRole role); + int updateRole(SysRoleBo bo); /** * 修改角色状态 * - * @param role 角色信息 + * @param roleId 角色ID + * @param status 角色状态 * @return 结果 */ - int updateRoleStatus(SysRole role); + int updateRoleStatus(Long roleId, String status); /** * 修改数据权限信息 * - * @param role 角色信息 + * @param bo 角色信息 * @return 结果 */ - int authDataScope(SysRole role); + int authDataScope(SysRoleBo bo); /** * 通过角色ID删除角色 @@ -176,5 +180,4 @@ public interface ISysRoleService { int insertAuthUsers(Long roleId, Long[] userIds); void cleanOnlineUserByRole(Long roleId); - } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java new file mode 100644 index 00000000..cdb887ca --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantPackageService.java @@ -0,0 +1,57 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 租户套餐Service接口 + * + * @author Michelle.Chung + */ +public interface ISysTenantPackageService { + + /** + * 查询租户套餐 + */ + SysTenantPackageVo queryById(Long packageId); + + /** + * 查询租户套餐列表 + */ + TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery); + + /** + * 查询租户套餐已启用列表 + */ + List selectList(); + + /** + * 查询租户套餐列表 + */ + List queryList(SysTenantPackageBo bo); + + /** + * 新增租户套餐 + */ + Boolean insertByBo(SysTenantPackageBo bo); + + /** + * 修改租户套餐 + */ + Boolean updateByBo(SysTenantPackageBo bo); + + /** + * 修改套餐状态 + */ + int updatePackageStatus(SysTenantPackageBo bo); + + /** + * 校验并批量删除租户套餐信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java new file mode 100644 index 00000000..f889f2b1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java @@ -0,0 +1,82 @@ +package org.dromara.system.service; + +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 租户Service接口 + * + * @author Michelle.Chung + */ +public interface ISysTenantService { + + /** + * 查询租户 + */ + SysTenantVo queryById(Long id); + + /** + * 基于租户ID查询租户 + */ + SysTenantVo queryByTenantId(String tenantId); + + /** + * 查询租户列表 + */ + TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery); + + /** + * 查询租户列表 + */ + List queryList(SysTenantBo bo); + + /** + * 新增租户 + */ + Boolean insertByBo(SysTenantBo bo); + + /** + * 修改租户 + */ + Boolean updateByBo(SysTenantBo bo); + + /** + * 修改租户状态 + */ + int updateTenantStatus(SysTenantBo bo); + + /** + * 校验租户是否允许操作 + */ + void checkTenantAllowed(String tenantId); + + /** + * 校验并批量删除租户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 校验企业名称是否唯一 + */ + boolean checkCompanyNameUnique(SysTenantBo bo); + + /** + * 校验账号余额 + */ + boolean checkAccountBalance(String tenantId); + + /** + * 校验有效期 + */ + boolean checkExpireTime(String tenantId); + + /** + * 同步租户套餐 + */ + Boolean syncTenantPackage(String tenantId, String packageId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java index 16882447..6045f0b2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -2,17 +2,20 @@ package org.dromara.system.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysUser; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysUserVo; import java.util.List; /** * 用户 业务层 * - * @author ruoyi + * @author Lion Li */ public interface ISysUserService { - TableDataInfo selectPageUserList(SysUser user, PageQuery pageQuery); + + + TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery); /** * 根据条件分页查询用户列表 @@ -20,7 +23,7 @@ public interface ISysUserService { * @param user 用户信息 * @return 用户信息集合信息 */ - List selectUserList(SysUser user); + List selectUserList(SysUserBo user); /** * 根据条件分页查询已分配用户角色列表 @@ -28,7 +31,7 @@ public interface ISysUserService { * @param user 用户信息 * @return 用户信息集合信息 */ - TableDataInfo selectAllocatedList(SysUser user, PageQuery pageQuery); + TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery); /** * 根据条件分页查询未分配用户角色列表 @@ -36,7 +39,7 @@ public interface ISysUserService { * @param user 用户信息 * @return 用户信息集合信息 */ - TableDataInfo selectUnallocatedList(SysUser user, PageQuery pageQuery); + TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery); /** * 通过用户名查询用户 @@ -44,7 +47,7 @@ public interface ISysUserService { * @param userName 用户名 * @return 用户对象信息 */ - SysUser selectUserByUserName(String userName); + SysUserVo selectUserByUserName(String userName); /** * 通过手机号查询用户 @@ -52,7 +55,7 @@ public interface ISysUserService { * @param phonenumber 手机号 * @return 用户对象信息 */ - SysUser selectUserByPhonenumber(String phonenumber); + SysUserVo selectUserByPhonenumber(String phonenumber); /** * 通过用户ID查询用户 @@ -60,7 +63,7 @@ public interface ISysUserService { * @param userId 用户ID * @return 用户对象信息 */ - SysUser selectUserById(Long userId); + SysUserVo selectUserById(Long userId); /** * 根据用户ID查询用户所属角色组 @@ -84,7 +87,7 @@ public interface ISysUserService { * @param user 用户信息 * @return 结果 */ - boolean checkUserNameUnique(SysUser user); + boolean checkUserNameUnique(SysUserBo user); /** * 校验手机号码是否唯一 @@ -92,7 +95,7 @@ public interface ISysUserService { * @param user 用户信息 * @return 结果 */ - boolean checkPhoneUnique(SysUser user); + boolean checkPhoneUnique(SysUserBo user); /** * 校验email是否唯一 @@ -100,14 +103,14 @@ public interface ISysUserService { * @param user 用户信息 * @return 结果 */ - boolean checkEmailUnique(SysUser user); + boolean checkEmailUnique(SysUserBo user); /** * 校验用户是否允许操作 * - * @param user 用户信息 + * @param userId 用户ID */ - void checkUserAllowed(SysUser user); + void checkUserAllowed(Long userId); /** * 校验用户是否有数据权限 @@ -122,7 +125,7 @@ public interface ISysUserService { * @param user 用户信息 * @return 结果 */ - int insertUser(SysUser user); + int insertUser(SysUserBo user); /** * 注册用户信息 @@ -130,7 +133,7 @@ public interface ISysUserService { * @param user 用户信息 * @return 结果 */ - boolean registerUser(SysUser user); + boolean registerUser(SysUserBo user, String tenantId); /** * 修改用户信息 @@ -138,7 +141,7 @@ public interface ISysUserService { * @param user 用户信息 * @return 结果 */ - int updateUser(SysUser user); + int updateUser(SysUserBo user); /** * 用户授权角色 @@ -151,10 +154,11 @@ public interface ISysUserService { /** * 修改用户状态 * - * @param user 用户信息 + * @param userId 用户ID + * @param status 帐号状态 * @return 结果 */ - int updateUserStatus(SysUser user); + int updateUserStatus(Long userId, String status); /** * 修改用户基本信息 @@ -162,33 +166,25 @@ public interface ISysUserService { * @param user 用户信息 * @return 结果 */ - int updateUserProfile(SysUser user); + int updateUserProfile(SysUserBo user); /** * 修改用户头像 * - * @param userName 用户名 - * @param avatar 头像地址 + * @param userId 用户ID + * @param avatar 头像地址 * @return 结果 */ - boolean updateUserAvatar(String userName, String avatar); + boolean updateUserAvatar(Long userId, Long avatar); /** * 重置用户密码 * - * @param user 用户信息 - * @return 结果 - */ - int resetPwd(SysUser user); - - /** - * 重置用户密码 - * - * @param userName 用户名 + * @param userId 用户ID * @param password 密码 * @return 结果 */ - int resetUserPwd(String userName, String password); + int resetUserPwd(Long userId, String password); /** * 通过用户ID删除用户 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java index d6f3f8ce..49fdd87a 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java @@ -1,19 +1,26 @@ package org.dromara.system.service.impl; +import cn.hutool.core.convert.Convert; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.system.domain.SysConfig; +import org.dromara.system.domain.bo.SysConfigBo; +import org.dromara.system.domain.vo.SysConfigVo; import org.dromara.system.mapper.SysConfigMapper; import org.dromara.system.service.ISysConfigService; -import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @@ -34,15 +41,9 @@ public class SysConfigServiceImpl implements ISysConfigService { private final SysConfigMapper baseMapper; @Override - public TableDataInfo selectPageConfigList(SysConfig config, PageQuery pageQuery) { - Map params = config.getParams(); - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(config.getConfigName()), SysConfig::getConfigName, config.getConfigName()) - .eq(StringUtils.isNotBlank(config.getConfigType()), SysConfig::getConfigType, config.getConfigType()) - .like(StringUtils.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey()) - .between(params.get("beginTime") != null && params.get("endTime") != null, - SysConfig::getCreateTime, params.get("beginTime"), params.get("endTime")); - Page page = baseMapper.selectPage(pageQuery.build(), lqw); + public TableDataInfo selectPageConfigList(SysConfigBo config, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -53,8 +54,9 @@ public class SysConfigServiceImpl implements ISysConfigService { * @return 参数配置信息 */ @Override - public SysConfig selectConfigById(Long configId) { - return baseMapper.selectById(configId); + @DS("master") + public SysConfigVo selectConfigById(Long configId) { + return baseMapper.selectVoById(configId); } /** @@ -74,6 +76,22 @@ public class SysConfigServiceImpl implements ISysConfigService { return StringUtils.EMPTY; } + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + @Override + public boolean selectRegisterEnabled(String tenantId) { + SysConfig retConfig = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(SysConfig::getConfigKey, "sys.account.registerUser") + .eq(TenantHelper.isEnable(),SysConfig::getTenantId, tenantId)); + if (ObjectUtil.isNull(retConfig)) { + return false; + } + return Convert.toBool(retConfig.getConfigValue()); + } + /** * 查询参数配置列表 * @@ -81,26 +99,32 @@ public class SysConfigServiceImpl implements ISysConfigService { * @return 参数配置集合 */ @Override - public List selectConfigList(SysConfig config) { - Map params = config.getParams(); - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(config.getConfigName()), SysConfig::getConfigName, config.getConfigName()) - .eq(StringUtils.isNotBlank(config.getConfigType()), SysConfig::getConfigType, config.getConfigType()) - .like(StringUtils.isNotBlank(config.getConfigKey()), SysConfig::getConfigKey, config.getConfigKey()) - .between(params.get("beginTime") != null && params.get("endTime") != null, - SysConfig::getCreateTime, params.get("beginTime"), params.get("endTime")); - return baseMapper.selectList(lqw); + public List selectConfigList(SysConfigBo config) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysConfigBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getConfigName()), SysConfig::getConfigName, bo.getConfigName()); + lqw.eq(StringUtils.isNotBlank(bo.getConfigType()), SysConfig::getConfigType, bo.getConfigType()); + lqw.like(StringUtils.isNotBlank(bo.getConfigKey()), SysConfig::getConfigKey, bo.getConfigKey()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysConfig::getCreateTime, params.get("beginTime"), params.get("endTime")); + return lqw; } /** * 新增参数配置 * - * @param config 参数配置信息 + * @param bo 参数配置信息 * @return 结果 */ - @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#config.configKey") + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") @Override - public String insertConfig(SysConfig config) { + public String insertConfig(SysConfigBo bo) { + SysConfig config = MapstructUtils.convert(bo, SysConfig.class); int row = baseMapper.insert(config); if (row > 0) { return config.getConfigValue(); @@ -111,13 +135,14 @@ public class SysConfigServiceImpl implements ISysConfigService { /** * 修改参数配置 * - * @param config 参数配置信息 + * @param bo 参数配置信息 * @return 结果 */ - @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#config.configKey") + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") @Override - public String updateConfig(SysConfig config) { + public String updateConfig(SysConfigBo bo) { int row = 0; + SysConfig config = MapstructUtils.convert(bo, SysConfig.class); if (config.getConfigId() != null) { SysConfig temp = baseMapper.selectById(config.getConfigId()); if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) { @@ -142,7 +167,7 @@ public class SysConfigServiceImpl implements ISysConfigService { @Override public void deleteConfigByIds(Long[] configIds) { for (Long configId : configIds) { - SysConfig config = selectConfigById(configId); + SysConfig config = baseMapper.selectById(configId); if (StringUtils.equals(UserConstants.YES, config.getConfigType())) { throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); } @@ -151,31 +176,12 @@ public class SysConfigServiceImpl implements ISysConfigService { baseMapper.deleteBatchIds(Arrays.asList(configIds)); } - /** - * 加载参数缓存数据 - */ - @Override - public void loadingConfigCache() { - List configsList = selectConfigList(new SysConfig()); - configsList.forEach(config -> - CacheUtils.put(CacheNames.SYS_CONFIG, config.getConfigKey(), config.getConfigValue())); - } - - /** - * 清空参数缓存数据 - */ - @Override - public void clearConfigCache() { - CacheUtils.clear(CacheNames.SYS_CONFIG); - } - /** * 重置参数缓存数据 */ @Override public void resetConfigCache() { - clearConfigCache(); - loadingConfigCache(); + CacheUtils.clear(CacheNames.SYS_CONFIG); } /** @@ -185,10 +191,10 @@ public class SysConfigServiceImpl implements ISysConfigService { * @return 结果 */ @Override - public boolean checkConfigKeyUnique(SysConfig config) { - Long configId = ObjectUtil.isNull(config.getConfigId()) ? -1L : config.getConfigId(); + public boolean checkConfigKeyUnique(SysConfigBo config) { + long configId = ObjectUtil.isNull(config.getConfigId()) ? -1L : config.getConfigId(); SysConfig info = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, config.getConfigKey())); - if (ObjectUtil.isNotNull(info) && info.getConfigId().longValue() != configId.longValue()) { + if (ObjectUtil.isNotNull(info) && info.getConfigId() != configId) { return false; } return true; diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java new file mode 100644 index 00000000..6d5964f3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDataScopeServiceImpl.java @@ -0,0 +1,61 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.mybatis.helper.DataBaseHelper; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRoleDept; +import org.dromara.system.mapper.SysDeptMapper; +import org.dromara.system.mapper.SysRoleDeptMapper; +import org.dromara.system.service.ISysDataScopeService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 数据权限 实现 + *

+ * 注意: 此Service内不允许调用标注`数据权限`注解的方法 + * 例如: deptMapper.selectList 此 selectList 方法标注了`数据权限`注解 会出现循环解析的问题 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service("sdss") +public class SysDataScopeServiceImpl implements ISysDataScopeService { + + private final SysRoleDeptMapper roleDeptMapper; + private final SysDeptMapper deptMapper; + + @Override + public String getRoleCustom(Long roleId) { + List list = roleDeptMapper.selectList( + new LambdaQueryWrapper() + .select(SysRoleDept::getDeptId) + .eq(SysRoleDept::getRoleId, roleId)); + if (CollUtil.isNotEmpty(list)) { + return StreamUtils.join(list, rd -> Convert.toStr(rd.getDeptId())); + } + return null; + } + + @Override + public String getDeptAndChild(Long deptId) { + List deptList = deptMapper.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + List ids = StreamUtils.toList(deptList, SysDept::getDeptId); + ids.add(deptId); + List list = deptMapper.selectList(new LambdaQueryWrapper() + .select(SysDept::getDeptId) + .in(SysDept::getDeptId, ids)); + if (CollUtil.isNotEmpty(list)) { + return StreamUtils.join(list, d -> Convert.toStr(d.getDeptId())); + } + return null; + } + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 0144c746..36229909 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -6,23 +6,27 @@ import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.TreeBuildUtils; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.redis.utils.CacheUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.api.domain.SysDept; -import org.dromara.system.api.domain.SysRole; -import org.dromara.system.api.domain.SysUser; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysRole; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.mapper.SysDeptMapper; import org.dromara.system.mapper.SysRoleMapper; import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysDeptService; -import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @@ -38,7 +42,7 @@ import java.util.List; */ @RequiredArgsConstructor @Service -public class SysDeptServiceImpl implements ISysDeptService { +public class SysDeptServiceImpl implements ISysDeptService{ private final SysDeptMapper baseMapper; private final SysRoleMapper roleMapper; @@ -51,30 +55,36 @@ public class SysDeptServiceImpl implements ISysDeptService { * @return 部门信息集合 */ @Override - public List selectDeptList(SysDept dept) { - LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(SysDept::getDelFlag, "0") - .eq(ObjectUtil.isNotNull(dept.getDeptId()), SysDept::getDeptId, dept.getDeptId()) - .eq(ObjectUtil.isNotNull(dept.getParentId()), SysDept::getParentId, dept.getParentId()) - .like(StringUtils.isNotBlank(dept.getDeptName()), SysDept::getDeptName, dept.getDeptName()) - .eq(StringUtils.isNotBlank(dept.getStatus()), SysDept::getStatus, dept.getStatus()) - .orderByAsc(SysDept::getParentId) - .orderByAsc(SysDept::getOrderNum); + public List selectDeptList(SysDeptBo dept) { + LambdaQueryWrapper lqw = buildQueryWrapper(dept); return baseMapper.selectDeptList(lqw); } /** * 查询部门树结构信息 * - * @param dept 部门信息 + * @param bo 部门信息 * @return 部门树信息集合 */ @Override - public List> selectDeptTreeList(SysDept dept) { - List depts = this.selectDeptList(dept); + public List> selectDeptTreeList(SysDeptBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List depts = baseMapper.selectList(lqw); return buildDeptTreeSelect(depts); } + private LambdaQueryWrapper buildQueryWrapper(SysDeptBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(SysDept::getDelFlag, "0"); + lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), SysDept::getDeptId, bo.getDeptId()); + lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId()); + lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); + lqw.orderByAsc(SysDept::getParentId); + lqw.orderByAsc(SysDept::getOrderNum); + return lqw; + } + /** * 构建前端所需要下拉树结构 * @@ -113,12 +123,12 @@ public class SysDeptServiceImpl implements ISysDeptService { */ @Cacheable(cacheNames = CacheNames.SYS_DEPT, key = "#deptId") @Override - public SysDept selectDeptById(Long deptId) { - SysDept dept = baseMapper.selectById(deptId); + public SysDeptVo selectDeptById(Long deptId) { + SysDeptVo dept = baseMapper.selectVoById(deptId); if (ObjectUtil.isNull(dept)) { return null; } - SysDept parentDept = baseMapper.selectOne(new LambdaQueryWrapper() + SysDeptVo parentDept = baseMapper.selectVoOne(new LambdaQueryWrapper() .select(SysDept::getDeptName).eq(SysDept::getDeptId, dept.getParentId())); dept.setParentName(ObjectUtil.isNotNull(parentDept) ? parentDept.getDeptName() : null); return dept; @@ -130,20 +140,19 @@ public class SysDeptServiceImpl implements ISysDeptService { * @param deptIds 部门ID串逗号分隔 * @return 部门名称串逗号分隔 */ - @Override public String selectDeptNameByIds(String deptIds) { List list = new ArrayList<>(); for (Long id : StringUtils.splitTo(deptIds, Convert::toLong)) { - SysDept dept = SpringUtils.getAopProxy(this).selectDeptById(id); - if (ObjectUtil.isNotNull(dept)) { - list.add(dept.getDeptName()); + SysDeptVo vo = SpringUtils.getAopProxy(this).selectDeptById(id); + if (ObjectUtil.isNotNull(vo)) { + list.add(vo.getDeptName()); } } return String.join(StringUtils.SEPARATOR, list); } /** - * 根据ID查询所有子部门(正常状态) + * 根据ID查询所有子部门数(正常状态) * * @param deptId 部门ID * @return 子部门数 @@ -186,7 +195,7 @@ public class SysDeptServiceImpl implements ISysDeptService { * @return 结果 */ @Override - public boolean checkDeptNameUnique(SysDept dept) { + public boolean checkDeptNameUnique(SysDeptBo dept) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysDept::getDeptName, dept.getDeptName()) .eq(SysDept::getParentId, dept.getParentId()) @@ -201,29 +210,32 @@ public class SysDeptServiceImpl implements ISysDeptService { */ @Override public void checkDeptDataScope(Long deptId) { - if (!LoginHelper.isSuperAdmin()) { - SysDept dept = new SysDept(); - dept.setDeptId(deptId); - List depts = this.selectDeptList(dept); - if (CollUtil.isEmpty(depts)) { - throw new ServiceException("没有权限访问部门数据!"); - } + if (ObjectUtil.isNull(deptId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + SysDeptVo dept = baseMapper.selectDeptById(deptId); + if (ObjectUtil.isNull(dept)) { + throw new ServiceException("没有权限访问部门数据!"); } } /** * 新增保存部门信息 * - * @param dept 部门信息 + * @param bo 部门信息 * @return 结果 */ @Override - public int insertDept(SysDept dept) { - SysDept info = baseMapper.selectById(dept.getParentId()); + public int insertDept(SysDeptBo bo) { + SysDept info = baseMapper.selectById(bo.getParentId()); // 如果父节点不为正常状态,则不允许新增子节点 if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { throw new ServiceException("部门停用,不允许新增"); } + SysDept dept = MapstructUtils.convert(bo, SysDept.class); dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId()); return baseMapper.insert(dept); } @@ -231,19 +243,24 @@ public class SysDeptServiceImpl implements ISysDeptService { /** * 修改保存部门信息 * - * @param dept 部门信息 + * @param bo 部门信息 * @return 结果 */ - @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#dept.deptId") + @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#bo.deptId") @Override - public int updateDept(SysDept dept) { - SysDept newParentDept = baseMapper.selectById(dept.getParentId()); + public int updateDept(SysDeptBo bo) { + SysDept dept = MapstructUtils.convert(bo, SysDept.class); SysDept oldDept = baseMapper.selectById(dept.getDeptId()); - if (ObjectUtil.isNotNull(newParentDept) && ObjectUtil.isNotNull(oldDept)) { - String newAncestors = newParentDept.getAncestors() + StringUtils.SEPARATOR + newParentDept.getDeptId(); - String oldAncestors = oldDept.getAncestors(); - dept.setAncestors(newAncestors); - updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + if (!oldDept.getParentId().equals(dept.getParentId())) { + // 如果是新父部门 则校验是否具有新父部门权限 避免越权 + this.checkDeptDataScope(dept.getParentId()); + SysDept newParentDept = baseMapper.selectById(dept.getParentId()); + if (ObjectUtil.isNotNull(newParentDept) && ObjectUtil.isNotNull(oldDept)) { + String newAncestors = newParentDept.getAncestors() + StringUtils.SEPARATOR + newParentDept.getDeptId(); + String oldAncestors = oldDept.getAncestors(); + dept.setAncestors(newAncestors); + updateDeptChildren(dept.getDeptId(), newAncestors, oldAncestors); + } } int result = baseMapper.updateById(dept); if (UserConstants.DEPT_NORMAL.equals(dept.getStatus()) && StringUtils.isNotEmpty(dept.getAncestors()) @@ -274,7 +291,7 @@ public class SysDeptServiceImpl implements ISysDeptService { * @param newAncestors 新的父ID集合 * @param oldAncestors 旧的父ID集合 */ - public void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { + private void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { List children = baseMapper.selectList(new LambdaQueryWrapper() .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); List list = new ArrayList<>(); @@ -284,7 +301,7 @@ public class SysDeptServiceImpl implements ISysDeptService { dept.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); list.add(dept); } - if (list.size() > 0) { + if (CollUtil.isNotEmpty(list)) { if (baseMapper.updateBatchById(list)) { list.forEach(dept -> CacheUtils.evict(CacheNames.SYS_DEPT, dept.getDeptId())); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java index 3740a860..efc9989c 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictDataServiceImpl.java @@ -1,17 +1,21 @@ package org.dromara.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.redis.utils.CacheUtils; -import org.dromara.system.api.domain.SysDictData; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.bo.SysDictDataBo; +import org.dromara.system.domain.vo.SysDictDataVo; import org.dromara.system.mapper.SysDictDataMapper; import org.dromara.system.service.ISysDictDataService; -import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CachePut; import org.springframework.stereotype.Service; @@ -20,7 +24,7 @@ import java.util.List; /** * 字典 业务层处理 * - * @author ruoyi + * @author Lion Li */ @RequiredArgsConstructor @Service @@ -29,13 +33,9 @@ public class SysDictDataServiceImpl implements ISysDictDataService { private final SysDictDataMapper baseMapper; @Override - public TableDataInfo selectPageDictDataList(SysDictData dictData, PageQuery pageQuery) { - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .eq(StringUtils.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) - .like(StringUtils.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) - .eq(StringUtils.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) - .orderByAsc(SysDictData::getDictSort); - Page page = baseMapper.selectPage(pageQuery.build(), lqw); + public TableDataInfo selectPageDictDataList(SysDictDataBo dictData, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -46,12 +46,19 @@ public class SysDictDataServiceImpl implements ISysDictDataService { * @return 字典数据集合信息 */ @Override - public List selectDictDataList(SysDictData dictData) { - return baseMapper.selectList(new LambdaQueryWrapper() - .eq(StringUtils.isNotBlank(dictData.getDictType()), SysDictData::getDictType, dictData.getDictType()) - .like(StringUtils.isNotBlank(dictData.getDictLabel()), SysDictData::getDictLabel, dictData.getDictLabel()) - .eq(StringUtils.isNotBlank(dictData.getStatus()), SysDictData::getStatus, dictData.getStatus()) - .orderByAsc(SysDictData::getDictSort)); + public List selectDictDataList(SysDictDataBo dictData) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDictDataBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getDictSort() != null, SysDictData::getDictSort, bo.getDictSort()); + lqw.like(StringUtils.isNotBlank(bo.getDictLabel()), SysDictData::getDictLabel, bo.getDictLabel()); + lqw.eq(StringUtils.isNotBlank(bo.getDictType()), SysDictData::getDictType, bo.getDictType()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDictData::getStatus, bo.getStatus()); + lqw.orderByAsc(SysDictData::getDictSort); + return lqw; } /** @@ -77,8 +84,8 @@ public class SysDictDataServiceImpl implements ISysDictDataService { * @return 字典数据 */ @Override - public SysDictData selectDictDataById(Long dictCode) { - return baseMapper.selectById(dictCode); + public SysDictDataVo selectDictDataById(Long dictCode) { + return baseMapper.selectVoById(dictCode); } /** @@ -89,7 +96,7 @@ public class SysDictDataServiceImpl implements ISysDictDataService { @Override public void deleteDictDataByIds(Long[] dictCodes) { for (Long dictCode : dictCodes) { - SysDictData data = selectDictDataById(dictCode); + SysDictData data = baseMapper.selectById(dictCode); baseMapper.deleteById(dictCode); CacheUtils.evict(CacheNames.SYS_DICT, data.getDictType()); } @@ -98,12 +105,13 @@ public class SysDictDataServiceImpl implements ISysDictDataService { /** * 新增保存字典数据信息 * - * @param data 字典数据信息 + * @param bo 字典数据信息 * @return 结果 */ - @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#data.dictType") + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") @Override - public List insertDictData(SysDictData data) { + public List insertDictData(SysDictDataBo bo) { + SysDictData data = MapstructUtils.convert(bo, SysDictData.class); int row = baseMapper.insert(data); if (row > 0) { return baseMapper.selectDictDataByType(data.getDictType()); @@ -114,16 +122,18 @@ public class SysDictDataServiceImpl implements ISysDictDataService { /** * 修改保存字典数据信息 * - * @param data 字典数据信息 + * @param bo 字典数据信息 * @return 结果 */ - @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#data.dictType") + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") @Override - public List updateDictData(SysDictData data) { + public List updateDictData(SysDictDataBo bo) { + SysDictData data = MapstructUtils.convert(bo, SysDictData.class); int row = baseMapper.updateById(data); if (row > 0) { return baseMapper.selectDictDataByType(data.getDictType()); } throw new ServiceException("操作失败"); } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java index 0db23ad4..074000e3 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDictTypeServiceImpl.java @@ -1,30 +1,42 @@ package org.dromara.system.service.impl; +import cn.dev33.satoken.context.SaHolder; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheConstants; import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.DictService; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.redis.utils.CacheUtils; -import org.dromara.system.api.domain.SysDictData; -import org.dromara.system.api.domain.SysDictType; +import org.dromara.system.domain.SysDictData; +import org.dromara.system.domain.SysDictType; +import org.dromara.system.domain.bo.SysDictTypeBo; +import org.dromara.system.domain.vo.SysDictDataVo; +import org.dromara.system.domain.vo.SysDictTypeVo; import org.dromara.system.mapper.SysDictDataMapper; import org.dromara.system.mapper.SysDictTypeMapper; import org.dromara.system.service.ISysDictTypeService; -import lombok.RequiredArgsConstructor; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * 字典 业务层处理 @@ -33,21 +45,15 @@ import java.util.*; */ @RequiredArgsConstructor @Service -public class SysDictTypeServiceImpl implements ISysDictTypeService { +public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService { private final SysDictTypeMapper baseMapper; private final SysDictDataMapper dictDataMapper; @Override - public TableDataInfo selectPageDictTypeList(SysDictType dictType, PageQuery pageQuery) { - Map params = dictType.getParams(); - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(dictType.getDictName()), SysDictType::getDictName, dictType.getDictName()) - .eq(StringUtils.isNotBlank(dictType.getStatus()), SysDictType::getStatus, dictType.getStatus()) - .like(StringUtils.isNotBlank(dictType.getDictType()), SysDictType::getDictType, dictType.getDictType()) - .between(params.get("beginTime") != null && params.get("endTime") != null, - SysDictType::getCreateTime, params.get("beginTime"), params.get("endTime")); - Page page = baseMapper.selectPage(pageQuery.build(), lqw); + public TableDataInfo selectPageDictTypeList(SysDictTypeBo dictType, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -58,14 +64,20 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { * @return 字典类型集合信息 */ @Override - public List selectDictTypeList(SysDictType dictType) { - Map params = dictType.getParams(); - return baseMapper.selectList(new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(dictType.getDictName()), SysDictType::getDictName, dictType.getDictName()) - .eq(StringUtils.isNotBlank(dictType.getStatus()), SysDictType::getStatus, dictType.getStatus()) - .like(StringUtils.isNotBlank(dictType.getDictType()), SysDictType::getDictType, dictType.getDictType()) - .between(params.get("beginTime") != null && params.get("endTime") != null, - SysDictType::getCreateTime, params.get("beginTime"), params.get("endTime"))); + public List selectDictTypeList(SysDictTypeBo dictType) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysDictTypeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getDictName()), SysDictType::getDictName, bo.getDictName()); + lqw.like(StringUtils.isNotBlank(bo.getDictType()), SysDictType::getDictType, bo.getDictType()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDictType::getStatus, bo.getStatus()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + SysDictType::getCreateTime, params.get("beginTime"), params.get("endTime")); + return lqw; } /** @@ -74,8 +86,8 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { * @return 字典类型集合信息 */ @Override - public List selectDictTypeAll() { - return baseMapper.selectList(); + public List selectDictTypeAll() { + return baseMapper.selectVoList(); } /** @@ -86,8 +98,8 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { */ @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType") @Override - public List selectDictDataByType(String dictType) { - List dictDatas = dictDataMapper.selectDictDataByType(dictType); + public List selectDictDataByType(String dictType) { + List dictDatas = dictDataMapper.selectDictDataByType(dictType); if (CollUtil.isNotEmpty(dictDatas)) { return dictDatas; } @@ -101,8 +113,8 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { * @return 字典类型 */ @Override - public SysDictType selectDictTypeById(Long dictId) { - return baseMapper.selectById(dictId); + public SysDictTypeVo selectDictTypeById(Long dictId) { + return baseMapper.selectVoById(dictId); } /** @@ -113,8 +125,8 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { */ @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType") @Override - public SysDictType selectDictTypeByType(String dictType) { - return baseMapper.selectById(new LambdaQueryWrapper().eq(SysDictType::getDictType, dictType)); + public SysDictTypeVo selectDictTypeByType(String dictType) { + return baseMapper.selectVoById(new LambdaQueryWrapper().eq(SysDictType::getDictType, dictType)); } /** @@ -125,7 +137,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { @Override public void deleteDictTypeByIds(Long[] dictIds) { for (Long dictId : dictIds) { - SysDictType dictType = selectDictTypeById(dictId); + SysDictType dictType = baseMapper.selectById(dictId); if (dictDataMapper.exists(new LambdaQueryWrapper() .eq(SysDictData::getDictType, dictType.getDictType()))) { throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); @@ -135,46 +147,24 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { baseMapper.deleteBatchIds(Arrays.asList(dictIds)); } - /** - * 加载字典缓存数据 - */ - @Override - public void loadingDictCache() { - List dictDataList = dictDataMapper.selectList( - new LambdaQueryWrapper().eq(SysDictData::getStatus, UserConstants.DICT_NORMAL)); - Map> dictDataMap = StreamUtils.groupByKey(dictDataList, SysDictData::getDictType); - dictDataMap.forEach((k,v) -> { - List dictList = StreamUtils.sorted(v, Comparator.comparing(SysDictData::getDictSort)); - CacheUtils.put(CacheNames.SYS_DICT, k, dictList); - }); - } - - /** - * 清空字典缓存数据 - */ - @Override - public void clearDictCache() { - CacheUtils.clear(CacheNames.SYS_DICT); - } - /** * 重置字典缓存数据 */ @Override public void resetDictCache() { - clearDictCache(); - loadingDictCache(); + CacheUtils.clear(CacheNames.SYS_DICT); } /** * 新增保存字典类型信息 * - * @param dict 字典类型信息 + * @param bo 字典类型信息 * @return 结果 */ - @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#dict.dictType") + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") @Override - public List insertDictType(SysDictType dict) { + public List insertDictType(SysDictTypeBo bo) { + SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); int row = baseMapper.insert(dict); if (row > 0) { return new ArrayList<>(); @@ -185,13 +175,14 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { /** * 修改保存字典类型信息 * - * @param dict 字典类型信息 + * @param bo 字典类型信息 * @return 结果 */ - @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#dict.dictType") + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") @Override @Transactional(rollbackFor = Exception.class) - public List updateDictType(SysDictType dict) { + public List updateDictType(SysDictTypeBo bo) { + SysDictType dict = MapstructUtils.convert(bo, SysDictType.class); SysDictType oldDict = baseMapper.selectById(dict.getDictId()); dictDataMapper.update(null, new LambdaUpdateWrapper() .set(SysDictData::getDictType, dict.getDictType()) @@ -207,14 +198,71 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService { /** * 校验字典类型称是否唯一 * - * @param dict 字典类型 + * @param dictType 字典类型 * @return 结果 */ @Override - public boolean checkDictTypeUnique(SysDictType dict) { + public boolean checkDictTypeUnique(SysDictTypeBo dictType) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() - .eq(SysDictType::getDictType, dict.getDictType()) - .ne(ObjectUtil.isNotNull(dict.getDictId()), SysDictType::getDictId, dict.getDictId())); + .eq(SysDictType::getDictType, dictType.getDictType()) + .ne(ObjectUtil.isNotNull(dictType.getDictId()), SysDictType::getDictId, dictType.getDictId())); return !exist; } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + @SuppressWarnings("unchecked cast") + @Override + public String getDictLabel(String dictType, String dictValue, String separator) { + // 优先从本地缓存获取 + List datas = (List) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); + if (ObjectUtil.isNull(datas)) { + datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas); + } + + Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel); + if (StringUtils.containsAny(dictValue, separator)) { + return Arrays.stream(dictValue.split(separator)) + .map(v -> map.getOrDefault(v, StringUtils.EMPTY)) + .collect(Collectors.joining(separator)); + } else { + return map.getOrDefault(dictValue, StringUtils.EMPTY); + } + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + @SuppressWarnings("unchecked cast") + @Override + public String getDictValue(String dictType, String dictLabel, String separator) { + // 优先从本地缓存获取 + List datas = (List) SaHolder.getStorage().get(CacheConstants.SYS_DICT_KEY + dictType); + if (ObjectUtil.isNull(datas)) { + datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + SaHolder.getStorage().set(CacheConstants.SYS_DICT_KEY + dictType, datas); + } + + Map map = StreamUtils.toMap(datas, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue); + if (StringUtils.containsAny(dictLabel, separator)) { + return Arrays.stream(dictLabel.split(separator)) + .map(l -> map.getOrDefault(l, StringUtils.EMPTY)) + .collect(Collectors.joining(separator)); + } else { + return map.getOrDefault(dictLabel, StringUtils.EMPTY); + } + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java index 0d843395..aec97a96 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLogininforServiceImpl.java @@ -1,16 +1,29 @@ package org.dromara.system.service.impl; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.ServletUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ip.AddressUtils; +import org.dromara.common.log.event.LogininforEvent; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysLogininfor; +import org.dromara.system.domain.SysLogininfor; +import org.dromara.system.domain.bo.SysLogininforBo; +import org.dromara.system.domain.vo.SysLogininforVo; import org.dromara.system.mapper.SysLogininforMapper; import org.dromara.system.service.ISysLogininforService; -import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; +import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -19,16 +32,68 @@ import java.util.Map; /** * 系统访问日志情况信息 服务层处理 * - * @author ruoyi + * @author Lion Li */ @RequiredArgsConstructor +@Slf4j @Service public class SysLogininforServiceImpl implements ISysLogininforService { private final SysLogininforMapper baseMapper; + /** + * 记录登录信息 + * + * @param logininforEvent 登录事件 + */ + @Async + @EventListener + public void recordLogininfor(LogininforEvent logininforEvent) { + HttpServletRequest request = logininforEvent.getRequest(); + final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); + final String ip = ServletUtils.getClientIP(request); + + String address = AddressUtils.getRealAddressByIP(ip); + StringBuilder s = new StringBuilder(); + s.append(getBlock(ip)); + s.append(address); + s.append(getBlock(logininforEvent.getUsername())); + s.append(getBlock(logininforEvent.getStatus())); + s.append(getBlock(logininforEvent.getMessage())); + // 打印信息到日志 + log.info(s.toString(), logininforEvent.getArgs()); + // 获取客户端操作系统 + String os = userAgent.getOs().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName(); + // 封装对象 + SysLogininforBo logininfor = new SysLogininforBo(); + logininfor.setTenantId(logininforEvent.getTenantId()); + logininfor.setUserName(logininforEvent.getUsername()); + logininfor.setIpaddr(ip); + logininfor.setLoginLocation(address); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(logininforEvent.getMessage()); + // 日志状态 + if (StringUtils.equalsAny(logininforEvent.getStatus(), Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { + logininfor.setStatus(Constants.SUCCESS); + } else if (Constants.LOGIN_FAIL.equals(logininforEvent.getStatus())) { + logininfor.setStatus(Constants.FAIL); + } + // 插入数据 + insertLogininfor(logininfor); + } + + private String getBlock(Object msg) { + if (msg == null) { + msg = ""; + } + return "[" + msg.toString() + "]"; + } + @Override - public TableDataInfo selectPageLogininforList(SysLogininfor logininfor, PageQuery pageQuery) { + public TableDataInfo selectPageLogininforList(SysLogininforBo logininfor, PageQuery pageQuery) { Map params = logininfor.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) @@ -40,19 +105,20 @@ public class SysLogininforServiceImpl implements ISysLogininforService { pageQuery.setOrderByColumn("info_id"); pageQuery.setIsAsc("desc"); } - Page page = baseMapper.selectPage(pageQuery.build(), lqw); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } /** * 新增系统登录日志 * - * @param logininfor 访问日志对象 + * @param bo 访问日志对象 */ @Override - public int insertLogininfor(SysLogininfor logininfor) { + public void insertLogininfor(SysLogininforBo bo) { + SysLogininfor logininfor = MapstructUtils.convert(bo, SysLogininfor.class); logininfor.setLoginTime(new Date()); - return baseMapper.insert(logininfor); + baseMapper.insert(logininfor); } /** @@ -62,9 +128,9 @@ public class SysLogininforServiceImpl implements ISysLogininforService { * @return 登录记录集合 */ @Override - public List selectLogininforList(SysLogininfor logininfor) { + public List selectLogininforList(SysLogininforBo logininfor) { Map params = logininfor.getParams(); - return baseMapper.selectList(new LambdaQueryWrapper() + return baseMapper.selectVoList(new LambdaQueryWrapper() .like(StringUtils.isNotBlank(logininfor.getIpaddr()), SysLogininfor::getIpaddr, logininfor.getIpaddr()) .eq(StringUtils.isNotBlank(logininfor.getStatus()), SysLogininfor::getStatus, logininfor.getStatus()) .like(StringUtils.isNotBlank(logininfor.getUserName()), SysLogininfor::getUserName, logininfor.getUserName()) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java index 08ef8729..3fb16a72 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java @@ -1,27 +1,32 @@ package org.dromara.system.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import org.dromara.common.core.constant.Constants; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.TreeBuildUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.api.domain.SysRole; import org.dromara.system.domain.SysMenu; +import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysRoleMenu; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.bo.SysMenuBo; import org.dromara.system.domain.vo.MetaVo; import org.dromara.system.domain.vo.RouterVo; +import org.dromara.system.domain.vo.SysMenuVo; import org.dromara.system.mapper.SysMenuMapper; import org.dromara.system.mapper.SysRoleMapper; import org.dromara.system.mapper.SysRoleMenuMapper; +import org.dromara.system.mapper.SysTenantPackageMapper; import org.dromara.system.service.ISysMenuService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.*; @@ -29,7 +34,7 @@ import java.util.*; /** * 菜单 业务层处理 * - * @author ruoyi + * @author Lion Li */ @RequiredArgsConstructor @Service @@ -38,6 +43,7 @@ public class SysMenuServiceImpl implements ISysMenuService { private final SysMenuMapper baseMapper; private final SysRoleMapper roleMapper; private final SysRoleMenuMapper roleMenuMapper; + private final SysTenantPackageMapper tenantPackageMapper; /** * 根据用户查询系统菜单列表 @@ -46,8 +52,8 @@ public class SysMenuServiceImpl implements ISysMenuService { * @return 菜单列表 */ @Override - public List selectMenuList(Long userId) { - return selectMenuList(new SysMenu(), userId); + public List selectMenuList(Long userId) { + return selectMenuList(new SysMenuBo(), userId); } /** @@ -57,11 +63,11 @@ public class SysMenuServiceImpl implements ISysMenuService { * @return 菜单列表 */ @Override - public List selectMenuList(SysMenu menu, Long userId) { - List menuList = null; + public List selectMenuList(SysMenuBo menu, Long userId) { + List menuList; // 管理员显示所有菜单信息 if (LoginHelper.isSuperAdmin(userId)) { - menuList = baseMapper.selectList(new LambdaQueryWrapper() + menuList = baseMapper.selectVoList(new LambdaQueryWrapper() .like(StringUtils.isNotBlank(menu.getMenuName()), SysMenu::getMenuName, menu.getMenuName()) .eq(StringUtils.isNotBlank(menu.getVisible()), SysMenu::getVisible, menu.getVisible()) .eq(StringUtils.isNotBlank(menu.getStatus()), SysMenu::getStatus, menu.getStatus()) @@ -75,7 +81,8 @@ public class SysMenuServiceImpl implements ISysMenuService { .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) .orderByAsc("m.parent_id") .orderByAsc("m.order_num"); - menuList = baseMapper.selectMenuListByUserId(wrapper); + List list = baseMapper.selectMenuListByUserId(wrapper); + menuList = MapstructUtils.convert(list, SysMenuVo.class); } return menuList; } @@ -124,7 +131,7 @@ public class SysMenuServiceImpl implements ISysMenuService { */ @Override public List selectMenuTreeByUserId(Long userId) { - List menus = null; + List menus; if (LoginHelper.isSuperAdmin(userId)) { menus = baseMapper.selectMenuTreeAll(); } else { @@ -145,6 +152,30 @@ public class SysMenuServiceImpl implements ISysMenuService { return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly()); } + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByPackageId(Long packageId) { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + if (CollUtil.isEmpty(menuIds)) { + return new ArrayList<>(); + } + List parentIds = null; + if (tenantPackage.getMenuCheckStrictly()) { + parentIds = baseMapper.selectObjs(new LambdaQueryWrapper() + .select(SysMenu::getParentId) + .in(SysMenu::getMenuId, menuIds), Convert::toLong); + } + return baseMapper.selectObjs(new LambdaQueryWrapper() + .in(SysMenu::getMenuId, menuIds) + .notIn(CollUtil.isNotEmpty(parentIds), SysMenu::getMenuId, parentIds), Convert::toLong); + } + /** * 构建前端路由所需要的菜单 * @@ -153,37 +184,37 @@ public class SysMenuServiceImpl implements ISysMenuService { */ @Override public List buildMenus(List menus) { - List routers = new LinkedList(); + List routers = new LinkedList<>(); for (SysMenu menu : menus) { RouterVo router = new RouterVo(); router.setHidden("1".equals(menu.getVisible())); - router.setName(getRouteName(menu)); - router.setPath(getRouterPath(menu)); - router.setComponent(getComponent(menu)); + router.setName(menu.getRouteName()); + router.setPath(menu.getRouterPath()); + router.setComponent(menu.getComponentInfo()); router.setQuery(menu.getQueryParam()); router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); List cMenus = menu.getChildren(); - if (!cMenus.isEmpty() && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { + if (CollUtil.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { router.setAlwaysShow(true); router.setRedirect("noRedirect"); router.setChildren(buildMenus(cMenus)); - } else if (isMenuFrame(menu)) { + } else if (menu.isMenuFrame()) { router.setMeta(null); - List childrenList = new ArrayList(); + List childrenList = new ArrayList<>(); RouterVo children = new RouterVo(); children.setPath(menu.getPath()); - children.setComponent(menu.getComponent()); + children.setComponent(menu.getComponentInfo()); children.setName(StringUtils.capitalize(menu.getPath())); children.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); children.setQuery(menu.getQueryParam()); childrenList.add(children); router.setChildren(childrenList); - } else if (menu.getParentId().intValue() == 0 && isInnerLink(menu)) { + } else if (menu.getParentId().intValue() == 0 && menu.isInnerLink()) { router.setMeta(new MetaVo(menu.getMenuName(), menu.getIcon())); router.setPath("/"); - List childrenList = new ArrayList(); + List childrenList = new ArrayList<>(); RouterVo children = new RouterVo(); - String routerPath = innerLinkReplaceEach(menu.getPath()); + String routerPath = SysMenu.innerLinkReplaceEach(menu.getPath()); children.setPath(routerPath); children.setComponent(UserConstants.INNER_LINK); children.setName(StringUtils.capitalize(routerPath)); @@ -203,7 +234,7 @@ public class SysMenuServiceImpl implements ISysMenuService { * @return 下拉树结构列表 */ @Override - public List> buildMenuTreeSelect(List menus) { + public List> buildMenuTreeSelect(List menus) { if (CollUtil.isEmpty(menus)) { return CollUtil.newArrayList(); } @@ -221,8 +252,8 @@ public class SysMenuServiceImpl implements ISysMenuService { * @return 菜单信息 */ @Override - public SysMenu selectMenuById(Long menuId) { - return baseMapper.selectById(menuId); + public SysMenuVo selectMenuById(Long menuId) { + return baseMapper.selectVoById(menuId); } /** @@ -250,22 +281,24 @@ public class SysMenuServiceImpl implements ISysMenuService { /** * 新增保存菜单信息 * - * @param menu 菜单信息 + * @param bo 菜单信息 * @return 结果 */ @Override - public int insertMenu(SysMenu menu) { + public int insertMenu(SysMenuBo bo) { + SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); return baseMapper.insert(menu); } /** * 修改保存菜单信息 * - * @param menu 菜单信息 + * @param bo 菜单信息 * @return 结果 */ @Override - public int updateMenu(SysMenu menu) { + public int updateMenu(SysMenuBo bo) { + SysMenu menu = MapstructUtils.convert(bo, SysMenu.class); return baseMapper.updateById(menu); } @@ -280,7 +313,6 @@ public class SysMenuServiceImpl implements ISysMenuService { return baseMapper.deleteById(menuId); } - /** * 校验菜单名称是否唯一 * @@ -288,7 +320,7 @@ public class SysMenuServiceImpl implements ISysMenuService { * @return 结果 */ @Override - public boolean checkMenuNameUnique(SysMenu menu) { + public boolean checkMenuNameUnique(SysMenuBo menu) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysMenu::getMenuName, menu.getMenuName()) .eq(SysMenu::getParentId, menu.getParentId()) @@ -296,94 +328,6 @@ public class SysMenuServiceImpl implements ISysMenuService { return !exist; } - /** - * 获取路由名称 - * - * @param menu 菜单信息 - * @return 路由名称 - */ - public String getRouteName(SysMenu menu) { - String routerName = StringUtils.capitalize(menu.getPath()); - // 非外链并且是一级目录(类型为目录) - if (isMenuFrame(menu)) { - routerName = StringUtils.EMPTY; - } - return routerName; - } - - /** - * 获取路由地址 - * - * @param menu 菜单信息 - * @return 路由地址 - */ - public String getRouterPath(SysMenu menu) { - String routerPath = menu.getPath(); - // 内链打开外网方式 - if (menu.getParentId().intValue() != 0 && isInnerLink(menu)) { - routerPath = innerLinkReplaceEach(routerPath); - } - // 非外链并且是一级目录(类型为目录) - if (0 == menu.getParentId().intValue() && UserConstants.TYPE_DIR.equals(menu.getMenuType()) - && UserConstants.NO_FRAME.equals(menu.getIsFrame())) { - routerPath = "/" + menu.getPath(); - } - // 非外链并且是一级目录(类型为菜单) - else if (isMenuFrame(menu)) { - routerPath = "/"; - } - return routerPath; - } - - /** - * 获取组件信息 - * - * @param menu 菜单信息 - * @return 组件信息 - */ - public String getComponent(SysMenu menu) { - String component = UserConstants.LAYOUT; - if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) { - component = menu.getComponent(); - } else if (StringUtils.isEmpty(menu.getComponent()) && menu.getParentId().intValue() != 0 && isInnerLink(menu)) { - component = UserConstants.INNER_LINK; - } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) { - component = UserConstants.PARENT_VIEW; - } - return component; - } - - /** - * 是否为菜单内部跳转 - * - * @param menu 菜单信息 - * @return 结果 - */ - public boolean isMenuFrame(SysMenu menu) { - return menu.getParentId().intValue() == 0 && UserConstants.TYPE_MENU.equals(menu.getMenuType()) - && menu.getIsFrame().equals(UserConstants.NO_FRAME); - } - - /** - * 是否为内链组件 - * - * @param menu 菜单信息 - * @return 结果 - */ - public boolean isInnerLink(SysMenu menu) { - return menu.getIsFrame().equals(UserConstants.NO_FRAME) && StringUtils.ishttp(menu.getPath()); - } - - /** - * 是否为parent_view组件 - * - * @param menu 菜单信息 - * @return 结果 - */ - public boolean isParentView(SysMenu menu) { - return menu.getParentId().intValue() != 0 && UserConstants.TYPE_DIR.equals(menu.getMenuType()); - } - /** * 根据父节点的ID获取所有子节点 * @@ -391,8 +335,8 @@ public class SysMenuServiceImpl implements ISysMenuService { * @param parentId 传入的父节点ID * @return String */ - public List getChildPerms(List list, int parentId) { - List returnList = new ArrayList(); + private List getChildPerms(List list, int parentId) { + List returnList = new ArrayList<>(); for (SysMenu t : list) { // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 if (t.getParentId() == parentId) { @@ -405,40 +349,17 @@ public class SysMenuServiceImpl implements ISysMenuService { /** * 递归列表 - * - * @param list - * @param t */ private void recursionFn(List list, SysMenu t) { // 得到子节点列表 - List childList = getChildList(list, t); + List childList = StreamUtils.filter(list, n -> n.getParentId().equals(t.getMenuId())); t.setChildren(childList); for (SysMenu tChild : childList) { - if (hasChild(list, tChild)) { + // 判断是否有子节点 + if (list.stream().anyMatch(n -> n.getParentId().equals(tChild.getMenuId()))) { recursionFn(list, tChild); } } } - /** - * 得到子节点列表 - */ - private List getChildList(List list, SysMenu t) { - return StreamUtils.filter(list, n -> n.getParentId().equals(t.getMenuId())); - } - - /** - * 判断是否有子节点 - */ - private boolean hasChild(List list, SysMenu t) { - return getChildList(list, t).size() > 0; - } - - /** - * 内链域名特殊字符替换 - */ - public String innerLinkReplaceEach(String path) { - return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, "."}, - new String[]{"", "", "", "/"}); - } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java index b5cad48c..4092baec 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysNoticeServiceImpl.java @@ -1,14 +1,21 @@ package org.dromara.system.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.system.domain.SysNotice; +import org.dromara.system.domain.bo.SysNoticeBo; +import org.dromara.system.domain.vo.SysNoticeVo; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.SysNoticeMapper; +import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysNoticeService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -17,21 +24,19 @@ import java.util.List; /** * 公告 服务层实现 * - * @author ruoyi + * @author Lion Li */ @RequiredArgsConstructor @Service public class SysNoticeServiceImpl implements ISysNoticeService { private final SysNoticeMapper baseMapper; + private final SysUserMapper userMapper; @Override - public TableDataInfo selectPageNoticeList(SysNotice notice, PageQuery pageQuery) { - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle()) - .eq(StringUtils.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType()) - .like(StringUtils.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy()); - Page page = baseMapper.selectPage(pageQuery.build(), lqw); + public TableDataInfo selectPageNoticeList(SysNoticeBo notice, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(notice); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -42,8 +47,8 @@ public class SysNoticeServiceImpl implements ISysNoticeService { * @return 公告信息 */ @Override - public SysNotice selectNoticeById(Long noticeId) { - return baseMapper.selectById(noticeId); + public SysNoticeVo selectNoticeById(Long noticeId) { + return baseMapper.selectVoById(noticeId); } /** @@ -53,32 +58,43 @@ public class SysNoticeServiceImpl implements ISysNoticeService { * @return 公告集合 */ @Override - public List selectNoticeList(SysNotice notice) { - return baseMapper.selectList(new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(notice.getNoticeTitle()), SysNotice::getNoticeTitle, notice.getNoticeTitle()) - .eq(StringUtils.isNotBlank(notice.getNoticeType()), SysNotice::getNoticeType, notice.getNoticeType()) - .like(StringUtils.isNotBlank(notice.getCreateBy()), SysNotice::getCreateBy, notice.getCreateBy())); + public List selectNoticeList(SysNoticeBo notice) { + LambdaQueryWrapper lqw = buildQueryWrapper(notice); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysNoticeBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getNoticeTitle()), SysNotice::getNoticeTitle, bo.getNoticeTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), SysNotice::getNoticeType, bo.getNoticeType()); + if (StringUtils.isNotBlank(bo.getCreateByName())) { + SysUserVo sysUser = userMapper.selectUserByUserName(bo.getCreateByName()); + lqw.eq(SysNotice::getCreateBy, ObjectUtil.isNotNull(sysUser) ? sysUser.getUserId() : null); + } + return lqw; } /** * 新增公告 * - * @param notice 公告信息 + * @param bo 公告信息 * @return 结果 */ @Override - public int insertNotice(SysNotice notice) { + public int insertNotice(SysNoticeBo bo) { + SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); return baseMapper.insert(notice); } /** * 修改公告 * - * @param notice 公告信息 + * @param bo 公告信息 * @return 结果 */ @Override - public int updateNotice(SysNotice notice) { + public int updateNotice(SysNoticeBo bo) { + SysNotice notice = MapstructUtils.convert(bo, SysNotice.class); return baseMapper.updateById(notice); } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java index 3a77d13d..fd788c22 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysOperLogServiceImpl.java @@ -3,13 +3,20 @@ package org.dromara.system.service.impl; import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.ip.AddressUtils; +import org.dromara.common.log.event.OperLogEvent; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.system.api.domain.SysOperLog; +import org.dromara.system.domain.SysOperLog; +import org.dromara.system.domain.bo.SysOperLogBo; +import org.dromara.system.domain.vo.SysOperLogVo; import org.dromara.system.mapper.SysOperLogMapper; import org.dromara.system.service.ISysOperLogService; -import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -20,7 +27,7 @@ import java.util.Map; /** * 操作日志 服务层处理 * - * @author ruoyi + * @author Lion Li */ @RequiredArgsConstructor @Service @@ -28,12 +35,26 @@ public class SysOperLogServiceImpl implements ISysOperLogService { private final SysOperLogMapper baseMapper; + /** + * 操作日志记录 + * + * @param operLogEvent 操作日志事件 + */ + @Async + @EventListener + public void recordOper(OperLogEvent operLogEvent) { + SysOperLogBo operLog = MapstructUtils.convert(operLogEvent, SysOperLogBo.class); + // 远程查询操作地点 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + insertOperlog(operLog); + } + @Override - public TableDataInfo selectPageOperLogList(SysOperLog operLog, PageQuery pageQuery) { + public TableDataInfo selectPageOperLogList(SysOperLogBo operLog, PageQuery pageQuery) { Map params = operLog.getParams(); LambdaQueryWrapper lqw = new LambdaQueryWrapper() .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) - .eq(operLog.getBusinessType() != null, + .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, SysOperLog::getBusinessType, operLog.getBusinessType()) .func(f -> { if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { @@ -49,20 +70,20 @@ public class SysOperLogServiceImpl implements ISysOperLogService { pageQuery.setOrderByColumn("oper_id"); pageQuery.setIsAsc("desc"); } - Page page = baseMapper.selectPage(pageQuery.build(), lqw); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } /** * 新增操作日志 * - * @param operLog 操作日志对象 - * @return 结果 + * @param bo 操作日志对象 */ @Override - public int insertOperlog(SysOperLog operLog) { + public void insertOperlog(SysOperLogBo bo) { + SysOperLog operLog = MapstructUtils.convert(bo, SysOperLog.class); operLog.setOperTime(new Date()); - return baseMapper.insert(operLog); + baseMapper.insert(operLog); } /** @@ -72,9 +93,9 @@ public class SysOperLogServiceImpl implements ISysOperLogService { * @return 操作日志集合 */ @Override - public List selectOperLogList(SysOperLog operLog) { + public List selectOperLogList(SysOperLogBo operLog) { Map params = operLog.getParams(); - return baseMapper.selectList(new LambdaQueryWrapper() + return baseMapper.selectVoList(new LambdaQueryWrapper() .like(StringUtils.isNotBlank(operLog.getTitle()), SysOperLog::getTitle, operLog.getTitle()) .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, SysOperLog::getBusinessType, operLog.getBusinessType()) @@ -109,8 +130,8 @@ public class SysOperLogServiceImpl implements ISysOperLogService { * @return 操作日志对象 */ @Override - public SysOperLog selectOperLogById(Long operId) { - return baseMapper.selectById(operId); + public SysOperLogVo selectOperLogById(Long operId) { + return baseMapper.selectVoById(operId); } /** diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java index 4d68a2c3..7ccae4bf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPermissionServiceImpl.java @@ -1,11 +1,11 @@ package org.dromara.system.service.impl; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.api.domain.SysUser; import org.dromara.system.service.ISysMenuService; import org.dromara.system.service.ISysPermissionService; import org.dromara.system.service.ISysRoleService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.HashSet; @@ -26,17 +26,17 @@ public class SysPermissionServiceImpl implements ISysPermissionService { /** * 获取角色数据权限 * - * @param user 用户 + * @param userId 用户id * @return 角色权限信息 */ @Override - public Set getRolePermission(SysUser user) { - Set roles = new HashSet(); + public Set getRolePermission(Long userId) { + Set roles = new HashSet<>(); // 管理员拥有所有权限 - if (LoginHelper.isSuperAdmin(user.getUserId())) { - roles.add("admin"); + if (LoginHelper.isSuperAdmin(userId)) { + roles.add(TenantConstants.SUPER_ADMIN_ROLE_KEY); } else { - roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId())); + roles.addAll(roleService.selectRolePermissionByUserId(userId)); } return roles; } @@ -44,17 +44,17 @@ public class SysPermissionServiceImpl implements ISysPermissionService { /** * 获取菜单数据权限 * - * @param user 用户 + * @param userId 用户id * @return 菜单权限信息 */ @Override - public Set getMenuPermission(SysUser user) { - Set perms = new HashSet(); + public Set getMenuPermission(Long userId) { + Set perms = new HashSet<>(); // 管理员拥有所有权限 - if (LoginHelper.isSuperAdmin(user.getUserId())) { + if (LoginHelper.isSuperAdmin(userId)) { perms.add("*:*:*"); } else { - perms.addAll(menuService.selectMenuPermsByUserId(user.getUserId())); + perms.addAll(menuService.selectMenuPermsByUserId(userId)); } return perms; } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java index 95d4f095..b345d227 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java @@ -2,17 +2,22 @@ package org.dromara.system.service.impl; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.system.domain.SysPost; import org.dromara.system.domain.SysUserPost; +import org.dromara.system.domain.bo.SysPostBo; +import org.dromara.system.domain.vo.SysPostVo; import org.dromara.system.mapper.SysPostMapper; import org.dromara.system.mapper.SysUserPostMapper; import org.dromara.system.service.ISysPostService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; @@ -21,7 +26,7 @@ import java.util.List; /** * 岗位信息 服务层处理 * - * @author ruoyi + * @author Lion Li */ @RequiredArgsConstructor @Service @@ -31,12 +36,9 @@ public class SysPostServiceImpl implements ISysPostService { private final SysUserPostMapper userPostMapper; @Override - public TableDataInfo selectPagePostList(SysPost post, PageQuery pageQuery) { - LambdaQueryWrapper lqw = new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) - .eq(StringUtils.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) - .like(StringUtils.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName()); - Page page = baseMapper.selectPage(pageQuery.build(), lqw); + public TableDataInfo selectPagePostList(SysPostBo post, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(post); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(page); } @@ -47,11 +49,18 @@ public class SysPostServiceImpl implements ISysPostService { * @return 岗位信息集合 */ @Override - public List selectPostList(SysPost post) { - return baseMapper.selectList(new LambdaQueryWrapper() - .like(StringUtils.isNotBlank(post.getPostCode()), SysPost::getPostCode, post.getPostCode()) - .eq(StringUtils.isNotBlank(post.getStatus()), SysPost::getStatus, post.getStatus()) - .like(StringUtils.isNotBlank(post.getPostName()), SysPost::getPostName, post.getPostName())); + public List selectPostList(SysPostBo post) { + LambdaQueryWrapper lqw = buildQueryWrapper(post); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysPostBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getPostCode()), SysPost::getPostCode, bo.getPostCode()); + lqw.like(StringUtils.isNotBlank(bo.getPostName()), SysPost::getPostName, bo.getPostName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysPost::getStatus, bo.getStatus()); + lqw.orderByAsc(SysPost::getPostSort); + return lqw; } /** @@ -60,8 +69,8 @@ public class SysPostServiceImpl implements ISysPostService { * @return 岗位列表 */ @Override - public List selectPostAll() { - return baseMapper.selectList(); + public List selectPostAll() { + return baseMapper.selectVoList(new QueryWrapper<>()); } /** @@ -71,8 +80,8 @@ public class SysPostServiceImpl implements ISysPostService { * @return 角色对象信息 */ @Override - public SysPost selectPostById(Long postId) { - return baseMapper.selectById(postId); + public SysPostVo selectPostById(Long postId) { + return baseMapper.selectVoById(postId); } /** @@ -93,7 +102,7 @@ public class SysPostServiceImpl implements ISysPostService { * @return 结果 */ @Override - public boolean checkPostNameUnique(SysPost post) { + public boolean checkPostNameUnique(SysPostBo post) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysPost::getPostName, post.getPostName()) .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); @@ -107,7 +116,7 @@ public class SysPostServiceImpl implements ISysPostService { * @return 结果 */ @Override - public boolean checkPostCodeUnique(SysPost post) { + public boolean checkPostCodeUnique(SysPostBo post) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysPost::getPostCode, post.getPostCode()) .ne(ObjectUtil.isNotNull(post.getPostId()), SysPost::getPostId, post.getPostId())); @@ -145,7 +154,7 @@ public class SysPostServiceImpl implements ISysPostService { @Override public int deletePostByIds(Long[] postIds) { for (Long postId : postIds) { - SysPost post = selectPostById(postId); + SysPost post = baseMapper.selectById(postId); if (countUserPostById(postId) > 0) { throw new ServiceException(String.format("%1$s已分配,不能删除", post.getPostName())); } @@ -156,22 +165,24 @@ public class SysPostServiceImpl implements ISysPostService { /** * 新增保存岗位信息 * - * @param post 岗位信息 + * @param bo 岗位信息 * @return 结果 */ @Override - public int insertPost(SysPost post) { + public int insertPost(SysPostBo bo) { + SysPost post = MapstructUtils.convert(bo, SysPost.class); return baseMapper.insert(post); } /** * 修改保存岗位信息 * - * @param post 岗位信息 + * @param bo 岗位信息 * @return 结果 */ @Override - public int updatePost(SysPost post) { + public int updatePost(SysPostBo bo) { + SysPost post = MapstructUtils.convert(bo, SysPost.class); return baseMapper.updateById(post); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java index c86e17f4..0d6e6c4e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java @@ -7,25 +7,30 @@ import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.api.domain.SysRole; import org.dromara.system.api.model.LoginUser; +import org.dromara.system.domain.SysRole; import org.dromara.system.domain.SysRoleDept; import org.dromara.system.domain.SysRoleMenu; import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysRoleBo; +import org.dromara.system.domain.vo.SysRoleVo; import org.dromara.system.mapper.SysRoleDeptMapper; import org.dromara.system.mapper.SysRoleMapper; import org.dromara.system.mapper.SysRoleMenuMapper; import org.dromara.system.mapper.SysUserRoleMapper; import org.dromara.system.service.ISysRoleService; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,7 +39,7 @@ import java.util.*; /** * 角色 业务层处理 * - * @author ruoyi + * @author Lion Li */ @RequiredArgsConstructor @Service @@ -46,8 +51,8 @@ public class SysRoleServiceImpl implements ISysRoleService { private final SysRoleDeptMapper roleDeptMapper; @Override - public TableDataInfo selectPageRoleList(SysRole role, PageQuery pageQuery) { - Page page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role)); + public TableDataInfo selectPageRoleList(SysRoleBo role, PageQuery pageQuery) { + Page page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role)); return TableDataInfo.build(page); } @@ -58,18 +63,18 @@ public class SysRoleServiceImpl implements ISysRoleService { * @return 角色数据集合信息 */ @Override - public List selectRoleList(SysRole role) { + public List selectRoleList(SysRoleBo role) { return baseMapper.selectRoleList(this.buildQueryWrapper(role)); } - private Wrapper buildQueryWrapper(SysRole role) { - Map params = role.getParams(); + private Wrapper buildQueryWrapper(SysRoleBo bo) { + Map params = bo.getParams(); QueryWrapper wrapper = Wrappers.query(); wrapper.eq("r.del_flag", UserConstants.ROLE_NORMAL) - .eq(ObjectUtil.isNotNull(role.getRoleId()), "r.role_id", role.getRoleId()) - .like(StringUtils.isNotBlank(role.getRoleName()), "r.role_name", role.getRoleName()) - .eq(StringUtils.isNotBlank(role.getStatus()), "r.status", role.getStatus()) - .like(StringUtils.isNotBlank(role.getRoleKey()), "r.role_key", role.getRoleKey()) + .eq(ObjectUtil.isNotNull(bo.getRoleId()), "r.role_id", bo.getRoleId()) + .like(StringUtils.isNotBlank(bo.getRoleName()), "r.role_name", bo.getRoleName()) + .eq(StringUtils.isNotBlank(bo.getStatus()), "r.status", bo.getStatus()) + .like(StringUtils.isNotBlank(bo.getRoleKey()), "r.role_key", bo.getRoleKey()) .between(params.get("beginTime") != null && params.get("endTime") != null, "r.create_time", params.get("beginTime"), params.get("endTime")) .orderByAsc("r.role_sort").orderByAsc("r.create_time");; @@ -83,11 +88,11 @@ public class SysRoleServiceImpl implements ISysRoleService { * @return 角色列表 */ @Override - public List selectRolesByUserId(Long userId) { - List userRoles = baseMapper.selectRolePermissionByUserId(userId); - List roles = selectRoleAll(); - for (SysRole role : roles) { - for (SysRole userRole : userRoles) { + public List selectRolesByUserId(Long userId) { + List userRoles = baseMapper.selectRolePermissionByUserId(userId); + List roles = selectRoleAll(); + for (SysRoleVo role : roles) { + for (SysRoleVo userRole : userRoles) { if (role.getRoleId().longValue() == userRole.getRoleId().longValue()) { role.setFlag(true); break; @@ -105,9 +110,9 @@ public class SysRoleServiceImpl implements ISysRoleService { */ @Override public Set selectRolePermissionByUserId(Long userId) { - List perms = baseMapper.selectRolePermissionByUserId(userId); + List perms = baseMapper.selectRolePermissionByUserId(userId); Set permsSet = new HashSet<>(); - for (SysRole perm : perms) { + for (SysRoleVo perm : perms) { if (ObjectUtil.isNotNull(perm)) { permsSet.addAll(StringUtils.splitList(perm.getRoleKey().trim())); } @@ -121,8 +126,8 @@ public class SysRoleServiceImpl implements ISysRoleService { * @return 角色列表 */ @Override - public List selectRoleAll() { - return this.selectRoleList(new SysRole()); + public List selectRoleAll() { + return this.selectRoleList(new SysRoleBo()); } /** @@ -143,8 +148,8 @@ public class SysRoleServiceImpl implements ISysRoleService { * @return 角色对象信息 */ @Override - public SysRole selectRoleById(Long roleId) { - return baseMapper.selectById(roleId); + public SysRoleVo selectRoleById(Long roleId) { + return baseMapper.selectRoleById(roleId); } /** @@ -154,7 +159,7 @@ public class SysRoleServiceImpl implements ISysRoleService { * @return 结果 */ @Override - public boolean checkRoleNameUnique(SysRole role) { + public boolean checkRoleNameUnique(SysRoleBo role) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysRole::getRoleName, role.getRoleName()) .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); @@ -168,7 +173,7 @@ public class SysRoleServiceImpl implements ISysRoleService { * @return 结果 */ @Override - public boolean checkRoleKeyUnique(SysRole role) { + public boolean checkRoleKeyUnique(SysRoleBo role) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysRole::getRoleKey, role.getRoleKey()) .ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId())); @@ -178,11 +183,11 @@ public class SysRoleServiceImpl implements ISysRoleService { /** * 校验角色是否允许操作 * - * @param role 角色信息 + * @param roleId 角色ID */ @Override - public void checkRoleAllowed(SysRole role) { - if (ObjectUtil.isNotNull(role.getRoleId()) && role.isAdmin()) { + public void checkRoleAllowed(Long roleId) { + if (ObjectUtil.isNotNull(roleId) && LoginHelper.isSuperAdmin(roleId)) { throw new ServiceException("不允许操作超级管理员角色"); } } @@ -194,14 +199,17 @@ public class SysRoleServiceImpl implements ISysRoleService { */ @Override public void checkRoleDataScope(Long roleId) { - if (!LoginHelper.isSuperAdmin()) { - SysRole role = new SysRole(); - role.setRoleId(roleId); - List roles = this.selectRoleList(role); - if (CollUtil.isEmpty(roles)) { - throw new ServiceException("没有权限访问角色数据!"); - } + if (ObjectUtil.isNull(roleId)) { + return; } + if (LoginHelper.isSuperAdmin()) { + return; + } + List roles = this.selectRoleList(new SysRoleBo(roleId)); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色数据!"); + } + } /** @@ -218,59 +226,67 @@ public class SysRoleServiceImpl implements ISysRoleService { /** * 新增保存角色信息 * - * @param role 角色信息 + * @param bo 角色信息 * @return 结果 */ @Override @Transactional(rollbackFor = Exception.class) - public int insertRole(SysRole role) { + public int insertRole(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); // 新增角色信息 baseMapper.insert(role); - return insertRoleMenu(role); + bo.setRoleId(role.getRoleId()); + return insertRoleMenu(bo); } /** * 修改保存角色信息 * - * @param role 角色信息 + * @param bo 角色信息 * @return 结果 */ @Override @Transactional(rollbackFor = Exception.class) - public int updateRole(SysRole role) { + public int updateRole(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); // 修改角色信息 baseMapper.updateById(role); // 删除角色与菜单关联 roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, role.getRoleId())); - return insertRoleMenu(role); + return insertRoleMenu(bo); } /** * 修改角色状态 * - * @param role 角色信息 + * @param roleId 角色ID + * @param status 角色状态 * @return 结果 */ @Override - public int updateRoleStatus(SysRole role) { - return baseMapper.updateById(role); + public int updateRoleStatus(Long roleId, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysRole::getStatus, status) + .eq(SysRole::getRoleId, roleId)); } /** * 修改数据权限信息 * - * @param role 角色信息 + * @param bo 角色信息 * @return 结果 */ @Override @Transactional(rollbackFor = Exception.class) - public int authDataScope(SysRole role) { + public int authDataScope(SysRoleBo bo) { + SysRole role = MapstructUtils.convert(bo, SysRole.class); // 修改角色信息 baseMapper.updateById(role); // 删除角色与部门关联 roleDeptMapper.delete(new LambdaQueryWrapper().eq(SysRoleDept::getRoleId, role.getRoleId())); // 新增角色和部门信息(数据权限) - return insertRoleDept(role); + return insertRoleDept(bo); } /** @@ -278,7 +294,7 @@ public class SysRoleServiceImpl implements ISysRoleService { * * @param role 角色对象 */ - public int insertRoleMenu(SysRole role) { + private int insertRoleMenu(SysRoleBo role) { int rows = 1; // 新增用户与角色管理 List list = new ArrayList(); @@ -299,7 +315,7 @@ public class SysRoleServiceImpl implements ISysRoleService { * * @param role 角色对象 */ - public int insertRoleDept(SysRole role) { + private int insertRoleDept(SysRoleBo role) { int rows = 1; // 新增角色与部门(数据权限)管理 List list = new ArrayList(); @@ -341,9 +357,9 @@ public class SysRoleServiceImpl implements ISysRoleService { @Transactional(rollbackFor = Exception.class) public int deleteRoleByIds(Long[] roleIds) { for (Long roleId : roleIds) { - checkRoleAllowed(new SysRole(roleId)); + checkRoleAllowed(roleId); checkRoleDataScope(roleId); - SysRole role = selectRoleById(roleId); + SysRole role = baseMapper.selectById(roleId); if (countUserRoleByRoleId(roleId) > 0) { throw new ServiceException(String.format("%1$s已分配,不能删除", role.getRoleName())); } @@ -364,13 +380,9 @@ public class SysRoleServiceImpl implements ISysRoleService { */ @Override public int deleteAuthUser(SysUserRole userRole) { - int rows = userRoleMapper.delete(new LambdaQueryWrapper() + return userRoleMapper.delete(new LambdaQueryWrapper() .eq(SysUserRole::getRoleId, userRole.getRoleId()) .eq(SysUserRole::getUserId, userRole.getUserId())); - if (rows > 0) { - cleanOnlineUserByRole(userRole.getRoleId()); - } - return rows; } /** @@ -382,13 +394,9 @@ public class SysRoleServiceImpl implements ISysRoleService { */ @Override public int deleteAuthUsers(Long roleId, Long[] userIds) { - int rows = userRoleMapper.delete(new LambdaQueryWrapper() + return userRoleMapper.delete(new LambdaQueryWrapper() .eq(SysUserRole::getRoleId, roleId) .in(SysUserRole::getUserId, Arrays.asList(userIds))); - if (rows > 0) { - cleanOnlineUserByRole(roleId); - } - return rows; } /** @@ -402,14 +410,13 @@ public class SysRoleServiceImpl implements ISysRoleService { public int insertAuthUsers(Long roleId, Long[] userIds) { // 新增用户与角色管理 int rows = 1; - List list = new ArrayList(); - for (Long userId : userIds) { + List list = StreamUtils.toList(Arrays.asList(userIds), userId -> { SysUserRole ur = new SysUserRole(); ur.setUserId(userId); ur.setRoleId(roleId); - list.add(ur); - } - if (list.size() > 0) { + return ur; + }); + if (CollUtil.isNotEmpty(list)) { rows = userRoleMapper.insertBatch(list) ? list.size() : 0; } if (rows > 0) { @@ -440,5 +447,4 @@ public class SysRoleServiceImpl implements ISysRoleService { } }); } - } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java index dbee6329..34bec7b2 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysSensitiveServiceImpl.java @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service; * 需自行根据业务重写实现 * * @author Lion Li + * @version 3.6.0 */ @Service public class SysSensitiveServiceImpl implements SensitiveService { @@ -19,7 +20,7 @@ public class SysSensitiveServiceImpl implements SensitiveService { */ @Override public boolean isSensitive() { - return !LoginHelper.isSuperAdmin(); + return !LoginHelper.isSuperAdmin() || !LoginHelper.isTenantAdmin(); } } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java new file mode 100644 index 00000000..829246bd --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantPackageServiceImpl.java @@ -0,0 +1,146 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysTenant; +import org.dromara.system.domain.SysTenantPackage; +import org.dromara.system.domain.bo.SysTenantPackageBo; +import org.dromara.system.domain.vo.SysTenantPackageVo; +import org.dromara.system.mapper.SysTenantMapper; +import org.dromara.system.mapper.SysTenantPackageMapper; +import org.dromara.system.service.ISysTenantPackageService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 租户套餐Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class SysTenantPackageServiceImpl implements ISysTenantPackageService { + + private final SysTenantPackageMapper baseMapper; + private final SysTenantMapper tenantMapper; + + /** + * 查询租户套餐 + */ + @Override + public SysTenantPackageVo queryById(Long packageId){ + return baseMapper.selectVoById(packageId); + } + + /** + * 查询租户套餐列表 + */ + @Override + public TableDataInfo queryPageList(SysTenantPackageBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List selectList() { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .eq(SysTenantPackage::getStatus, TenantConstants.NORMAL)); + } + + /** + * 查询租户套餐列表 + */ + @Override + public List queryList(SysTenantPackageBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysTenantPackageBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getPackageName()), SysTenantPackage::getPackageName, bo.getPackageName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenantPackage::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysTenantPackageBo bo) { + SysTenantPackage add = MapstructUtils.convert(bo, SysTenantPackage.class); + // 保存菜单id + List menuIds = Arrays.asList(bo.getMenuIds()); + if (CollUtil.isNotEmpty(menuIds)) { + add.setMenuIds(StringUtils.join(menuIds, ", ")); + } else { + add.setMenuIds(""); + } + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setPackageId(add.getPackageId()); + } + return flag; + } + + /** + * 修改租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateByBo(SysTenantPackageBo bo) { + SysTenantPackage update = MapstructUtils.convert(bo, SysTenantPackage.class); + // 保存菜单id + List menuIds = Arrays.asList(bo.getMenuIds()); + if (CollUtil.isNotEmpty(menuIds)) { + update.setMenuIds(StringUtils.join(menuIds, ", ")); + } else { + update.setMenuIds(""); + } + return baseMapper.updateById(update) > 0; + } + + /** + * 修改套餐状态 + * + * @param bo 套餐信息 + * @return 结果 + */ + @Override + public int updatePackageStatus(SysTenantPackageBo bo) { + SysTenantPackage tenantPackage = MapstructUtils.convert(bo, SysTenantPackage.class); + return baseMapper.updateById(tenantPackage); + } + + /** + * 批量删除租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + boolean exists = tenantMapper.exists(new LambdaQueryWrapper().in(SysTenant::getPackageId, ids)); + if (exists) { + throw new ServiceException("租户套餐已被使用"); + } + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java new file mode 100644 index 00000000..0cd574ad --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java @@ -0,0 +1,367 @@ +package org.dromara.system.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.*; +import org.dromara.system.domain.bo.SysTenantBo; +import org.dromara.system.domain.vo.SysTenantVo; +import org.dromara.system.mapper.*; +import org.dromara.system.service.ISysTenantService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + +/** + * 租户Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class SysTenantServiceImpl implements ISysTenantService { + + private final SysTenantMapper baseMapper; + private final SysTenantPackageMapper tenantPackageMapper; + private final SysUserMapper userMapper; + private final SysDeptMapper deptMapper; + private final SysRoleMapper roleMapper; + private final SysRoleMenuMapper roleMenuMapper; + private final SysRoleDeptMapper roleDeptMapper; + private final SysUserRoleMapper userRoleMapper; + private final SysDictTypeMapper dictTypeMapper; + private final SysDictDataMapper dictDataMapper; + private final SysConfigMapper configMapper; + + /** + * 查询租户 + */ + @Override + public SysTenantVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 基于租户ID查询租户 + */ + @Cacheable(cacheNames = CacheNames.SYS_TENANT, key = "#tenantId") + @Override + public SysTenantVo queryByTenantId(String tenantId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(SysTenant::getTenantId, tenantId)); + } + + /** + * 查询租户列表 + */ + @Override + public TableDataInfo queryPageList(SysTenantBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询租户列表 + */ + @Override + public List queryList(SysTenantBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(SysTenantBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId()); + lqw.like(StringUtils.isNotBlank(bo.getContactUserName()), SysTenant::getContactUserName, bo.getContactUserName()); + lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), SysTenant::getContactPhone, bo.getContactPhone()); + lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), SysTenant::getCompanyName, bo.getCompanyName()); + lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), SysTenant::getLicenseNumber, bo.getLicenseNumber()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro()); + lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain()); + lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId()); + lqw.eq(bo.getExpireTime() != null, SysTenant::getExpireTime, bo.getExpireTime()); + lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus()); + return lqw; + } + + /** + * 新增租户 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(SysTenantBo bo) { + SysTenant add = MapstructUtils.convert(bo, SysTenant.class); + + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(SysTenant::getTenantId), Convert::toStr); + String tenantId = generateTenantId(tenantIds); + add.setTenantId(tenantId); + boolean flag = baseMapper.insert(add) > 0; + if (!flag) { + throw new ServiceException("创建租户失败"); + } + bo.setId(add.getId()); + + // 根据套餐创建角色 + Long roleId = createTenantRole(tenantId, bo.getPackageId()); + + // 创建部门: 公司名是部门名称 + SysDept dept = new SysDept(); + dept.setTenantId(tenantId); + dept.setDeptName(bo.getCompanyName()); + dept.setLeader(bo.getUsername()); + dept.setParentId(Constants.TOP_PARENT_ID); + dept.setAncestors(Constants.TOP_PARENT_ID.toString()); + deptMapper.insert(dept); + Long deptId = dept.getDeptId(); + + // 角色和部门关联表 + SysRoleDept roleDept = new SysRoleDept(); + roleDept.setRoleId(roleId); + roleDept.setDeptId(deptId); + roleDeptMapper.insert(roleDept); + + // 创建系统用户 + SysUser user = new SysUser(); + user.setTenantId(tenantId); + user.setUserName(bo.getUsername()); + user.setNickName(bo.getUsername()); + user.setPassword(BCrypt.hashpw(bo.getPassword())); + user.setDeptId(deptId); + userMapper.insert(user); + + // 用户和角色关联表 + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(user.getUserId()); + userRole.setRoleId(roleId); + userRoleMapper.insert(userRole); + + String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; + List dictTypeList = dictTypeMapper.selectList( + new LambdaQueryWrapper().eq(SysDictType::getTenantId, defaultTenantId)); + List dictDataList = dictDataMapper.selectList( + new LambdaQueryWrapper().eq(SysDictData::getTenantId, defaultTenantId)); + for (SysDictType dictType : dictTypeList) { + dictType.setDictId(null); + dictType.setTenantId(tenantId); + } + for (SysDictData dictData : dictDataList) { + dictData.setDictCode(null); + dictData.setTenantId(tenantId); + } + dictTypeMapper.insertBatch(dictTypeList); + dictDataMapper.insertBatch(dictDataList); + + List sysConfigList = configMapper.selectList( + new LambdaQueryWrapper().eq(SysConfig::getTenantId, defaultTenantId)); + for (SysConfig config : sysConfigList) { + config.setConfigId(null); + config.setTenantId(tenantId); + } + configMapper.insertBatch(sysConfigList); + return true; + } + + /** + * 生成租户id + * + * @param tenantIds 已有租户id列表 + * @return 租户id + */ + private String generateTenantId(List tenantIds) { + // 随机生成6位 + String numbers = RandomUtil.randomNumbers(6); + // 判断是否存在,如果存在则重新生成 + if (tenantIds.contains(numbers)) { + generateTenantId(tenantIds); + } + return numbers; + } + + /** + * 根据租户菜单创建租户角色 + * + * @param tenantId 租户编号 + * @param packageId 租户套餐id + * @return 角色id + */ + private Long createTenantRole(String tenantId, Long packageId) { + // 获取租户套餐 + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + if (ObjectUtil.isNull(tenantPackage)) { + throw new ServiceException("套餐不存在"); + } + // 获取套餐菜单id + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + + // 创建角色 + SysRole role = new SysRole(); + role.setTenantId(tenantId); + role.setRoleName(TenantConstants.TENANT_ADMIN_ROLE_NAME); + role.setRoleKey(TenantConstants.TENANT_ADMIN_ROLE_KEY); + role.setRoleSort(1); + role.setStatus(TenantConstants.NORMAL); + roleMapper.insert(role); + Long roleId = role.getRoleId(); + + // 创建角色菜单 + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(roleId); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.insertBatch(roleMenus); + + return roleId; + } + + /** + * 修改租户 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") + @Override + public Boolean updateByBo(SysTenantBo bo) { + SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); + tenant.setTenantId(null); + tenant.setPackageId(null); + return baseMapper.updateById(tenant) > 0; + } + + /** + * 修改租户状态 + * + * @param bo 租户信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, key = "#bo.tenantId") + @Override + public int updateTenantStatus(SysTenantBo bo) { + SysTenant tenant = MapstructUtils.convert(bo, SysTenant.class); + return baseMapper.updateById(tenant); + } + + /** + * 校验租户是否允许操作 + * + * @param tenantId 租户ID + */ + @Override + public void checkTenantAllowed(String tenantId) { + if (ObjectUtil.isNotNull(tenantId) && TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) { + throw new ServiceException("不允许操作管理租户"); + } + } + + /** + * 批量删除租户 + */ + @CacheEvict(cacheNames = CacheNames.SYS_TENANT, allEntries = true) + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + if (ids.contains(TenantConstants.SUPER_ADMIN_ID)) { + throw new ServiceException("超管租户不能删除"); + } + } + return baseMapper.deleteBatchIds(ids) > 0; + } + + /** + * 校验企业名称是否唯一 + */ + @Override + public boolean checkCompanyNameUnique(SysTenantBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysTenant::getCompanyName, bo.getCompanyName()) + .ne(ObjectUtil.isNotNull(bo.getTenantId()), SysTenant::getTenantId, bo.getTenantId())); + return !exist; + } + + /** + * 校验账号余额 + */ + @Override + public boolean checkAccountBalance(String tenantId) { + SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); + // 如果余额为-1代表不限制 + if (tenant.getAccountCount() == -1) { + return true; + } + Long userNumber = userMapper.selectCount(new LambdaQueryWrapper<>()); + // 如果余额大于0代表还有可用名额 + return tenant.getAccountCount() - userNumber > 0; + } + + /** + * 校验有效期 + */ + @Override + public boolean checkExpireTime(String tenantId) { + SysTenantVo tenant = SpringUtils.getAopProxy(this).queryByTenantId(tenantId); + // 如果未设置过期时间代表不限制 + if (ObjectUtil.isNull(tenant.getExpireTime())) { + return true; + } + // 如果当前时间在过期时间之前则通过 + return new Date().before(tenant.getExpireTime()); + } + + /** + * 同步租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean syncTenantPackage(String tenantId, String packageId) { + SysTenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List roles = roleMapper.selectList( + new LambdaQueryWrapper().eq(SysRole::getTenantId, tenantId)); + List roleIds = new ArrayList<>(roles.size() - 1); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + roles.forEach(item -> { + if (TenantConstants.TENANT_ADMIN_ROLE_KEY.equals(item.getRoleKey())) { + List roleMenus = new ArrayList<>(menuIds.size()); + menuIds.forEach(menuId -> { + SysRoleMenu roleMenu = new SysRoleMenu(); + roleMenu.setRoleId(item.getRoleId()); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.delete(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, item.getRoleId())); + roleMenuMapper.insertBatch(roleMenus); + } else { + roleIds.add(item.getRoleId()); + } + }); + if (!roleIds.isEmpty()) { + roleMenuMapper.delete( + new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), SysRoleMenu::getMenuId, menuIds)); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index d8c778ee..ae2c1872 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -9,31 +9,32 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.helper.DataBaseHelper; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.system.api.domain.SysDept; -import org.dromara.system.api.domain.SysRole; -import org.dromara.system.api.domain.SysUser; -import org.dromara.system.domain.SysPost; +import org.dromara.system.domain.SysDept; +import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUserPost; import org.dromara.system.domain.SysUserRole; +import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.vo.SysPostVo; +import org.dromara.system.domain.vo.SysRoleVo; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.*; import org.dromara.system.service.ISysUserService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.CollectionUtils; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -41,7 +42,7 @@ import java.util.Map; /** * 用户 业务层处理 * - * @author ruoyi + * @author Lion Li */ @Slf4j @RequiredArgsConstructor @@ -56,8 +57,8 @@ public class SysUserServiceImpl implements ISysUserService { private final SysUserPostMapper userPostMapper; @Override - public TableDataInfo selectPageUserList(SysUser user, PageQuery pageQuery) { - Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); + public TableDataInfo selectPageUserList(SysUserBo user, PageQuery pageQuery) { + Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); return TableDataInfo.build(page); } @@ -68,11 +69,11 @@ public class SysUserServiceImpl implements ISysUserService { * @return 用户信息集合信息 */ @Override - public List selectUserList(SysUser user) { + public List selectUserList(SysUserBo user) { return baseMapper.selectUserList(this.buildQueryWrapper(user)); } - private Wrapper buildQueryWrapper(SysUser user) { + private Wrapper buildQueryWrapper(SysUserBo user) { Map params = user.getParams(); QueryWrapper wrapper = Wrappers.query(); wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) @@ -100,14 +101,14 @@ public class SysUserServiceImpl implements ISysUserService { * @return 用户信息集合信息 */ @Override - public TableDataInfo selectAllocatedList(SysUser user, PageQuery pageQuery) { + public TableDataInfo selectAllocatedList(SysUserBo user, PageQuery pageQuery) { QueryWrapper wrapper = Wrappers.query(); wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) .eq(ObjectUtil.isNotNull(user.getRoleId()), "r.role_id", user.getRoleId()) .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus()) .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()); - Page page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper); + Page page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper); return TableDataInfo.build(page); } @@ -118,7 +119,7 @@ public class SysUserServiceImpl implements ISysUserService { * @return 用户信息集合信息 */ @Override - public TableDataInfo selectUnallocatedList(SysUser user, PageQuery pageQuery) { + public TableDataInfo selectUnallocatedList(SysUserBo user, PageQuery pageQuery) { List userIds = userRoleMapper.selectUserIdsByRoleId(user.getRoleId()); QueryWrapper wrapper = Wrappers.query(); wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) @@ -126,7 +127,7 @@ public class SysUserServiceImpl implements ISysUserService { .notIn(CollUtil.isNotEmpty(userIds), "u.user_id", userIds) .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName()) .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber()); - Page page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper); + Page page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper); return TableDataInfo.build(page); } @@ -137,7 +138,7 @@ public class SysUserServiceImpl implements ISysUserService { * @return 用户对象信息 */ @Override - public SysUser selectUserByUserName(String userName) { + public SysUserVo selectUserByUserName(String userName) { return baseMapper.selectUserByUserName(userName); } @@ -148,7 +149,7 @@ public class SysUserServiceImpl implements ISysUserService { * @return 用户对象信息 */ @Override - public SysUser selectUserByPhonenumber(String phonenumber) { + public SysUserVo selectUserByPhonenumber(String phonenumber) { return baseMapper.selectUserByPhonenumber(phonenumber); } @@ -159,7 +160,7 @@ public class SysUserServiceImpl implements ISysUserService { * @return 用户对象信息 */ @Override - public SysUser selectUserById(Long userId) { + public SysUserVo selectUserById(Long userId) { return baseMapper.selectUserById(userId); } @@ -171,11 +172,11 @@ public class SysUserServiceImpl implements ISysUserService { */ @Override public String selectUserRoleGroup(String userName) { - List list = roleMapper.selectRolesByUserName(userName); - if (CollectionUtils.isEmpty(list)) { + List list = roleMapper.selectRolesByUserName(userName); + if (CollUtil.isEmpty(list)) { return StringUtils.EMPTY; } - return StreamUtils.join(list, SysRole::getRoleName); + return StreamUtils.join(list, SysRoleVo::getRoleName); } /** @@ -186,11 +187,11 @@ public class SysUserServiceImpl implements ISysUserService { */ @Override public String selectUserPostGroup(String userName) { - List list = postMapper.selectPostsByUserName(userName); - if (CollectionUtils.isEmpty(list)) { + List list = postMapper.selectPostsByUserName(userName); + if (CollUtil.isEmpty(list)) { return StringUtils.EMPTY; } - return StreamUtils.join(list, SysPost::getPostName); + return StreamUtils.join(list, SysPostVo::getPostName); } /** @@ -200,7 +201,7 @@ public class SysUserServiceImpl implements ISysUserService { * @return 结果 */ @Override - public boolean checkUserNameUnique(SysUser user) { + public boolean checkUserNameUnique(SysUserBo user) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysUser::getUserName, user.getUserName()) .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); @@ -211,10 +212,9 @@ public class SysUserServiceImpl implements ISysUserService { * 校验手机号码是否唯一 * * @param user 用户信息 - * @return */ @Override - public boolean checkPhoneUnique(SysUser user) { + public boolean checkPhoneUnique(SysUserBo user) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysUser::getPhonenumber, user.getPhonenumber()) .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); @@ -225,10 +225,9 @@ public class SysUserServiceImpl implements ISysUserService { * 校验email是否唯一 * * @param user 用户信息 - * @return */ @Override - public boolean checkEmailUnique(SysUser user) { + public boolean checkEmailUnique(SysUserBo user) { boolean exist = baseMapper.exists(new LambdaQueryWrapper() .eq(SysUser::getEmail, user.getEmail()) .ne(ObjectUtil.isNotNull(user.getUserId()), SysUser::getUserId, user.getUserId())); @@ -238,11 +237,11 @@ public class SysUserServiceImpl implements ISysUserService { /** * 校验用户是否允许操作 * - * @param user 用户信息 + * @param userId 用户ID */ @Override - public void checkUserAllowed(SysUser user) { - if (ObjectUtil.isNotNull(user.getUserId()) && user.isAdmin()) { + public void checkUserAllowed(Long userId) { + if (ObjectUtil.isNotNull(userId) && LoginHelper.isSuperAdmin(userId)) { throw new ServiceException("不允许操作超级管理员用户"); } } @@ -254,13 +253,14 @@ public class SysUserServiceImpl implements ISysUserService { */ @Override public void checkUserDataScope(Long userId) { - if (!LoginHelper.isSuperAdmin()) { - SysUser user = new SysUser(); - user.setUserId(userId); - List users = this.selectUserList(user); - if (CollUtil.isEmpty(users)) { - throw new ServiceException("没有权限访问用户数据!"); - } + if (ObjectUtil.isNull(userId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + if (ObjectUtil.isNull(baseMapper.selectUserById(userId))) { + throw new ServiceException("没有权限访问用户数据!"); } } @@ -272,13 +272,15 @@ public class SysUserServiceImpl implements ISysUserService { */ @Override @Transactional(rollbackFor = Exception.class) - public int insertUser(SysUser user) { + public int insertUser(SysUserBo user) { + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); // 新增用户信息 - int rows = baseMapper.insert(user); + int rows = baseMapper.insert(sysUser); + user.setUserId(sysUser.getUserId()); // 新增用户岗位关联 - insertUserPost(user); + insertUserPost(user, false); // 新增用户与角色管理 - insertUserRole(user); + insertUserRole(user, false); return rows; } @@ -289,10 +291,12 @@ public class SysUserServiceImpl implements ISysUserService { * @return 结果 */ @Override - public boolean registerUser(SysUser user) { - user.setCreateBy(user.getUserName()); - user.setUpdateBy(user.getUserName()); - return baseMapper.insert(user) > 0; + public boolean registerUser(SysUserBo user, String tenantId) { + user.setCreateBy(user.getUserId()); + user.setUpdateBy(user.getUserId()); + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + sysUser.setTenantId(tenantId); + return baseMapper.insert(sysUser) > 0; } /** @@ -303,17 +307,18 @@ public class SysUserServiceImpl implements ISysUserService { */ @Override @Transactional(rollbackFor = Exception.class) - public int updateUser(SysUser user) { - Long userId = user.getUserId(); - // 删除用户与角色关联 - userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + public int updateUser(SysUserBo user) { // 新增用户与角色管理 - insertUserRole(user); - // 删除用户与岗位关联 - userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, userId)); + insertUserRole(user, true); // 新增用户与岗位管理 - insertUserPost(user); - return baseMapper.updateById(user); + insertUserPost(user, true); + SysUser sysUser = MapstructUtils.convert(user, SysUser.class); + // 防止错误更新后导致的数据误删除 + int flag = baseMapper.updateById(sysUser); + if (flag < 1) { + throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); + } + return flag; } /** @@ -325,20 +330,22 @@ public class SysUserServiceImpl implements ISysUserService { @Override @Transactional(rollbackFor = Exception.class) public void insertUserAuth(Long userId, Long[] roleIds) { - userRoleMapper.delete(new LambdaQueryWrapper() - .eq(SysUserRole::getUserId, userId)); - insertUserRole(userId, roleIds); + insertUserRole(userId, roleIds, true); } /** * 修改用户状态 * - * @param user 用户信息 + * @param userId 用户ID + * @param status 帐号状态 * @return 结果 */ @Override - public int updateUserStatus(SysUser user) { - return baseMapper.updateById(user); + public int updateUserStatus(Long userId, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(SysUser::getStatus, status) + .eq(SysUser::getUserId, userId)); } /** @@ -348,76 +355,76 @@ public class SysUserServiceImpl implements ISysUserService { * @return 结果 */ @Override - public int updateUserProfile(SysUser user) { - return baseMapper.updateById(user); + public int updateUserProfile(SysUserBo user) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(ObjectUtil.isNotNull(user.getNickName()), SysUser::getNickName, user.getNickName()) + .set(SysUser::getPhonenumber, user.getPhonenumber()) + .set(SysUser::getEmail, user.getEmail()) + .set(SysUser::getSex, user.getSex()) + .eq(SysUser::getUserId, user.getUserId())); } /** * 修改用户头像 * - * @param userName 用户名 - * @param avatar 头像地址 + * @param userId 用户ID + * @param avatar 头像地址 * @return 结果 */ @Override - public boolean updateUserAvatar(String userName, String avatar) { + public boolean updateUserAvatar(Long userId, Long avatar) { return baseMapper.update(null, new LambdaUpdateWrapper() .set(SysUser::getAvatar, avatar) - .eq(SysUser::getUserName, userName)) > 0; + .eq(SysUser::getUserId, userId)) > 0; } /** * 重置用户密码 * - * @param user 用户信息 - * @return 结果 - */ - @Override - public int resetPwd(SysUser user) { - return baseMapper.updateById(user); - } - - /** - * 重置用户密码 - * - * @param userName 用户名 + * @param userId 用户ID * @param password 密码 * @return 结果 */ @Override - public int resetUserPwd(String userName, String password) { + public int resetUserPwd(Long userId, String password) { return baseMapper.update(null, new LambdaUpdateWrapper() .set(SysUser::getPassword, password) - .eq(SysUser::getUserName, userName)); + .eq(SysUser::getUserId, userId)); } /** * 新增用户角色信息 * - * @param user 用户对象 + * @param user 用户对象 + * @param clear 清除已存在的关联数据 */ - public void insertUserRole(SysUser user) { - this.insertUserRole(user.getUserId(), user.getRoleIds()); + private void insertUserRole(SysUserBo user, boolean clear) { + this.insertUserRole(user.getUserId(), user.getRoleIds(), clear); } /** * 新增用户岗位信息 * - * @param user 用户对象 + * @param user 用户对象 + * @param clear 清除已存在的关联数据 */ - public void insertUserPost(SysUser user) { + private void insertUserPost(SysUserBo user, boolean clear) { Long[] posts = user.getPostIds(); if (ArrayUtil.isNotEmpty(posts)) { + if (clear) { + // 删除用户与岗位关联 + userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, user.getUserId())); + } // 新增用户与岗位管理 - List list = new ArrayList<>(posts.length); - for (Long postId : posts) { + List list = StreamUtils.toList(Arrays.asList(posts), postId -> { SysUserPost up = new SysUserPost(); up.setUserId(user.getUserId()); up.setPostId(postId); - list.add(up); - } + return up; + }); userPostMapper.insertBatch(list); } } @@ -427,17 +434,34 @@ public class SysUserServiceImpl implements ISysUserService { * * @param userId 用户ID * @param roleIds 角色组 + * @param clear 清除已存在的关联数据 */ - public void insertUserRole(Long userId, Long[] roleIds) { + private void insertUserRole(Long userId, Long[] roleIds, boolean clear) { if (ArrayUtil.isNotEmpty(roleIds)) { + // 判断是否具有此角色的操作权限 + List roles = roleMapper.selectRoleList(new LambdaQueryWrapper<>()); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色的数据"); + } + List roleList = StreamUtils.toList(roles, SysRoleVo::getRoleId); + if (!LoginHelper.isSuperAdmin(userId)) { + roleList.remove(UserConstants.SUPER_ADMIN_ID); + } + List canDoRoleList = StreamUtils.filter(Arrays.asList(roleIds), roleList::contains); + if (CollUtil.isEmpty(canDoRoleList)) { + throw new ServiceException("没有权限访问角色的数据"); + } + if (clear) { + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); + } // 新增用户与角色管理 - List list = new ArrayList<>(roleIds.length); - for (Long roleId : roleIds) { + List list = StreamUtils.toList(canDoRoleList, roleId -> { SysUserRole ur = new SysUserRole(); ur.setUserId(userId); ur.setRoleId(roleId); - list.add(ur); - } + return ur; + }); userRoleMapper.insertBatch(list); } } @@ -455,7 +479,12 @@ public class SysUserServiceImpl implements ISysUserService { userRoleMapper.delete(new LambdaQueryWrapper().eq(SysUserRole::getUserId, userId)); // 删除用户与岗位表 userPostMapper.delete(new LambdaQueryWrapper().eq(SysUserPost::getUserId, userId)); - return baseMapper.deleteById(userId); + // 防止更新失败导致的数据删除 + int flag = baseMapper.deleteById(userId); + if (flag < 1) { + throw new ServiceException("删除用户失败!"); + } + return flag; } /** @@ -468,7 +497,7 @@ public class SysUserServiceImpl implements ISysUserService { @Transactional(rollbackFor = Exception.class) public int deleteUserByIds(Long[] userIds) { for (Long userId : userIds) { - checkUserAllowed(new SysUser(userId)); + checkUserAllowed(userId); checkUserDataScope(userId); } List ids = Arrays.asList(userIds); @@ -476,14 +505,19 @@ public class SysUserServiceImpl implements ISysUserService { userRoleMapper.delete(new LambdaQueryWrapper().in(SysUserRole::getUserId, ids)); // 删除用户与岗位表 userPostMapper.delete(new LambdaQueryWrapper().in(SysUserPost::getUserId, ids)); - return baseMapper.deleteBatchIds(ids); + // 防止更新失败导致的数据删除 + int flag = baseMapper.deleteBatchIds(ids); + if (flag < 1) { + throw new ServiceException("删除用户失败!"); + } + return flag; } @Cacheable(cacheNames = CacheNames.SYS_USER_NAME, key = "#userId") @Override public String selectUserNameById(Long userId) { SysUser sysUser = baseMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getUserName).eq(SysUser::getUserId, userId)); + .select(SysUser::getUserName).eq(SysUser::getUserId, userId)); return ObjectUtil.isNull(sysUser) ? null : sysUser.getUserName(); } diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml index 9977f04d..e542a103 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysConfigMapper.xml @@ -1,19 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml index e6cb5f6c..bba949d7 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -1,40 +1,29 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - + + + + + order by d.parent_id, d.order_num + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml index 5a66ea28..6bcce514 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictDataMapper.xml @@ -1,23 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml index 1e9c149b..6975da47 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDictTypeMapper.xml @@ -1,18 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml index 4f2475a8..c64b551b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysLogininforMapper.xml @@ -1,16 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml index 9db5ae3c..fad18127 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml @@ -1,41 +1,21 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - + + - + select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.query_param, m.visible, m.status, + m.perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time + from sys_menu m + left join sys_role_menu rm on m.menu_id = rm.menu_id + left join sys_user_role sur on rm.role_id = sur.role_id + left join sys_role ro on sur.role_id = ro.role_id ${ew.getCustomSqlSegment} - + - + select m.menu_id + from sys_menu m + left join sys_role_menu rm on m.menu_id = rm.menu_id where rm.role_id = #{roleId} - - and m.menu_id not in (select m.parent_id from sys_menu m inner join sys_role_menu rm on m.menu_id = rm.menu_id and rm.role_id = #{roleId}) - - order by m.parent_id, m.order_num - + + and m.menu_id not in (select m.parent_id from sys_menu m inner join sys_role_menu rm on m.menu_id = + rm.menu_id and rm.role_id = #{roleId}) + + order by m.parent_id, m.order_num + - + - + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml index b52de854..43f494db 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysNoticeMapper.xml @@ -1,20 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml index cdf754b5..5ef14eee 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysOperLogMapper.xml @@ -1,25 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml index f084865a..d2108ebb 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml @@ -1,36 +1,26 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - + + - + select p.post_id from sys_post p - left join sys_user_post up on up.post_id = p.post_id - left join sys_user u on u.user_id = up.user_id - where u.user_id = #{userId} - + left join sys_user_post up on up.post_id = p.post_id + left join sys_user u on u.user_id = up.user_id + where u.user_id = #{userId} + - + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml index 4fe845df..1705bb25 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleDeptMapper.xml @@ -1,12 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml index 14355a12..d482f396 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml @@ -1,25 +1,11 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - + + select distinct r.role_id, @@ -49,23 +35,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ${ew.getCustomSqlSegment} - + - - + select r.role_id from sys_role r - left join sys_user_role sur on sur.role_id = r.role_id - left join sys_user u on u.user_id = sur.user_id - where u.user_id = #{userId} - + left join sys_user_role sur on sur.role_id = r.role_id + left join sys_user u on u.user_id = sur.user_id + where u.user_id = #{userId} + - + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml index c4fd658a..f01dc5e8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMenuMapper.xml @@ -1,12 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml new file mode 100644 index 00000000..0d96e134 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml new file mode 100644 index 00000000..79cf4c56 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysTenantPackageMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml index ae54863d..32f3e315 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -1,54 +1,28 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - - - - - - + + + - - - - - - - - + + + select u.user_id, + u.tenant_id, u.dept_id, u.user_name, u.nick_name, @@ -79,47 +53,49 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" r.data_scope, r.status as role_status from sys_user u - left join sys_dept d on u.dept_id = d.dept_id - left join sys_user_role sur on u.user_id = sur.user_id - left join sys_role r on r.role_id = sur.role_id + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role sur on u.user_id = sur.user_id + left join sys_role r on r.role_id = sur.role_id + - + select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time + from sys_user u + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role sur on u.user_id = sur.user_id + left join sys_role r on r.role_id = sur.role_id ${ew.getCustomSqlSegment} - + - + select distinct u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.phonenumber, u.status, u.create_time + from sys_user u + left join sys_dept d on u.dept_id = d.dept_id + left join sys_user_role sur on u.user_id = sur.user_id + left join sys_role r on r.role_id = sur.role_id ${ew.getCustomSqlSegment} - + - + - + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml index 287ed01c..e9f2496f 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserPostMapper.xml @@ -1,12 +1,7 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - - diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml index b53ae50d..bc52d1a6 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -1,14 +1,9 @@ + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - - - - -