From 3bf4a29844eb2ab7cd0da776f2267570d01df24d Mon Sep 17 00:00:00 2001 From: Github_lizhw <171332584@qq.com> Date: Fri, 27 Sep 2024 22:54:32 +0800 Subject: [PATCH] =?UTF-8?q?system-tenant=20=E5=A4=9A=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=A4=9A=E7=A7=9F=E6=88=B7=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + ruoyi-admin/pom.xml | 5 + .../src/main/resources/application.yml | 8 + .../common/core/service/SaasDeptService.java | 18 + .../common/core/service/SaasDictService.java | 67 ++ .../common/core/service/SaasOssService.java | 29 + .../common/core/service/SaasUserService.java | 85 ++ ruoyi-modules/pom.xml | 1 + ruoyi-modules/ruoyi-system-saas/pom.xml | 128 +++ .../monitor/Sys2LogininforController.java | 89 ++ .../monitor/Sys2OperlogController.java | 75 ++ .../monitor/Sys2UserOnlineController.java | 130 +++ .../system/Sys2ApplicationController.java | 105 +++ .../system/Sys2ClientController.java | 115 +++ .../system/Sys2ConfigController.java | 137 +++ .../controller/system/Sys2DeptController.java | 140 +++ .../system/Sys2DictDataController.java | 123 +++ .../system/Sys2DictTypeController.java | 125 +++ .../system/Sys2NoticeController.java | 90 ++ .../system/Sys2OssConfigController.java | 105 +++ .../controller/system/Sys2OssController.java | 108 +++ .../controller/system/Sys2PostController.java | 133 +++ .../system/Sys2ProfileController.java | 132 +++ .../controller/system/Sys2RoleController.java | 229 +++++ .../system/Sys2SocialController.java | 38 + .../system/Sys2TenantController.java | 179 ++++ .../system/Sys2TenantPackageController.java | 142 +++ .../controller/system/Sys2UserController.java | 300 +++++++ .../system/SysSaasMenuController.java | 174 ++++ .../system/saas/domain/Sys2Application.java | 41 + .../dromara/system/saas/domain/Sys2Cache.java | 47 + .../system/saas/domain/Sys2Client.java | 77 ++ .../system/saas/domain/Sys2Config.java | 51 ++ .../dromara/system/saas/domain/Sys2Dept.java | 83 ++ .../system/saas/domain/Sys2DictData.java | 71 ++ .../system/saas/domain/Sys2DictType.java | 41 + .../system/saas/domain/Sys2Logininfor.java | 85 ++ .../system/saas/domain/Sys2Notice.java | 51 ++ .../system/saas/domain/Sys2OperLog.java | 115 +++ .../dromara/system/saas/domain/Sys2Oss.java | 50 ++ .../system/saas/domain/Sys2OssConfig.java | 89 ++ .../dromara/system/saas/domain/Sys2Post.java | 61 ++ .../dromara/system/saas/domain/Sys2Role.java | 79 ++ .../system/saas/domain/Sys2RoleDept.java | 29 + .../system/saas/domain/Sys2RoleMenu.java | 29 + .../system/saas/domain/Sys2Social.java | 136 +++ .../system/saas/domain/Sys2Tenant.java | 103 +++ .../saas/domain/Sys2TenantApplication.java | 34 + .../system/saas/domain/Sys2TenantPackage.java | 54 ++ .../dromara/system/saas/domain/Sys2User.java | 115 +++ .../system/saas/domain/Sys2UserOnline.java | 63 ++ .../system/saas/domain/Sys2UserPost.java | 29 + .../system/saas/domain/Sys2UserRole.java | 29 + .../system/saas/domain/SysSaasMenu.java | 196 ++++ .../saas/domain/bo/Sys2ApplicationBo.java | 42 + .../system/saas/domain/bo/Sys2ClientBo.java | 80 ++ .../system/saas/domain/bo/Sys2ConfigBo.java | 59 ++ .../system/saas/domain/bo/Sys2DeptBo.java | 76 ++ .../system/saas/domain/bo/Sys2DictDataBo.java | 79 ++ .../system/saas/domain/bo/Sys2DictTypeBo.java | 50 ++ .../saas/domain/bo/Sys2LogininforBo.java | 87 ++ .../system/saas/domain/bo/Sys2NoticeBo.java | 61 ++ .../system/saas/domain/bo/Sys2OperLogBo.java | 127 +++ .../system/saas/domain/bo/Sys2OssBo.java | 49 + .../saas/domain/bo/Sys2OssConfigBo.java | 109 +++ .../system/saas/domain/bo/Sys2PostBo.java | 75 ++ .../system/saas/domain/bo/Sys2RoleBo.java | 94 ++ .../system/saas/domain/bo/Sys2SocialBo.java | 142 +++ .../domain/bo/Sys2TenantApplicationBo.java | 32 + .../system/saas/domain/bo/Sys2TenantBo.java | 114 +++ .../saas/domain/bo/Sys2TenantPackageBo.java | 59 ++ .../system/saas/domain/bo/Sys2UserBo.java | 125 +++ .../saas/domain/bo/Sys2UserPasswordBo.java | 29 + .../saas/domain/bo/Sys2UserProfileBo.java | 53 ++ .../system/saas/domain/bo/SysSaasMenuBo.java | 110 +++ .../saas/domain/vo/Sys2ApplicationVo.java | 46 + .../system/saas/domain/vo/Sys2ClientVo.java | 90 ++ .../system/saas/domain/vo/Sys2ConfigVo.java | 72 ++ .../system/saas/domain/vo/Sys2DeptVo.java | 102 +++ .../system/saas/domain/vo/Sys2DictDataVo.java | 88 ++ .../system/saas/domain/vo/Sys2DictTypeVo.java | 57 ++ .../saas/domain/vo/Sys2LogininforVo.java | 106 +++ .../system/saas/domain/vo/Sys2NoticeVo.java | 73 ++ .../system/saas/domain/vo/Sys2OperLogVo.java | 144 +++ .../saas/domain/vo/Sys2OssConfigVo.java | 97 ++ .../saas/domain/vo/Sys2OssUploadVo.java | 28 + .../system/saas/domain/vo/Sys2OssVo.java | 72 ++ .../system/saas/domain/vo/Sys2PostVo.java | 91 ++ .../system/saas/domain/vo/Sys2RoleVo.java | 100 +++ .../system/saas/domain/vo/Sys2SocialVo.java | 144 +++ .../domain/vo/Sys2TenantApplicationVo.java | 38 + .../saas/domain/vo/Sys2TenantPackageVo.java | 66 ++ .../system/saas/domain/vo/Sys2TenantVo.java | 115 +++ .../saas/domain/vo/Sys2UserExportVo.java | 94 ++ .../saas/domain/vo/Sys2UserImportVo.java | 76 ++ .../system/saas/domain/vo/Sys2UserInfoVo.java | 40 + .../system/saas/domain/vo/Sys2UserVo.java | 142 +++ .../system/saas/domain/vo/SysSaasMenuVo.java | 119 +++ .../system/saas/domain/vo/TwoAvatarVo.java | 18 + .../saas/domain/vo/TwoCacheListInfoVo.java | 23 + .../saas/domain/vo/TwoDeptTreeSelectVo.java | 26 + .../saas/domain/vo/TwoMenuTreeSelectVo.java | 26 + .../system/saas/domain/vo/TwoMetaVo.java | 61 ++ .../system/saas/domain/vo/TwoProfileVo.java | 29 + .../system/saas/domain/vo/TwoRouterVo.java | 62 ++ .../system/saas/domain/vo/TwoUserInfoVo.java | 30 + .../saas/listener/SysUserImportListener.java | 119 +++ .../saas/mapper/Sys2ApplicationMapper.java | 17 + .../system/saas/mapper/Sys2ClientMapper.java | 17 + .../system/saas/mapper/Sys2ConfigMapper.java | 16 + .../system/saas/mapper/Sys2DeptMapper.java | 48 + .../saas/mapper/Sys2DictDataMapper.java | 25 + .../saas/mapper/Sys2DictTypeMapper.java | 16 + .../saas/mapper/Sys2LogininforMapper.java | 16 + .../system/saas/mapper/Sys2NoticeMapper.java | 16 + .../system/saas/mapper/Sys2OperLogMapper.java | 16 + .../saas/mapper/Sys2OssConfigMapper.java | 18 + .../system/saas/mapper/Sys2OssMapper.java | 15 + .../system/saas/mapper/Sys2PostMapper.java | 38 + .../saas/mapper/Sys2RoleDeptMapper.java | 15 + .../system/saas/mapper/Sys2RoleMapper.java | 64 ++ .../saas/mapper/Sys2RoleMenuMapper.java | 15 + .../system/saas/mapper/Sys2SocialMapper.java | 16 + .../mapper/Sys2TenantApplicationMapper.java | 17 + .../system/saas/mapper/Sys2TenantMapper.java | 16 + .../saas/mapper/Sys2TenantPackageMapper.java | 16 + .../system/saas/mapper/Sys2UserMapper.java | 93 ++ .../saas/mapper/Sys2UserPostMapper.java | 15 + .../saas/mapper/Sys2UserRoleMapper.java | 19 + .../system/saas/mapper/SysSaasMenuMapper.java | 78 ++ .../saas/runner/System2ApplicationRunner.java | 28 + .../saas/service/ISys2ApplicationService.java | 68 ++ .../saas/service/ISys2ClientService.java | 59 ++ .../saas/service/ISys2ConfigService.java | 87 ++ .../saas/service/ISys2DataScopeService.java | 26 + .../system/saas/service/ISys2DeptService.java | 125 +++ .../saas/service/ISys2DictDataService.java | 76 ++ .../saas/service/ISys2DictTypeService.java | 95 ++ .../saas/service/ISys2LogininforService.java | 47 + .../saas/service/ISys2NoticeService.java | 67 ++ .../saas/service/ISys2OperLogService.java | 54 ++ .../saas/service/ISys2OssConfigService.java | 64 ++ .../system/saas/service/ISys2OssService.java | 80 ++ .../saas/service/ISys2PermissionService.java | 28 + .../system/saas/service/ISys2PostService.java | 122 +++ .../system/saas/service/ISys2RoleService.java | 200 +++++ .../saas/service/ISys2SocialService.java | 53 ++ .../ISys2TenantApplicationService.java | 68 ++ .../service/ISys2TenantPackageService.java | 62 ++ .../saas/service/ISys2TenantService.java | 82 ++ .../system/saas/service/ISys2UserService.java | 222 +++++ .../saas/service/ISysSaasMenuService.java | 147 +++ .../impl/Sys2ApplicationServiceImpl.java | 130 +++ .../service/impl/Sys2ClientServiceImpl.java | 151 ++++ .../service/impl/Sys2ConfigServiceImpl.java | 219 +++++ .../impl/Sys2DataScopeServiceImpl.java | 76 ++ .../service/impl/Sys2DeptServiceImpl.java | 337 +++++++ .../service/impl/Sys2DictDataServiceImpl.java | 156 ++++ .../service/impl/Sys2DictTypeServiceImpl.java | 258 ++++++ .../impl/Sys2LogininforServiceImpl.java | 176 ++++ .../service/impl/Sys2NoticeServiceImpl.java | 124 +++ .../service/impl/Sys2OperLogServiceImpl.java | 146 +++ .../impl/Sys2OssConfigServiceImpl.java | 176 ++++ .../saas/service/impl/Sys2OssServiceImpl.java | 269 ++++++ .../impl/Sys2PermissionServiceImpl.java | 61 ++ .../service/impl/Sys2PostServiceImpl.java | 242 +++++ .../service/impl/Sys2RoleServiceImpl.java | 514 +++++++++++ .../impl/Sys2SensitiveServiceImpl.java | 47 + .../service/impl/Sys2SocialServiceImpl.java | 112 +++ .../Sys2TenantApplicationServiceImpl.java | 127 +++ .../impl/Sys2TenantPackageServiceImpl.java | 157 ++++ .../service/impl/Sys2TenantServiceImpl.java | 372 ++++++++ .../service/impl/Sys2UserServiceImpl.java | 673 ++++++++++++++ .../service/impl/SysSaasMenuServiceImpl.java | 379 ++++++++ .../src/main/resources/mapper/package-info.md | 3 + .../systemTenant/SysApplicationMapper.xml | 7 + .../mapper/systemTenant/SysClientMapper.xml | 7 + .../mapper/systemTenant/SysConfigMapper.xml | 7 + .../mapper/systemTenant/SysDeptMapper.xml | 36 + .../mapper/systemTenant/SysDictDataMapper.xml | 7 + .../mapper/systemTenant/SysDictTypeMapper.xml | 7 + .../systemTenant/SysLogininforMapper.xml | 7 + .../mapper/systemTenant/SysNoticeMapper.xml | 7 + .../mapper/systemTenant/SysOperLogMapper.xml | 7 + .../systemTenant/SysOssConfigMapper.xml | 7 + .../mapper/systemTenant/SysOssMapper.xml | 5 + .../mapper/systemTenant/SysPostMapper.xml | 29 + .../mapper/systemTenant/SysRoleDeptMapper.xml | 7 + .../mapper/systemTenant/SysRoleMapper.xml | 59 ++ .../mapper/systemTenant/SysRoleMenuMapper.xml | 7 + .../mapper/systemTenant/SysSaasMenuMapper.xml | 70 ++ .../mapper/systemTenant/SysSocialMapper.xml | 7 + .../SysTenantApplicationMapper.xml | 7 + .../mapper/systemTenant/SysTenantMapper.xml | 7 + .../systemTenant/SysTenantPackageMapper.xml | 7 + .../mapper/systemTenant/SysUserMapper.xml | 73 ++ .../mapper/systemTenant/SysUserPostMapper.xml | 7 + .../mapper/systemTenant/SysUserRoleMapper.xml | 13 + script/sql/ry_vue_5.X.sql | 10 + script/sql/tenant/ry_vue_5.X.sql | 842 ++++++++++++++++++ 200 files changed, 17456 insertions(+) create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasDeptService.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasDictService.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasOssService.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasUserService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/pom.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2LogininforController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2OperlogController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2UserOnlineController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ApplicationController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ClientController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ConfigController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DeptController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DictDataController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DictTypeController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2NoticeController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2OssConfigController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2OssController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2PostController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ProfileController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2RoleController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2SocialController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2TenantController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2TenantPackageController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2UserController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/SysSaasMenuController.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Application.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Cache.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Client.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Config.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Dept.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2DictData.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2DictType.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Logininfor.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Notice.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2OperLog.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Oss.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2OssConfig.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Post.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Role.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2RoleDept.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2RoleMenu.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Social.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Tenant.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2TenantApplication.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2TenantPackage.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2User.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserOnline.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserPost.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserRole.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/SysSaasMenu.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ApplicationBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ClientBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ConfigBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DeptBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DictDataBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DictTypeBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2LogininforBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2NoticeBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OperLogBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OssBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OssConfigBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2PostBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2RoleBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2SocialBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantApplicationBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantPackageBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserPasswordBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserProfileBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/SysSaasMenuBo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ApplicationVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ClientVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ConfigVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DeptVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DictDataVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DictTypeVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2LogininforVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2NoticeVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OperLogVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssConfigVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssUploadVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2PostVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2RoleVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2SocialVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantApplicationVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantPackageVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserExportVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserImportVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserInfoVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/SysSaasMenuVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoAvatarVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoCacheListInfoVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoDeptTreeSelectVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoMenuTreeSelectVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoMetaVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoProfileVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoRouterVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoUserInfoVo.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/listener/SysUserImportListener.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ApplicationMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ClientMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ConfigMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DeptMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DictDataMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DictTypeMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2LogininforMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2NoticeMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OperLogMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OssConfigMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OssMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2PostMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleDeptMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleMenuMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2SocialMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantApplicationMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantPackageMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserPostMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserRoleMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/SysSaasMenuMapper.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/runner/System2ApplicationRunner.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ApplicationService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ClientService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ConfigService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DataScopeService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DeptService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DictDataService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DictTypeService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2LogininforService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2NoticeService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OperLogService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OssConfigService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OssService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2PermissionService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2PostService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2RoleService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2SocialService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantApplicationService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantPackageService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2UserService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISysSaasMenuService.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ApplicationServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ClientServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DataScopeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DeptServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DictDataServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DictTypeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2LogininforServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2NoticeServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OperLogServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OssConfigServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OssServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2PermissionServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2PostServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2RoleServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2SensitiveServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2SocialServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantApplicationServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantPackageServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2UserServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/SysSaasMenuServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/package-info.md create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysApplicationMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysClientMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysConfigMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDeptMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDictDataMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDictTypeMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysLogininforMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysNoticeMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOperLogMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOssConfigMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOssMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysPostMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleDeptMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleMenuMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysSaasMenuMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysSocialMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantApplicationMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantPackageMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserPostMapper.xml create mode 100644 ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserRoleMapper.xml create mode 100644 script/sql/tenant/ry_vue_5.X.sql diff --git a/pom.xml b/pom.xml index 5db785c8c..d7ee8d969 100644 --- a/pom.xml +++ b/pom.xml @@ -370,6 +370,12 @@ ${revision} + + org.dromara + ruoyi-system-saas + ${revision} + + org.dromara ruoyi-job diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index b7e3b30d9..7f9f4bd29 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -47,6 +47,11 @@ ruoyi-system + + org.dromara + ruoyi-system-saas + + org.dromara ruoyi-job diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 16b245fb4..c72257f2e 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -125,6 +125,14 @@ tenant: - sys_user_role - sys_client - sys_oss_config + - sys_saas_menu + - sys_saas_tenant + - sys_saas_tenant_package + - sys_saas_application + - sys_saas_role_dept + - sys_saas_role_menu + - sys_saas_user_post + - sys_saas_user_role # MyBatisPlus配置 # https://baomidou.com/config/ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasDeptService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasDeptService.java new file mode 100644 index 000000000..d06566cb3 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasDeptService.java @@ -0,0 +1,18 @@ +package org.dromara.common.core.service; + +/** + * 通用 部门服务 + * + * @author Lion Li + */ +public interface SaasDeptService { + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + String selectDeptNameByIds(String deptIds); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasDictService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasDictService.java new file mode 100644 index 000000000..1a724da6e --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasDictService.java @@ -0,0 +1,67 @@ +package org.dromara.common.core.service; + +import java.util.Map; + +/** + * 通用 字典服务 + * + * @author Lion Li + */ +public interface SaasDictService { + + /** + * 分隔符 + */ + String SEPARATOR = ","; + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @return 字典标签 + */ + default String getDictLabel(String dictType, String dictValue) { + return getDictLabel(dictType, dictValue, SEPARATOR); + } + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @return 字典值 + */ + default String getDictValue(String dictType, String dictLabel) { + return getDictValue(dictType, dictLabel, SEPARATOR); + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + String getDictLabel(String dictType, String dictValue, String separator); + + /** + * 根据字典类型和字典标签获取字典值 + * + * @param dictType 字典类型 + * @param dictLabel 字典标签 + * @param separator 分隔符 + * @return 字典值 + */ + String getDictValue(String dictType, String dictLabel, String separator); + + /** + * 获取字典下所有的字典值与标签 + * + * @param dictType 字典类型 + * @return dictValue为key,dictLabel为值组成的Map + */ + Map getAllDictByDictType(String dictType); + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasOssService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasOssService.java new file mode 100644 index 000000000..4aa33f8bb --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasOssService.java @@ -0,0 +1,29 @@ +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.OssDTO; + +import java.util.List; + +/** + * 通用 OSS服务 + * + * @author Lion Li + */ +public interface SaasOssService { + + /** + * 通过ossId查询对应的url + * + * @param ossIds ossId串逗号分隔 + * @return url串逗号分隔 + */ + String selectUrlByIds(String ossIds); + + /** + * 通过ossId查询列表 + * + * @param ossIds ossId串逗号分隔 + * @return 列表 + */ + List selectByIds(String ossIds); +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasUserService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasUserService.java new file mode 100644 index 000000000..1a3256c4c --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/service/SaasUserService.java @@ -0,0 +1,85 @@ +package org.dromara.common.core.service; + +import org.dromara.common.core.domain.dto.UserDTO; + +import java.util.List; + +/** + * 通用 用户服务 + * + * @author Lion Li + */ +public interface SaasUserService { + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + String selectUserNameById(Long userId); + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户名称 + */ + String selectNicknameById(Long userId); + + /** + * 通过用户ID查询用户账户 + * + * @param userIds 用户ID 多个用逗号隔开 + * @return 用户名称 + */ + String selectNicknameByIds(String userIds); + + /** + * 通过用户ID查询用户手机号 + * + * @param userId 用户id + * @return 用户手机号 + */ + String selectPhonenumberById(Long userId); + + /** + * 通过用户ID查询用户邮箱 + * + * @param userId 用户id + * @return 用户邮箱 + */ + String selectEmailById(Long userId); + + /** + * 通过用户ID查询用户列表 + * + * @param userIds 用户ids + * @return 用户列表 + */ + List selectListByIds(List userIds); + + /** + * 通过角色ID查询用户ID + * + * @param roleIds 角色ids + * @return 用户ids + */ + List selectUserIdsByRoleIds(List roleIds); + + /** + * 通过角色ID查询用户 + * + * @param roleIds 角色ids + * @return 用户 + */ + List selectUsersByRoleIds(List roleIds); + + /** + * 通过部门ID查询用户 + * + * @param deptIds 部门ids + * @return 用户 + */ + List selectUsersByDeptIds(List deptIds); +} diff --git a/ruoyi-modules/pom.xml b/ruoyi-modules/pom.xml index daff497a0..012c71e44 100644 --- a/ruoyi-modules/pom.xml +++ b/ruoyi-modules/pom.xml @@ -14,6 +14,7 @@ ruoyi-generator ruoyi-job ruoyi-system + ruoyi-system-saas ruoyi-workflow diff --git a/ruoyi-modules/ruoyi-system-saas/pom.xml b/ruoyi-modules/ruoyi-system-saas/pom.xml new file mode 100644 index 000000000..f46d7794a --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/pom.xml @@ -0,0 +1,128 @@ + + + + org.dromara + ruoyi-modules + ${revision} + + 4.0.0 + + ruoyi-system-saas + + + system-tenant 系统模块 + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + + + + org.dromara + ruoyi-common-core + + + + org.dromara + ruoyi-common-doc + + + + org.dromara + ruoyi-common-mybatis + + + + org.dromara + ruoyi-common-translation + + + + + org.dromara + ruoyi-common-oss + + + + org.dromara + ruoyi-common-log + + + + + org.dromara + ruoyi-common-excel + + + + + org.dromara + ruoyi-common-sms + + + + org.dromara + ruoyi-common-tenant + + + + org.dromara + ruoyi-common-security + + + + org.dromara + ruoyi-common-web + + + + org.dromara + ruoyi-common-idempotent + + + + org.dromara + ruoyi-common-sensitive + + + + org.dromara + ruoyi-common-encrypt + + + + org.dromara + ruoyi-common-websocket + + + + org.dromara + ruoyi-common-sse + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2LogininforController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2LogininforController.java new file mode 100644 index 000000000..4e53d365e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2LogininforController.java @@ -0,0 +1,89 @@ +package org.dromara.system.saas.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +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.redis.utils.RedisUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.saas.domain.bo.Sys2LogininforBo; +import org.dromara.system.saas.domain.vo.Sys2LogininforVo; +import org.dromara.system.saas.service.ISys2LogininforService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 系统访问记录 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/monitor2/logininfor") +public class Sys2LogininforController extends BaseController { + + private final ISys2LogininforService logininforService; + + /** + * 获取系统访问记录列表 + */ + @SaCheckPermission("monitor:logininfor:list") + @GetMapping("/list") + public TableDataInfo list(Sys2LogininforBo logininfor, PageQuery pageQuery) { + return logininforService.selectPageLogininforList(logininfor, pageQuery); + } + + /** + * 导出系统访问记录列表 + */ + @Log(title = "登录日志", businessType = BusinessType.EXPORT) + @SaCheckPermission("monitor:logininfor:export") + @PostMapping("/export") + public void export(Sys2LogininforBo logininfor, HttpServletResponse response) { + List list = logininforService.selectLogininforList(logininfor); + ExcelUtil.exportExcel(list, "登录日志", Sys2LogininforVo.class, response); + } + + /** + * 批量删除登录日志 + * @param infoIds 日志ids + */ + @SaCheckPermission("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public R remove(@PathVariable Long[] infoIds) { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + /** + * 清理系统访问记录 + */ + @SaCheckPermission("monitor:logininfor:remove") + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public R clean() { + logininforService.cleanLogininfor(); + return R.ok(); + } + + @SaCheckPermission("monitor:logininfor:unlock") + @Log(title = "账户解锁", businessType = BusinessType.OTHER) + @GetMapping("/unlock/{userName}") + public R unlock(@PathVariable("userName") String userName) { + String loginName = CacheConstants.PWD_ERR_CNT_KEY + userName; + if (RedisUtils.hasKey(loginName)) { + RedisUtils.deleteObject(loginName); + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2OperlogController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2OperlogController.java new file mode 100644 index 000000000..5cb346e37 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2OperlogController.java @@ -0,0 +1,75 @@ +package org.dromara.system.saas.controller.monitor; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.saas.domain.bo.Sys2OperLogBo; +import org.dromara.system.saas.domain.vo.Sys2OperLogVo; +import org.dromara.system.saas.service.ISys2OperLogService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 操作日志记录 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/monitor2/operlog") +public class Sys2OperlogController extends BaseController { + + private final ISys2OperLogService operLogService; + + /** + * 获取操作日志记录列表 + */ + @SaCheckPermission("monitor:operlog:list") + @GetMapping("/list") + public TableDataInfo list(Sys2OperLogBo operLog, PageQuery pageQuery) { + return operLogService.selectPageOperLogList(operLog, pageQuery); + } + + /** + * 导出操作日志记录列表 + */ + @Log(title = "操作日志", businessType = BusinessType.EXPORT) + @SaCheckPermission("monitor:operlog:export") + @PostMapping("/export") + public void export(Sys2OperLogBo operLog, HttpServletResponse response) { + List list = operLogService.selectOperLogList(operLog); + ExcelUtil.exportExcel(list, "操作日志", Sys2OperLogVo.class, response); + } + + /** + * 批量删除操作日志记录 + * @param operIds 日志ids + */ + @Log(title = "操作日志", businessType = BusinessType.DELETE) + @SaCheckPermission("monitor:operlog:remove") + @DeleteMapping("/{operIds}") + public R remove(@PathVariable Long[] operIds) { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + /** + * 清理操作日志记录 + */ + @Log(title = "操作日志", businessType = BusinessType.CLEAN) + @SaCheckPermission("monitor:operlog:remove") + @DeleteMapping("/clean") + public R clean() { + operLogService.cleanOperLog(); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2UserOnlineController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2UserOnlineController.java new file mode 100644 index 000000000..2e1e65920 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/monitor/Sys2UserOnlineController.java @@ -0,0 +1,130 @@ +package org.dromara.system.saas.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.domain.dto.UserOnlineDTO; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.log.annotation.Log; +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.common.web.core.BaseController; +import org.dromara.system.saas.domain.Sys2UserOnline; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 在线用户监控 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/monitor2/online") +public class Sys2UserOnlineController extends BaseController { + + /** + * 获取在线用户监控列表 + * + * @param ipaddr IP地址 + * @param userName 用户名 + */ + @SaCheckPermission("monitor:online:list") + @GetMapping("/list") + public TableDataInfo list(String ipaddr, String userName) { + // 获取所有未过期的 token + List keys = StpUtil.searchTokenValue("", 0, -1, false); + List userOnlineDTOList = new ArrayList<>(); + for (String key : keys) { + String token = StringUtils.substringAfterLast(key, ":"); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { + continue; + } + userOnlineDTOList.add(RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)); + } + if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) && + StringUtils.equals(userName, userOnline.getUserName()) + ); + } else if (StringUtils.isNotEmpty(ipaddr)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(ipaddr, userOnline.getIpaddr()) + ); + } else if (StringUtils.isNotEmpty(userName)) { + userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline -> + StringUtils.equals(userName, userOnline.getUserName()) + ); + } + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, Sys2UserOnline.class); + return TableDataInfo.build(userOnlineList); + } + + /** + * 强退用户 + * + * @param tokenId token值 + */ + @SaCheckPermission("monitor:online:forceLogout") + @Log(title = "在线用户", businessType = BusinessType.FORCE) + @DeleteMapping("/{tokenId}") + public R forceLogout(@PathVariable String tokenId) { + try { + StpUtil.kickoutByTokenValue(tokenId); + } catch (NotLoginException ignored) { + } + return R.ok(); + } + + /** + * 获取当前用户登录在线设备 + */ + @GetMapping() + public TableDataInfo getInfo() { + // 获取指定账号 id 的 token 集合 + List tokenIds = StpUtil.getTokenValueListByLoginId(StpUtil.getLoginIdAsString()); + List userOnlineDTOList = tokenIds.stream() + .filter(token -> StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) >= -1) + .map(token -> (UserOnlineDTO) RedisUtils.getCacheObject(CacheConstants.ONLINE_TOKEN_KEY + token)) + .collect(Collectors.toList()); + //复制和处理 Sys2UserOnline 对象列表 + Collections.reverse(userOnlineDTOList); + userOnlineDTOList.removeAll(Collections.singleton(null)); + List userOnlineList = BeanUtil.copyToList(userOnlineDTOList, Sys2UserOnline.class); + return TableDataInfo.build(userOnlineList); + } + + /** + * 强退当前在线设备 + * + * @param tokenId token值 + */ + @Log(title = "在线设备", businessType = BusinessType.FORCE) + @PostMapping("/{tokenId}") + public R remove(@PathVariable("tokenId") String tokenId) { + try { + // 获取指定账号 id 的 token 集合 + List keys = StpUtil.getTokenValueListByLoginId(StpUtil.getLoginIdAsString()); + keys.stream() + .filter(key -> key.equals(tokenId)) + .findFirst() + .ifPresent(key -> StpUtil.kickoutByTokenValue(tokenId)); + } catch (NotLoginException ignored) { + } + return R.ok(); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ApplicationController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ApplicationController.java new file mode 100644 index 000000000..a9136beee --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ApplicationController.java @@ -0,0 +1,105 @@ +package org.dromara.system.saas.controller.system; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +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.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.saas.domain.vo.Sys2ApplicationVo; +import org.dromara.system.saas.domain.bo.Sys2ApplicationBo; +import org.dromara.system.saas.service.ISys2ApplicationService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 应用 + * + * @author Lion Li + * @date 2024-09-22 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/application") +public class Sys2ApplicationController extends BaseController { + + private final ISys2ApplicationService sysApplicationService; + + /** + * 查询应用列表 + */ + @SaCheckPermission("system:application:list") + @GetMapping("/list") + public TableDataInfo list(Sys2ApplicationBo bo, PageQuery pageQuery) { + return sysApplicationService.queryPageList(bo, pageQuery); + } + + /** + * 导出应用列表 + */ + @SaCheckPermission("system:application:export") + @Log(title = "应用", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(Sys2ApplicationBo bo, HttpServletResponse response) { + List list = sysApplicationService.queryList(bo); + ExcelUtil.exportExcel(list, "应用", Sys2ApplicationVo.class, response); + } + + /** + * 获取应用详细信息 + * + * @param applicationId 主键 + */ + @SaCheckPermission("system:application:query") + @GetMapping("/{applicationId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long applicationId) { + return R.ok(sysApplicationService.queryById(applicationId)); + } + + /** + * 新增应用 + */ + @SaCheckPermission("system:application:add") + @Log(title = "应用", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody Sys2ApplicationBo bo) { + return toAjax(sysApplicationService.insertByBo(bo)); + } + + /** + * 修改应用 + */ + @SaCheckPermission("system:application:edit") + @Log(title = "应用", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody Sys2ApplicationBo bo) { + return toAjax(sysApplicationService.updateByBo(bo)); + } + + /** + * 删除应用 + * + * @param applicationIds 主键串 + */ + @SaCheckPermission("system:application:remove") + @Log(title = "应用", businessType = BusinessType.DELETE) + @DeleteMapping("/{applicationIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] applicationIds) { + return toAjax(sysApplicationService.deleteWithValidByIds(List.of(applicationIds), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ClientController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ClientController.java new file mode 100644 index 000000000..cc458a6c3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ClientController.java @@ -0,0 +1,115 @@ +package org.dromara.system.saas.controller.system; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.system.saas.domain.bo.Sys2ClientBo; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +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.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.saas.domain.vo.Sys2ClientVo; +import org.dromara.system.saas.service.ISys2ClientService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 客户端管理 + * + * @author Michelle.Chung + * @date 2023-06-18 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/client") +public class Sys2ClientController extends BaseController { + + private final ISys2ClientService sysClientService; + + /** + * 查询客户端管理列表 + */ + @SaCheckPermission("system:client:list") + @GetMapping("/list") + public TableDataInfo list(Sys2ClientBo bo, PageQuery pageQuery) { + return sysClientService.queryPageList(bo, pageQuery); + } + + /** + * 导出客户端管理列表 + */ + @SaCheckPermission("system:client:export") + @Log(title = "客户端管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(Sys2ClientBo bo, HttpServletResponse response) { + List list = sysClientService.queryList(bo); + ExcelUtil.exportExcel(list, "客户端管理", Sys2ClientVo.class, response); + } + + /** + * 获取客户端管理详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("system:client:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long id) { + return R.ok(sysClientService.queryById(id)); + } + + /** + * 新增客户端管理 + */ + @SaCheckPermission("system:client:add") + @Log(title = "客户端管理", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody Sys2ClientBo bo) { + return toAjax(sysClientService.insertByBo(bo)); + } + + /** + * 修改客户端管理 + */ + @SaCheckPermission("system:client:edit") + @Log(title = "客户端管理", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody Sys2ClientBo bo) { + return toAjax(sysClientService.updateByBo(bo)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:client:edit") + @Log(title = "客户端管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody Sys2ClientBo bo) { + return toAjax(sysClientService.updateUserStatus(bo.getClientId(), bo.getStatus())); + } + + /** + * 删除客户端管理 + * + * @param ids 主键串 + */ + @SaCheckPermission("system:client:remove") + @Log(title = "客户端管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ids) { + return toAjax(sysClientService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ConfigController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ConfigController.java new file mode 100644 index 000000000..c7f4a2895 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ConfigController.java @@ -0,0 +1,137 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +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.web.core.BaseController; +import org.dromara.system.saas.domain.bo.Sys2ConfigBo; +import org.dromara.system.saas.domain.vo.Sys2ConfigVo; +import org.dromara.system.saas.service.ISys2ConfigService; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 参数配置 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/config") +public class Sys2ConfigController extends BaseController { + + private final ISys2ConfigService configService; + + /** + * 获取参数配置列表 + */ + @SaCheckPermission("system:config:list") + @GetMapping("/list") + public TableDataInfo list(Sys2ConfigBo config, PageQuery pageQuery) { + return configService.selectPageConfigList(config, pageQuery); + } + + /** + * 导出参数配置列表 + */ + @Log(title = "参数管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:config:export") + @PostMapping("/export") + public void export(Sys2ConfigBo config, HttpServletResponse response) { + List list = configService.selectConfigList(config); + ExcelUtil.exportExcel(list, "参数数据", Sys2ConfigVo.class, response); + } + + /** + * 根据参数编号获取详细信息 + * + * @param configId 参数ID + */ + @SaCheckPermission("system:config:query") + @GetMapping(value = "/{configId}") + public R getInfo(@PathVariable Long configId) { + return R.ok(configService.selectConfigById(configId)); + } + + /** + * 根据参数键名查询参数值 + * + * @param configKey 参数Key + */ + @GetMapping(value = "/configKey/{configKey}") + public R getConfigKey(@PathVariable String configKey) { + return R.ok("操作成功", configService.selectConfigByKey(configKey)); + } + + /** + * 新增参数配置 + */ + @SaCheckPermission("system:config:add") + @Log(title = "参数管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody Sys2ConfigBo config) { + if (!configService.checkConfigKeyUnique(config)) { + return R.fail("新增参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + configService.insertConfig(config); + return R.ok(); + } + + /** + * 修改参数配置 + */ + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody Sys2ConfigBo config) { + if (!configService.checkConfigKeyUnique(config)) { + return R.fail("修改参数'" + config.getConfigName() + "'失败,参数键名已存在"); + } + configService.updateConfig(config); + return R.ok(); + } + + /** + * 根据参数键名修改参数配置 + */ + @SaCheckPermission("system:config:edit") + @Log(title = "参数管理", businessType = BusinessType.UPDATE) + @PutMapping("/updateByKey") + public R updateByKey(@RequestBody Sys2ConfigBo config) { + configService.updateConfig(config); + return R.ok(); + } + + /** + * 删除参数配置 + * + * @param configIds 参数ID串 + */ + @SaCheckPermission("system:config:remove") + @Log(title = "参数管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{configIds}") + public R remove(@PathVariable Long[] configIds) { + configService.deleteConfigByIds(configIds); + return R.ok(); + } + + /** + * 刷新参数缓存 + */ + @SaCheckPermission("system:config:remove") + @Log(title = "参数管理", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public R refreshCache() { + configService.resetConfigCache(); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DeptController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DeptController.java new file mode 100644 index 000000000..acc314456 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DeptController.java @@ -0,0 +1,140 @@ +package org.dromara.system.saas.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.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.saas.domain.bo.Sys2DeptBo; +import org.dromara.system.saas.domain.vo.Sys2DeptVo; +import org.dromara.system.saas.service.ISys2DeptService; +import org.dromara.system.saas.service.ISys2PostService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 部门信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/dept") +public class Sys2DeptController extends BaseController { + + private final ISys2DeptService deptService; + private final ISys2PostService postService; + + /** + * 获取部门列表 + */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list") + public R> list(Sys2DeptBo dept) { + List depts = deptService.selectDeptList(dept); + return R.ok(depts); + } + + /** + * 查询部门列表(排除节点) + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:list") + @GetMapping("/list/exclude/{deptId}") + public R> excludeChild(@PathVariable(value = "deptId", required = false) Long deptId) { + List depts = deptService.selectDeptList(new Sys2DeptBo()); + depts.removeIf(d -> d.getDeptId().equals(deptId) + || StringUtils.splitList(d.getAncestors()).contains(Convert.toStr(deptId))); + return R.ok(depts); + } + + /** + * 根据部门编号获取详细信息 + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:query") + @GetMapping(value = "/{deptId}") + public R getInfo(@PathVariable Long deptId) { + deptService.checkDeptDataScope(deptId); + return R.ok(deptService.selectDeptById(deptId)); + } + + /** + * 新增部门 + */ + @SaCheckPermission("system:dept:add") + @Log(title = "部门管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody Sys2DeptBo dept) { + if (!deptService.checkDeptNameUnique(dept)) { + return R.fail("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } + return toAjax(deptService.insertDept(dept)); + } + + /** + * 修改部门 + */ + @SaCheckPermission("system:dept:edit") + @Log(title = "部门管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody Sys2DeptBo dept) { + Long deptId = dept.getDeptId(); + deptService.checkDeptDataScope(deptId); + if (!deptService.checkDeptNameUnique(dept)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在"); + } else if (dept.getParentId().equals(deptId)) { + return R.fail("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己"); + } else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus())) { + if (deptService.selectNormalChildrenDeptById(deptId) > 0) { + return R.fail("该部门包含未停用的子部门!"); + } else if (deptService.checkDeptExistUser(deptId)) { + return R.fail("该部门下存在已分配用户,不能禁用!"); + } + } + return toAjax(deptService.updateDept(dept)); + } + + /** + * 删除部门 + * + * @param deptId 部门ID + */ + @SaCheckPermission("system:dept:remove") + @Log(title = "部门管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{deptId}") + public R remove(@PathVariable Long deptId) { + if (deptService.hasChildByDeptId(deptId)) { + return R.warn("存在下级部门,不允许删除"); + } + if (deptService.checkDeptExistUser(deptId)) { + return R.warn("部门存在用户,不允许删除"); + } + if (postService.countPostByDeptId(deptId) > 0) { + return R.warn("部门存在岗位,不允许删除"); + } + deptService.checkDeptDataScope(deptId); + return toAjax(deptService.deleteDeptById(deptId)); + } + + /** + * 获取部门选择框列表 + * + * @param deptIds 部门ID串 + */ + @SaCheckPermission("system:dept:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] deptIds) { + return R.ok(deptService.selectDeptByIds(deptIds == null ? null : List.of(deptIds))); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DictDataController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DictDataController.java new file mode 100644 index 000000000..05c6e2a28 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DictDataController.java @@ -0,0 +1,123 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.system.saas.domain.bo.Sys2DictDataBo; +import org.dromara.system.saas.domain.vo.Sys2DictDataVo; +import org.dromara.system.saas.service.ISys2DictDataService; +import org.dromara.system.saas.service.ISys2DictTypeService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + +/** + * 数据字典信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/dict/data") +public class Sys2DictDataController extends BaseController { + + private final ISys2DictDataService dictDataService; + private final ISys2DictTypeService dictTypeService; + + /** + * 查询字典数据列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public TableDataInfo list(Sys2DictDataBo dictData, PageQuery pageQuery) { + return dictDataService.selectPageDictDataList(dictData, pageQuery); + } + + /** + * 导出字典数据列表 + */ + @Log(title = "字典数据", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:dict:export") + @PostMapping("/export") + public void export(Sys2DictDataBo dictData, HttpServletResponse response) { + List list = dictDataService.selectDictDataList(dictData); + ExcelUtil.exportExcel(list, "字典数据", Sys2DictDataVo.class, response); + } + + /** + * 查询字典数据详细 + * + * @param dictCode 字典code + */ + @SaCheckPermission("system:dict:query") + @GetMapping(value = "/{dictCode}") + public R getInfo(@PathVariable Long dictCode) { + return R.ok(dictDataService.selectDictDataById(dictCode)); + } + + /** + * 根据字典类型查询字典数据信息 + * + * @param dictType 字典类型 + */ + @GetMapping(value = "/type/{dictType}") + public R> dictType(@PathVariable String dictType) { + List data = dictTypeService.selectDictDataByType(dictType); + if (ObjectUtil.isNull(data)) { + data = new ArrayList<>(); + } + return R.ok(data); + } + + /** + * 新增字典类型 + */ + @SaCheckPermission("system:dict:add") + @Log(title = "字典数据", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody Sys2DictDataBo dict) { + if (!dictDataService.checkDictDataUnique(dict)) { + return R.fail("新增字典数据'" + dict.getDictValue() + "'失败,字典键值已存在"); + } + dictDataService.insertDictData(dict); + return R.ok(); + } + + /** + * 修改保存字典类型 + */ + @SaCheckPermission("system:dict:edit") + @Log(title = "字典数据", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody Sys2DictDataBo dict) { + if (!dictDataService.checkDictDataUnique(dict)) { + return R.fail("修改字典数据'" + dict.getDictValue() + "'失败,字典键值已存在"); + } + dictDataService.updateDictData(dict); + return R.ok(); + } + + /** + * 删除字典类型 + * + * @param dictCodes 字典code串 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictCodes}") + public R remove(@PathVariable Long[] dictCodes) { + dictDataService.deleteDictDataByIds(dictCodes); + return R.ok(); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DictTypeController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DictTypeController.java new file mode 100644 index 000000000..c620c8469 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2DictTypeController.java @@ -0,0 +1,125 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +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.web.core.BaseController; +import org.dromara.system.saas.domain.bo.Sys2DictTypeBo; +import org.dromara.system.saas.domain.vo.Sys2DictTypeVo; +import org.dromara.system.saas.service.ISys2DictTypeService; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 数据字典信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/dict/type") +public class Sys2DictTypeController extends BaseController { + + private final ISys2DictTypeService dictTypeService; + + /** + * 查询字典类型列表 + */ + @SaCheckPermission("system:dict:list") + @GetMapping("/list") + public TableDataInfo list(Sys2DictTypeBo dictType, PageQuery pageQuery) { + return dictTypeService.selectPageDictTypeList(dictType, pageQuery); + } + + /** + * 导出字典类型列表 + */ + @Log(title = "字典类型", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:dict:export") + @PostMapping("/export") + public void export(Sys2DictTypeBo dictType, HttpServletResponse response) { + List list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil.exportExcel(list, "字典类型", Sys2DictTypeVo.class, response); + } + + /** + * 查询字典类型详细 + * + * @param dictId 字典ID + */ + @SaCheckPermission("system:dict:query") + @GetMapping(value = "/{dictId}") + public R getInfo(@PathVariable Long dictId) { + return R.ok(dictTypeService.selectDictTypeById(dictId)); + } + + /** + * 新增字典类型 + */ + @SaCheckPermission("system:dict:add") + @Log(title = "字典类型", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody Sys2DictTypeBo dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { + return R.fail("新增字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.insertDictType(dict); + return R.ok(); + } + + /** + * 修改字典类型 + */ + @SaCheckPermission("system:dict:edit") + @Log(title = "字典类型", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody Sys2DictTypeBo dict) { + if (!dictTypeService.checkDictTypeUnique(dict)) { + return R.fail("修改字典'" + dict.getDictName() + "'失败,字典类型已存在"); + } + dictTypeService.updateDictType(dict); + return R.ok(); + } + + /** + * 删除字典类型 + * + * @param dictIds 字典ID串 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.DELETE) + @DeleteMapping("/{dictIds}") + public R remove(@PathVariable Long[] dictIds) { + dictTypeService.deleteDictTypeByIds(dictIds); + return R.ok(); + } + + /** + * 刷新字典缓存 + */ + @SaCheckPermission("system:dict:remove") + @Log(title = "字典类型", businessType = BusinessType.CLEAN) + @DeleteMapping("/refreshCache") + public R refreshCache() { + dictTypeService.resetDictCache(); + return R.ok(); + } + + /** + * 获取字典选择框列表 + */ + @GetMapping("/optionselect") + public R> optionselect() { + List dictTypes = dictTypeService.selectDictTypeAll(); + return R.ok(dictTypes); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2NoticeController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2NoticeController.java new file mode 100644 index 000000000..7f347ab5d --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2NoticeController.java @@ -0,0 +1,90 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.service.SaasDictService; +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.sse.utils.SseMessageUtils; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.saas.domain.bo.Sys2NoticeBo; +import org.dromara.system.saas.domain.vo.Sys2NoticeVo; +import org.dromara.system.saas.service.ISys2NoticeService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +/** + * 公告 信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/notice") +public class Sys2NoticeController extends BaseController { + + private final ISys2NoticeService noticeService; + private final SaasDictService dictService; + + /** + * 获取通知公告列表 + */ + @SaCheckPermission("system:notice:list") + @GetMapping("/list") + public TableDataInfo list(Sys2NoticeBo notice, PageQuery pageQuery) { + return noticeService.selectPageNoticeList(notice, pageQuery); + } + + /** + * 根据通知公告编号获取详细信息 + * + * @param noticeId 公告ID + */ + @SaCheckPermission("system:notice:query") + @GetMapping(value = "/{noticeId}") + public R getInfo(@PathVariable Long noticeId) { + return R.ok(noticeService.selectNoticeById(noticeId)); + } + + /** + * 新增通知公告 + */ + @SaCheckPermission("system:notice:add") + @Log(title = "通知公告", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody Sys2NoticeBo notice) { + int rows = noticeService.insertNotice(notice); + if (rows <= 0) { + return R.fail(); + } + String type = dictService.getDictLabel("sys2_notice_type", notice.getNoticeType()); + SseMessageUtils.publishAll("[" + type + "] " + notice.getNoticeTitle()); + return R.ok(); + } + + /** + * 修改通知公告 + */ + @SaCheckPermission("system:notice:edit") + @Log(title = "通知公告", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody Sys2NoticeBo notice) { + return toAjax(noticeService.updateNotice(notice)); + } + + /** + * 删除通知公告 + * + * @param noticeIds 公告ID串 + */ + @SaCheckPermission("system:notice:remove") + @Log(title = "通知公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{noticeIds}") + public R remove(@PathVariable Long[] noticeIds) { + return toAjax(noticeService.deleteNoticeByIds(noticeIds)); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2OssConfigController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2OssConfigController.java new file mode 100644 index 000000000..bba31e630 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2OssConfigController.java @@ -0,0 +1,105 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +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.validate.QueryGroup; +import org.dromara.common.web.core.BaseController; +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.saas.domain.bo.Sys2OssConfigBo; +import org.dromara.system.saas.domain.vo.Sys2OssConfigVo; +import org.dromara.system.saas.service.ISys2OssConfigService; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 对象存储配置 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/resource2/oss/config") +public class Sys2OssConfigController extends BaseController { + + private final ISys2OssConfigService ossConfigService; + + /** + * 查询对象存储配置列表 + */ + @SaCheckPermission("system:ossConfig:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) Sys2OssConfigBo bo, PageQuery pageQuery) { + return ossConfigService.queryPageList(bo, pageQuery); + } + + /** + * 获取对象存储配置详细信息 + * + * @param ossConfigId OSS配置ID + */ + @SaCheckPermission("system:ossConfig:list") + @GetMapping("/{ossConfigId}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable Long ossConfigId) { + return R.ok(ossConfigService.queryById(ossConfigId)); + } + + /** + * 新增对象存储配置 + */ + @SaCheckPermission("system:ossConfig:add") + @Log(title = "对象存储配置", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody Sys2OssConfigBo bo) { + return toAjax(ossConfigService.insertByBo(bo)); + } + + /** + * 修改对象存储配置 + */ + @SaCheckPermission("system:ossConfig:edit") + @Log(title = "对象存储配置", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody Sys2OssConfigBo bo) { + return toAjax(ossConfigService.updateByBo(bo)); + } + + /** + * 删除对象存储配置 + * + * @param ossConfigIds OSS配置ID串 + */ + @SaCheckPermission("system:ossConfig:remove") + @Log(title = "对象存储配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{ossConfigIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ossConfigIds) { + return toAjax(ossConfigService.deleteWithValidByIds(List.of(ossConfigIds), true)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:ossConfig:edit") + @Log(title = "对象存储状态修改", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody Sys2OssConfigBo bo) { + return toAjax(ossConfigService.updateOssConfigStatus(bo)); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2OssController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2OssController.java new file mode 100644 index 000000000..d46055ea5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2OssController.java @@ -0,0 +1,108 @@ +package org.dromara.system.saas.controller.system; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.validate.QueryGroup; +import org.dromara.common.web.core.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.saas.domain.bo.Sys2OssBo; +import org.dromara.system.saas.domain.vo.Sys2OssUploadVo; +import org.dromara.system.saas.domain.vo.Sys2OssVo; +import org.dromara.system.saas.service.ISys2OssService; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +/** + * 文件上传 控制层 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/resource2/oss") +public class Sys2OssController extends BaseController { + + private final ISys2OssService ossService; + + /** + * 查询OSS对象存储列表 + */ + @SaCheckPermission("system:oss:list") + @GetMapping("/list") + public TableDataInfo list(@Validated(QueryGroup.class) Sys2OssBo bo, PageQuery pageQuery) { + return ossService.queryPageList(bo, pageQuery); + } + + /** + * 查询OSS对象基于id串 + * + * @param ossIds OSS对象ID串 + */ + @SaCheckPermission("system:oss:list") + @GetMapping("/listByIds/{ossIds}") + public R> listByIds(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ossIds) { + List list = ossService.listByIds(Arrays.asList(ossIds)); + return R.ok(list); + } + + /** + * 上传OSS对象存储 + * + * @param file 文件 + */ + @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) { + if (ObjectUtil.isNull(file)) { + return R.fail("上传文件不能为空"); + } + Sys2OssVo oss = ossService.upload(file); + Sys2OssUploadVo uploadVo = new Sys2OssUploadVo(); + uploadVo.setUrl(oss.getUrl()); + uploadVo.setFileName(oss.getOriginalName()); + uploadVo.setOssId(oss.getOssId().toString()); + return R.ok(uploadVo); + } + + /** + * 下载OSS对象 + * + * @param ossId OSS对象ID + */ + @SaCheckPermission("system:oss:download") + @GetMapping("/download/{ossId}") + public void download(@PathVariable Long ossId, HttpServletResponse response) throws IOException { + ossService.download(ossId, response); + } + + /** + * 删除OSS对象存储 + * + * @param ossIds OSS对象ID串 + */ + @SaCheckPermission("system:oss:remove") + @Log(title = "OSS对象存储", businessType = BusinessType.DELETE) + @DeleteMapping("/{ossIds}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable Long[] ossIds) { + return toAjax(ossService.deleteWithValidByIds(List.of(ossIds), true)); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2PostController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2PostController.java new file mode 100644 index 000000000..836b293ae --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2PostController.java @@ -0,0 +1,133 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +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.web.core.BaseController; +import org.dromara.system.saas.domain.bo.Sys2PostBo; +import org.dromara.system.saas.domain.vo.Sys2PostVo; +import org.dromara.system.saas.service.ISys2PostService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; + +/** + * 岗位信息操作处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/post") +public class Sys2PostController extends BaseController { + + private final ISys2PostService postService; + + /** + * 获取岗位列表 + */ + @SaCheckPermission("system:post:list") + @GetMapping("/list") + public TableDataInfo list(Sys2PostBo post, PageQuery pageQuery) { + return postService.selectPagePostList(post, pageQuery); + } + + /** + * 导出岗位列表 + */ + @Log(title = "岗位管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:post:export") + @PostMapping("/export") + public void export(Sys2PostBo post, HttpServletResponse response) { + List list = postService.selectPostList(post); + ExcelUtil.exportExcel(list, "岗位数据", Sys2PostVo.class, response); + } + + /** + * 根据岗位编号获取详细信息 + * + * @param postId 岗位ID + */ + @SaCheckPermission("system:post:query") + @GetMapping(value = "/{postId}") + public R getInfo(@PathVariable Long postId) { + return R.ok(postService.selectPostById(postId)); + } + + /** + * 新增岗位 + */ + @SaCheckPermission("system:post:add") + @Log(title = "岗位管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody Sys2PostBo post) { + if (!postService.checkPostNameUnique(post)) { + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (!postService.checkPostCodeUnique(post)) { + return R.fail("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } + return toAjax(postService.insertPost(post)); + } + + /** + * 修改岗位 + */ + @SaCheckPermission("system:post:edit") + @Log(title = "岗位管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody Sys2PostBo post) { + if (!postService.checkPostNameUnique(post)) { + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在"); + } else if (!postService.checkPostCodeUnique(post)) { + return R.fail("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在"); + } else if (UserConstants.POST_DISABLE.equals(post.getStatus()) + && postService.countUserPostById(post.getPostId()) > 0) { + return R.fail("该岗位下存在已分配用户,不能禁用!"); + } + return toAjax(postService.updatePost(post)); + } + + /** + * 删除岗位 + * + * @param postIds 岗位ID串 + */ + @SaCheckPermission("system:post:remove") + @Log(title = "岗位管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{postIds}") + public R remove(@PathVariable Long[] postIds) { + return toAjax(postService.deletePostByIds(postIds)); + } + + /** + * 获取岗位选择框列表 + * + * @param postIds 岗位ID串 + * @param deptId 部门id + */ + @SaCheckPermission("system:post:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] postIds, @RequestParam(required = false) Long deptId) { + List list = new ArrayList<>(); + if (ObjectUtil.isNotNull(deptId)) { + Sys2PostBo post = new Sys2PostBo(); + post.setDeptId(deptId); + list = postService.selectPostList(post); + } else if (postIds != null) { + list = postService.selectPostByIds(List.of(postIds)); + } + return R.ok(list); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ProfileController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ProfileController.java new file mode 100644 index 000000000..a45b75644 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2ProfileController.java @@ -0,0 +1,132 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.io.FileUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.file.MimeTypeUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +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.helper.DataPermissionHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.saas.domain.bo.Sys2UserBo; +import org.dromara.system.saas.domain.bo.Sys2UserPasswordBo; +import org.dromara.system.saas.domain.bo.Sys2UserProfileBo; +import org.dromara.system.saas.domain.vo.TwoAvatarVo; +import org.dromara.system.saas.domain.vo.TwoProfileVo; +import org.dromara.system.saas.domain.vo.Sys2OssVo; +import org.dromara.system.saas.domain.vo.Sys2UserVo; +import org.dromara.system.saas.service.ISys2OssService; +import org.dromara.system.saas.service.ISys2UserService; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.Arrays; + +/** + * 个人信息 业务处理 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/user/profile") +public class Sys2ProfileController extends BaseController { + + private final ISys2UserService userService; + private final ISys2OssService ossService; + + /** + * 个人信息 + */ + @GetMapping + public R profile() { + Sys2UserVo user = userService.selectUserById(LoginHelper.getUserId()); + TwoProfileVo twoProfileVo = new TwoProfileVo(); + twoProfileVo.setUser(user); + twoProfileVo.setRoleGroup(userService.selectUserRoleGroup(user.getUserId())); + twoProfileVo.setPostGroup(userService.selectUserPostGroup(user.getUserId())); + return R.ok(twoProfileVo); + } + + /** + * 修改用户信息 + */ + @RepeatSubmit + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping + public R updateProfile(@Validated @RequestBody Sys2UserProfileBo profile) { + Sys2UserBo user = BeanUtil.toBean(profile, Sys2UserBo.class); + user.setUserId(LoginHelper.getUserId()); + String username = LoginHelper.getUsername(); + if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("修改用户'" + username + "'失败,手机号码已存在"); + } + if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("修改用户'" + username + "'失败,邮箱账号已存在"); + } + int rows = DataPermissionHelper.ignore(() -> userService.updateUserProfile(user)); + if (rows > 0) { + return R.ok(); + } + return R.fail("修改个人信息异常,请联系管理员"); + } + + /** + * 重置密码 + * + * @param bo 新旧密码 + */ + @RepeatSubmit + @ApiEncrypt + @Log(title = "个人信息", businessType = BusinessType.UPDATE) + @PutMapping("/updatePwd") + public R updatePwd(@Validated @RequestBody Sys2UserPasswordBo bo) { + Sys2UserVo user = userService.selectUserById(LoginHelper.getUserId()); + String password = user.getPassword(); + if (!BCrypt.checkpw(bo.getOldPassword(), password)) { + return R.fail("修改密码失败,旧密码错误"); + } + if (BCrypt.checkpw(bo.getNewPassword(), password)) { + return R.fail("新密码不能与旧密码相同"); + } + + if (userService.resetUserPwd(user.getUserId(), BCrypt.hashpw(bo.getNewPassword())) > 0) { + return R.ok(); + } + return R.fail("修改密码异常,请联系管理员"); + } + + /** + * 头像上传 + * + * @param avatarfile 用户头像 + */ + @RepeatSubmit + @Log(title = "用户头像", businessType = BusinessType.UPDATE) + @PostMapping(value = "/avatar", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R avatar(@RequestPart("avatarfile") MultipartFile avatarfile) { + if (!avatarfile.isEmpty()) { + String extension = FileUtil.extName(avatarfile.getOriginalFilename()); + if (!StringUtils.equalsAnyIgnoreCase(extension, MimeTypeUtils.IMAGE_EXTENSION)) { + return R.fail("文件格式不正确,请上传" + Arrays.toString(MimeTypeUtils.IMAGE_EXTENSION) + "格式"); + } + Sys2OssVo oss = ossService.upload(avatarfile); + String avatar = oss.getUrl(); + if (userService.updateUserAvatar(LoginHelper.getUserId(), oss.getOssId())) { + TwoAvatarVo twoAvatarVo = new TwoAvatarVo(); + twoAvatarVo.setImgUrl(avatar); + return R.ok(twoAvatarVo); + } + } + return R.fail("上传图片异常,请联系管理员"); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2RoleController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2RoleController.java new file mode 100644 index 000000000..89cd85517 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2RoleController.java @@ -0,0 +1,229 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; +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.web.core.BaseController; +import org.dromara.system.saas.domain.Sys2UserRole; +import org.dromara.system.saas.domain.bo.Sys2DeptBo; +import org.dromara.system.saas.domain.bo.Sys2RoleBo; +import org.dromara.system.saas.domain.bo.Sys2UserBo; +import org.dromara.system.saas.domain.vo.TwoDeptTreeSelectVo; +import org.dromara.system.saas.domain.vo.Sys2RoleVo; +import org.dromara.system.saas.domain.vo.Sys2UserVo; +import org.dromara.system.saas.service.ISys2DeptService; +import org.dromara.system.saas.service.ISys2RoleService; +import org.dromara.system.saas.service.ISys2UserService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 角色信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/role") +public class Sys2RoleController extends BaseController { + + private final ISys2RoleService roleService; + private final ISys2UserService userService; + private final ISys2DeptService deptService; + + /** + * 获取角色信息列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/list") + public TableDataInfo list(Sys2RoleBo role, PageQuery pageQuery) { + return roleService.selectPageRoleList(role, pageQuery); + } + + /** + * 导出角色信息列表 + */ + @Log(title = "角色管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:role:export") + @PostMapping("/export") + public void export(Sys2RoleBo role, HttpServletResponse response) { + List list = roleService.selectRoleList(role); + ExcelUtil.exportExcel(list, "角色数据", Sys2RoleVo.class, response); + } + + /** + * 根据角色编号获取详细信息 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:query") + @GetMapping(value = "/{roleId}") + public R getInfo(@PathVariable Long roleId) { + roleService.checkRoleDataScope(roleId); + return R.ok(roleService.selectRoleById(roleId)); + } + + /** + * 新增角色 + */ + @SaCheckPermission("system:role:add") + @Log(title = "角色管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody Sys2RoleBo role) { + roleService.checkRoleAllowed(role); + if (!roleService.checkRoleNameUnique(role)) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色名称已存在"); + } else if (!roleService.checkRoleKeyUnique(role)) { + return R.fail("新增角色'" + role.getRoleName() + "'失败,角色权限已存在"); + } + return toAjax(roleService.insertRole(role)); + + } + + /** + * 修改保存角色 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody Sys2RoleBo role) { + roleService.checkRoleAllowed(role); + 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(); + } + return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员"); + } + + /** + * 修改保存数据权限 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/dataScope") + public R dataScope(@RequestBody Sys2RoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.authDataScope(role)); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody Sys2RoleBo role) { + roleService.checkRoleAllowed(role); + roleService.checkRoleDataScope(role.getRoleId()); + return toAjax(roleService.updateRoleStatus(role.getRoleId(), role.getStatus())); + } + + /** + * 删除角色 + * + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:role:remove") + @Log(title = "角色管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{roleIds}") + public R remove(@PathVariable Long[] roleIds) { + return toAjax(roleService.deleteRoleByIds(roleIds)); + } + + /** + * 获取角色选择框列表 + * + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:role:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] roleIds) { + return R.ok(roleService.selectRoleByIds(roleIds == null ? null : List.of(roleIds))); + } + + /** + * 查询已分配用户角色列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/authUser/allocatedList") + public TableDataInfo allocatedList(Sys2UserBo user, PageQuery pageQuery) { + return userService.selectAllocatedList(user, pageQuery); + } + + /** + * 查询未分配用户角色列表 + */ + @SaCheckPermission("system:role:list") + @GetMapping("/authUser/unallocatedList") + public TableDataInfo unallocatedList(Sys2UserBo user, PageQuery pageQuery) { + return userService.selectUnallocatedList(user, pageQuery); + } + + /** + * 取消授权用户 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancel") + public R cancelAuthUser(@RequestBody Sys2UserRole userRole) { + return toAjax(roleService.deleteAuthUser(userRole)); + } + + /** + * 批量取消授权用户 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/cancelAll") + public R cancelAuthUserAll(Long roleId, Long[] userIds) { + return toAjax(roleService.deleteAuthUsers(roleId, userIds)); + } + + /** + * 批量选择用户授权 + * + * @param roleId 角色ID + * @param userIds 用户ID串 + */ + @SaCheckPermission("system:role:edit") + @Log(title = "角色管理", businessType = BusinessType.GRANT) + @PutMapping("/authUser/selectAll") + public R selectAuthUserAll(Long roleId, Long[] userIds) { + roleService.checkRoleDataScope(roleId); + return toAjax(roleService.insertAuthUsers(roleId, userIds)); + } + + /** + * 获取对应角色部门树列表 + * + * @param roleId 角色ID + */ + @SaCheckPermission("system:role:list") + @GetMapping(value = "/deptTree/{roleId}") + public R roleDeptTreeselect(@PathVariable("roleId") Long roleId) { + TwoDeptTreeSelectVo selectVo = new TwoDeptTreeSelectVo(); + selectVo.setCheckedKeys(deptService.selectDeptListByRoleId(roleId)); + selectVo.setDepts(deptService.selectDeptTreeList(new Sys2DeptBo())); + return R.ok(selectVo); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2SocialController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2SocialController.java new file mode 100644 index 000000000..f81a7cdca --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2SocialController.java @@ -0,0 +1,38 @@ +package org.dromara.system.saas.controller.system; + +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.saas.domain.vo.Sys2SocialVo; +import org.dromara.system.saas.service.ISys2SocialService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 社会化关系 + * + * @author thiszhc + * @date 2023-06-16 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/social") +public class Sys2SocialController extends BaseController { + + private final ISys2SocialService socialUserService; + + /** + * 查询社会化关系列表 + */ + @GetMapping("/list") + public R> list() { + return R.ok(socialUserService.queryListByUserId(LoginHelper.getUserId())); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2TenantController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2TenantController.java new file mode 100644 index 000000000..df71785b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2TenantController.java @@ -0,0 +1,179 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +import com.baomidou.lock.annotation.Lock4j; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +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.encrypt.annotation.ApiEncrypt; +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.common.web.core.BaseController; +import org.dromara.system.saas.domain.bo.Sys2TenantBo; +import org.dromara.system.saas.domain.vo.Sys2TenantVo; +import org.dromara.system.saas.service.ISys2TenantService; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 租户管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/tenant") +@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") +public class Sys2TenantController extends BaseController { + + private final ISys2TenantService tenantService; + + /** + * 查询租户列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenant:list") + @GetMapping("/list") + public TableDataInfo list(Sys2TenantBo 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(Sys2TenantBo bo, HttpServletResponse response) { + List list = tenantService.queryList(bo); + ExcelUtil.exportExcel(list, "租户", Sys2TenantVo.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)); + } + + /** + * 新增租户 + */ + @ApiEncrypt + @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 Sys2TenantBo 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 Sys2TenantBo 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 Sys2TenantBo 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(List.of(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, true); + 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, + @NotNull(message = "套餐ID不能为空") Long packageId) { + return toAjax(TenantHelper.ignore(() -> tenantService.syncTenantPackage(tenantId, packageId))); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2TenantPackageController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2TenantPackageController.java new file mode 100644 index 000000000..764fc9b94 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2TenantPackageController.java @@ -0,0 +1,142 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaCheckRole; +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.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.web.core.BaseController; +import org.dromara.system.saas.domain.bo.Sys2TenantPackageBo; +import org.dromara.system.saas.domain.vo.Sys2TenantPackageVo; +import org.dromara.system.saas.service.ISys2TenantPackageService; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 租户套餐管理 + * + * @author Michelle.Chung + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/tenant/package") +@ConditionalOnProperty(value = "tenant.enable", havingValue = "true") +public class Sys2TenantPackageController extends BaseController { + + private final ISys2TenantPackageService tenantPackageService; + + /** + * 查询租户套餐列表 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("system:tenantPackage:list") + @GetMapping("/list") + public TableDataInfo list(Sys2TenantPackageBo 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(Sys2TenantPackageBo bo, HttpServletResponse response) { + List list = tenantPackageService.queryList(bo); + ExcelUtil.exportExcel(list, "租户套餐", Sys2TenantPackageVo.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 Sys2TenantPackageBo bo) { + if (!tenantPackageService.checkPackageNameUnique(bo)) { + return R.fail("新增套餐'" + bo.getPackageName() + "'失败,套餐名称已存在"); + } + 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 Sys2TenantPackageBo bo) { + if (!tenantPackageService.checkPackageNameUnique(bo)) { + return R.fail("修改套餐'" + bo.getPackageName() + "'失败,套餐名称已存在"); + } + 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 Sys2TenantPackageBo 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(List.of(packageIds), true)); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2UserController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2UserController.java new file mode 100644 index 000000000..7563236c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/Sys2UserController.java @@ -0,0 +1,300 @@ +package org.dromara.system.saas.controller.system; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.secure.BCrypt; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.R; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.StreamUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.encrypt.annotation.ApiEncrypt; +import org.dromara.common.excel.core.ExcelResult; +import org.dromara.common.excel.utils.ExcelUtil; +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.satoken.utils.LoginHelper; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.saas.domain.bo.Sys2DeptBo; +import org.dromara.system.saas.domain.bo.Sys2PostBo; +import org.dromara.system.saas.domain.bo.Sys2RoleBo; +import org.dromara.system.saas.domain.bo.Sys2UserBo; +import org.dromara.system.saas.domain.vo.*; +import org.dromara.system.saas.listener.SysUserImportListener; +import org.dromara.system.saas.service.*; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.ArrayList; +import java.util.List; + +/** + * 用户信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system2/user") +public class Sys2UserController extends BaseController { + + private final ISys2UserService userService; + private final ISys2RoleService roleService; + private final ISys2PostService postService; + private final ISys2DeptService deptService; + private final ISys2TenantService tenantService; + + /** + * 获取用户列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/list") + public TableDataInfo list(Sys2UserBo user, PageQuery pageQuery) { + return userService.selectPageUserList(user, pageQuery); + } + + /** + * 导出用户列表 + */ + @Log(title = "用户管理", businessType = BusinessType.EXPORT) + @SaCheckPermission("system:user:export") + @PostMapping("/export") + public void export(Sys2UserBo user, HttpServletResponse response) { + List list = userService.selectUserExportList(user); + ExcelUtil.exportExcel(list, "用户数据", Sys2UserExportVo.class, response); + } + + /** + * 导入数据 + * + * @param file 导入文件 + * @param updateSupport 是否更新已存在数据 + */ + @Log(title = "用户管理", businessType = BusinessType.IMPORT) + @SaCheckPermission("system:user:import") + @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public R importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { + ExcelResult result = ExcelUtil.importExcel(file.getInputStream(), Sys2UserImportVo.class, new SysUserImportListener(updateSupport)); + return R.ok(result.getAnalysis()); + } + + /** + * 获取导入模板 + */ + @PostMapping("/importTemplate") + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", Sys2UserImportVo.class, response); + } + + /** + * 获取用户信息 + * + * @return 用户信息 + */ + @GetMapping("/getInfo") + public R getInfo() { + TwoUserInfoVo twoUserInfoVo = new TwoUserInfoVo(); + LoginUser loginUser = LoginHelper.getLoginUser(); + if (TenantHelper.isEnable() && LoginHelper.isSuperAdmin()) { + // 超级管理员 如果重新加载用户信息需清除动态租户 + TenantHelper.clearDynamic(); + } + Sys2UserVo user = userService.selectUserById(loginUser.getUserId()); + if (ObjectUtil.isNull(user)) { + return R.fail("没有权限访问用户数据!"); + } + twoUserInfoVo.setUser(user); + twoUserInfoVo.setPermissions(loginUser.getMenuPermission()); + twoUserInfoVo.setRoles(loginUser.getRolePermission()); + return R.ok(twoUserInfoVo); + } + + /** + * 根据用户编号获取详细信息 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping(value = {"/", "/{userId}"}) + public R getInfo(@PathVariable(value = "userId", required = false) Long userId) { + userService.checkUserDataScope(userId); + Sys2UserInfoVo userInfoVo = new Sys2UserInfoVo(); + Sys2RoleBo roleBo = new Sys2RoleBo(); + roleBo.setStatus(UserConstants.ROLE_NORMAL); + List roles = roleService.selectRoleList(roleBo); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + if (ObjectUtil.isNotNull(userId)) { + Sys2UserVo sysUser = userService.selectUserById(userId); + userInfoVo.setUser(sysUser); + userInfoVo.setRoleIds(roleService.selectRoleListByUserId(userId)); + Long deptId = sysUser.getDeptId(); + if (ObjectUtil.isNotNull(deptId)) { + Sys2PostBo postBo = new Sys2PostBo(); + postBo.setDeptId(deptId); + userInfoVo.setPosts(postService.selectPostList(postBo)); + userInfoVo.setPostIds(postService.selectPostListByUserId(userId)); + } + } + return R.ok(userInfoVo); + } + + /** + * 新增用户 + */ + @SaCheckPermission("system:user:add") + @Log(title = "用户管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody Sys2UserBo user) { + deptService.checkDeptDataScope(user.getDeptId()); + if (!userService.checkUserNameUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在"); + } 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)); + } + + /** + * 修改用户 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody Sys2UserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + deptService.checkDeptDataScope(user.getDeptId()); + if (!userService.checkUserNameUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,登录账号已存在"); + } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,手机号码已存在"); + } else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) { + return R.fail("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在"); + } + return toAjax(userService.updateUser(user)); + } + + /** + * 删除用户 + * + * @param userIds 角色ID串 + */ + @SaCheckPermission("system:user:remove") + @Log(title = "用户管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{userIds}") + public R remove(@PathVariable Long[] userIds) { + if (ArrayUtil.contains(userIds, LoginHelper.getUserId())) { + return R.fail("当前用户不能删除"); + } + return toAjax(userService.deleteUserByIds(userIds)); + } + + /** + * 根据用户ID串批量获取用户基础信息 + * + * @param userIds 用户ID串 + * @param deptId 部门ID + */ + @SaCheckPermission("system:user:query") + @GetMapping("/optionselect") + public R> optionselect(@RequestParam(required = false) Long[] userIds, + @RequestParam(required = false) Long deptId) { + return R.ok(userService.selectUserByIds(userIds == null ? null : List.of(userIds), deptId)); + } + + /** + * 重置密码 + */ + @ApiEncrypt + @SaCheckPermission("system:user:resetPwd") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/resetPwd") + public R resetPwd(@RequestBody Sys2UserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + user.setPassword(BCrypt.hashpw(user.getPassword())); + return toAjax(userService.resetUserPwd(user.getUserId(), user.getPassword())); + } + + /** + * 状态修改 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public R changeStatus(@RequestBody Sys2UserBo user) { + userService.checkUserAllowed(user.getUserId()); + userService.checkUserDataScope(user.getUserId()); + return toAjax(userService.updateUserStatus(user.getUserId(), user.getStatus())); + } + + /** + * 根据用户编号获取授权角色 + * + * @param userId 用户ID + */ + @SaCheckPermission("system:user:query") + @GetMapping("/authRole/{userId}") + public R authRole(@PathVariable Long userId) { + userService.checkUserDataScope(userId); + Sys2UserVo user = userService.selectUserById(userId); + List roles = roleService.selectRolesAuthByUserId(userId); + Sys2UserInfoVo userInfoVo = new Sys2UserInfoVo(); + userInfoVo.setUser(user); + userInfoVo.setRoles(LoginHelper.isSuperAdmin(userId) ? roles : StreamUtils.filter(roles, r -> !r.isSuperAdmin())); + return R.ok(userInfoVo); + } + + /** + * 用户授权角色 + * + * @param userId 用户Id + * @param roleIds 角色ID串 + */ + @SaCheckPermission("system:user:edit") + @Log(title = "用户管理", businessType = BusinessType.GRANT) + @PutMapping("/authRole") + public R insertAuthRole(Long userId, Long[] roleIds) { + userService.checkUserDataScope(userId); + userService.insertUserAuth(userId, roleIds); + return R.ok(); + } + + /** + * 获取部门树列表 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/deptTree") + public R>> deptTree(Sys2DeptBo dept) { + return R.ok(deptService.selectDeptTreeList(dept)); + } + + /** + * 获取部门下的所有用户信息 + */ + @SaCheckPermission("system:user:list") + @GetMapping("/list/dept/{deptId}") + public R> listByDept(@PathVariable @NotNull Long deptId) { + return R.ok(userService.selectUserListByDept(deptId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/SysSaasMenuController.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/SysSaasMenuController.java new file mode 100644 index 000000000..f29c38e41 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/controller/system/SysSaasMenuController.java @@ -0,0 +1,174 @@ +package org.dromara.system.saas.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 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; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.web.core.BaseController; +import org.dromara.system.saas.domain.SysSaasMenu; +import org.dromara.system.saas.domain.bo.SysSaasMenuBo; +import org.dromara.system.saas.domain.vo.TwoMenuTreeSelectVo; +import org.dromara.system.saas.domain.vo.TwoRouterVo; +import org.dromara.system.saas.domain.vo.SysSaasMenuVo; +import org.dromara.system.saas.service.ISysSaasMenuService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 菜单信息 + * + * @author Lion Li + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/systemSaas/menu") +public class SysSaasMenuController extends BaseController { + + private final ISysSaasMenuService 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("systemSaas:menu:list") + @GetMapping("/list") + public R> list(SysSaasMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); + return R.ok(menus); + } + + /** + * 根据菜单编号获取详细信息 + * + * @param menuId 菜单ID + */ + @SaCheckRole(value = { + TenantConstants.SUPER_ADMIN_ROLE_KEY, + TenantConstants.TENANT_ADMIN_ROLE_KEY + }, mode = SaMode.OR) + @SaCheckPermission("systemSaas:menu:query") + @GetMapping(value = "/{menuId}") + public R getInfo(@PathVariable Long menuId) { + return R.ok(menuService.selectMenuById(menuId)); + } + + /** + * 获取菜单下拉树列表 + */ + @SaCheckPermission("systemSaas:menu:query") + @GetMapping("/treeselect") + public R>> treeselect(SysSaasMenuBo menu) { + List menus = menuService.selectMenuList(menu, LoginHelper.getUserId()); + return R.ok(menuService.buildMenuTreeSelect(menus)); + } + + /** + * 加载对应角色菜单列表树 + * + * @param roleId 角色ID + */ + @SaCheckPermission("systemSaas:menu:query") + @GetMapping(value = "/roleMenuTreeselect/{roleId}") + public R roleMenuTreeselect(@PathVariable("roleId") Long roleId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId()); + TwoMenuTreeSelectVo selectVo = new TwoMenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByRoleId(roleId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 加载对应租户套餐菜单列表树 + * + * @param packageId 租户套餐ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("systemSaas:menu:query") + @GetMapping(value = "/tenantPackageMenuTreeselect/{packageId}") + public R tenantPackageMenuTreeselect(@PathVariable("packageId") Long packageId) { + List menus = menuService.selectMenuList(LoginHelper.getUserId()); + TwoMenuTreeSelectVo selectVo = new TwoMenuTreeSelectVo(); + selectVo.setCheckedKeys(menuService.selectMenuListByPackageId(packageId)); + selectVo.setMenus(menuService.buildMenuTreeSelect(menus)); + return R.ok(selectVo); + } + + /** + * 新增菜单 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("systemSaas:menu:add") + @Log(title = "菜单管理", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody SysSaasMenuBo menu) { + if (!menuService.checkMenuNameUnique(menu)) { + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return R.fail("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } + return toAjax(menuService.insertMenu(menu)); + } + + /** + * 修改菜单 + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("systemSaas:menu:edit") + @Log(title = "菜单管理", businessType = BusinessType.UPDATE) + @PutMapping + public R edit(@Validated @RequestBody SysSaasMenuBo menu) { + if (!menuService.checkMenuNameUnique(menu)) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath())) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); + } else if (menu.getMenuId().equals(menu.getParentId())) { + return R.fail("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); + } + return toAjax(menuService.updateMenu(menu)); + } + + /** + * 删除菜单 + * + * @param menuId 菜单ID + */ + @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY) + @SaCheckPermission("systemSaas:menu:remove") + @Log(title = "菜单管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{menuId}") + public R remove(@PathVariable("menuId") Long menuId) { + if (menuService.hasChildByMenuId(menuId)) { + return R.warn("存在子菜单,不允许删除"); + } + if (menuService.checkMenuExistRole(menuId)) { + return R.warn("菜单已分配,不允许删除"); + } + return toAjax(menuService.deleteMenuById(menuId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Application.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Application.java new file mode 100644 index 000000000..97d4b94f8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Application.java @@ -0,0 +1,41 @@ +package org.dromara.system.saas.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 应用对象 sys_saas_application + * + * @author Lion Li + * @date 2024-09-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_saas_application") +public class Sys2Application extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "application_id") + private Long applicationId; + + /** + * 应用名称 + */ + private String applicationName; + + /** + * 应用code + */ + private String applicationCode; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Cache.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Cache.java new file mode 100644 index 000000000..297e8b973 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Cache.java @@ -0,0 +1,47 @@ +package org.dromara.system.saas.domain; + +import org.dromara.common.core.utils.StringUtils; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * 缓存信息 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class Sys2Cache { + + /** + * 缓存名称 + */ + private String cacheName = ""; + + /** + * 缓存键名 + */ + private String cacheKey = ""; + + /** + * 缓存内容 + */ + private String cacheValue = ""; + + /** + * 备注 + */ + private String remark = ""; + + public Sys2Cache(String cacheName, String remark) { + this.cacheName = cacheName; + this.remark = remark; + } + + public Sys2Cache(String cacheName, String cacheKey, String cacheValue) { + this.cacheName = StringUtils.replace(cacheName, ":", ""); + this.cacheKey = StringUtils.replace(cacheKey, cacheName, ""); + this.cacheValue = cacheValue; + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Client.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Client.java new file mode 100644 index 000000000..46fadb82e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Client.java @@ -0,0 +1,77 @@ +package org.dromara.system.saas.domain; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 授权管理对象 sys2_client + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_client") +public class Sys2Client extends BaseEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + private String clientKey; + + /** + * 客户端秘钥 + */ + private String clientSecret; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Config.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Config.java new file mode 100644 index 000000000..6d756de07 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Config.java @@ -0,0 +1,51 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 参数配置表 sys2_config + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_config") +public class Sys2Config extends TenantEntity { + + /** + * 参数主键 + */ + @TableId(value = "config_id") + private Long configId; + + /** + * 参数名称 + */ + private String configName; + + /** + * 参数键名 + */ + private String configKey; + + /** + * 参数键值 + */ + private String configValue; + + /** + * 系统内置(Y是 N否) + */ + private String configType; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Dept.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Dept.java new file mode 100644 index 000000000..f38ca5e55 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Dept.java @@ -0,0 +1,83 @@ +package org.dromara.system.saas.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.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 部门表 sys2_dept + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_dept") +public class Sys2Dept extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 部门ID + */ + @TableId(value = "dept_id") + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 部门类别编码 + */ + private String deptCategory; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人 + */ + private Long leader; + + /** + * 联系电话 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 部门状态:0正常,1停用 + */ + private String status; + + /** + * 删除标志(0代表存在 2代表删除) + */ + @TableLogic + private String delFlag; + + /** + * 祖级列表 + */ + private String ancestors; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2DictData.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2DictData.java new file mode 100644 index 000000000..d1dfb1e80 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2DictData.java @@ -0,0 +1,71 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 字典数据表 sys2_dict_data + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_dict_data") +public class Sys2DictData 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; + + /** + * 备注 + */ + private String remark; + + public boolean getDefault() { + return UserConstants.YES.equals(this.isDefault); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2DictType.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2DictType.java new file mode 100644 index 000000000..c3475ee25 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2DictType.java @@ -0,0 +1,41 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 字典类型表 sys2_dict_type + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_dict_type") +public class Sys2DictType extends TenantEntity { + + /** + * 字典主键 + */ + @TableId(value = "dict_id") + private Long dictId; + + /** + * 字典名称 + */ + private String dictName; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Logininfor.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Logininfor.java new file mode 100644 index 000000000..0e780673e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Logininfor.java @@ -0,0 +1,85 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 系统访问记录表 sys2_logininfor + * + * @author Lion Li + */ + +@Data +@TableName("sys2_logininfor") +public class Sys2Logininfor implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "info_id") + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录状态 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-saas/src/main/java/org/dromara/system/saas/domain/Sys2Notice.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Notice.java new file mode 100644 index 000000000..048966fe0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Notice.java @@ -0,0 +1,51 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + + +/** + * 通知公告表 sys2_notice + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_notice") +public class Sys2Notice extends TenantEntity { + + /** + * 公告ID + */ + @TableId(value = "notice_id") + private Long noticeId; + + /** + * 公告标题 + */ + private String noticeTitle; + + /** + * 公告类型(1通知 2公告) + */ + private String noticeType; + + /** + * 公告内容 + */ + private String noticeContent; + + /** + * 公告状态(0正常 1关闭) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2OperLog.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2OperLog.java new file mode 100644 index 000000000..29b874b09 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2OperLog.java @@ -0,0 +1,115 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 操作日志记录表 oper_log + * + * @author Lion Li + */ + +@Data +@TableName("sys2_oper_log") +public class Sys2OperLog implements Serializable { + + @Serial + 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-saas/src/main/java/org/dromara/system/saas/domain/Sys2Oss.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Oss.java new file mode 100644 index 000000000..23e7db46e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Oss.java @@ -0,0 +1,50 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * OSS对象存储对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_oss") +public class Sys2Oss extends TenantEntity { + + /** + * 对象存储主键 + */ + @TableId(value = "oss_id") + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 服务商 + */ + private String service; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2OssConfig.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2OssConfig.java new file mode 100644 index 000000000..b0151895b --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2OssConfig.java @@ -0,0 +1,89 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 对象存储配置对象 sys2_oss_config + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_oss_config") +public class Sys2OssConfig extends BaseEntity { + + /** + * 主键 + */ + @TableId(value = "oss_config_id") + private Long ossConfigId; + + /** + * 配置key + */ + private String configKey; + + /** + * accessKey + */ + private String accessKey; + + /** + * 秘钥 + */ + private String secretKey; + + /** + * 桶名称 + */ + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(0否 1是) + */ + private String isHttps; + + /** + * 域 + */ + private String region; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Post.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Post.java new file mode 100644 index 000000000..f0e75bbc3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Post.java @@ -0,0 +1,61 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 岗位表 sys2_post + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_post") +public class Sys2Post extends TenantEntity { + + /** + * 岗位序号 + */ + @TableId(value = "post_id") + private Long postId; + + /** + * 部门id + */ + private Long deptId; + + /** + * 岗位编码 + */ + private String postCode; + + /** + * 岗位名称 + */ + private String postName; + + /** + * 岗位类别编码 + */ + private String postCategory; + + /** + * 岗位排序 + */ + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Role.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Role.java new file mode 100644 index 000000000..8bdd4f642 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Role.java @@ -0,0 +1,79 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 角色表 sys2_role + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_role") +public class Sys2Role 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 Sys2Role(Long roleId) { + this.roleId = roleId; + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2RoleDept.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2RoleDept.java new file mode 100644 index 000000000..4c943f87a --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2RoleDept.java @@ -0,0 +1,29 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 角色和部门关联 sys2_role_dept + * + * @author Lion Li + */ + +@Data +@TableName("sys2_role_dept") +public class Sys2RoleDept { + + /** + * 角色ID + */ + @TableId(type = IdType.INPUT) + private Long roleId; + + /** + * 部门ID + */ + private Long deptId; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2RoleMenu.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2RoleMenu.java new file mode 100644 index 000000000..168875d85 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2RoleMenu.java @@ -0,0 +1,29 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 角色和菜单关联 sys2_role_menu + * + * @author Lion Li + */ + +@Data +@TableName("sys2_role_menu") +public class Sys2RoleMenu { + + /** + * 角色ID + */ + @TableId(type = IdType.INPUT) + private Long roleId; + + /** + * 菜单ID + */ + private Long menuId; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Social.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Social.java new file mode 100644 index 000000000..7e6d20841 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Social.java @@ -0,0 +1,136 @@ +package org.dromara.system.saas.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; + +import java.io.Serial; + +/** + * 社会化关系对象 sys2_social + * + * @author thiszhc + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_social") +public class Sys2Social extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @TableId(value = "id") + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Tenant.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Tenant.java new file mode 100644 index 000000000..d90533f8c --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2Tenant.java @@ -0,0 +1,103 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; +import java.util.Date; + +/** + * 租户对象 sys2_tenant + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_tenant") +public class Sys2Tenant extends BaseEntity { + + @Serial + 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-saas/src/main/java/org/dromara/system/saas/domain/Sys2TenantApplication.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2TenantApplication.java new file mode 100644 index 000000000..1ce038915 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2TenantApplication.java @@ -0,0 +1,34 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 租户和应用关联对象 sys2_tenant_application + * + * @author Lion Li + * @date 2024-09-22 + */ +@Data +@TableName("sys2_tenant_application") +public class Sys2TenantApplication implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 租户id + */ + @TableId(value = "tenant_id") + private Long tenantId; + + /** + * 应用ID + */ + private Long applicationId; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2TenantPackage.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2TenantPackage.java new file mode 100644 index 000000000..d3e4c94ed --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2TenantPackage.java @@ -0,0 +1,54 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; +import java.io.Serial; + +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 租户套餐对象 sys2_tenant_package + * + * @author Michelle.Chung + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_tenant_package") +public class Sys2TenantPackage extends BaseEntity { + + @Serial + 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-saas/src/main/java/org/dromara/system/saas/domain/Sys2User.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2User.java new file mode 100644 index 000000000..642c2f0a6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2User.java @@ -0,0 +1,115 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.*; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.tenant.core.TenantEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.Date; + +/** + * 用户对象 sys2_user + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("sys2_user") +public class Sys2User extends TenantEntity { + + /** + * 用户ID + */ + @TableId(value = "user_id") + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys2_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 Sys2User(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserOnline.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserOnline.java new file mode 100644 index 000000000..7ab8bca64 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserOnline.java @@ -0,0 +1,63 @@ +package org.dromara.system.saas.domain; + +import lombok.Data; + +/** + * 当前在线会话 + * + * @author Lion Li + */ +@Data +public class Sys2UserOnline { + + /** + * 会话编号 + */ + private String tokenId; + + /** + * 部门名称 + */ + private String deptName; + + /** + * 用户名称 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录IP地址 + */ + private String ipaddr; + + /** + * 登录地址 + */ + private String loginLocation; + + /** + * 浏览器类型 + */ + private String browser; + + /** + * 操作系统 + */ + private String os; + + /** + * 登录时间 + */ + private Long loginTime; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserPost.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserPost.java new file mode 100644 index 000000000..5502f807f --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserPost.java @@ -0,0 +1,29 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户和岗位关联 sys2_user_post + * + * @author Lion Li + */ + +@Data +@TableName("sys2_user_post") +public class Sys2UserPost { + + /** + * 用户ID + */ + @TableId(type = IdType.INPUT) + private Long userId; + + /** + * 岗位ID + */ + private Long postId; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserRole.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserRole.java new file mode 100644 index 000000000..cd7d26faf --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/Sys2UserRole.java @@ -0,0 +1,29 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +/** + * 用户和角色关联 sys2_user_role + * + * @author Lion Li + */ + +@Data +@TableName("sys2_user_role") +public class Sys2UserRole { + + /** + * 用户ID + */ + @TableId(type = IdType.INPUT) + private Long userId; + + /** + * 角色ID + */ + private Long roleId; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/SysSaasMenu.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/SysSaasMenu.java new file mode 100644 index 000000000..0e7138087 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/SysSaasMenu.java @@ -0,0 +1,196 @@ +package org.dromara.system.saas.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +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.mybatis.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; +import java.util.List; + +/** + * 菜单权限表 sys_saas_menu + * + * @author Lion Li + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("sys_saas_menu") +public class SysSaasMenu extends BaseEntity { + + /** + * 应用id + */ + @TableId(value = "application_id") + private Long applicationId; + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + private String menuName; + + /** + * 显示顺序 + */ + 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 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-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ApplicationBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ApplicationBo.java new file mode 100644 index 000000000..062e99dc7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ApplicationBo.java @@ -0,0 +1,42 @@ +package org.dromara.system.saas.domain.bo; + +import org.dromara.system.saas.domain.Sys2Application; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 应用业务对象 sys_saas_application + * + * @author Lion Li + * @date 2024-09-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2Application.class, reverseConvertGenerate = false) +public class Sys2ApplicationBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long applicationId; + + /** + * 应用名称 + */ + @NotBlank(message = "应用名称不能为空", groups = { AddGroup.class, EditGroup.class }) + private String applicationName; + + /** + * 应用code + */ + @NotBlank(message = "应用code不能为空", groups = { AddGroup.class, EditGroup.class }) + private String applicationCode; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ClientBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ClientBo.java new file mode 100644 index 000000000..751c28a13 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ClientBo.java @@ -0,0 +1,80 @@ +package org.dromara.system.saas.domain.bo; + +import org.dromara.system.saas.domain.Sys2Client; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.List; + +/** + * 授权管理业务对象 sys2_client + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2Client.class, reverseConvertGenerate = false) +public class Sys2ClientBo extends BaseEntity { + + /** + * id + */ + @NotNull(message = "id不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 客户端id + */ + private String clientId; + + /** + * 客户端key + */ + @NotBlank(message = "客户端key不能为空", groups = { AddGroup.class, EditGroup.class }) + private String clientKey; + + /** + * 客户端秘钥 + */ + @NotBlank(message = "客户端秘钥不能为空", groups = { AddGroup.class, EditGroup.class }) + private String clientSecret; + + /** + * 授权类型 + */ + @NotNull(message = "授权类型不能为空", groups = { AddGroup.class, EditGroup.class }) + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + private Long activeTimeout; + + /** + * token固定超时时间 + */ + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ConfigBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ConfigBo.java new file mode 100644 index 000000000..ed5483d0d --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2ConfigBo.java @@ -0,0 +1,59 @@ +package org.dromara.system.saas.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.Sys2Config; + +/** + * 参数配置业务对象 sys2_config + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2Config.class, reverseConvertGenerate = false) +public class Sys2ConfigBo extends BaseEntity { + + /** + * 参数主键 + */ + private Long configId; + + /** + * 参数名称 + */ + @NotBlank(message = "参数名称不能为空") + @Size(min = 0, max = 100, message = "参数名称不能超过{max}个字符") + private String configName; + + /** + * 参数键名 + */ + @NotBlank(message = "参数键名不能为空") + @Size(min = 0, max = 100, message = "参数键名长度不能超过{max}个字符") + private String configKey; + + /** + * 参数键值 + */ + @NotBlank(message = "参数键值不能为空") + @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-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DeptBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DeptBo.java new file mode 100644 index 000000000..47c7767c0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DeptBo.java @@ -0,0 +1,76 @@ +package org.dromara.system.saas.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.Sys2Dept; + +/** + * 部门业务对象 sys2_dept + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2Dept.class, reverseConvertGenerate = false) +public class Sys2DeptBo extends BaseEntity { + + /** + * 部门id + */ + private Long deptId; + + /** + * 父部门ID + */ + private Long parentId; + + /** + * 部门名称 + */ + @NotBlank(message = "部门名称不能为空") + @Size(min = 0, max = 30, message = "部门名称长度不能超过{max}个字符") + private String deptName; + + /** + * 部门类别编码 + */ + @Size(min = 0, max = 100, message = "部门类别编码长度不能超过{max}个字符") + private String deptCategory; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer orderNum; + + /** + * 负责人 + */ + private Long 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-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DictDataBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DictDataBo.java new file mode 100644 index 000000000..84aeba191 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DictDataBo.java @@ -0,0 +1,79 @@ +package org.dromara.system.saas.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.Sys2DictData; + +/** + * 字典数据业务对象 sys2_dict_data + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2DictData.class, reverseConvertGenerate = false) +public class Sys2DictDataBo extends BaseEntity { + + /** + * 字典编码 + */ + private Long dictCode; + + /** + * 字典排序 + */ + private Integer dictSort; + + /** + * 字典标签 + */ + @NotBlank(message = "字典标签不能为空") + @Size(min = 0, max = 100, message = "字典标签长度不能超过{max}个字符") + private String dictLabel; + + /** + * 字典键值 + */ + @NotBlank(message = "字典键值不能为空") + @Size(min = 0, max = 100, message = "字典键值长度不能超过{max}个字符") + private String dictValue; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @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; + + /** + * 创建部门 + */ + private Long createDept; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DictTypeBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DictTypeBo.java new file mode 100644 index 000000000..d29785b2c --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2DictTypeBo.java @@ -0,0 +1,50 @@ +package org.dromara.system.saas.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.RegexConstants; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.Sys2DictType; + +/** + * 字典类型业务对象 sys2_dict_type + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2DictType.class, reverseConvertGenerate = false) +public class Sys2DictTypeBo extends BaseEntity { + + /** + * 字典主键 + */ + private Long dictId; + + /** + * 字典名称 + */ + @NotBlank(message = "字典名称不能为空") + @Size(min = 0, max = 100, message = "字典类型名称长度不能超过{max}个字符") + private String dictName; + + /** + * 字典类型 + */ + @NotBlank(message = "字典类型不能为空") + @Size(min = 0, max = 100, message = "字典类型类型长度不能超过{max}个字符") + @Pattern(regexp = RegexConstants.DICTIONARY_TYPE, message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)") + private String dictType; + + /** + * 备注 + */ + private String remark; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2LogininforBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2LogininforBo.java new file mode 100644 index 000000000..335bd608b --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2LogininforBo.java @@ -0,0 +1,87 @@ +package org.dromara.system.saas.domain.bo; + +import org.dromara.system.saas.domain.Sys2Logininfor; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 系统访问记录业务对象 sys2_logininfor + * + * @author Michelle.Chung + */ + +@Data +@AutoMapper(target = Sys2Logininfor.class, reverseConvertGenerate = false) +public class Sys2LogininforBo { + + /** + * 访问ID + */ + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 客户端 + */ + private String clientKey; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * 登录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-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2NoticeBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2NoticeBo.java new file mode 100644 index 000000000..14268a07f --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2NoticeBo.java @@ -0,0 +1,61 @@ +package org.dromara.system.saas.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.Sys2Notice; + +/** + * 通知公告业务对象 sys2_notice + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2Notice.class, reverseConvertGenerate = false) +public class Sys2NoticeBo extends BaseEntity { + + /** + * 公告ID + */ + private Long noticeId; + + /** + * 公告标题 + */ + @Xss(message = "公告标题不能包含脚本字符") + @NotBlank(message = "公告标题不能为空") + @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-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OperLogBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OperLogBo.java new file mode 100644 index 000000000..7496b0f54 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OperLogBo.java @@ -0,0 +1,127 @@ +package org.dromara.system.saas.domain.bo; + +import org.dromara.common.log.event.OperLogEvent; +import org.dromara.system.saas.domain.Sys2OperLog; +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMappers; +import lombok.Data; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * 操作日志记录业务对象 sys2_oper_log + * + * @author Michelle.Chung + * @date 2023-02-07 + */ + +@Data +@AutoMappers({ + @AutoMapper(target = Sys2OperLog.class, reverseConvertGenerate = false), + @AutoMapper(target = OperLogEvent.class) +}) +public class Sys2OperLogBo { + + /** + * 日志主键 + */ + 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-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OssBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OssBo.java new file mode 100644 index 000000000..9c3680001 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OssBo.java @@ -0,0 +1,49 @@ +package org.dromara.system.saas.domain.bo; + +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.Sys2Oss; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * OSS对象存储分页查询对象 sys2_oss + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2Oss.class, reverseConvertGenerate = false) +public class Sys2OssBo extends BaseEntity { + + /** + * ossId + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 服务商 + */ + private String service; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OssConfigBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OssConfigBo.java new file mode 100644 index 000000000..dce191b31 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2OssConfigBo.java @@ -0,0 +1,109 @@ +package org.dromara.system.saas.domain.bo; + +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.Sys2OssConfig; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 对象存储配置业务对象 sys2_oss_config + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2OssConfig.class, reverseConvertGenerate = false) +public class Sys2OssConfigBo extends BaseEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = {EditGroup.class}) + private Long ossConfigId; + + /** + * 配置key + */ + @NotBlank(message = "配置key不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "configKey长度必须介于{min}和{max} 之间") + private String configKey; + + /** + * accessKey + */ + @NotBlank(message = "accessKey不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "accessKey长度必须介于{min}和{max} 之间") + private String accessKey; + + /** + * 秘钥 + */ + @NotBlank(message = "secretKey不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "secretKey长度必须介于{min}和{max} 之间") + private String secretKey; + + /** + * 桶名称 + */ + @NotBlank(message = "桶名称不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "bucketName长度必须介于{min}和{max}之间") + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + @NotBlank(message = "访问站点不能为空", groups = {AddGroup.class, EditGroup.class}) + @Size(min = 2, max = 100, message = "endpoint长度必须介于{min}和{max}之间") + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 域 + */ + private String region; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + @NotBlank(message = "桶权限类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String accessPolicy; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2PostBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2PostBo.java new file mode 100644 index 000000000..7e9628533 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2PostBo.java @@ -0,0 +1,75 @@ +package org.dromara.system.saas.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.Sys2Post; + +/** + * 岗位信息业务对象 sys2_post + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2Post.class, reverseConvertGenerate = false) +public class Sys2PostBo extends BaseEntity { + + /** + * 岗位ID + */ + private Long postId; + + /** + * 部门id(单部门) + */ + @NotNull(message = "部门id不能为空") + private Long deptId; + + /** + * 归属部门id(部门树) + */ + private Long belongDeptId; + + /** + * 岗位编码 + */ + @NotBlank(message = "岗位编码不能为空") + @Size(min = 0, max = 64, message = "岗位编码长度不能超过{max}个字符") + private String postCode; + + /** + * 岗位名称 + */ + @NotBlank(message = "岗位名称不能为空") + @Size(min = 0, max = 50, message = "岗位名称长度不能超过{max}个字符") + private String postName; + + /** + * 岗位类别编码 + */ + @Size(min = 0, max = 100, message = "类别编码长度不能超过{max}个字符") + private String postCategory; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2RoleBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2RoleBo.java new file mode 100644 index 000000000..c37ea65de --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2RoleBo.java @@ -0,0 +1,94 @@ +package org.dromara.system.saas.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.Sys2Role; + +/** + * 角色信息业务对象 sys2_role + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2Role.class, reverseConvertGenerate = false) +public class Sys2RoleBo extends BaseEntity { + + /** + * 角色ID + */ + private Long roleId; + + /** + * 角色名称 + */ + @NotBlank(message = "角色名称不能为空") + @Size(min = 0, max = 30, message = "角色名称长度不能超过{max}个字符") + private String roleName; + + /** + * 角色权限字符串 + */ + @NotBlank(message = "角色权限字符串不能为空") + @Size(min = 0, max = 100, message = "权限字符长度不能超过{max}个字符") + private String roleKey; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + 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 Sys2RoleBo(Long roleId) { + this.roleId = roleId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.roleId); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2SocialBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2SocialBo.java new file mode 100644 index 000000000..72f1e0c0a --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2SocialBo.java @@ -0,0 +1,142 @@ +package org.dromara.system.saas.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.common.tenant.core.TenantEntity; +import org.dromara.system.saas.domain.Sys2Social; + +/** + * 社会化关系业务对象 sys2_social + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2Social.class, reverseConvertGenerate = false) +public class Sys2SocialBo extends TenantEntity { + + /** + * 主键 + */ + @NotNull(message = "主键不能为空", groups = { EditGroup.class }) + private Long id; + + /** + * 认证唯一ID + */ + @NotBlank(message = "认证唯一ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private String authId; + + /** + * 用户来源 + */ + @NotBlank(message = "用户来源不能为空", groups = { AddGroup.class, EditGroup.class }) + private String source; + + /** + * 用户的授权令牌 + */ + @NotBlank(message = "用户的授权令牌不能为空", groups = { AddGroup.class, EditGroup.class }) + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 平台唯一id + */ + private String openId; + + /** + * 用户的 ID + */ + @NotBlank(message = "用户的ID不能为空", groups = { AddGroup.class, EditGroup.class }) + private Long userId; + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantApplicationBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantApplicationBo.java new file mode 100644 index 000000000..5a14a7881 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantApplicationBo.java @@ -0,0 +1,32 @@ +package org.dromara.system.saas.domain.bo; + +import org.dromara.system.saas.domain.Sys2TenantApplication; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 租户和应用关联业务对象 sys2_tenant_application + * + * @author Lion Li + * @date 2024-09-22 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2TenantApplication.class, reverseConvertGenerate = false) +public class Sys2TenantApplicationBo extends BaseEntity { + + @NotNull(message = "租户ID不能为空", groups = {EditGroup.class}) + private Long tenantId; + + /** + * 应用ID + */ + @NotNull(message = "应用ID不能为空", groups = {EditGroup.class}) + private Long applicationId; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantBo.java new file mode 100644 index 000000000..19a1456b6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantBo.java @@ -0,0 +1,114 @@ +package org.dromara.system.saas.domain.bo; + +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.system.saas.domain.Sys2Tenant; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import java.util.Date; + +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 租户业务对象 sys2_tenant + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2Tenant.class, reverseConvertGenerate = false) +public class Sys2TenantBo 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-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantPackageBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantPackageBo.java new file mode 100644 index 000000000..3f9b81205 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2TenantPackageBo.java @@ -0,0 +1,59 @@ +package org.dromara.system.saas.domain.bo; + +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import org.dromara.system.saas.domain.Sys2TenantPackage; +import io.github.linpeilie.annotations.AutoMapper; +import io.github.linpeilie.annotations.AutoMapping; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +import org.dromara.common.mybatis.core.domain.BaseEntity; + +/** + * 租户套餐业务对象 sys2_tenant_package + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2TenantPackage.class, reverseConvertGenerate = false) +public class Sys2TenantPackageBo 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-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserBo.java new file mode 100644 index 000000000..c4db816bd --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserBo.java @@ -0,0 +1,125 @@ +package org.dromara.system.saas.domain.bo; + +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.Sys2User; + +/** + * 用户信息业务对象 sys2_user + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = Sys2User.class, reverseConvertGenerate = false) +public class Sys2UserBo extends BaseEntity { + + /** + * 应用id + */ + @NotBlank(message = "不能为空") + private Long applicationId; + + /** + * 用户ID + */ + private Long userId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + @Xss(message = "用户账号不能包含脚本字符") + @NotBlank(message = "用户账号不能为空") + @Size(min = 0, max = 30, message = "用户账号长度不能超过{max}个字符") + private String userName; + + /** + * 用户昵称 + */ + @Xss(message = "用户昵称不能包含脚本字符") + @NotBlank(message = "用户昵称不能为空") + @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") + private String nickName; + + /** + * 用户类型(sys2_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Email(message = "邮箱格式不正确") + @Size(min = 0, max = 50, message = "邮箱长度不能超过{max}个字符") + private String email; + + /** + * 手机号码 + */ + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + + /** + * 密码 + */ + private String password; + + /** + * 帐号状态(0正常 1停用) + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 角色组 + */ + @Size(min = 1, message = "用户角色不能为空") + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + + /** + * 排除不查询的用户(工作流用) + */ + private String excludeUserIds; + + public Sys2UserBo(Long userId) { + this.userId = userId; + } + + public boolean isSuperAdmin() { + return UserConstants.SUPER_ADMIN_ID.equals(this.userId); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserPasswordBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserPasswordBo.java new file mode 100644 index 000000000..2eae6017d --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserPasswordBo.java @@ -0,0 +1,29 @@ +package org.dromara.system.saas.domain.bo; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 用户密码修改bo + */ +@Data +public class Sys2UserPasswordBo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 旧密码 + */ + @NotBlank(message = "旧密码不能为空") + private String oldPassword; + + /** + * 新密码 + */ + @NotBlank(message = "新密码不能为空") + private String newPassword; +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserProfileBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserProfileBo.java new file mode 100644 index 000000000..d799d9ff0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/Sys2UserProfileBo.java @@ -0,0 +1,53 @@ +package org.dromara.system.saas.domain.bo; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.constant.RegexConstants; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; + +/** + * 个人信息业务处理 + * + * @author Michelle.Chung + */ + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class Sys2UserProfileBo extends BaseEntity { + + /** + * 用户昵称 + */ + @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; + + /** + * 手机号码 + */ + @Pattern(regexp = RegexConstants.MOBILE, message = "手机号格式不正确") + @Sensitive(strategy = SensitiveStrategy.PHONE) + private String phonenumber; + + /** + * 用户性别(0男 1女 2未知) + */ + private String sex; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/SysSaasMenuBo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/SysSaasMenuBo.java new file mode 100644 index 000000000..a229f2f1b --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/bo/SysSaasMenuBo.java @@ -0,0 +1,110 @@ +package org.dromara.system.saas.domain.bo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Pattern; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.constant.RegexConstants; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.saas.domain.SysSaasMenu; + +/** + * 菜单权限业务对象 sys_saas_menu + * + * @author Michelle.Chung + */ + +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = SysSaasMenu.class, reverseConvertGenerate = false) +public class SysSaasMenuBo extends BaseEntity { + + /** + * 菜单ID + */ + private Long menuId; + + /** + * 父菜单ID + */ + private Long parentId; + + /** + * 菜单名称 + */ + @NotBlank(message = "菜单名称不能为空") + @Size(min = 0, max = 50, message = "菜单名称长度不能超过{max}个字符") + private String menuName; + + /** + * 显示顺序 + */ + @NotNull(message = "显示顺序不能为空") + 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 = "菜单类型不能为空") + 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}个字符") + @Pattern(regexp = RegexConstants.PERMISSION_STRING, message = "权限标识必须符合 tool:build:list 格式") + private String perms; + + /** + * 菜单图标 + */ + private String icon; + + /** + * 备注 + */ + private String remark; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ApplicationVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ApplicationVo.java new file mode 100644 index 000000000..b892df21f --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ApplicationVo.java @@ -0,0 +1,46 @@ +package org.dromara.system.saas.domain.vo; + +import org.dromara.system.saas.domain.Sys2Application; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 应用视图对象 sys_saas_application + * + * @author Lion Li + * @date 2024-09-22 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2Application.class) +public class Sys2ApplicationVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long applicationId; + + /** + * 应用名称 + */ + @ExcelProperty(value = "应用名称") + private String applicationName; + + /** + * 应用code + */ + @ExcelProperty(value = "应用code") + private String applicationCode; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ClientVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ClientVo.java new file mode 100644 index 000000000..5d5b35616 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ClientVo.java @@ -0,0 +1,90 @@ +package org.dromara.system.saas.domain.vo; + +import org.dromara.system.saas.domain.Sys2Client; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +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 lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.List; + + +/** + * 授权管理视图对象 sys2_client + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2Client.class) +public class Sys2ClientVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 客户端id + */ + @ExcelProperty(value = "客户端id") + private String clientId; + + /** + * 客户端key + */ + @ExcelProperty(value = "客户端key") + private String clientKey; + + /** + * 客户端秘钥 + */ + @ExcelProperty(value = "客户端秘钥") + private String clientSecret; + + /** + * 授权类型 + */ + @ExcelProperty(value = "授权类型") + private List grantTypeList; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 设备类型 + */ + private String deviceType; + + /** + * token活跃超时时间 + */ + @ExcelProperty(value = "token活跃超时时间") + private Long activeTimeout; + + /** + * token固定超时时间 + */ + @ExcelProperty(value = "token固定超时时间") + private Long timeout; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=正常,1=停用") + private String status; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ConfigVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ConfigVo.java new file mode 100644 index 000000000..0c2a644ef --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2ConfigVo.java @@ -0,0 +1,72 @@ +package org.dromara.system.saas.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.saas.domain.Sys2Config; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 参数配置视图对象 sys2_config + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2Config.class) +public class Sys2ConfigVo implements Serializable { + + @Serial + 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 = "sys2_yes_no") + private String configType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DeptVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DeptVo.java new file mode 100644 index 000000000..c84d315b1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DeptVo.java @@ -0,0 +1,102 @@ +package org.dromara.system.saas.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.saas.domain.Sys2Dept; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 部门视图对象 sys2_dept + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2Dept.class) +public class Sys2DeptVo implements Serializable { + + @Serial + 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; + + /** + * 部门类别编码 + */ + @ExcelProperty(value = "部门类别编码") + private String deptCategory; + + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 负责人ID + */ + private Long leader; + + /** + * 负责人 + */ + @ExcelProperty(value = "负责人") + private String leaderName; + + /** + * 联系电话 + */ + @ExcelProperty(value = "联系电话") + private String phone; + + /** + * 邮箱 + */ + @ExcelProperty(value = "邮箱") + private String email; + + /** + * 部门状态(0正常 1停用) + */ + @ExcelProperty(value = "部门状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_normal_disable") + private String status; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DictDataVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DictDataVo.java new file mode 100644 index 000000000..c79c58be1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DictDataVo.java @@ -0,0 +1,88 @@ +package org.dromara.system.saas.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.saas.domain.Sys2DictData; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典数据视图对象 sys2_dict_data + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2DictData.class) +public class Sys2DictDataVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典编码 + */ + @ExcelProperty(value = "字典编码") + private Long dictCode; + + /** + * 字典排序 + */ + @ExcelProperty(value = "字典排序") + private Integer dictSort; + + /** + * 字典标签 + */ + @ExcelProperty(value = "字典标签") + private String dictLabel; + + /** + * 字典键值 + */ + @ExcelProperty(value = "字典键值") + private String dictValue; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 样式属性(其他样式扩展) + */ + private String cssClass; + + /** + * 表格回显样式 + */ + private String listClass; + + /** + * 是否默认(Y是 N否) + */ + @ExcelProperty(value = "是否默认", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_yes_no") + private String isDefault; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DictTypeVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DictTypeVo.java new file mode 100644 index 000000000..e0ad7cc09 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2DictTypeVo.java @@ -0,0 +1,57 @@ +package org.dromara.system.saas.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.system.saas.domain.Sys2DictType; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 字典类型视图对象 sys2_dict_type + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2DictType.class) +public class Sys2DictTypeVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 字典主键 + */ + @ExcelProperty(value = "字典主键") + private Long dictId; + + /** + * 字典名称 + */ + @ExcelProperty(value = "字典名称") + private String dictName; + + /** + * 字典类型 + */ + @ExcelProperty(value = "字典类型") + private String dictType; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2LogininforVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2LogininforVo.java new file mode 100644 index 000000000..f3c5ed2fc --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2LogininforVo.java @@ -0,0 +1,106 @@ +package org.dromara.system.saas.domain.vo; + +import java.util.Date; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.saas.domain.Sys2Logininfor; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + + +/** + * 系统访问记录视图对象 sys2_logininfor + * + * @author Michelle.Chung + * @date 2023-02-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2Logininfor.class) +public class Sys2LogininforVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 访问ID + */ + @ExcelProperty(value = "序号") + private Long infoId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "用户账号") + private String userName; + + /** + * 客户端 + */ + @ExcelProperty(value = "客户端") + private String clientKey; + + /** + * 设备类型 + */ + @ExcelProperty(value = "设备类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_device_type") + private String deviceType; + + /** + * 登录状态(0成功 1失败) + */ + @ExcelProperty(value = "登录状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_common_status") + private String status; + + /** + * 登录IP地址 + */ + @ExcelProperty(value = "登录地址") + private String ipaddr; + + /** + * 登录地点 + */ + @ExcelProperty(value = "登录地点") + private String loginLocation; + + /** + * 浏览器类型 + */ + @ExcelProperty(value = "浏览器") + private String browser; + + /** + * 操作系统 + */ + @ExcelProperty(value = "操作系统") + private String os; + + + /** + * 提示消息 + */ + @ExcelProperty(value = "提示消息") + private String msg; + + /** + * 访问时间 + */ + @ExcelProperty(value = "访问时间") + private Date loginTime; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2NoticeVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2NoticeVo.java new file mode 100644 index 000000000..dd334ebd4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2NoticeVo.java @@ -0,0 +1,73 @@ +package org.dromara.system.saas.domain.vo; + +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.saas.domain.Sys2Notice; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 通知公告视图对象 sys2_notice + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = Sys2Notice.class) +public class Sys2NoticeVo implements Serializable { + + @Serial + 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-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OperLogVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OperLogVo.java new file mode 100644 index 000000000..607cc0b1d --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OperLogVo.java @@ -0,0 +1,144 @@ +package org.dromara.system.saas.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.saas.domain.Sys2OperLog; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 操作日志记录视图对象 sys2_oper_log + * + * @author Michelle.Chung + * @date 2023-02-07 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2OperLog.class) +public class Sys2OperLogVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 日志主键 + */ + @ExcelProperty(value = "日志主键") + private Long operId; + + /** + * 租户编号 + */ + private String tenantId; + + /** + * 模块标题 + */ + @ExcelProperty(value = "操作模块") + private String title; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + @ExcelProperty(value = "业务类型", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_oper_type") + private Integer businessType; + + /** + * 业务类型数组 + */ + private Integer[] businessTypes; + + /** + * 方法名称 + */ + @ExcelProperty(value = "请求方法") + private String method; + + /** + * 请求方式 + */ + @ExcelProperty(value = "请求方式") + private String requestMethod; + + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + @ExcelProperty(value = "操作类别", converter = ExcelDictConvert.class) + @ExcelDictFormat(readConverterExp = "0=其它,1=后台用户,2=手机端用户") + private Integer operatorType; + + /** + * 操作人员 + */ + @ExcelProperty(value = "操作人员") + private String operName; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 请求URL + */ + @ExcelProperty(value = "请求地址") + private String operUrl; + + /** + * 主机地址 + */ + @ExcelProperty(value = "操作地址") + private String operIp; + + /** + * 操作地点 + */ + @ExcelProperty(value = "操作地点") + private String operLocation; + + /** + * 请求参数 + */ + @ExcelProperty(value = "请求参数") + private String operParam; + + /** + * 返回参数 + */ + @ExcelProperty(value = "返回参数") + private String jsonResult; + + /** + * 操作状态(0正常 1异常) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_common_status") + private Integer status; + + /** + * 错误消息 + */ + @ExcelProperty(value = "错误消息") + private String errorMsg; + + /** + * 操作时间 + */ + @ExcelProperty(value = "操作时间") + private Date operTime; + + /** + * 消耗时间 + */ + @ExcelProperty(value = "消耗时间") + private Long costTime; +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssConfigVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssConfigVo.java new file mode 100644 index 000000000..137f3f3e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssConfigVo.java @@ -0,0 +1,97 @@ +package org.dromara.system.saas.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import org.dromara.system.saas.domain.Sys2OssConfig; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 对象存储配置视图对象 sys2_oss_config + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2OssConfig.class) +public class Sys2OssConfigVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long ossConfigId; + + /** + * 配置key + */ + private String configKey; + + /** + * accessKey + */ + private String accessKey; + + /** + * 秘钥 + */ + private String secretKey; + + /** + * 桶名称 + */ + private String bucketName; + + /** + * 前缀 + */ + private String prefix; + + /** + * 访问站点 + */ + private String endpoint; + + /** + * 自定义域名 + */ + private String domain; + + /** + * 是否https(Y=是,N=否) + */ + private String isHttps; + + /** + * 域 + */ + private String region; + + /** + * 是否默认(0=是,1=否) + */ + private String status; + + /** + * 扩展字段 + */ + private String ext1; + + /** + * 备注 + */ + private String remark; + + /** + * 桶权限类型(0private 1public 2custom) + */ + private String accessPolicy; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssUploadVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssUploadVo.java new file mode 100644 index 000000000..82d40d872 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssUploadVo.java @@ -0,0 +1,28 @@ +package org.dromara.system.saas.domain.vo; + +import lombok.Data; + +/** + * 上传对象信息 + * + * @author Michelle.Chung + */ +@Data +public class Sys2OssUploadVo { + + /** + * URL地址 + */ + private String url; + + /** + * 文件名 + */ + private String fileName; + + /** + * 对象存储主键 + */ + private String ossId; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssVo.java new file mode 100644 index 000000000..ce3d24973 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2OssVo.java @@ -0,0 +1,72 @@ +package org.dromara.system.saas.domain.vo; + +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.saas.domain.Sys2Oss; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * OSS对象存储视图对象 sys2_oss + * + * @author Lion Li + */ +@Data +@AutoMapper(target = Sys2Oss.class) +public class Sys2OssVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 对象存储主键 + */ + private Long ossId; + + /** + * 文件名 + */ + private String fileName; + + /** + * 原名 + */ + private String originalName; + + /** + * 文件后缀名 + */ + private String fileSuffix; + + /** + * URL地址 + */ + private String url; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 上传人 + */ + private Long createBy; + + /** + * 上传人名称 + */ + @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "createBy") + private String createByName; + + /** + * 服务商 + */ + private String service; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2PostVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2PostVo.java new file mode 100644 index 000000000..dfbde3cbd --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2PostVo.java @@ -0,0 +1,91 @@ +package org.dromara.system.saas.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.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.saas.domain.Sys2Post; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 岗位信息视图对象 sys2_post + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2Post.class) +public class Sys2PostVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 岗位ID + */ + @ExcelProperty(value = "岗位序号") + private Long postId; + + /** + * 部门id + */ + @ExcelProperty(value = "部门id") + private Long deptId; + + /** + * 岗位编码 + */ + @ExcelProperty(value = "岗位编码") + private String postCode; + + /** + * 岗位名称 + */ + @ExcelProperty(value = "岗位名称") + private String postName; + + /** + * 岗位类别编码 + */ + @ExcelProperty(value = "类别编码") + private String postCategory; + + /** + * 显示顺序 + */ + @ExcelProperty(value = "岗位排序") + private Integer postSort; + + /** + * 状态(0正常 1停用) + */ + @ExcelProperty(value = "状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_normal_disable") + private String status; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; + + /** + * 部门名 + */ + @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId") + private String deptName; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2RoleVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2RoleVo.java new file mode 100644 index 000000000..80cbc4e75 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2RoleVo.java @@ -0,0 +1,100 @@ +package org.dromara.system.saas.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +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.saas.domain.Sys2Role; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 角色信息视图对象 sys2_role + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2Role.class) +public class Sys2RoleVo implements Serializable { + + @Serial + 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 = "sys2_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-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2SocialVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2SocialVo.java new file mode 100644 index 000000000..fe62c83d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2SocialVo.java @@ -0,0 +1,144 @@ +package org.dromara.system.saas.domain.vo; + +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import org.dromara.system.saas.domain.Sys2Social; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + +/** + * 社会化关系视图对象 sys2_social + * + * @author thiszhc + */ +@Data +@AutoMapper(target = Sys2Social.class) +public class Sys2SocialVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + private Long id; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 的唯一ID + */ + private String authId; + + /** + * 用户来源 + */ + private String source; + + /** + * 用户的授权令牌 + */ + private String accessToken; + + /** + * 用户的授权令牌的有效期,部分平台可能没有 + */ + private int expireIn; + + /** + * 刷新令牌,部分平台可能没有 + */ + private String refreshToken; + + /** + * 用户的 open id + */ + private String openId; + + /** + * 授权的第三方账号 + */ + private String userName; + + /** + * 授权的第三方昵称 + */ + private String nickName; + + /** + * 授权的第三方邮箱 + */ + private String email; + + /** + * 授权的第三方头像地址 + */ + private String avatar; + + + /** + * 平台的授权信息,部分平台可能没有 + */ + private String accessCode; + + /** + * 用户的 unionid + */ + private String unionId; + + /** + * 授予的权限,部分平台可能没有 + */ + private String scope; + + /** + * 个别平台的授权信息,部分平台可能没有 + */ + private String tokenType; + + /** + * id token,部分平台可能没有 + */ + private String idToken; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macAlgorithm; + + /** + * 小米平台用户的附带属性,部分平台可能没有 + */ + private String macKey; + + /** + * 用户的授权code,部分平台可能没有 + */ + private String code; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthToken; + + /** + * Twitter平台用户的附带属性,部分平台可能没有 + */ + private String oauthTokenSecret; + + /** + * 创建时间 + */ + private Date createTime; +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantApplicationVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantApplicationVo.java new file mode 100644 index 000000000..71e8532e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantApplicationVo.java @@ -0,0 +1,38 @@ +package org.dromara.system.saas.domain.vo; + +import org.dromara.system.saas.domain.Sys2TenantApplication; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 租户和应用关联视图对象 sys2_tenant_application + * + * @author Lion Li + * @date 2024-09-22 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2TenantApplication.class) +public class Sys2TenantApplicationVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + @ExcelProperty(value = "应用ID") + private Long tenantId; + + /** + * 应用ID + */ + @ExcelProperty(value = "应用ID") + private Long applicationId; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantPackageVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantPackageVo.java new file mode 100644 index 000000000..bc842253e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantPackageVo.java @@ -0,0 +1,66 @@ +package org.dromara.system.saas.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.saas.domain.Sys2TenantPackage; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 租户套餐视图对象 sys2_tenant_package + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2TenantPackage.class) +public class Sys2TenantPackageVo implements Serializable { + + @Serial + 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-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantVo.java new file mode 100644 index 000000000..75c373a6a --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2TenantVo.java @@ -0,0 +1,115 @@ +package org.dromara.system.saas.domain.vo; + +import java.util.Date; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; +import org.dromara.system.saas.domain.Sys2Tenant; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + + +/** + * 租户视图对象 sys2_tenant + * + * @author Michelle.Chung + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = Sys2Tenant.class) +public class Sys2TenantVo implements Serializable { + + @Serial + 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-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserExportVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserExportVo.java new file mode 100644 index 000000000..4d32efa28 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserExportVo.java @@ -0,0 +1,94 @@ +package org.dromara.system.saas.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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 用户对象导出VO + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +public class Sys2UserExportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户序号") + private Long userId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_user_sex") + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_normal_disable") + private String status; + + /** + * 最后登录IP + */ + @ExcelProperty(value = "最后登录IP") + private String loginIp; + + /** + * 最后登录时间 + */ + @ExcelProperty(value = "最后登录时间") + private Date loginDate; + + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") + private String deptName; + + /** + * 负责人 + */ + @ExcelProperty(value = "部门负责人") + private String leaderName; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserImportVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserImportVo.java new file mode 100644 index 000000000..e6a888bd3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserImportVo.java @@ -0,0 +1,76 @@ +package org.dromara.system.saas.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 java.io.Serial; +import java.io.Serializable; + +/** + * 用户对象导入VO + * + * @author Lion Li + */ + +@Data +@NoArgsConstructor +// @Accessors(chain = true) // 导入不允许使用 会找不到set方法 +public class Sys2UserImportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + @ExcelProperty(value = "用户序号") + private Long userId; + + /** + * 部门ID + */ + @ExcelProperty(value = "部门编号") + private Long deptId; + + /** + * 用户账号 + */ + @ExcelProperty(value = "登录名称") + private String userName; + + /** + * 用户昵称 + */ + @ExcelProperty(value = "用户名称") + private String nickName; + + /** + * 用户邮箱 + */ + @ExcelProperty(value = "用户邮箱") + private String email; + + /** + * 手机号码 + */ + @ExcelProperty(value = "手机号码") + private String phonenumber; + + /** + * 用户性别 + */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_user_sex") + private String sex; + + /** + * 帐号状态(0正常 1停用) + */ + @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "sys2_normal_disable") + private String status; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserInfoVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserInfoVo.java new file mode 100644 index 000000000..674c5b04b --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserInfoVo.java @@ -0,0 +1,40 @@ +package org.dromara.system.saas.domain.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 用户信息 + * + * @author Michelle.Chung + */ +@Data +public class Sys2UserInfoVo { + + /** + * 用户信息 + */ + private Sys2UserVo user; + + /** + * 角色ID列表 + */ + private List roleIds; + + /** + * 角色列表 + */ + private List roles; + + /** + * 岗位ID列表 + */ + private List postIds; + + /** + * 岗位列表 + */ + private List posts; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserVo.java new file mode 100644 index 000000000..4af26ca59 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/Sys2UserVo.java @@ -0,0 +1,142 @@ +package org.dromara.system.saas.domain.vo; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import org.dromara.common.sensitive.annotation.Sensitive; +import org.dromara.common.sensitive.core.SensitiveStrategy; +import org.dromara.common.translation.annotation.Translation; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.system.saas.domain.Sys2User; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +/** + * 用户信息视图对象 sys2_user + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = Sys2User.class) +public class Sys2UserVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 用户ID + */ + private Long userId; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 部门ID + */ + private Long deptId; + + /** + * 用户账号 + */ + private String userName; + + /** + * 用户昵称 + */ + private String nickName; + + /** + * 用户类型(sys2_user系统用户) + */ + private String userType; + + /** + * 用户邮箱 + */ + @Sensitive(strategy = SensitiveStrategy.EMAIL, perms = "system:user:edit") + private String email; + + /** + * 手机号码 + */ + @Sensitive(strategy = SensitiveStrategy.PHONE, perms = "system:user:edit") + 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; + + /** + * 部门名 + */ + @Translation(type = TransConstant.DEPT_ID_TO_NAME, mapper = "deptId") + private String deptName; + + /** + * 角色对象 + */ + private List roles; + + /** + * 角色组 + */ + private Long[] roleIds; + + /** + * 岗位组 + */ + private Long[] postIds; + + /** + * 数据权限 当前角色ID + */ + private Long roleId; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/SysSaasMenuVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/SysSaasMenuVo.java new file mode 100644 index 000000000..8e3052cd3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/SysSaasMenuVo.java @@ -0,0 +1,119 @@ +package org.dromara.system.saas.domain.vo; + +import org.dromara.system.saas.domain.SysSaasMenu; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +/** + * 菜单权限视图对象 sys_saas_menu + * + * @author Michelle.Chung + */ +@Data +@AutoMapper(target = SysSaasMenu.class) +public class SysSaasMenuVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + /** + * 应用id + */ + private Long applicationId; + /** + * 菜单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; + + /** + * 菜单类型(A应用 M目录 C菜单 F按钮 A应用) + */ + 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-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoAvatarVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoAvatarVo.java new file mode 100644 index 000000000..595c9651e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoAvatarVo.java @@ -0,0 +1,18 @@ +package org.dromara.system.saas.domain.vo; + +import lombok.Data; + +/** + * 用户头像信息 + * + * @author Michelle.Chung + */ +@Data +public class TwoAvatarVo { + + /** + * 头像地址 + */ + private String imgUrl; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoCacheListInfoVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoCacheListInfoVo.java new file mode 100644 index 000000000..87752f19e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoCacheListInfoVo.java @@ -0,0 +1,23 @@ +package org.dromara.system.saas.domain.vo; + +import lombok.Data; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +/** + * 缓存监控列表信息 + * + * @author Michelle.Chung + */ +@Data +public class TwoCacheListInfoVo { + + private Properties info; + + private Long dbSize; + + private List> commandStats; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoDeptTreeSelectVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoDeptTreeSelectVo.java new file mode 100644 index 000000000..b0d5c79a7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoDeptTreeSelectVo.java @@ -0,0 +1,26 @@ +package org.dromara.system.saas.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.util.List; + +/** + * 角色部门列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class TwoDeptTreeSelectVo { + + /** + * 选中部门列表 + */ + private List checkedKeys; + + /** + * 下拉树结构列表 + */ + private List> depts; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoMenuTreeSelectVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoMenuTreeSelectVo.java new file mode 100644 index 000000000..6324c9f61 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoMenuTreeSelectVo.java @@ -0,0 +1,26 @@ +package org.dromara.system.saas.domain.vo; + +import cn.hutool.core.lang.tree.Tree; +import lombok.Data; + +import java.util.List; + +/** + * 角色菜单列表树信息 + * + * @author Michelle.Chung + */ +@Data +public class TwoMenuTreeSelectVo { + + /** + * 选中菜单列表 + */ + private List checkedKeys; + + /** + * 菜单下拉树结构列表 + */ + private List> menus; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoMetaVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoMetaVo.java new file mode 100644 index 000000000..e04a5696e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoMetaVo.java @@ -0,0 +1,61 @@ +package org.dromara.system.saas.domain.vo; + +import org.dromara.common.core.utils.StringUtils; +import lombok.Data; + +/** + * 路由显示信息 + * + * @author ruoyi + */ + +@Data +public class TwoMetaVo { + + /** + * 设置该路由在侧边栏和面包屑中展示的名字 + */ + private String title; + + /** + * 设置该路由的图标,对应路径src/assets/icons/svg + */ + private String icon; + + /** + * 设置为true,则不会被 缓存 + */ + private boolean noCache; + + /** + * 内链地址(http(s)://开头) + */ + private String link; + + public TwoMetaVo(String title, String icon) { + this.title = title; + this.icon = icon; + } + + public TwoMetaVo(String title, String icon, boolean noCache) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + } + + public TwoMetaVo(String title, String icon, String link) { + this.title = title; + this.icon = icon; + this.link = link; + } + + public TwoMetaVo(String title, String icon, boolean noCache, String link) { + this.title = title; + this.icon = icon; + this.noCache = noCache; + if (StringUtils.ishttp(link)) { + this.link = link; + } + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoProfileVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoProfileVo.java new file mode 100644 index 000000000..8ee64a465 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoProfileVo.java @@ -0,0 +1,29 @@ +package org.dromara.system.saas.domain.vo; + +import lombok.Data; + +/** + * 用户个人信息 + * + * @author Michelle.Chung + */ +@Data +public class TwoProfileVo { + + /** + * 用户信息 + */ + private Sys2UserVo user; + + /** + * 用户所属角色组 + */ + private String roleGroup; + + /** + * 用户所属岗位组 + */ + private String postGroup; + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoRouterVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoRouterVo.java new file mode 100644 index 000000000..d2bb0a811 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoRouterVo.java @@ -0,0 +1,62 @@ +package org.dromara.system.saas.domain.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Data; + +import java.util.List; + +/** + * 路由配置信息 + * + * @author Lion Li + */ +@Data +@JsonInclude(JsonInclude.Include.NON_EMPTY) +public class TwoRouterVo { + + /** + * 路由名字 + */ + private String name; + + /** + * 路由地址 + */ + private String path; + + /** + * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现 + */ + private boolean hidden; + + /** + * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击 + */ + private String redirect; + + /** + * 组件地址 + */ + private String component; + + /** + * 路由参数:如 {"id": 1, "name": "ry"} + */ + private String query; + + /** + * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面 + */ + private Boolean alwaysShow; + + /** + * 其他元素 + */ + private TwoMetaVo meta; + + /** + * 子路由 + */ + private List children; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoUserInfoVo.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoUserInfoVo.java new file mode 100644 index 000000000..3993779d8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/domain/vo/TwoUserInfoVo.java @@ -0,0 +1,30 @@ +package org.dromara.system.saas.domain.vo; + +import lombok.Data; + +import java.util.Set; + +/** + * 登录用户信息 + * + * @author Michelle.Chung + */ +@Data +public class TwoUserInfoVo { + + /** + * 用户基本信息 + */ + private Sys2UserVo user; + + /** + * 菜单权限 + */ + private Set permissions; + + /** + * 角色权限 + */ + private Set roles; + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/listener/SysUserImportListener.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/listener/SysUserImportListener.java new file mode 100644 index 000000000..7ab5e932d --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/listener/SysUserImportListener.java @@ -0,0 +1,119 @@ +package org.dromara.system.saas.listener; + +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; +import org.dromara.common.core.utils.SpringUtils; +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.saas.domain.bo.Sys2UserBo; +import org.dromara.system.saas.domain.vo.Sys2UserImportVo; +import org.dromara.system.saas.domain.vo.Sys2UserVo; +import org.dromara.system.saas.service.ISys2ConfigService; +import org.dromara.system.saas.service.ISys2UserService; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +/** + * 系统用户自定义导入 + * + * @author Lion Li + */ +@Slf4j +public class SysUserImportListener extends AnalysisEventListener implements ExcelListener { + + private final ISys2UserService userService; + + private final String password; + + private final Boolean isUpdateSupport; + + private final Long operUserId; + + private int successNum = 0; + private int failureNum = 0; + private final StringBuilder successMsg = new StringBuilder(); + private final StringBuilder failureMsg = new StringBuilder(); + + public SysUserImportListener(Boolean isUpdateSupport) { + String initPassword = SpringUtils.getBean(ISys2ConfigService.class).selectConfigByKey("sys.user.initPassword"); + this.userService = SpringUtils.getBean(ISys2UserService.class); + this.password = BCrypt.hashpw(initPassword); + this.isUpdateSupport = isUpdateSupport; + this.operUserId = LoginHelper.getUserId(); + } + + @Override + public void invoke(Sys2UserImportVo userVo, AnalysisContext context) { + Sys2UserVo sysUser = this.userService.selectUserByUserName(userVo.getUserName()); + try { + // 验证是否存在这个用户 + if (ObjectUtil.isNull(sysUser)) { + Sys2UserBo user = BeanUtil.toBean(userVo, Sys2UserBo.class); + ValidatorUtils.validate(user); + user.setPassword(password); + user.setCreateBy(operUserId); + userService.insertUser(user); + successNum++; + successMsg.append("
").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功"); + } else if (isUpdateSupport) { + Long userId = sysUser.getUserId(); + Sys2UserBo user = BeanUtil.toBean(userVo, Sys2UserBo.class); + user.setUserId(userId); + ValidatorUtils.validate(user); + 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(sysUser.getUserName()).append(" 已存在"); + } + } catch (Exception e) { + failureNum++; + String msg = "
" + failureNum + "、账号 " + userVo.getUserName() + " 导入失败:"; + failureMsg.append(msg).append(e.getMessage()); + log.error(msg, e); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + + } + + @Override + public ExcelResult getExcelResult() { + return new ExcelResult<>() { + + @Override + public String getAnalysis() { + if (failureNum > 0) { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } else { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + + @Override + public List getList() { + return null; + } + + @Override + public List getErrorList() { + return null; + } + }; + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ApplicationMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ApplicationMapper.java new file mode 100644 index 000000000..bb22041d6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ApplicationMapper.java @@ -0,0 +1,17 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.system.saas.domain.Sys2Application; +import org.dromara.system.saas.domain.vo.Sys2ApplicationVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 应用Mapper接口 + * + * @author Lion Li + * @date 2024-09-22 + */ +@Mapper +public interface Sys2ApplicationMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ClientMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ClientMapper.java new file mode 100644 index 000000000..ade939bb1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ClientMapper.java @@ -0,0 +1,17 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.system.saas.domain.Sys2Client; +import org.dromara.system.saas.domain.vo.Sys2ClientVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 授权管理Mapper接口 + * + * @author Michelle.Chung + * @date 2023-05-15 + */ +@Mapper +public interface Sys2ClientMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ConfigMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ConfigMapper.java new file mode 100644 index 000000000..9d473880c --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2ConfigMapper.java @@ -0,0 +1,16 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2Config; +import org.dromara.system.saas.domain.vo.Sys2ConfigVo; + +/** + * 参数配置 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2ConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DeptMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DeptMapper.java new file mode 100644 index 000000000..27d2b5550 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DeptMapper.java @@ -0,0 +1,48 @@ +package org.dromara.system.saas.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Mapper; +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.saas.domain.Sys2Dept; +import org.dromara.system.saas.domain.vo.Sys2DeptVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 部门管理 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2DeptMapper extends BaseMapperPlus { + + /** + * 查询部门管理数据 + * + * @param queryWrapper 查询条件 + * @return 部门信息集合 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + List selectDeptList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id") + }) + long countDeptById(Long deptId); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @param deptCheckStrictly 部门树选择项是否关联显示 + * @return 选中部门列表 + */ + List selectDeptListByRoleId(@Param("roleId") Long roleId, @Param("deptCheckStrictly") boolean deptCheckStrictly); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DictDataMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DictDataMapper.java new file mode 100644 index 000000000..15fb19cc4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DictDataMapper.java @@ -0,0 +1,25 @@ +package org.dromara.system.saas.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2DictData; +import org.dromara.system.saas.domain.vo.Sys2DictDataVo; + +import java.util.List; + +/** + * 字典表 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2DictDataMapper extends BaseMapperPlus { + + default List selectDictDataByType(String dictType) { + return selectVoList( + new LambdaQueryWrapper() + .eq(Sys2DictData::getDictType, dictType) + .orderByAsc(Sys2DictData::getDictSort)); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DictTypeMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DictTypeMapper.java new file mode 100644 index 000000000..9f9c6f3bd --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2DictTypeMapper.java @@ -0,0 +1,16 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.system.saas.domain.Sys2DictType; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.vo.Sys2DictTypeVo; + +/** + * 字典表 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2DictTypeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2LogininforMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2LogininforMapper.java new file mode 100644 index 000000000..4305f40c1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2LogininforMapper.java @@ -0,0 +1,16 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2Logininfor; +import org.dromara.system.saas.domain.vo.Sys2LogininforVo; + +/** + * 系统访问日志情况信息 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2LogininforMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2NoticeMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2NoticeMapper.java new file mode 100644 index 000000000..baf540158 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2NoticeMapper.java @@ -0,0 +1,16 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2Notice; +import org.dromara.system.saas.domain.vo.Sys2NoticeVo; + +/** + * 通知公告表 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2NoticeMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OperLogMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OperLogMapper.java new file mode 100644 index 000000000..60011fbe6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OperLogMapper.java @@ -0,0 +1,16 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2OperLog; +import org.dromara.system.saas.domain.vo.Sys2OperLogVo; + +/** + * 操作日志 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2OperLogMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OssConfigMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OssConfigMapper.java new file mode 100644 index 000000000..7541c0fcb --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OssConfigMapper.java @@ -0,0 +1,18 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2OssConfig; +import org.dromara.system.saas.domain.vo.Sys2OssConfigVo; + +/** + * 对象存储配置Mapper接口 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Mapper +public interface Sys2OssConfigMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OssMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OssMapper.java new file mode 100644 index 000000000..db809ab7d --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2OssMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2Oss; +import org.dromara.system.saas.domain.vo.Sys2OssVo; + +/** + * 文件上传 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2OssMapper extends BaseMapperPlus { +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2PostMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2PostMapper.java new file mode 100644 index 000000000..db92fb6ca --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2PostMapper.java @@ -0,0 +1,38 @@ +package org.dromara.system.saas.mapper; + +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.Mapper; +import org.apache.ibatis.annotations.Param; +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.saas.domain.Sys2Post; +import org.dromara.system.saas.domain.vo.Sys2PostVo; + +import java.util.List; + +/** + * 岗位信息 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2PostMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "create_by") + }) + Page selectPagePostList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 查询用户所属岗位组 + * + * @param userId 用户ID + * @return 结果 + */ + List selectPostsByUserId(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleDeptMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleDeptMapper.java new file mode 100644 index 000000000..2eaaeb345 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleDeptMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2RoleDept; + +/** + * 角色与部门关联表 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2RoleDeptMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleMapper.java new file mode 100644 index 000000000..82e961f2b --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleMapper.java @@ -0,0 +1,64 @@ +package org.dromara.system.saas.mapper; + +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.Mapper; +import org.apache.ibatis.annotations.Param; +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.saas.domain.Sys2Role; +import org.dromara.system.saas.domain.vo.Sys2RoleVo; + +import java.util.List; + +/** + * 角色表 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2RoleMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + Page selectPageRoleList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询角色数据 + * + * @param queryWrapper 查询条件 + * @return 角色数据集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + List selectRoleList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "r.create_by") + }) + Sys2RoleVo selectRoleById(Long roleId); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolePermissionByUserId(Long userId); + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesByUserId(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleMenuMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleMenuMapper.java new file mode 100644 index 000000000..7141d50a8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2RoleMenuMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2RoleMenu; + +/** + * 角色与菜单关联表 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2RoleMenuMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2SocialMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2SocialMapper.java new file mode 100644 index 000000000..9713dbee1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2SocialMapper.java @@ -0,0 +1,16 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2Social; +import org.dromara.system.saas.domain.vo.Sys2SocialVo; + +/** + * 社会化关系Mapper接口 + * + * @author thiszhc + */ +@Mapper +public interface Sys2SocialMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantApplicationMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantApplicationMapper.java new file mode 100644 index 000000000..5a4954c15 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantApplicationMapper.java @@ -0,0 +1,17 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.system.saas.domain.Sys2TenantApplication; +import org.dromara.system.saas.domain.vo.Sys2TenantApplicationVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 租户和应用关联Mapper接口 + * + * @author Lion Li + * @date 2024-09-22 + */ +@Mapper +public interface Sys2TenantApplicationMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantMapper.java new file mode 100644 index 000000000..7c665b91e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantMapper.java @@ -0,0 +1,16 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.system.saas.domain.Sys2Tenant; +import org.dromara.system.saas.domain.vo.Sys2TenantVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 租户Mapper接口 + * + * @author Michelle.Chung + */ +@Mapper +public interface Sys2TenantMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantPackageMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantPackageMapper.java new file mode 100644 index 000000000..ca45d1076 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2TenantPackageMapper.java @@ -0,0 +1,16 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2TenantPackage; +import org.dromara.system.saas.domain.vo.Sys2TenantPackageVo; + +/** + * 租户套餐Mapper接口 + * + * @author Michelle.Chung + */ +@Mapper +public interface Sys2TenantPackageMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserMapper.java new file mode 100644 index 000000000..137cea34e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserMapper.java @@ -0,0 +1,93 @@ +package org.dromara.system.saas.mapper; + +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.Mapper; +import org.apache.ibatis.annotations.Param; +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.saas.domain.Sys2User; +import org.dromara.system.saas.domain.vo.Sys2UserExportVo; +import org.dromara.system.saas.domain.vo.Sys2UserVo; + +import java.util.List; + +/** + * 用户表 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2UserMapper extends BaseMapperPlus { + + @DataPermission({ + @DataColumn(key = "deptName", value = "u.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectPageUserList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + List selectUserList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询用户列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + List selectUserExportList(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询已配用户角色列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectAllocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param queryWrapper 查询条件 + * @return 用户信息集合信息 + */ + @DataPermission({ + @DataColumn(key = "deptName", value = "d.dept_id"), + @DataColumn(key = "userName", value = "u.user_id") + }) + Page selectUnallocatedList(@Param("page") Page page, @Param(Constants.WRAPPER) Wrapper queryWrapper); + + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + long countUserById(Long userId); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int update(@Param(Constants.ENTITY) Sys2User user, @Param(Constants.WRAPPER) Wrapper updateWrapper); + + @Override + @DataPermission({ + @DataColumn(key = "deptName", value = "dept_id"), + @DataColumn(key = "userName", value = "user_id") + }) + int updateById(@Param(Constants.ENTITY) Sys2User user); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserPostMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserPostMapper.java new file mode 100644 index 000000000..340a850d1 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserPostMapper.java @@ -0,0 +1,15 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2UserPost; + +/** + * 用户与岗位关联表 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2UserPostMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserRoleMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserRoleMapper.java new file mode 100644 index 000000000..257367276 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/Sys2UserRoleMapper.java @@ -0,0 +1,19 @@ +package org.dromara.system.saas.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.Sys2UserRole; + +import java.util.List; + +/** + * 用户与角色关联表 数据层 + * + * @author Lion Li + */ +@Mapper +public interface Sys2UserRoleMapper extends BaseMapperPlus { + + List selectUserIdsByRoleId(Long roleId); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/SysSaasMenuMapper.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/SysSaasMenuMapper.java new file mode 100644 index 000000000..93651f5cd --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/mapper/SysSaasMenuMapper.java @@ -0,0 +1,78 @@ +package org.dromara.system.saas.mapper; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.system.saas.domain.SysSaasMenu; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.saas.domain.vo.SysSaasMenuVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 菜单表 数据层 + * + * @author Lion Li + */ +@Mapper +public interface SysSaasMenuMapper extends BaseMapperPlus { + + /** + * 根据用户查询系统菜单列表 + * + * @param queryWrapper 查询条件 + * @return 菜单列表 + */ + List selectMenuListByUserId(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + List selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + List selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单 + * + * @return 菜单列表 + */ + default List selectMenuTreeAll() { + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .in(SysSaasMenu::getMenuType, UserConstants.TYPE_DIR, UserConstants.TYPE_MENU) + .eq(SysSaasMenu::getStatus, UserConstants.MENU_NORMAL) + .orderByAsc(SysSaasMenu::getParentId) + .orderByAsc(SysSaasMenu::getOrderNum); + return this.selectList(lqw); + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @param menuCheckStrictly 菜单树选择项是否关联显示 + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/runner/System2ApplicationRunner.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/runner/System2ApplicationRunner.java new file mode 100644 index 000000000..94f5e373e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/runner/System2ApplicationRunner.java @@ -0,0 +1,28 @@ +package org.dromara.system.saas.runner; + +import org.dromara.system.saas.service.ISys2OssConfigService; +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 System2ApplicationRunner implements ApplicationRunner { + + private final ISys2OssConfigService ossConfigService; + + @Override + public void run(ApplicationArguments args) throws Exception { + ossConfigService.init(); + log.info("初始化OSS配置成功"); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ApplicationService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ApplicationService.java new file mode 100644 index 000000000..63edff565 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ApplicationService.java @@ -0,0 +1,68 @@ +package org.dromara.system.saas.service; + +import org.dromara.system.saas.domain.vo.Sys2ApplicationVo; +import org.dromara.system.saas.domain.bo.Sys2ApplicationBo; +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 Lion Li + * @date 2024-09-22 + */ +public interface ISys2ApplicationService { + + /** + * 查询应用 + * + * @param applicationId 主键 + * @return 应用 + */ + Sys2ApplicationVo queryById(Long applicationId); + + /** + * 分页查询应用列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 应用分页列表 + */ + TableDataInfo queryPageList(Sys2ApplicationBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的应用列表 + * + * @param bo 查询条件 + * @return 应用列表 + */ + List queryList(Sys2ApplicationBo bo); + + /** + * 新增应用 + * + * @param bo 应用 + * @return 是否新增成功 + */ + Boolean insertByBo(Sys2ApplicationBo bo); + + /** + * 修改应用 + * + * @param bo 应用 + * @return 是否修改成功 + */ + Boolean updateByBo(Sys2ApplicationBo bo); + + /** + * 校验并批量删除应用信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ClientService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ClientService.java new file mode 100644 index 000000000..dd59b3bce --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ClientService.java @@ -0,0 +1,59 @@ +package org.dromara.system.saas.service; + +import org.dromara.system.saas.domain.bo.Sys2ClientBo; +import org.dromara.system.saas.domain.vo.Sys2ClientVo; +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 + * @date 2023-06-18 + */ +public interface ISys2ClientService { + + /** + * 查询客户端管理 + */ + Sys2ClientVo queryById(Long id); + + /** + * 查询客户端信息基于客户端id + */ + Sys2ClientVo queryByClientId(String clientId); + + /** + * 查询客户端管理列表 + */ + TableDataInfo queryPageList(Sys2ClientBo bo, PageQuery pageQuery); + + /** + * 查询客户端管理列表 + */ + List queryList(Sys2ClientBo bo); + + /** + * 新增客户端管理 + */ + Boolean insertByBo(Sys2ClientBo bo); + + /** + * 修改客户端管理 + */ + Boolean updateByBo(Sys2ClientBo bo); + + /** + * 修改状态 + */ + int updateUserStatus(String clientId, String status); + + /** + * 校验并批量删除客户端管理信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ConfigService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ConfigService.java new file mode 100644 index 000000000..d4a8457ae --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2ConfigService.java @@ -0,0 +1,87 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2ConfigBo; +import org.dromara.system.saas.domain.vo.Sys2ConfigVo; + +import java.util.List; + +/** + * 参数配置 服务层 + * + * @author Lion Li + */ +public interface ISys2ConfigService { + + + TableDataInfo selectPageConfigList(Sys2ConfigBo config, PageQuery pageQuery); + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + Sys2ConfigVo selectConfigById(Long configId); + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数键名 + * @return 参数键值 + */ + String selectConfigByKey(String configKey); + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + boolean selectRegisterEnabled(String tenantId); + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + List selectConfigList(Sys2ConfigBo config); + + /** + * 新增参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + String insertConfig(Sys2ConfigBo bo); + + /** + * 修改参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + String updateConfig(Sys2ConfigBo bo); + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + void deleteConfigByIds(Long[] configIds); + + /** + * 重置参数缓存数据 + */ + void resetConfigCache(); + + /** + * 校验参数键名是否唯一 + * + * @param config 参数信息 + * @return 结果 + */ + boolean checkConfigKeyUnique(Sys2ConfigBo config); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DataScopeService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DataScopeService.java new file mode 100644 index 000000000..f99581948 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DataScopeService.java @@ -0,0 +1,26 @@ +package org.dromara.system.saas.service; + +/** + * 通用 数据权限 服务 + * + * @author Lion Li + */ +public interface ISys2DataScopeService { + + /** + * 获取角色自定义权限 + * + * @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-saas/src/main/java/org/dromara/system/saas/service/ISys2DeptService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DeptService.java new file mode 100644 index 000000000..9b58ccd93 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DeptService.java @@ -0,0 +1,125 @@ +package org.dromara.system.saas.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.system.saas.domain.bo.Sys2DeptBo; +import org.dromara.system.saas.domain.vo.Sys2DeptVo; + +import java.util.List; + +/** + * 部门管理 服务层 + * + * @author Lion Li + */ +public interface ISys2DeptService { + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + List selectDeptList(Sys2DeptBo dept); + + /** + * 查询部门树结构信息 + * + * @param dept 部门信息 + * @return 部门树信息集合 + */ + List> selectDeptTreeList(Sys2DeptBo dept); + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + List> buildDeptTreeSelect(List depts); + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + List selectDeptListByRoleId(Long roleId); + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + Sys2DeptVo selectDeptById(Long deptId); + + /** + * 通过部门ID串查询部门 + * + * @param deptIds 部门id串 + * @return 部门列表信息 + */ + List selectDeptByIds(List deptIds); + + /** + * 根据ID查询所有子部门数(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + long selectNormalChildrenDeptById(Long deptId); + + /** + * 是否存在部门子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + boolean hasChildByDeptId(Long deptId); + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkDeptExistUser(Long deptId); + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + boolean checkDeptNameUnique(Sys2DeptBo dept); + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + void checkDeptDataScope(Long deptId); + + /** + * 新增保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + int insertDept(Sys2DeptBo bo); + + /** + * 修改保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + int updateDept(Sys2DeptBo bo); + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + int deleteDeptById(Long deptId); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DictDataService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DictDataService.java new file mode 100644 index 000000000..d0bfaf84d --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DictDataService.java @@ -0,0 +1,76 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2DictDataBo; +import org.dromara.system.saas.domain.vo.Sys2DictDataVo; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author Lion Li + */ +public interface ISys2DictDataService { + + + TableDataInfo selectPageDictDataList(Sys2DictDataBo dictData, PageQuery pageQuery); + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + List selectDictDataList(Sys2DictDataBo dictData); + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + String selectDictLabel(String dictType, String dictValue); + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + Sys2DictDataVo selectDictDataById(Long dictCode); + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + void deleteDictDataByIds(Long[] dictCodes); + + /** + * 新增保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + List insertDictData(Sys2DictDataBo bo); + + /** + * 修改保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + List updateDictData(Sys2DictDataBo bo); + + /** + * 校验字典键值是否唯一 + * + * @param dict 字典数据 + * @return 结果 + */ + boolean checkDictDataUnique(Sys2DictDataBo dict); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DictTypeService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DictTypeService.java new file mode 100644 index 000000000..465e6a2a8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2DictTypeService.java @@ -0,0 +1,95 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2DictTypeBo; +import org.dromara.system.saas.domain.vo.Sys2DictDataVo; +import org.dromara.system.saas.domain.vo.Sys2DictTypeVo; + +import java.util.List; + +/** + * 字典 业务层 + * + * @author Lion Li + */ +public interface ISys2DictTypeService { + + + TableDataInfo selectPageDictTypeList(Sys2DictTypeBo dictType, PageQuery pageQuery); + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + List selectDictTypeList(Sys2DictTypeBo dictType); + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + List selectDictTypeAll(); + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + List selectDictDataByType(String dictType); + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + Sys2DictTypeVo selectDictTypeById(Long dictId); + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + Sys2DictTypeVo selectDictTypeByType(String dictType); + + /** + * 批量删除字典信息 + * + * @param dictIds 需要删除的字典ID + */ + void deleteDictTypeByIds(Long[] dictIds); + + /** + * 重置字典缓存数据 + */ + void resetDictCache(); + + /** + * 新增保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + List insertDictType(Sys2DictTypeBo bo); + + /** + * 修改保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + List updateDictType(Sys2DictTypeBo bo); + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + boolean checkDictTypeUnique(Sys2DictTypeBo dictType); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2LogininforService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2LogininforService.java new file mode 100644 index 000000000..6ad498cba --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2LogininforService.java @@ -0,0 +1,47 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2LogininforBo; +import org.dromara.system.saas.domain.vo.Sys2LogininforVo; + +import java.util.List; + +/** + * 系统访问日志情况信息 服务层 + * + * @author Lion Li + */ +public interface ISys2LogininforService { + + + TableDataInfo selectPageLogininforList(Sys2LogininforBo logininfor, PageQuery pageQuery); + + /** + * 新增系统登录日志 + * + * @param bo 访问日志对象 + */ + void insertLogininfor(Sys2LogininforBo bo); + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + List selectLogininforList(Sys2LogininforBo logininfor); + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + int deleteLogininforByIds(Long[] infoIds); + + /** + * 清空系统登录日志 + */ + void cleanLogininfor(); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2NoticeService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2NoticeService.java new file mode 100644 index 000000000..057a255f9 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2NoticeService.java @@ -0,0 +1,67 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2NoticeBo; +import org.dromara.system.saas.domain.vo.Sys2NoticeVo; + +import java.util.List; + +/** + * 公告 服务层 + * + * @author Lion Li + */ +public interface ISys2NoticeService { + + + TableDataInfo selectPageNoticeList(Sys2NoticeBo notice, PageQuery pageQuery); + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + Sys2NoticeVo selectNoticeById(Long noticeId); + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + List selectNoticeList(Sys2NoticeBo notice); + + /** + * 新增公告 + * + * @param bo 公告信息 + * @return 结果 + */ + int insertNotice(Sys2NoticeBo bo); + + /** + * 修改公告 + * + * @param bo 公告信息 + * @return 结果 + */ + int updateNotice(Sys2NoticeBo bo); + + /** + * 删除公告信息 + * + * @param noticeId 公告ID + * @return 结果 + */ + int deleteNoticeById(Long noticeId); + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + int deleteNoticeByIds(Long[] noticeIds); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OperLogService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OperLogService.java new file mode 100644 index 000000000..0081ad23e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OperLogService.java @@ -0,0 +1,54 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2OperLogBo; +import org.dromara.system.saas.domain.vo.Sys2OperLogVo; + +import java.util.List; + +/** + * 操作日志 服务层 + * + * @author Lion Li + */ +public interface ISys2OperLogService { + + TableDataInfo selectPageOperLogList(Sys2OperLogBo operLog, PageQuery pageQuery); + + /** + * 新增操作日志 + * + * @param bo 操作日志对象 + */ + void insertOperlog(Sys2OperLogBo bo); + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + List selectOperLogList(Sys2OperLogBo operLog); + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + int deleteOperLogByIds(Long[] operIds); + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + Sys2OperLogVo selectOperLogById(Long operId); + + /** + * 清空操作日志 + */ + void cleanOperLog(); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OssConfigService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OssConfigService.java new file mode 100644 index 000000000..961d498d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OssConfigService.java @@ -0,0 +1,64 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2OssConfigBo; +import org.dromara.system.saas.domain.vo.Sys2OssConfigVo; + +import java.util.Collection; + +/** + * 对象存储配置Service接口 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +public interface ISys2OssConfigService { + + /** + * 初始化OSS配置 + */ + void init(); + + /** + * 查询单个 + */ + Sys2OssConfigVo queryById(Long ossConfigId); + + /** + * 查询列表 + */ + TableDataInfo queryPageList(Sys2OssConfigBo bo, PageQuery pageQuery); + + /** + * 根据新增业务对象插入对象存储配置 + * + * @param bo 对象存储配置新增业务对象 + * @return 结果 + */ + Boolean insertByBo(Sys2OssConfigBo bo); + + /** + * 根据编辑业务对象修改对象存储配置 + * + * @param bo 对象存储配置编辑业务对象 + * @return 结果 + */ + Boolean updateByBo(Sys2OssConfigBo bo); + + /** + * 校验并删除数据 + * + * @param ids 主键集合 + * @param isValid 是否校验,true-删除前校验,false-不校验 + * @return 结果 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 启用停用状态 + */ + int updateOssConfigStatus(Sys2OssConfigBo bo); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OssService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OssService.java new file mode 100644 index 000000000..b36fdb5d7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2OssService.java @@ -0,0 +1,80 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2OssBo; +import jakarta.servlet.http.HttpServletResponse; +import org.dromara.system.saas.domain.vo.Sys2OssVo; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; +import java.util.List; + +/** + * 文件上传 服务层 + * + * @author Lion Li + */ +public interface ISys2OssService { + + /** + * 查询OSS对象存储列表 + * + * @param sysOss OSS对象存储分页查询对象 + * @param pageQuery 分页查询实体类 + * @return 结果 + */ + TableDataInfo queryPageList(Sys2OssBo sysOss, PageQuery pageQuery); + + /** + * 根据一组 ossIds 获取对应的 Sys2OssVo 列表 + * + * @param ossIds 一组文件在数据库中的唯一标识集合 + * @return 包含 Sys2OssVo 对象的列表 + */ + List listByIds(Collection ossIds); + + /** + * 根据 ossId 从缓存或数据库中获取 Sys2OssVo 对象 + * + * @param ossId 文件在数据库中的唯一标识 + * @return Sys2OssVo 对象,包含文件信息 + */ + Sys2OssVo getById(Long ossId); + + /** + * 上传 MultipartFile 到对象存储服务,并保存文件信息到数据库 + * + * @param file 要上传的 MultipartFile 对象 + * @return 上传成功后的 Sys2OssVo 对象,包含文件信息 + */ + Sys2OssVo upload(MultipartFile file); + + /** + * 上传文件到对象存储服务,并保存文件信息到数据库 + * + * @param file 要上传的文件对象 + * @return 上传成功后的 Sys2OssVo 对象,包含文件信息 + */ + Sys2OssVo upload(File file); + + /** + * 文件下载方法,支持一次性下载完整文件 + * + * @param ossId OSS对象ID + * @param response HttpServletResponse对象,用于设置响应头和向客户端发送文件内容 + */ + void download(Long ossId, HttpServletResponse response) throws IOException; + + /** + * 删除OSS对象存储 + * + * @param ids OSS对象ID串 + * @param isValid 判断是否需要校验 + * @return 结果 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2PermissionService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2PermissionService.java new file mode 100644 index 000000000..dbedab0d4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2PermissionService.java @@ -0,0 +1,28 @@ +package org.dromara.system.saas.service; + +import java.util.Set; + +/** + * 用户权限处理 + * + * @author Lion Li + */ +public interface ISys2PermissionService { + + /** + * 获取角色数据权限 + * + * @param userId 用户id + * @return 角色权限信息 + */ + Set getRolePermission(Long userId); + + /** + * 获取菜单数据权限 + * + * @param userId 用户id + * @return 菜单权限信息 + */ + Set getMenuPermission(Long userId); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2PostService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2PostService.java new file mode 100644 index 000000000..f9bd90867 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2PostService.java @@ -0,0 +1,122 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2PostBo; +import org.dromara.system.saas.domain.vo.Sys2PostVo; + +import java.util.List; + +/** + * 岗位信息 服务层 + * + * @author Lion Li + */ +public interface ISys2PostService { + + + TableDataInfo selectPagePostList(Sys2PostBo post, PageQuery pageQuery); + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位列表 + */ + List selectPostList(Sys2PostBo post); + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + List selectPostAll(); + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + Sys2PostVo selectPostById(Long postId); + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + List selectPostListByUserId(Long userId); + + /** + * 通过岗位ID串查询岗位 + * + * @param postIds 岗位id串 + * @return 岗位列表信息 + */ + List selectPostByIds(List postIds); + + /** + * 校验岗位名称 + * + * @param post 岗位信息 + * @return 结果 + */ + boolean checkPostNameUnique(Sys2PostBo post); + + /** + * 校验岗位编码 + * + * @param post 岗位信息 + * @return 结果 + */ + boolean checkPostCodeUnique(Sys2PostBo post); + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + long countUserPostById(Long postId); + + /** + * 通过部门ID查询岗位使用数量 + * + * @param deptId 部门id + * @return 结果 + */ + long countPostByDeptId(Long deptId); + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + int deletePostById(Long postId); + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + int deletePostByIds(Long[] postIds); + + /** + * 新增保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + int insertPost(Sys2PostBo bo); + + /** + * 修改保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + int updatePost(Sys2PostBo bo); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2RoleService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2RoleService.java new file mode 100644 index 000000000..2a4c4f0d2 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2RoleService.java @@ -0,0 +1,200 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.Sys2UserRole; +import org.dromara.system.saas.domain.bo.Sys2RoleBo; +import org.dromara.system.saas.domain.vo.Sys2RoleVo; + +import java.util.List; +import java.util.Set; + +/** + * 角色业务层 + * + * @author Lion Li + */ +public interface ISys2RoleService { + + + TableDataInfo selectPageRoleList(Sys2RoleBo role, PageQuery pageQuery); + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + List selectRoleList(Sys2RoleBo role); + + /** + * 根据用户ID查询角色列表 + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesByUserId(Long userId); + + /** + * 根据用户ID查询角色列表(包含被授权状态) + * + * @param userId 用户ID + * @return 角色列表 + */ + List selectRolesAuthByUserId(Long userId); + + /** + * 根据用户ID查询角色权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectRolePermissionByUserId(Long userId); + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + List selectRoleAll(); + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + List selectRoleListByUserId(Long userId); + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + Sys2RoleVo selectRoleById(Long roleId); + + /** + * 通过角色ID串查询角色 + * + * @param roleIds 角色ID串 + * @return 角色列表信息 + */ + List selectRoleByIds(List roleIds); + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + boolean checkRoleNameUnique(Sys2RoleBo role); + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + boolean checkRoleKeyUnique(Sys2RoleBo role); + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + void checkRoleAllowed(Sys2RoleBo role); + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + void checkRoleDataScope(Long roleId); + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + long countUserRoleByRoleId(Long roleId); + + /** + * 新增保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int insertRole(Sys2RoleBo bo); + + /** + * 修改保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int updateRole(Sys2RoleBo bo); + + /** + * 修改角色状态 + * + * @param roleId 角色ID + * @param status 角色状态 + * @return 结果 + */ + int updateRoleStatus(Long roleId, String status); + + /** + * 修改数据权限信息 + * + * @param bo 角色信息 + * @return 结果 + */ + int authDataScope(Sys2RoleBo bo); + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + int deleteRoleById(Long roleId); + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + int deleteRoleByIds(Long[] roleIds); + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + int deleteAuthUser(Sys2UserRole userRole); + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + int deleteAuthUsers(Long roleId, Long[] userIds); + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要删除的用户数据ID + * @return 结果 + */ + int insertAuthUsers(Long roleId, Long[] userIds); + + void cleanOnlineUserByRole(Long roleId); + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2SocialService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2SocialService.java new file mode 100644 index 000000000..acf5bba8a --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2SocialService.java @@ -0,0 +1,53 @@ +package org.dromara.system.saas.service; + +import org.dromara.system.saas.domain.bo.Sys2SocialBo; +import org.dromara.system.saas.domain.vo.Sys2SocialVo; + +import java.util.List; + +/** + * 社会化关系Service接口 + * + * @author thiszhc + */ +public interface ISys2SocialService { + + + /** + * 查询社会化关系 + */ + Sys2SocialVo queryById(String id); + + /** + * 查询社会化关系列表 + */ + List queryList(Sys2SocialBo bo); + + /** + * 查询社会化关系列表 + */ + List queryListByUserId(Long userId); + + /** + * 新增授权关系 + */ + Boolean insertByBo(Sys2SocialBo bo); + + /** + * 更新社会化关系 + */ + Boolean updateByBo(Sys2SocialBo bo); + + /** + * 删除社会化关系信息 + */ + Boolean deleteWithValidById(Long id); + + + /** + * 根据 authId 查询 + */ + List selectByAuthId(String authId); + + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantApplicationService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantApplicationService.java new file mode 100644 index 000000000..c5d7487e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantApplicationService.java @@ -0,0 +1,68 @@ +package org.dromara.system.saas.service; + +import org.dromara.system.saas.domain.vo.Sys2TenantApplicationVo; +import org.dromara.system.saas.domain.bo.Sys2TenantApplicationBo; +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 Lion Li + * @date 2024-09-22 + */ +public interface ISys2TenantApplicationService { + + /** + * 查询租户和应用关联 + * + * @param tenantId 主键 + * @return 租户和应用关联 + */ + Sys2TenantApplicationVo queryById(Long tenantId); + + /** + * 分页查询租户和应用关联列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 租户和应用关联分页列表 + */ + TableDataInfo queryPageList(Sys2TenantApplicationBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的租户和应用关联列表 + * + * @param bo 查询条件 + * @return 租户和应用关联列表 + */ + List queryList(Sys2TenantApplicationBo bo); + + /** + * 新增租户和应用关联 + * + * @param bo 租户和应用关联 + * @return 是否新增成功 + */ + Boolean insertByBo(Sys2TenantApplicationBo bo); + + /** + * 修改租户和应用关联 + * + * @param bo 租户和应用关联 + * @return 是否修改成功 + */ + Boolean updateByBo(Sys2TenantApplicationBo bo); + + /** + * 校验并批量删除租户和应用关联信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantPackageService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantPackageService.java new file mode 100644 index 000000000..5e607b6e0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantPackageService.java @@ -0,0 +1,62 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2TenantPackageBo; +import org.dromara.system.saas.domain.vo.Sys2TenantPackageVo; + +import java.util.Collection; +import java.util.List; + +/** + * 租户套餐Service接口 + * + * @author Michelle.Chung + */ +public interface ISys2TenantPackageService { + + /** + * 查询租户套餐 + */ + Sys2TenantPackageVo queryById(Long packageId); + + /** + * 查询租户套餐列表 + */ + TableDataInfo queryPageList(Sys2TenantPackageBo bo, PageQuery pageQuery); + + /** + * 查询租户套餐已启用列表 + */ + List selectList(); + + /** + * 查询租户套餐列表 + */ + List queryList(Sys2TenantPackageBo bo); + + /** + * 新增租户套餐 + */ + Boolean insertByBo(Sys2TenantPackageBo bo); + + /** + * 修改租户套餐 + */ + Boolean updateByBo(Sys2TenantPackageBo bo); + + /** + * 校验套餐名称是否唯一 + */ + boolean checkPackageNameUnique(Sys2TenantPackageBo bo); + + /** + * 修改套餐状态 + */ + int updatePackageStatus(Sys2TenantPackageBo bo); + + /** + * 校验并批量删除租户套餐信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantService.java new file mode 100644 index 000000000..a2b4f45bf --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2TenantService.java @@ -0,0 +1,82 @@ +package org.dromara.system.saas.service; + +import org.dromara.system.saas.domain.vo.Sys2TenantVo; +import org.dromara.system.saas.domain.bo.Sys2TenantBo; +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 ISys2TenantService { + + /** + * 查询租户 + */ + Sys2TenantVo queryById(Long id); + + /** + * 基于租户ID查询租户 + */ + Sys2TenantVo queryByTenantId(String tenantId); + + /** + * 查询租户列表 + */ + TableDataInfo queryPageList(Sys2TenantBo bo, PageQuery pageQuery); + + /** + * 查询租户列表 + */ + List queryList(Sys2TenantBo bo); + + /** + * 新增租户 + */ + Boolean insertByBo(Sys2TenantBo bo); + + /** + * 修改租户 + */ + Boolean updateByBo(Sys2TenantBo bo); + + /** + * 修改租户状态 + */ + int updateTenantStatus(Sys2TenantBo bo); + + /** + * 校验租户是否允许操作 + */ + void checkTenantAllowed(String tenantId); + + /** + * 校验并批量删除租户信息 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 校验企业名称是否唯一 + */ + boolean checkCompanyNameUnique(Sys2TenantBo bo); + + /** + * 校验账号余额 + */ + boolean checkAccountBalance(String tenantId); + + /** + * 校验有效期 + */ + boolean checkExpireTime(String tenantId); + + /** + * 同步租户套餐 + */ + Boolean syncTenantPackage(String tenantId, Long packageId); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2UserService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2UserService.java new file mode 100644 index 000000000..8936232c4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISys2UserService.java @@ -0,0 +1,222 @@ +package org.dromara.system.saas.service; + +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.saas.domain.bo.Sys2UserBo; +import org.dromara.system.saas.domain.vo.Sys2UserExportVo; +import org.dromara.system.saas.domain.vo.Sys2UserVo; + +import java.util.List; + +/** + * 用户 业务层 + * + * @author Lion Li + */ +public interface ISys2UserService { + + + TableDataInfo selectPageUserList(Sys2UserBo user, PageQuery pageQuery); + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + List selectUserExportList(Sys2UserBo user); + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + TableDataInfo selectAllocatedList(Sys2UserBo user, PageQuery pageQuery); + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + TableDataInfo selectUnallocatedList(Sys2UserBo user, PageQuery pageQuery); + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + Sys2UserVo selectUserByUserName(String userName); + + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + Sys2UserVo selectUserByPhonenumber(String phonenumber); + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + Sys2UserVo selectUserById(Long userId); + + /** + * 通过用户ID串查询用户 + * + * @param userIds 用户ID串 + * @param deptId 部门id + * @return 用户列表信息 + */ + List selectUserByIds(List userIds, Long deptId); + + /** + * 根据用户ID查询用户所属角色组 + * + * @param userId 用户ID + * @return 结果 + */ + String selectUserRoleGroup(Long userId); + + /** + * 根据用户ID查询用户所属岗位组 + * + * @param userId 用户ID + * @return 结果 + */ + String selectUserPostGroup(Long userId); + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkUserNameUnique(Sys2UserBo user); + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkPhoneUnique(Sys2UserBo user); + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + boolean checkEmailUnique(Sys2UserBo user); + + /** + * 校验用户是否允许操作 + * + * @param userId 用户ID + */ + void checkUserAllowed(Long userId); + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + void checkUserDataScope(Long userId); + + /** + * 新增用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int insertUser(Sys2UserBo user); + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + boolean registerUser(Sys2UserBo user, String tenantId); + + /** + * 修改用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUser(Sys2UserBo user); + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + void insertUserAuth(Long userId, Long[] roleIds); + + /** + * 修改用户状态 + * + * @param userId 用户ID + * @param status 帐号状态 + * @return 结果 + */ + int updateUserStatus(Long userId, String status); + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + int updateUserProfile(Sys2UserBo user); + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + boolean updateUserAvatar(Long userId, Long avatar); + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + int resetUserPwd(Long userId, String password); + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + int deleteUserById(Long userId); + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + int deleteUserByIds(Long[] userIds); + + /** + * 通过部门id查询当前部门所有用户 + * + * @param deptId 部门id + * @return 结果 + */ + List selectUserListByDept(Long deptId); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISysSaasMenuService.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISysSaasMenuService.java new file mode 100644 index 000000000..1d41ea3df --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/ISysSaasMenuService.java @@ -0,0 +1,147 @@ +package org.dromara.system.saas.service; + +import cn.hutool.core.lang.tree.Tree; +import org.dromara.system.saas.domain.SysSaasMenu; +import org.dromara.system.saas.domain.bo.SysSaasMenuBo; +import org.dromara.system.saas.domain.vo.TwoRouterVo; +import org.dromara.system.saas.domain.vo.SysSaasMenuVo; + +import java.util.List; +import java.util.Set; + +/** + * 菜单 业务层 + * + * @author Lion Li + */ +public interface ISysSaasMenuService { + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuList(Long userId); + + /** + * 根据用户查询系统菜单列表 + * + * @param menu 菜单信息 + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuList(SysSaasMenuBo menu, Long userId); + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + Set selectMenuPermsByUserId(Long userId); + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + Set selectMenuPermsByRoleId(Long roleId); + + /** + * 根据用户ID查询菜单树信息 + * + * @param userId 用户ID + * @return 菜单列表 + */ + List selectMenuTreeByUserId(Long userId); + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + List selectMenuListByRoleId(Long roleId); + + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + List selectMenuListByPackageId(Long packageId); + + /** + * 构建前端路由所需要的菜单 + * + * @param menus 菜单列表 + * @return 路由列表 + */ + List buildMenus(List menus); + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + List> buildMenuTreeSelect(List menus); + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + SysSaasMenuVo selectMenuById(Long menuId); + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean hasChildByMenuId(Long menuId); + + /** + * 查询菜单是否存在角色 + * + * @param menuId 菜单ID + * @return 结果 true 存在 false 不存在 + */ + boolean checkMenuExistRole(Long menuId); + + /** + * 新增保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + int insertMenu(SysSaasMenuBo bo); + + /** + * 修改保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + int updateMenu(SysSaasMenuBo bo); + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + int deleteMenuById(Long menuId); + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + boolean checkMenuNameUnique(SysSaasMenuBo menu); +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ApplicationServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ApplicationServiceImpl.java new file mode 100644 index 000000000..d613988f4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ApplicationServiceImpl.java @@ -0,0 +1,130 @@ +package org.dromara.system.saas.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.system.saas.domain.Sys2Application; +import org.dromara.system.saas.domain.bo.Sys2ApplicationBo; +import org.dromara.system.saas.domain.vo.Sys2ApplicationVo; +import org.dromara.system.saas.mapper.Sys2ApplicationMapper; +import org.dromara.system.saas.service.ISys2ApplicationService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 应用Service业务层处理 + * + * @author Lion Li + * @date 2024-09-22 + */ +@RequiredArgsConstructor +@Service +public class Sys2ApplicationServiceImpl implements ISys2ApplicationService { + + private final Sys2ApplicationMapper baseMapper; + + /** + * 查询应用 + * + * @param applicationId 主键 + * @return 应用 + */ + @Override + public Sys2ApplicationVo queryById(Long applicationId){ + return baseMapper.selectVoById(applicationId); + } + + /** + * 分页查询应用列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 应用分页列表 + */ + @Override + public TableDataInfo queryPageList(Sys2ApplicationBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的应用列表 + * + * @param bo 查询条件 + * @return 应用列表 + */ + @Override + public List queryList(Sys2ApplicationBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2ApplicationBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getApplicationName()), Sys2Application::getApplicationName, bo.getApplicationName()); + lqw.eq(StringUtils.isNotBlank(bo.getApplicationCode()), Sys2Application::getApplicationCode, bo.getApplicationCode()); + return lqw; + } + + /** + * 新增应用 + * + * @param bo 应用 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(Sys2ApplicationBo bo) { + Sys2Application add = MapstructUtils.convert(bo, Sys2Application.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setApplicationId(add.getApplicationId()); + } + return flag; + } + + /** + * 修改应用 + * + * @param bo 应用 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(Sys2ApplicationBo bo) { + Sys2Application update = MapstructUtils.convert(bo, Sys2Application.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(Sys2Application entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除应用信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ClientServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ClientServiceImpl.java new file mode 100644 index 000000000..e6f095472 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ClientServiceImpl.java @@ -0,0 +1,151 @@ +package org.dromara.system.saas.service.impl; + +import cn.hutool.crypto.SecureUtil; +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.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.saas.domain.Sys2Client; +import org.dromara.system.saas.domain.bo.Sys2ClientBo; +import org.dromara.system.saas.domain.vo.Sys2ClientVo; +import org.dromara.system.saas.mapper.Sys2ClientMapper; +import org.dromara.system.saas.service.ISys2ClientService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 客户端管理Service业务层处理 + * + * @author Michelle.Chung + * @date 2023-06-18 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class Sys2ClientServiceImpl implements ISys2ClientService { + + private final Sys2ClientMapper baseMapper; + + /** + * 查询客户端管理 + */ + @Override + public Sys2ClientVo queryById(Long id) { + Sys2ClientVo vo = baseMapper.selectVoById(id); + vo.setGrantTypeList(List.of(vo.getGrantType().split(","))); + return vo; + } + + + /** + * 查询客户端管理 + */ + @Cacheable(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") + @Override + public Sys2ClientVo queryByClientId(String clientId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(Sys2Client::getClientId, clientId)); + } + + /** + * 查询客户端管理列表 + */ + @Override + public TableDataInfo queryPageList(Sys2ClientBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + result.getRecords().forEach(r -> r.setGrantTypeList(List.of(r.getGrantType().split(",")))); + return TableDataInfo.build(result); + } + + /** + * 查询客户端管理列表 + */ + @Override + public List queryList(Sys2ClientBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2ClientBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getClientId()), Sys2Client::getClientId, bo.getClientId()); + lqw.eq(StringUtils.isNotBlank(bo.getClientKey()), Sys2Client::getClientKey, bo.getClientKey()); + lqw.eq(StringUtils.isNotBlank(bo.getClientSecret()), Sys2Client::getClientSecret, bo.getClientSecret()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), Sys2Client::getStatus, bo.getStatus()); + lqw.orderByAsc(Sys2Client::getId); + return lqw; + } + + /** + * 新增客户端管理 + */ + @Override + public Boolean insertByBo(Sys2ClientBo bo) { + Sys2Client add = MapstructUtils.convert(bo, Sys2Client.class); + validEntityBeforeSave(add); + add.setGrantType(String.join(",", bo.getGrantTypeList())); + // 生成clientid + String clientKey = bo.getClientKey(); + String clientSecret = bo.getClientSecret(); + add.setClientId(SecureUtil.md5(clientKey + clientSecret)); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改客户端管理 + */ + @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#bo.clientId") + @Override + public Boolean updateByBo(Sys2ClientBo bo) { + Sys2Client update = MapstructUtils.convert(bo, Sys2Client.class); + validEntityBeforeSave(update); + update.setGrantType(String.join(",", bo.getGrantTypeList())); + return baseMapper.updateById(update) > 0; + } + + /** + * 修改状态 + */ + @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, key = "#clientId") + @Override + public int updateUserStatus(String clientId, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(Sys2Client::getStatus, status) + .eq(Sys2Client::getClientId, clientId)); + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(Sys2Client entity) { + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 批量删除客户端管理 + */ + @CacheEvict(cacheNames = CacheNames.SYS_CLIENT, allEntries = true) + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ConfigServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ConfigServiceImpl.java new file mode 100644 index 000000000..48b3f1ac7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2ConfigServiceImpl.java @@ -0,0 +1,219 @@ +package org.dromara.system.saas.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 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.ConfigService; +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.common.redis.utils.CacheUtils; +import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.saas.domain.Sys2Config; +import org.dromara.system.saas.domain.bo.Sys2ConfigBo; +import org.dromara.system.saas.domain.vo.Sys2ConfigVo; +import org.dromara.system.saas.mapper.Sys2ConfigMapper; +import org.dromara.system.saas.service.ISys2ConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 参数配置 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class Sys2ConfigServiceImpl implements ISys2ConfigService, ConfigService { + + private final Sys2ConfigMapper baseMapper; + + @Override + public TableDataInfo selectPageConfigList(Sys2ConfigBo config, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询参数配置信息 + * + * @param configId 参数配置ID + * @return 参数配置信息 + */ + @Override + @DS("master") + public Sys2ConfigVo selectConfigById(Long configId) { + return baseMapper.selectVoById(configId); + } + + /** + * 根据键名查询参数配置信息 + * + * @param configKey 参数key + * @return 参数键值 + */ + @Cacheable(cacheNames = CacheNames.SYS_CONFIG, key = "#configKey") + @Override + public String selectConfigByKey(String configKey) { + Sys2Config retConfig = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(Sys2Config::getConfigKey, configKey)); + if (ObjectUtil.isNotNull(retConfig)) { + return retConfig.getConfigValue(); + } + return StringUtils.EMPTY; + } + + /** + * 获取注册开关 + * @param tenantId 租户id + * @return true开启,false关闭 + */ + @Override + public boolean selectRegisterEnabled(String tenantId) { + Sys2Config retConfig = TenantHelper.dynamic(tenantId, () -> { + return baseMapper.selectOne(new LambdaQueryWrapper() + .eq(Sys2Config::getConfigKey, "sys.account.registerUser")); + }); + if (ObjectUtil.isNull(retConfig)) { + return false; + } + return Convert.toBool(retConfig.getConfigValue()); + } + + /** + * 查询参数配置列表 + * + * @param config 参数配置信息 + * @return 参数配置集合 + */ + @Override + public List selectConfigList(Sys2ConfigBo config) { + LambdaQueryWrapper lqw = buildQueryWrapper(config); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2ConfigBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getConfigName()), Sys2Config::getConfigName, bo.getConfigName()); + lqw.eq(StringUtils.isNotBlank(bo.getConfigType()), Sys2Config::getConfigType, bo.getConfigType()); + lqw.like(StringUtils.isNotBlank(bo.getConfigKey()), Sys2Config::getConfigKey, bo.getConfigKey()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + Sys2Config::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.orderByAsc(Sys2Config::getConfigId); + return lqw; + } + + /** + * 新增参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") + @Override + public String insertConfig(Sys2ConfigBo bo) { + Sys2Config config = MapstructUtils.convert(bo, Sys2Config.class); + int row = baseMapper.insert(config); + if (row > 0) { + return config.getConfigValue(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改参数配置 + * + * @param bo 参数配置信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey") + @Override + public String updateConfig(Sys2ConfigBo bo) { + int row = 0; + Sys2Config config = MapstructUtils.convert(bo, Sys2Config.class); + if (config.getConfigId() != null) { + Sys2Config temp = baseMapper.selectById(config.getConfigId()); + if (!StringUtils.equals(temp.getConfigKey(), config.getConfigKey())) { + CacheUtils.evict(CacheNames.SYS_CONFIG, temp.getConfigKey()); + } + row = baseMapper.updateById(config); + } else { + CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); + row = baseMapper.update(config, new LambdaQueryWrapper() + .eq(Sys2Config::getConfigKey, config.getConfigKey())); + } + if (row > 0) { + return config.getConfigValue(); + } + throw new ServiceException("操作失败"); + } + + /** + * 批量删除参数信息 + * + * @param configIds 需要删除的参数ID + */ + @Override + public void deleteConfigByIds(Long[] configIds) { + for (Long configId : configIds) { + Sys2Config config = baseMapper.selectById(configId); + if (StringUtils.equals(UserConstants.YES, config.getConfigType())) { + throw new ServiceException(String.format("内置参数【%1$s】不能删除 ", config.getConfigKey())); + } + CacheUtils.evict(CacheNames.SYS_CONFIG, config.getConfigKey()); + } + baseMapper.deleteByIds(Arrays.asList(configIds)); + } + + /** + * 重置参数缓存数据 + */ + @Override + public void resetConfigCache() { + CacheUtils.clear(CacheNames.SYS_CONFIG); + } + + /** + * 校验参数键名是否唯一 + * + * @param config 参数配置信息 + * @return 结果 + */ + @Override + public boolean checkConfigKeyUnique(Sys2ConfigBo config) { + long configId = ObjectUtil.isNull(config.getConfigId()) ? -1L : config.getConfigId(); + Sys2Config info = baseMapper.selectOne(new LambdaQueryWrapper().eq(Sys2Config::getConfigKey, config.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getConfigId() != configId) { + return false; + } + return true; + } + + /** + * 根据参数 key 获取参数值 + * + * @param configKey 参数 key + * @return 参数值 + */ + @Override + public String getConfigValue(String configKey) { + return SpringUtils.getAopProxy(this).selectConfigByKey(configKey); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DataScopeServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DataScopeServiceImpl.java new file mode 100644 index 000000000..3aa833d74 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DataScopeServiceImpl.java @@ -0,0 +1,76 @@ +package org.dromara.system.saas.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ObjectUtil; +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.saas.domain.Sys2Dept; +import org.dromara.system.saas.domain.Sys2RoleDept; +import org.dromara.system.saas.mapper.Sys2DeptMapper; +import org.dromara.system.saas.mapper.Sys2RoleDeptMapper; +import org.dromara.system.saas.service.ISys2DataScopeService; + +import java.util.List; + +/** + * 数据权限 实现 + *

+ * 注意: 此Service内不允许调用标注`数据权限`注解的方法 + * 例如: deptMapper.selectList 此 selectList 方法标注了`数据权限`注解 会出现循环解析的问题 + * + * @author Lion Li + */ +@RequiredArgsConstructor +//@Service("sdss") 目前数据权限注解没有用,所以不需要用 +public class Sys2DataScopeServiceImpl implements ISys2DataScopeService { + + private final Sys2RoleDeptMapper roleDeptMapper; + private final Sys2DeptMapper deptMapper; + + /** + * 获取角色自定义权限 + * + * @param roleId 角色Id + * @return 部门Id组 + */ + @Override + public String getRoleCustom(Long roleId) { + if (ObjectUtil.isNull(roleId)) { + return "-1"; + } + List list = roleDeptMapper.selectList( + new LambdaQueryWrapper() + .select(Sys2RoleDept::getDeptId) + .eq(Sys2RoleDept::getRoleId, roleId)); + if (CollUtil.isNotEmpty(list)) { + return StreamUtils.join(list, rd -> Convert.toStr(rd.getDeptId())); + } + return "-1"; + } + + /** + * 获取部门及以下权限 + * + * @param deptId 部门Id + * @return 部门Id组 + */ + @Override + public String getDeptAndChild(Long deptId) { + if (ObjectUtil.isNull(deptId)) { + return "-1"; + } + List deptList = deptMapper.selectList(new LambdaQueryWrapper() + .select(Sys2Dept::getDeptId) + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + List ids = StreamUtils.toList(deptList, Sys2Dept::getDeptId); + ids.add(deptId); + if (CollUtil.isNotEmpty(ids)) { + return StreamUtils.join(ids, Convert::toStr); + } + return "-1"; + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DeptServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DeptServiceImpl.java new file mode 100644 index 000000000..af9dec210 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DeptServiceImpl.java @@ -0,0 +1,337 @@ +package org.dromara.system.saas.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.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.service.SaasDeptService; +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.saas.domain.Sys2Dept; +import org.dromara.system.saas.domain.Sys2Role; +import org.dromara.system.saas.domain.Sys2User; +import org.dromara.system.saas.domain.bo.Sys2DeptBo; +import org.dromara.system.saas.domain.vo.Sys2DeptVo; +import org.dromara.system.saas.mapper.Sys2DeptMapper; +import org.dromara.system.saas.mapper.Sys2RoleMapper; +import org.dromara.system.saas.mapper.Sys2UserMapper; +import org.dromara.system.saas.service.ISys2DeptService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 部门管理 服务实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class Sys2DeptServiceImpl implements ISys2DeptService, SaasDeptService { + + private final Sys2DeptMapper baseMapper; + private final Sys2RoleMapper roleMapper; + private final Sys2UserMapper userMapper; + + /** + * 查询部门管理数据 + * + * @param dept 部门信息 + * @return 部门信息集合 + */ + @Override + public List selectDeptList(Sys2DeptBo dept) { + LambdaQueryWrapper lqw = buildQueryWrapper(dept); + return baseMapper.selectDeptList(lqw); + } + + /** + * 查询部门树结构信息 + * + * @param bo 部门信息 + * @return 部门树信息集合 + */ + @Override + public List> selectDeptTreeList(Sys2DeptBo bo) { + // 只查询未禁用部门 + bo.setStatus(UserConstants.DEPT_NORMAL); + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + List depts = baseMapper.selectDeptList(lqw); + return buildDeptTreeSelect(depts); + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2DeptBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(Sys2Dept::getDelFlag, UserConstants.DEL_FLAG_NORMAL); + lqw.eq(ObjectUtil.isNotNull(bo.getDeptId()), Sys2Dept::getDeptId, bo.getDeptId()); + lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), Sys2Dept::getParentId, bo.getParentId()); + lqw.like(StringUtils.isNotBlank(bo.getDeptName()), Sys2Dept::getDeptName, bo.getDeptName()); + lqw.like(StringUtils.isNotBlank(bo.getDeptCategory()), Sys2Dept::getDeptCategory, bo.getDeptCategory()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), Sys2Dept::getStatus, bo.getStatus()); + lqw.orderByAsc(Sys2Dept::getAncestors); + lqw.orderByAsc(Sys2Dept::getParentId); + lqw.orderByAsc(Sys2Dept::getOrderNum); + lqw.orderByAsc(Sys2Dept::getDeptId); + return lqw; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param depts 部门列表 + * @return 下拉树结构列表 + */ + @Override + public List> buildDeptTreeSelect(List depts) { + if (CollUtil.isEmpty(depts)) { + return CollUtil.newArrayList(); + } + return TreeBuildUtils.build(depts, (dept, tree) -> + tree.setId(dept.getDeptId()) + .setParentId(dept.getParentId()) + .setName(dept.getDeptName()) + .setWeight(dept.getOrderNum())); + } + + /** + * 根据角色ID查询部门树信息 + * + * @param roleId 角色ID + * @return 选中部门列表 + */ + @Override + public List selectDeptListByRoleId(Long roleId) { + Sys2Role role = roleMapper.selectById(roleId); + return baseMapper.selectDeptListByRoleId(roleId, role.getDeptCheckStrictly()); + } + + /** + * 根据部门ID查询信息 + * + * @param deptId 部门ID + * @return 部门信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_DEPT, key = "#deptId") + @Override + public Sys2DeptVo selectDeptById(Long deptId) { + Sys2DeptVo dept = baseMapper.selectVoById(deptId); + if (ObjectUtil.isNull(dept)) { + return null; + } + Sys2DeptVo parentDept = baseMapper.selectVoOne(new LambdaQueryWrapper() + .select(Sys2Dept::getDeptName).eq(Sys2Dept::getDeptId, dept.getParentId())); + dept.setParentName(ObjectUtil.isNotNull(parentDept) ? parentDept.getDeptName() : null); + return dept; + } + + @Override + public List selectDeptByIds(List deptIds) { + return baseMapper.selectDeptList(new LambdaQueryWrapper() + .select(Sys2Dept::getDeptId, Sys2Dept::getDeptName, Sys2Dept::getLeader) + .eq(Sys2Dept::getStatus, UserConstants.DEPT_NORMAL) + .in(CollUtil.isNotEmpty(deptIds), Sys2Dept::getDeptId, deptIds)); + } + + /** + * 通过部门ID查询部门名称 + * + * @param deptIds 部门ID串逗号分隔 + * @return 部门名称串逗号分隔 + */ + @Override + public String selectDeptNameByIds(String deptIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(deptIds, Convert::toLong)) { + Sys2DeptVo vo = SpringUtils.getAopProxy(this).selectDeptById(id); + if (ObjectUtil.isNotNull(vo)) { + list.add(vo.getDeptName()); + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + /** + * 根据ID查询所有子部门数(正常状态) + * + * @param deptId 部门ID + * @return 子部门数 + */ + @Override + public long selectNormalChildrenDeptById(Long deptId) { + return baseMapper.selectCount(new LambdaQueryWrapper() + .eq(Sys2Dept::getStatus, UserConstants.DEPT_NORMAL) + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + } + + /** + * 是否存在子节点 + * + * @param deptId 部门ID + * @return 结果 + */ + @Override + public boolean hasChildByDeptId(Long deptId) { + return baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2Dept::getParentId, deptId)); + } + + /** + * 查询部门是否存在用户 + * + * @param deptId 部门ID + * @return 结果 true 存在 false 不存在 + */ + @Override + public boolean checkDeptExistUser(Long deptId) { + return userMapper.exists(new LambdaQueryWrapper() + .eq(Sys2User::getDeptId, deptId)); + } + + /** + * 校验部门名称是否唯一 + * + * @param dept 部门信息 + * @return 结果 + */ + @Override + public boolean checkDeptNameUnique(Sys2DeptBo dept) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2Dept::getDeptName, dept.getDeptName()) + .eq(Sys2Dept::getParentId, dept.getParentId()) + .ne(ObjectUtil.isNotNull(dept.getDeptId()), Sys2Dept::getDeptId, dept.getDeptId())); + return !exist; + } + + /** + * 校验部门是否有数据权限 + * + * @param deptId 部门id + */ + @Override + public void checkDeptDataScope(Long deptId) { + if (ObjectUtil.isNull(deptId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + if (baseMapper.countDeptById(deptId) == 0) { + throw new ServiceException("没有权限访问部门数据!"); + } + } + + /** + * 新增保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + @Override + public int insertDept(Sys2DeptBo bo) { + Sys2Dept info = baseMapper.selectById(bo.getParentId()); + // 如果父节点不为正常状态,则不允许新增子节点 + if (!UserConstants.DEPT_NORMAL.equals(info.getStatus())) { + throw new ServiceException("部门停用,不允许新增"); + } + Sys2Dept dept = MapstructUtils.convert(bo, Sys2Dept.class); + dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId()); + return baseMapper.insert(dept); + } + + /** + * 修改保存部门信息 + * + * @param bo 部门信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#bo.deptId") + @Override + public int updateDept(Sys2DeptBo bo) { + Sys2Dept dept = MapstructUtils.convert(bo, Sys2Dept.class); + Sys2Dept oldDept = baseMapper.selectById(dept.getDeptId()); + if (!oldDept.getParentId().equals(dept.getParentId())) { + // 如果是新父部门 则校验是否具有新父部门权限 避免越权 + this.checkDeptDataScope(dept.getParentId()); + Sys2Dept 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()) + && !StringUtils.equals(UserConstants.DEPT_NORMAL, dept.getAncestors())) { + // 如果该部门是启用状态,则启用该部门的所有上级部门 + updateParentDeptStatusNormal(dept); + } + return result; + } + + /** + * 修改该部门的父级部门状态 + * + * @param dept 当前部门 + */ + private void updateParentDeptStatusNormal(Sys2Dept dept) { + String ancestors = dept.getAncestors(); + Long[] deptIds = Convert.toLongArray(ancestors); + baseMapper.update(null, new LambdaUpdateWrapper() + .set(Sys2Dept::getStatus, UserConstants.DEPT_NORMAL) + .in(Sys2Dept::getDeptId, Arrays.asList(deptIds))); + } + + /** + * 修改子元素关系 + * + * @param deptId 被修改的部门ID + * @param newAncestors 新的父ID集合 + * @param oldAncestors 旧的父ID集合 + */ + private void updateDeptChildren(Long deptId, String newAncestors, String oldAncestors) { + List children = baseMapper.selectList(new LambdaQueryWrapper() + .apply(DataBaseHelper.findInSet(deptId, "ancestors"))); + List list = new ArrayList<>(); + for (Sys2Dept child : children) { + Sys2Dept dept = new Sys2Dept(); + dept.setDeptId(child.getDeptId()); + dept.setAncestors(child.getAncestors().replaceFirst(oldAncestors, newAncestors)); + list.add(dept); + } + if (CollUtil.isNotEmpty(list)) { + if (baseMapper.updateBatchById(list)) { + list.forEach(dept -> CacheUtils.evict(CacheNames.SYS_DEPT, dept.getDeptId())); + } + } + } + + /** + * 删除部门管理信息 + * + * @param deptId 部门ID + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_DEPT, key = "#deptId") + @Override + public int deleteDeptById(Long deptId) { + return baseMapper.deleteById(deptId); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DictDataServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DictDataServiceImpl.java new file mode 100644 index 000000000..a254fed2c --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DictDataServiceImpl.java @@ -0,0 +1,156 @@ +package org.dromara.system.saas.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 org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.system.saas.domain.Sys2DictData; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.redis.utils.CacheUtils; +import org.dromara.system.saas.domain.bo.Sys2DictDataBo; +import org.dromara.system.saas.domain.vo.Sys2DictDataVo; +import org.dromara.system.saas.mapper.Sys2DictDataMapper; +import org.dromara.system.saas.service.ISys2DictDataService; +import lombok.RequiredArgsConstructor; +import org.springframework.cache.annotation.CachePut; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 字典 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class Sys2DictDataServiceImpl implements ISys2DictDataService { + + private final Sys2DictDataMapper baseMapper; + + @Override + public TableDataInfo selectPageDictDataList(Sys2DictDataBo dictData, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询字典数据 + * + * @param dictData 字典数据信息 + * @return 字典数据集合信息 + */ + @Override + public List selectDictDataList(Sys2DictDataBo dictData) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictData); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2DictDataBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getDictSort() != null, Sys2DictData::getDictSort, bo.getDictSort()); + lqw.like(StringUtils.isNotBlank(bo.getDictLabel()), Sys2DictData::getDictLabel, bo.getDictLabel()); + lqw.eq(StringUtils.isNotBlank(bo.getDictType()), Sys2DictData::getDictType, bo.getDictType()); + lqw.orderByAsc(Sys2DictData::getDictSort); + return lqw; + } + + /** + * 根据字典类型和字典键值查询字典数据信息 + * + * @param dictType 字典类型 + * @param dictValue 字典键值 + * @return 字典标签 + */ + @Override + public String selectDictLabel(String dictType, String dictValue) { + return baseMapper.selectOne(new LambdaQueryWrapper() + .select(Sys2DictData::getDictLabel) + .eq(Sys2DictData::getDictType, dictType) + .eq(Sys2DictData::getDictValue, dictValue)) + .getDictLabel(); + } + + /** + * 根据字典数据ID查询信息 + * + * @param dictCode 字典数据ID + * @return 字典数据 + */ + @Override + public Sys2DictDataVo selectDictDataById(Long dictCode) { + return baseMapper.selectVoById(dictCode); + } + + /** + * 批量删除字典数据信息 + * + * @param dictCodes 需要删除的字典数据ID + */ + @Override + public void deleteDictDataByIds(Long[] dictCodes) { + for (Long dictCode : dictCodes) { + Sys2DictData data = baseMapper.selectById(dictCode); + baseMapper.deleteById(dictCode); + CacheUtils.evict(CacheNames.SYS_DICT, data.getDictType()); + } + } + + /** + * 新增保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List insertDictData(Sys2DictDataBo bo) { + Sys2DictData data = MapstructUtils.convert(bo, Sys2DictData.class); + int row = baseMapper.insert(data); + if (row > 0) { + return baseMapper.selectDictDataByType(data.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典数据信息 + * + * @param bo 字典数据信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List updateDictData(Sys2DictDataBo bo) { + Sys2DictData data = MapstructUtils.convert(bo, Sys2DictData.class); + int row = baseMapper.updateById(data); + if (row > 0) { + return baseMapper.selectDictDataByType(data.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 校验字典键值是否唯一 + * + * @param dict 字典数据 + * @return 结果 + */ + @Override + public boolean checkDictDataUnique(Sys2DictDataBo dict) { + Long dictCode = ObjectUtil.isNull(dict.getDictCode()) ? -1L : dict.getDictCode(); + Sys2DictData entity = baseMapper.selectOne(new LambdaQueryWrapper() + .eq(Sys2DictData::getDictType, dict.getDictType()).eq(Sys2DictData::getDictValue, dict.getDictValue())); + if (ObjectUtil.isNotNull(entity) && !dictCode.equals(entity.getDictCode())) { + return false; + } + return true; + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DictTypeServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DictTypeServiceImpl.java new file mode 100644 index 000000000..5ecff7fcc --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2DictTypeServiceImpl.java @@ -0,0 +1,258 @@ +package org.dromara.system.saas.service.impl; + +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.CacheNames; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.SaasDictService; +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.saas.domain.Sys2DictData; +import org.dromara.system.saas.domain.Sys2DictType; +import org.dromara.system.saas.domain.bo.Sys2DictTypeBo; +import org.dromara.system.saas.domain.vo.Sys2DictDataVo; +import org.dromara.system.saas.domain.vo.Sys2DictTypeVo; +import org.dromara.system.saas.mapper.Sys2DictDataMapper; +import org.dromara.system.saas.mapper.Sys2DictTypeMapper; +import org.dromara.system.saas.service.ISys2DictTypeService; +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.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 字典 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class Sys2DictTypeServiceImpl implements ISys2DictTypeService, SaasDictService { + + private final Sys2DictTypeMapper baseMapper; + private final Sys2DictDataMapper dictDataMapper; + + @Override + public TableDataInfo selectPageDictTypeList(Sys2DictTypeBo dictType, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询字典类型 + * + * @param dictType 字典类型信息 + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeList(Sys2DictTypeBo dictType) { + LambdaQueryWrapper lqw = buildQueryWrapper(dictType); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2DictTypeBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getDictName()), Sys2DictType::getDictName, bo.getDictName()); + lqw.like(StringUtils.isNotBlank(bo.getDictType()), Sys2DictType::getDictType, bo.getDictType()); + lqw.between(params.get("beginTime") != null && params.get("endTime") != null, + Sys2DictType::getCreateTime, params.get("beginTime"), params.get("endTime")); + lqw.orderByAsc(Sys2DictType::getDictId); + return lqw; + } + + /** + * 根据所有字典类型 + * + * @return 字典类型集合信息 + */ + @Override + public List selectDictTypeAll() { + return baseMapper.selectVoList(); + } + + /** + * 根据字典类型查询字典数据 + * + * @param dictType 字典类型 + * @return 字典数据集合信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType") + @Override + public List selectDictDataByType(String dictType) { + List dictDatas = dictDataMapper.selectDictDataByType(dictType); + if (CollUtil.isNotEmpty(dictDatas)) { + return dictDatas; + } + return null; + } + + /** + * 根据字典类型ID查询信息 + * + * @param dictId 字典类型ID + * @return 字典类型 + */ + @Override + public Sys2DictTypeVo selectDictTypeById(Long dictId) { + return baseMapper.selectVoById(dictId); + } + + /** + * 根据字典类型查询信息 + * + * @param dictType 字典类型 + * @return 字典类型 + */ + @Override + public Sys2DictTypeVo selectDictTypeByType(String dictType) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(Sys2DictType::getDictType, dictType)); + } + + /** + * 批量删除字典类型信息 + * + * @param dictIds 需要删除的字典ID + */ + @Override + public void deleteDictTypeByIds(Long[] dictIds) { + for (Long dictId : dictIds) { + Sys2DictType dictType = baseMapper.selectById(dictId); + if (dictDataMapper.exists(new LambdaQueryWrapper() + .eq(Sys2DictData::getDictType, dictType.getDictType()))) { + throw new ServiceException(String.format("%1$s已分配,不能删除", dictType.getDictName())); + } + CacheUtils.evict(CacheNames.SYS_DICT, dictType.getDictType()); + } + baseMapper.deleteByIds(Arrays.asList(dictIds)); + } + + /** + * 重置字典缓存数据 + */ + @Override + public void resetDictCache() { + CacheUtils.clear(CacheNames.SYS_DICT); + } + + /** + * 新增保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + public List insertDictType(Sys2DictTypeBo bo) { + Sys2DictType dict = MapstructUtils.convert(bo, Sys2DictType.class); + int row = baseMapper.insert(dict); + if (row > 0) { + // 新增 type 下无 data 数据 返回空防止缓存穿透 + return new ArrayList<>(); + } + throw new ServiceException("操作失败"); + } + + /** + * 修改保存字典类型信息 + * + * @param bo 字典类型信息 + * @return 结果 + */ + @CachePut(cacheNames = CacheNames.SYS_DICT, key = "#bo.dictType") + @Override + @Transactional(rollbackFor = Exception.class) + public List updateDictType(Sys2DictTypeBo bo) { + Sys2DictType dict = MapstructUtils.convert(bo, Sys2DictType.class); + Sys2DictType oldDict = baseMapper.selectById(dict.getDictId()); + dictDataMapper.update(null, new LambdaUpdateWrapper() + .set(Sys2DictData::getDictType, dict.getDictType()) + .eq(Sys2DictData::getDictType, oldDict.getDictType())); + int row = baseMapper.updateById(dict); + if (row > 0) { + CacheUtils.evict(CacheNames.SYS_DICT, oldDict.getDictType()); + return dictDataMapper.selectDictDataByType(dict.getDictType()); + } + throw new ServiceException("操作失败"); + } + + /** + * 校验字典类型称是否唯一 + * + * @param dictType 字典类型 + * @return 结果 + */ + @Override + public boolean checkDictTypeUnique(Sys2DictTypeBo dictType) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2DictType::getDictType, dictType.getDictType()) + .ne(ObjectUtil.isNotNull(dictType.getDictId()), Sys2DictType::getDictId, dictType.getDictId())); + return !exist; + } + + /** + * 根据字典类型和字典值获取字典标签 + * + * @param dictType 字典类型 + * @param dictValue 字典值 + * @param separator 分隔符 + * @return 字典标签 + */ + @Override + public String getDictLabel(String dictType, String dictValue, String separator) { + List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + Map map = StreamUtils.toMap(datas, Sys2DictDataVo::getDictValue, Sys2DictDataVo::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 字典值 + */ + @Override + public String getDictValue(String dictType, String dictLabel, String separator) { + List datas = SpringUtils.getAopProxy(this).selectDictDataByType(dictType); + Map map = StreamUtils.toMap(datas, Sys2DictDataVo::getDictLabel, Sys2DictDataVo::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); + } + } + + @Override + public Map getAllDictByDictType(String dictType) { + List list = selectDictDataByType(dictType); + return StreamUtils.toMap(list, Sys2DictDataVo::getDictValue, Sys2DictDataVo::getDictLabel); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2LogininforServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2LogininforServiceImpl.java new file mode 100644 index 000000000..2771ee243 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2LogininforServiceImpl.java @@ -0,0 +1,176 @@ +package org.dromara.system.saas.service.impl; + +import cn.hutool.core.util.ObjectUtil; +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 jakarta.servlet.http.HttpServletRequest; +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.common.satoken.utils.LoginHelper; +import org.dromara.system.saas.domain.Sys2Logininfor; +import org.dromara.system.saas.domain.bo.Sys2LogininforBo; +import org.dromara.system.saas.domain.vo.Sys2ClientVo; +import org.dromara.system.saas.domain.vo.Sys2LogininforVo; +import org.dromara.system.saas.mapper.Sys2LogininforMapper; +import org.dromara.system.saas.service.ISys2ClientService; +import org.dromara.system.saas.service.ISys2LogininforService; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 系统访问日志情况信息 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Slf4j +@Service +public class Sys2LogininforServiceImpl implements ISys2LogininforService { + + private final Sys2LogininforMapper baseMapper; + + private final ISys2ClientService clientService; + + /** + * 记录登录信息 + * + * @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 clientId = request.getHeader(LoginHelper.CLIENT_KEY); + Sys2ClientVo client = null; + if (StringUtils.isNotBlank(clientId)) { + client = clientService.queryByClientId(clientId); + } + + 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(); + // 封装对象 + Sys2LogininforBo logininfor = new Sys2LogininforBo(); + logininfor.setTenantId(logininforEvent.getTenantId()); + logininfor.setUserName(logininforEvent.getUsername()); + if (ObjectUtil.isNotNull(client)) { + logininfor.setClientKey(client.getClientKey()); + logininfor.setDeviceType(client.getDeviceType()); + } + 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(Sys2LogininforBo logininfor, PageQuery pageQuery) { + Map params = logininfor.getParams(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), Sys2Logininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), Sys2Logininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), Sys2Logininfor::getUserName, logininfor.getUserName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + Sys2Logininfor::getLoginTime, params.get("beginTime"), params.get("endTime")); + if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { + pageQuery.setOrderByColumn("info_id"); + pageQuery.setIsAsc("desc"); + } + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 新增系统登录日志 + * + * @param bo 访问日志对象 + */ + @Override + public void insertLogininfor(Sys2LogininforBo bo) { + Sys2Logininfor logininfor = MapstructUtils.convert(bo, Sys2Logininfor.class); + logininfor.setLoginTime(new Date()); + baseMapper.insert(logininfor); + } + + /** + * 查询系统登录日志集合 + * + * @param logininfor 访问日志对象 + * @return 登录记录集合 + */ + @Override + public List selectLogininforList(Sys2LogininforBo logininfor) { + Map params = logininfor.getParams(); + return baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(logininfor.getIpaddr()), Sys2Logininfor::getIpaddr, logininfor.getIpaddr()) + .eq(StringUtils.isNotBlank(logininfor.getStatus()), Sys2Logininfor::getStatus, logininfor.getStatus()) + .like(StringUtils.isNotBlank(logininfor.getUserName()), Sys2Logininfor::getUserName, logininfor.getUserName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + Sys2Logininfor::getLoginTime, params.get("beginTime"), params.get("endTime")) + .orderByDesc(Sys2Logininfor::getInfoId)); + } + + /** + * 批量删除系统登录日志 + * + * @param infoIds 需要删除的登录日志ID + * @return 结果 + */ + @Override + public int deleteLogininforByIds(Long[] infoIds) { + return baseMapper.deleteByIds(Arrays.asList(infoIds)); + } + + /** + * 清空系统登录日志 + */ + @Override + public void cleanLogininfor() { + baseMapper.delete(new LambdaQueryWrapper<>()); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2NoticeServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2NoticeServiceImpl.java new file mode 100644 index 000000000..fdddf906d --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2NoticeServiceImpl.java @@ -0,0 +1,124 @@ +package org.dromara.system.saas.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 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.saas.domain.Sys2Notice; +import org.dromara.system.saas.domain.Sys2User; +import org.dromara.system.saas.domain.bo.Sys2NoticeBo; +import org.dromara.system.saas.domain.vo.Sys2NoticeVo; +import org.dromara.system.saas.domain.vo.Sys2UserVo; +import org.dromara.system.saas.mapper.Sys2NoticeMapper; +import org.dromara.system.saas.mapper.Sys2UserMapper; +import org.dromara.system.saas.service.ISys2NoticeService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +/** + * 公告 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class Sys2NoticeServiceImpl implements ISys2NoticeService { + + private final Sys2NoticeMapper baseMapper; + private final Sys2UserMapper userMapper; + + @Override + public TableDataInfo selectPageNoticeList(Sys2NoticeBo notice, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(notice); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 查询公告信息 + * + * @param noticeId 公告ID + * @return 公告信息 + */ + @Override + public Sys2NoticeVo selectNoticeById(Long noticeId) { + return baseMapper.selectVoById(noticeId); + } + + /** + * 查询公告列表 + * + * @param notice 公告信息 + * @return 公告集合 + */ + @Override + public List selectNoticeList(Sys2NoticeBo notice) { + LambdaQueryWrapper lqw = buildQueryWrapper(notice); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2NoticeBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getNoticeTitle()), Sys2Notice::getNoticeTitle, bo.getNoticeTitle()); + lqw.eq(StringUtils.isNotBlank(bo.getNoticeType()), Sys2Notice::getNoticeType, bo.getNoticeType()); + if (StringUtils.isNotBlank(bo.getCreateByName())) { + Sys2UserVo sysUser = userMapper.selectVoOne(new LambdaQueryWrapper().eq(Sys2User::getUserName, bo.getCreateByName())); + lqw.eq(Sys2Notice::getCreateBy, ObjectUtil.isNotNull(sysUser) ? sysUser.getUserId() : null); + } + lqw.orderByAsc(Sys2Notice::getNoticeId); + return lqw; + } + + /** + * 新增公告 + * + * @param bo 公告信息 + * @return 结果 + */ + @Override + public int insertNotice(Sys2NoticeBo bo) { + Sys2Notice notice = MapstructUtils.convert(bo, Sys2Notice.class); + return baseMapper.insert(notice); + } + + /** + * 修改公告 + * + * @param bo 公告信息 + * @return 结果 + */ + @Override + public int updateNotice(Sys2NoticeBo bo) { + Sys2Notice notice = MapstructUtils.convert(bo, Sys2Notice.class); + return baseMapper.updateById(notice); + } + + /** + * 删除公告对象 + * + * @param noticeId 公告ID + * @return 结果 + */ + @Override + public int deleteNoticeById(Long noticeId) { + return baseMapper.deleteById(noticeId); + } + + /** + * 批量删除公告信息 + * + * @param noticeIds 需要删除的公告ID + * @return 结果 + */ + @Override + public int deleteNoticeByIds(Long[] noticeIds) { + return baseMapper.deleteByIds(Arrays.asList(noticeIds)); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OperLogServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OperLogServiceImpl.java new file mode 100644 index 000000000..a22f8b680 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OperLogServiceImpl.java @@ -0,0 +1,146 @@ +package org.dromara.system.saas.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 org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +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.system.saas.domain.Sys2OperLog; +import org.dromara.system.saas.domain.bo.Sys2OperLogBo; +import org.dromara.system.saas.domain.vo.Sys2OperLogVo; +import org.dromara.system.saas.mapper.Sys2OperLogMapper; +import org.dromara.system.saas.service.ISys2OperLogService; +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 操作日志 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class Sys2OperLogServiceImpl implements ISys2OperLogService { + + private final Sys2OperLogMapper baseMapper; + + /** + * 操作日志记录 + * + * @param operLogEvent 操作日志事件 + */ + @Async + @EventListener + public void recordOper(OperLogEvent operLogEvent) { + Sys2OperLogBo operLog = MapstructUtils.convert(operLogEvent, Sys2OperLogBo.class); + // 远程查询操作地点 + operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp())); + insertOperlog(operLog); + } + + @Override + public TableDataInfo selectPageOperLogList(Sys2OperLogBo operLog, PageQuery pageQuery) { + Map params = operLog.getParams(); + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(operLog.getOperIp()), Sys2OperLog::getOperIp, operLog.getOperIp()) + .like(StringUtils.isNotBlank(operLog.getTitle()), Sys2OperLog::getTitle, operLog.getTitle()) + .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, + Sys2OperLog::getBusinessType, operLog.getBusinessType()) + .func(f -> { + if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { + f.in(Sys2OperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes())); + } + }) + .eq(operLog.getStatus() != null, + Sys2OperLog::getStatus, operLog.getStatus()) + .like(StringUtils.isNotBlank(operLog.getOperName()), Sys2OperLog::getOperName, operLog.getOperName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + Sys2OperLog::getOperTime, params.get("beginTime"), params.get("endTime")); + if (StringUtils.isBlank(pageQuery.getOrderByColumn())) { + pageQuery.setOrderByColumn("oper_id"); + pageQuery.setIsAsc("desc"); + } + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + /** + * 新增操作日志 + * + * @param bo 操作日志对象 + */ + @Override + public void insertOperlog(Sys2OperLogBo bo) { + Sys2OperLog operLog = MapstructUtils.convert(bo, Sys2OperLog.class); + operLog.setOperTime(new Date()); + baseMapper.insert(operLog); + } + + /** + * 查询系统操作日志集合 + * + * @param operLog 操作日志对象 + * @return 操作日志集合 + */ + @Override + public List selectOperLogList(Sys2OperLogBo operLog) { + Map params = operLog.getParams(); + return baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(operLog.getOperIp()), Sys2OperLog::getOperIp, operLog.getOperIp()) + .like(StringUtils.isNotBlank(operLog.getTitle()), Sys2OperLog::getTitle, operLog.getTitle()) + .eq(operLog.getBusinessType() != null && operLog.getBusinessType() > 0, + Sys2OperLog::getBusinessType, operLog.getBusinessType()) + .func(f -> { + if (ArrayUtil.isNotEmpty(operLog.getBusinessTypes())) { + f.in(Sys2OperLog::getBusinessType, Arrays.asList(operLog.getBusinessTypes())); + } + }) + .eq(operLog.getStatus() != null && operLog.getStatus() > 0, + Sys2OperLog::getStatus, operLog.getStatus()) + .like(StringUtils.isNotBlank(operLog.getOperName()), Sys2OperLog::getOperName, operLog.getOperName()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + Sys2OperLog::getOperTime, params.get("beginTime"), params.get("endTime")) + .orderByDesc(Sys2OperLog::getOperId)); + } + + /** + * 批量删除系统操作日志 + * + * @param operIds 需要删除的操作日志ID + * @return 结果 + */ + @Override + public int deleteOperLogByIds(Long[] operIds) { + return baseMapper.deleteByIds(Arrays.asList(operIds)); + } + + /** + * 查询操作日志详细 + * + * @param operId 操作ID + * @return 操作日志对象 + */ + @Override + public Sys2OperLogVo selectOperLogById(Long operId) { + return baseMapper.selectVoById(operId); + } + + /** + * 清空操作日志 + */ + @Override + public void cleanOperLog() { + baseMapper.delete(new LambdaQueryWrapper<>()); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OssConfigServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OssConfigServiceImpl.java new file mode 100644 index 000000000..b5ea8da69 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OssConfigServiceImpl.java @@ -0,0 +1,176 @@ +package org.dromara.system.saas.service.impl; + +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 lombok.extern.slf4j.Slf4j; +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.json.utils.JsonUtils; +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.system.saas.domain.Sys2OssConfig; +import org.dromara.system.saas.domain.bo.Sys2OssConfigBo; +import org.dromara.system.saas.domain.vo.Sys2OssConfigVo; +import org.dromara.system.saas.mapper.Sys2OssConfigMapper; +import org.dromara.system.saas.service.ISys2OssConfigService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collection; +import java.util.List; + +/** + * 对象存储配置Service业务层处理 + * + * @author Lion Li + * @author 孤舟烟雨 + * @date 2021-08-13 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class Sys2OssConfigServiceImpl implements ISys2OssConfigService { + + private final Sys2OssConfigMapper baseMapper; + + /** + * 项目启动时,初始化参数到缓存,加载配置类 + */ + @Override + public void init() { + List list = baseMapper.selectList(); + // 加载OSS初始化配置 + for (Sys2OssConfig config : list) { + 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)); + } + } + + @Override + public Sys2OssConfigVo queryById(Long ossConfigId) { + return baseMapper.selectVoById(ossConfigId); + } + + @Override + public TableDataInfo queryPageList(Sys2OssConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + + private LambdaQueryWrapper buildQueryWrapper(Sys2OssConfigBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getConfigKey()), Sys2OssConfig::getConfigKey, bo.getConfigKey()); + lqw.like(StringUtils.isNotBlank(bo.getBucketName()), Sys2OssConfig::getBucketName, bo.getBucketName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), Sys2OssConfig::getStatus, bo.getStatus()); + lqw.orderByAsc(Sys2OssConfig::getOssConfigId); + return lqw; + } + + @Override + public Boolean insertByBo(Sys2OssConfigBo bo) { + Sys2OssConfig config = MapstructUtils.convert(bo, Sys2OssConfig.class); + validEntityBeforeSave(config); + boolean flag = baseMapper.insert(config) > 0; + if (flag) { + // 从数据库查询完整的数据做缓存 + config = baseMapper.selectById(config.getOssConfigId()); + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + return flag; + } + + @Override + public Boolean updateByBo(Sys2OssConfigBo bo) { + Sys2OssConfig config = MapstructUtils.convert(bo, Sys2OssConfig.class); + validEntityBeforeSave(config); + LambdaUpdateWrapper luw = new LambdaUpdateWrapper<>(); + luw.set(ObjectUtil.isNull(config.getPrefix()), Sys2OssConfig::getPrefix, ""); + luw.set(ObjectUtil.isNull(config.getRegion()), Sys2OssConfig::getRegion, ""); + luw.set(ObjectUtil.isNull(config.getExt1()), Sys2OssConfig::getExt1, ""); + luw.set(ObjectUtil.isNull(config.getRemark()), Sys2OssConfig::getRemark, ""); + luw.eq(Sys2OssConfig::getOssConfigId, config.getOssConfigId()); + boolean flag = baseMapper.update(config, luw) > 0; + if (flag) { + // 从数据库查询完整的数据做缓存 + config = baseMapper.selectById(config.getOssConfigId()); + CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config)); + } + return flag; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(Sys2OssConfig entity) { + if (StringUtils.isNotEmpty(entity.getConfigKey()) + && !checkConfigKeyUnique(entity)) { + throw new ServiceException("操作配置'" + entity.getConfigKey() + "'失败, 配置key已存在!"); + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + if (CollUtil.containsAny(ids, OssConstant.SYSTEM_DATA_IDS)) { + throw new ServiceException("系统内置, 不可删除!"); + } + } + List list = CollUtil.newArrayList(); + for (Long configId : ids) { + Sys2OssConfig config = baseMapper.selectById(configId); + list.add(config); + } + boolean flag = baseMapper.deleteByIds(ids) > 0; + if (flag) { + list.forEach(sys2OssConfig -> + CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sys2OssConfig.getConfigKey())); + } + return flag; + } + + /** + * 判断configKey是否唯一 + */ + private boolean checkConfigKeyUnique(Sys2OssConfig sys2OssConfig) { + long ossConfigId = ObjectUtil.isNull(sys2OssConfig.getOssConfigId()) ? -1L : sys2OssConfig.getOssConfigId(); + Sys2OssConfig info = baseMapper.selectOne(new LambdaQueryWrapper() + .select(Sys2OssConfig::getOssConfigId, Sys2OssConfig::getConfigKey) + .eq(Sys2OssConfig::getConfigKey, sys2OssConfig.getConfigKey())); + if (ObjectUtil.isNotNull(info) && info.getOssConfigId() != ossConfigId) { + return false; + } + return true; + } + + /** + * 启用禁用状态 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateOssConfigStatus(Sys2OssConfigBo bo) { + Sys2OssConfig sys2OssConfig = MapstructUtils.convert(bo, Sys2OssConfig.class); + int row = baseMapper.update(null, new LambdaUpdateWrapper() + .set(Sys2OssConfig::getStatus, "1")); + row += baseMapper.updateById(sys2OssConfig); + if (row > 0) { + RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, sys2OssConfig.getConfigKey()); + } + return row; + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OssServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OssServiceImpl.java new file mode 100644 index 000000000..e5a635a71 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2OssServiceImpl.java @@ -0,0 +1,269 @@ +package org.dromara.system.saas.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.convert.Convert; +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 jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.domain.dto.OssDTO; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.SaasOssService; +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.core.utils.file.FileUtils; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.oss.core.OssClient; +import org.dromara.common.oss.entity.UploadResult; +import org.dromara.common.oss.enumd.AccessPolicyType; +import org.dromara.common.oss.factory.OssFactory; +import org.dromara.system.saas.domain.Sys2Oss; +import org.dromara.system.saas.domain.bo.Sys2OssBo; +import org.dromara.system.saas.domain.vo.Sys2OssVo; +import org.dromara.system.saas.mapper.Sys2OssMapper; +import org.dromara.system.saas.service.ISys2OssService; +import org.jetbrains.annotations.NotNull; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 文件上传 服务层实现 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class Sys2OssServiceImpl implements ISys2OssService, SaasOssService { + + private final Sys2OssMapper baseMapper; + + /** + * 查询OSS对象存储列表 + * + * @param bo OSS对象存储分页查询对象 + * @param pageQuery 分页查询实体类 + * @return 结果 + */ + @Override + public TableDataInfo queryPageList(Sys2OssBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + List filterResult = StreamUtils.toList(result.getRecords(), this::matchingUrl); + result.setRecords(filterResult); + return TableDataInfo.build(result); + } + + /** + * 根据一组 ossIds 获取对应的 Sys2OssVo 列表 + * + * @param ossIds 一组文件在数据库中的唯一标识集合 + * @return 包含 Sys2OssVo 对象的列表 + */ + @Override + public List listByIds(Collection ossIds) { + List list = new ArrayList<>(); + Sys2OssServiceImpl ossService = SpringUtils.getAopProxy(this); + for (Long id : ossIds) { + Sys2OssVo vo = ossService.getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + list.add(this.matchingUrl(vo)); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(vo); + } + } + } + return list; + } + + /** + * 根据一组 ossIds 获取对应文件的 URL 列表 + * + * @param ossIds 以逗号分隔的 ossId 字符串 + * @return 以逗号分隔的文件 URL 字符串 + */ + @Override + public String selectUrlByIds(String ossIds) { + List list = new ArrayList<>(); + Sys2OssServiceImpl ossService = SpringUtils.getAopProxy(this); + for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { + Sys2OssVo vo = ossService.getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + list.add(this.matchingUrl(vo).getUrl()); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(vo.getUrl()); + } + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + @Override + public List selectByIds(String ossIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { + Sys2OssVo vo = SpringUtils.getAopProxy(this).getById(id); + if (ObjectUtil.isNotNull(vo)) { + try { + vo.setUrl(this.matchingUrl(vo).getUrl()); + list.add(BeanUtil.toBean(vo, OssDTO.class)); + } catch (Exception ignored) { + // 如果oss异常无法连接则将数据直接返回 + list.add(BeanUtil.toBean(vo, OssDTO.class)); + } + } + } + return list; + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2OssBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getFileName()), Sys2Oss::getFileName, bo.getFileName()); + lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), Sys2Oss::getOriginalName, bo.getOriginalName()); + lqw.eq(StringUtils.isNotBlank(bo.getFileSuffix()), Sys2Oss::getFileSuffix, bo.getFileSuffix()); + lqw.eq(StringUtils.isNotBlank(bo.getUrl()), Sys2Oss::getUrl, bo.getUrl()); + lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null, + Sys2Oss::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime")); + lqw.eq(ObjectUtil.isNotNull(bo.getCreateBy()), Sys2Oss::getCreateBy, bo.getCreateBy()); + lqw.eq(StringUtils.isNotBlank(bo.getService()), Sys2Oss::getService, bo.getService()); + lqw.orderByAsc(Sys2Oss::getOssId); + return lqw; + } + + /** + * 根据 ossId 从缓存或数据库中获取 Sys2OssVo 对象 + * + * @param ossId 文件在数据库中的唯一标识 + * @return Sys2OssVo 对象,包含文件信息 + */ + @Cacheable(cacheNames = CacheNames.SYS_OSS, key = "#ossId") + @Override + public Sys2OssVo getById(Long ossId) { + return baseMapper.selectVoById(ossId); + } + + + /** + * 文件下载方法,支持一次性下载完整文件 + * + * @param ossId OSS对象ID + * @param response HttpServletResponse对象,用于设置响应头和向客户端发送文件内容 + */ + @Override + public void download(Long ossId, HttpServletResponse response) throws IOException { + Sys2OssVo sysOss = SpringUtils.getAopProxy(this).getById(ossId); + if (ObjectUtil.isNull(sysOss)) { + throw new ServiceException("文件数据不存在!"); + } + FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName()); + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8"); + OssClient storage = OssFactory.instance(sysOss.getService()); + long contentLength = storage.download(sysOss.getFileName(), response.getOutputStream()); + response.setContentLengthLong(contentLength); + } + + /** + * 上传 MultipartFile 到对象存储服务,并保存文件信息到数据库 + * + * @param file 要上传的 MultipartFile 对象 + * @return 上传成功后的 Sys2OssVo 对象,包含文件信息 + * @throws ServiceException 如果上传过程中发生异常,则抛出 ServiceException 异常 + */ + @Override + public Sys2OssVo upload(MultipartFile file) { + String originalfileName = file.getOriginalFilename(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult; + try { + uploadResult = storage.uploadSuffix(file.getBytes(), suffix); + } catch (IOException e) { + throw new ServiceException(e.getMessage()); + } + // 保存文件信息 + return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); + } + + /** + * 上传文件到对象存储服务,并保存文件信息到数据库 + * + * @param file 要上传的文件对象 + * @return 上传成功后的 Sys2OssVo 对象,包含文件信息 + */ + @Override + public Sys2OssVo upload(File file) { + String originalfileName = file.getName(); + String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length()); + OssClient storage = OssFactory.instance(); + UploadResult uploadResult = storage.uploadSuffix(file, suffix); + // 保存文件信息 + return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult); + } + + @NotNull + private Sys2OssVo buildResultEntity(String originalfileName, String suffix, String configKey, UploadResult uploadResult) { + Sys2Oss oss = new Sys2Oss(); + oss.setUrl(uploadResult.getUrl()); + oss.setFileSuffix(suffix); + oss.setFileName(uploadResult.getFilename()); + oss.setOriginalName(originalfileName); + oss.setService(configKey); + baseMapper.insert(oss); + Sys2OssVo sys2OssVo = MapstructUtils.convert(oss, Sys2OssVo.class); + return this.matchingUrl(sys2OssVo); + } + + /** + * 删除OSS对象存储 + * + * @param ids OSS对象ID串 + * @param isValid 判断是否需要校验 + * @return 结果 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // 做一些业务上的校验,判断是否需要校验 + } + List list = baseMapper.selectBatchIds(ids); + for (Sys2Oss sys2Oss : list) { + OssClient storage = OssFactory.instance(sys2Oss.getService()); + storage.delete(sys2Oss.getUrl()); + } + return baseMapper.deleteByIds(ids) > 0; + } + + /** + * 桶类型为 private 的URL 修改为临时URL时长为120s + * + * @param oss OSS对象 + * @return oss 匹配Url的OSS对象 + */ + private Sys2OssVo matchingUrl(Sys2OssVo oss) { + OssClient storage = OssFactory.instance(oss.getService()); + // 仅修改桶类型为 private 的URL,临时URL时长为120s + if (AccessPolicyType.PRIVATE == storage.getAccessPolicy()) { + oss.setUrl(storage.getPrivateUrl(oss.getFileName(), 120)); + } + return oss; + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2PermissionServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2PermissionServiceImpl.java new file mode 100644 index 000000000..c755b7bf3 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2PermissionServiceImpl.java @@ -0,0 +1,61 @@ +package org.dromara.system.saas.service.impl; + +import org.dromara.common.core.constant.TenantConstants; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.saas.service.ISysSaasMenuService; +import org.dromara.system.saas.service.ISys2PermissionService; +import org.dromara.system.saas.service.ISys2RoleService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.HashSet; +import java.util.Set; + +/** + * 用户权限处理 + * + * @author ruoyi + */ +@RequiredArgsConstructor +@Service +public class Sys2PermissionServiceImpl implements ISys2PermissionService { + + private final ISys2RoleService roleService; + private final ISysSaasMenuService menuService; + + /** + * 获取角色数据权限 + * + * @param userId 用户id + * @return 角色权限信息 + */ + @Override + public Set getRolePermission(Long userId) { + Set roles = new HashSet<>(); + // 管理员拥有所有权限 + if (LoginHelper.isSuperAdmin(userId)) { + roles.add(TenantConstants.SUPER_ADMIN_ROLE_KEY); + } else { + roles.addAll(roleService.selectRolePermissionByUserId(userId)); + } + return roles; + } + + /** + * 获取菜单数据权限 + * + * @param userId 用户id + * @return 菜单权限信息 + */ + @Override + public Set getMenuPermission(Long userId) { + Set perms = new HashSet<>(); + // 管理员拥有所有权限 + if (LoginHelper.isSuperAdmin(userId)) { + perms.add("*:*:*"); + } else { + perms.addAll(menuService.selectMenuPermsByUserId(userId)); + } + return perms; + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2PostServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2PostServiceImpl.java new file mode 100644 index 000000000..bba23b324 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2PostServiceImpl.java @@ -0,0 +1,242 @@ +package org.dromara.system.saas.service.impl; + +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.query.QueryWrapper; +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.mybatis.helper.DataBaseHelper; +import org.dromara.system.saas.domain.Sys2Dept; +import org.dromara.system.saas.domain.Sys2Post; +import org.dromara.system.saas.domain.Sys2UserPost; +import org.dromara.system.saas.domain.bo.Sys2PostBo; +import org.dromara.system.saas.domain.vo.Sys2PostVo; +import org.dromara.system.saas.mapper.Sys2DeptMapper; +import org.dromara.system.saas.mapper.Sys2PostMapper; +import org.dromara.system.saas.mapper.Sys2UserPostMapper; +import org.dromara.system.saas.service.ISys2PostService; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 岗位信息 服务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class Sys2PostServiceImpl implements ISys2PostService { + + private final Sys2PostMapper baseMapper; + private final Sys2DeptMapper deptMapper; + private final Sys2UserPostMapper userPostMapper; + + @Override + public TableDataInfo selectPagePostList(Sys2PostBo post, PageQuery pageQuery) { + Page page = baseMapper.selectPagePostList(pageQuery.build(), buildQueryWrapper(post)); + return TableDataInfo.build(page); + } + + /** + * 查询岗位信息集合 + * + * @param post 岗位信息 + * @return 岗位信息集合 + */ + @Override + public List selectPostList(Sys2PostBo post) { + return baseMapper.selectVoList(buildQueryWrapper(post)); + } + + /** + * 根据查询条件构建查询包装器 + * + * @param bo 查询条件对象 + * @return 构建好的查询包装器 + */ + private LambdaQueryWrapper buildQueryWrapper(Sys2PostBo bo) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.like(StringUtils.isNotBlank(bo.getPostCode()), Sys2Post::getPostCode, bo.getPostCode()) + .like(StringUtils.isNotBlank(bo.getPostCategory()), Sys2Post::getPostCategory, bo.getPostCategory()) + .like(StringUtils.isNotBlank(bo.getPostName()), Sys2Post::getPostName, bo.getPostName()) + .eq(StringUtils.isNotBlank(bo.getStatus()), Sys2Post::getStatus, bo.getStatus()) + .orderByAsc(Sys2Post::getPostSort); + if (ObjectUtil.isNotNull(bo.getDeptId())) { + //优先单部门搜索 + wrapper.eq(Sys2Post::getDeptId, bo.getDeptId()); + } else if (ObjectUtil.isNotNull(bo.getBelongDeptId())) { + //部门树搜索 + wrapper.and(x -> { + List deptIds = deptMapper.selectList(new LambdaQueryWrapper() + .select(Sys2Dept::getDeptId) + .apply(DataBaseHelper.findInSet(bo.getBelongDeptId(), "ancestors"))) + .stream() + .map(Sys2Dept::getDeptId) + .collect(Collectors.toList()); + deptIds.add(bo.getBelongDeptId()); + x.in(Sys2Post::getDeptId, deptIds); + }); + } + return wrapper; + } + + /** + * 查询所有岗位 + * + * @return 岗位列表 + */ + @Override + public List selectPostAll() { + return baseMapper.selectVoList(new QueryWrapper<>()); + } + + /** + * 通过岗位ID查询岗位信息 + * + * @param postId 岗位ID + * @return 角色对象信息 + */ + @Override + public Sys2PostVo selectPostById(Long postId) { + return baseMapper.selectVoById(postId); + } + + /** + * 根据用户ID获取岗位选择框列表 + * + * @param userId 用户ID + * @return 选中岗位ID列表 + */ + @Override + public List selectPostListByUserId(Long userId) { + List list = baseMapper.selectPostsByUserId(userId); + return StreamUtils.toList(list, Sys2PostVo::getPostId); + } + + /** + * 通过岗位ID串查询岗位 + * + * @param postIds 岗位id串 + * @return 岗位列表信息 + */ + @Override + public List selectPostByIds(List postIds) { + return baseMapper.selectVoList(new LambdaQueryWrapper() + .select(Sys2Post::getPostId, Sys2Post::getPostName, Sys2Post::getPostCode) + .eq(Sys2Post::getStatus, UserConstants.POST_NORMAL) + .in(CollUtil.isNotEmpty(postIds), Sys2Post::getPostId, postIds)); + } + + /** + * 校验岗位名称是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostNameUnique(Sys2PostBo post) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2Post::getPostName, post.getPostName()) + .ne(ObjectUtil.isNotNull(post.getPostId()), Sys2Post::getPostId, post.getPostId())); + return !exist; + } + + /** + * 校验岗位编码是否唯一 + * + * @param post 岗位信息 + * @return 结果 + */ + @Override + public boolean checkPostCodeUnique(Sys2PostBo post) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2Post::getPostCode, post.getPostCode()) + .ne(ObjectUtil.isNotNull(post.getPostId()), Sys2Post::getPostId, post.getPostId())); + return !exist; + } + + /** + * 通过岗位ID查询岗位使用数量 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public long countUserPostById(Long postId) { + return userPostMapper.selectCount(new LambdaQueryWrapper().eq(Sys2UserPost::getPostId, postId)); + } + + /** + * 通过部门ID查询岗位使用数量 + * + * @param deptId 部门id + * @return 结果 + */ + @Override + public long countPostByDeptId(Long deptId) { + return baseMapper.selectCount(new LambdaQueryWrapper().eq(Sys2Post::getDeptId, deptId)); + } + + /** + * 删除岗位信息 + * + * @param postId 岗位ID + * @return 结果 + */ + @Override + public int deletePostById(Long postId) { + return baseMapper.deleteById(postId); + } + + /** + * 批量删除岗位信息 + * + * @param postIds 需要删除的岗位ID + * @return 结果 + */ + @Override + public int deletePostByIds(Long[] postIds) { + for (Long postId : postIds) { + Sys2Post post = baseMapper.selectById(postId); + if (countUserPostById(postId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除!", post.getPostName())); + } + } + return baseMapper.deleteByIds(Arrays.asList(postIds)); + } + + /** + * 新增保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + @Override + public int insertPost(Sys2PostBo bo) { + Sys2Post post = MapstructUtils.convert(bo, Sys2Post.class); + return baseMapper.insert(post); + } + + /** + * 修改保存岗位信息 + * + * @param bo 岗位信息 + * @return 结果 + */ + @Override + public int updatePost(Sys2PostBo bo) { + Sys2Post post = MapstructUtils.convert(bo, Sys2Post.class); + return baseMapper.updateById(post); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2RoleServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2RoleServiceImpl.java new file mode 100644 index 000000000..f33dbd0ea --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2RoleServiceImpl.java @@ -0,0 +1,514 @@ +package org.dromara.system.saas.service.impl; + +import cn.dev33.satoken.exception.NotLoginException; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +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.TenantConstants; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.model.LoginUser; +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.saas.domain.Sys2Role; +import org.dromara.system.saas.domain.Sys2RoleDept; +import org.dromara.system.saas.domain.Sys2RoleMenu; +import org.dromara.system.saas.domain.Sys2UserRole; +import org.dromara.system.saas.domain.bo.Sys2RoleBo; +import org.dromara.system.saas.domain.vo.Sys2RoleVo; +import org.dromara.system.saas.mapper.Sys2RoleDeptMapper; +import org.dromara.system.saas.mapper.Sys2RoleMapper; +import org.dromara.system.saas.mapper.Sys2RoleMenuMapper; +import org.dromara.system.saas.mapper.Sys2UserRoleMapper; +import org.dromara.system.saas.service.ISys2RoleService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +/** + * 角色 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class Sys2RoleServiceImpl implements ISys2RoleService { + + private final Sys2RoleMapper baseMapper; + private final Sys2RoleMenuMapper roleMenuMapper; + private final Sys2UserRoleMapper userRoleMapper; + private final Sys2RoleDeptMapper roleDeptMapper; + + @Override + public TableDataInfo selectPageRoleList(Sys2RoleBo role, PageQuery pageQuery) { + Page page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role)); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询角色数据 + * + * @param role 角色信息 + * @return 角色数据集合信息 + */ + @Override + public List selectRoleList(Sys2RoleBo role) { + return baseMapper.selectRoleList(this.buildQueryWrapper(role)); + } + + private Wrapper buildQueryWrapper(Sys2RoleBo bo) { + Map params = bo.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("r.del_flag", UserConstants.ROLE_NORMAL) + .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"); + return wrapper; + } + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + @Override + public List selectRolesByUserId(Long userId) { + return baseMapper.selectRolesByUserId(userId); + } + + /** + * 根据用户ID查询角色列表(包含被授权状态) + * + * @param userId 用户ID + * @return 角色列表 + */ + @Override + public List selectRolesAuthByUserId(Long userId) { + List userRoles = baseMapper.selectRolesByUserId(userId); + List roles = selectRoleAll(); + // 使用HashSet提高查找效率 + Set userRoleIds = StreamUtils.toSet(userRoles, Sys2RoleVo::getRoleId); + for (Sys2RoleVo role : roles) { + if (userRoleIds.contains(role.getRoleId())) { + role.setFlag(true); + } + } + return roles; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectRolePermissionByUserId(Long userId) { + List perms = baseMapper.selectRolesByUserId(userId); + Set permsSet = new HashSet<>(); + for (Sys2RoleVo perm : perms) { + if (ObjectUtil.isNotNull(perm)) { + permsSet.addAll(StringUtils.splitList(perm.getRoleKey().trim())); + } + } + return permsSet; + } + + /** + * 查询所有角色 + * + * @return 角色列表 + */ + @Override + public List selectRoleAll() { + return this.selectRoleList(new Sys2RoleBo()); + } + + /** + * 根据用户ID获取角色选择框列表 + * + * @param userId 用户ID + * @return 选中角色ID列表 + */ + @Override + public List selectRoleListByUserId(Long userId) { + List list = baseMapper.selectRolesByUserId(userId); + return StreamUtils.toList(list, Sys2RoleVo::getRoleId); + } + + /** + * 通过角色ID查询角色 + * + * @param roleId 角色ID + * @return 角色对象信息 + */ + @Override + public Sys2RoleVo selectRoleById(Long roleId) { + return baseMapper.selectRoleById(roleId); + } + + /** + * 通过角色ID串查询角色 + * + * @param roleIds 角色ID串 + * @return 角色列表信息 + */ + @Override + public List selectRoleByIds(List roleIds) { + return baseMapper.selectRoleList(new QueryWrapper() + .eq("r.status", UserConstants.ROLE_NORMAL) + .in(CollUtil.isNotEmpty(roleIds), "r.role_id", roleIds)); + } + + /** + * 校验角色名称是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleNameUnique(Sys2RoleBo role) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2Role::getRoleName, role.getRoleName()) + .ne(ObjectUtil.isNotNull(role.getRoleId()), Sys2Role::getRoleId, role.getRoleId())); + return !exist; + } + + /** + * 校验角色权限是否唯一 + * + * @param role 角色信息 + * @return 结果 + */ + @Override + public boolean checkRoleKeyUnique(Sys2RoleBo role) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2Role::getRoleKey, role.getRoleKey()) + .ne(ObjectUtil.isNotNull(role.getRoleId()), Sys2Role::getRoleId, role.getRoleId())); + return !exist; + } + + /** + * 校验角色是否允许操作 + * + * @param role 角色信息 + */ + @Override + public void checkRoleAllowed(Sys2RoleBo role) { + if (ObjectUtil.isNotNull(role.getRoleId()) && LoginHelper.isSuperAdmin(role.getRoleId())) { + throw new ServiceException("不允许操作超级管理员角色"); + } + String[] keys = new String[]{TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY}; + // 新增不允许使用 管理员标识符 + if (ObjectUtil.isNull(role.getRoleId()) + && StringUtils.equalsAny(role.getRoleKey(), keys)) { + throw new ServiceException("不允许使用系统内置管理员角色标识符!"); + } + // 修改不允许修改 管理员标识符 + if (ObjectUtil.isNotNull(role.getRoleId())) { + Sys2Role sys2Role = baseMapper.selectById(role.getRoleId()); + // 如果标识符不相等 判断为修改了管理员标识符 + if (!StringUtils.equals(sys2Role.getRoleKey(), role.getRoleKey())) { + if (StringUtils.equalsAny(sys2Role.getRoleKey(), keys)) { + throw new ServiceException("不允许修改系统内置管理员角色标识符!"); + } else if (StringUtils.equalsAny(role.getRoleKey(), keys)) { + throw new ServiceException("不允许使用系统内置管理员角色标识符!"); + } + } + } + } + + /** + * 校验角色是否有数据权限 + * + * @param roleId 角色id + */ + @Override + public void checkRoleDataScope(Long roleId) { + if (ObjectUtil.isNull(roleId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + List roles = this.selectRoleList(new Sys2RoleBo(roleId)); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色数据!"); + } + + } + + /** + * 通过角色ID查询角色使用数量 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public long countUserRoleByRoleId(Long roleId) { + return userRoleMapper.selectCount(new LambdaQueryWrapper().eq(Sys2UserRole::getRoleId, roleId)); + } + + /** + * 新增保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertRole(Sys2RoleBo bo) { + Sys2Role role = MapstructUtils.convert(bo, Sys2Role.class); + // 新增角色信息 + baseMapper.insert(role); + bo.setRoleId(role.getRoleId()); + return insertRoleMenu(bo); + } + + /** + * 修改保存角色信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int updateRole(Sys2RoleBo bo) { + Sys2Role role = MapstructUtils.convert(bo, Sys2Role.class); + + if (UserConstants.ROLE_DISABLE.equals(role.getStatus()) && this.countUserRoleByRoleId(role.getRoleId()) > 0) { + throw new ServiceException("角色已分配,不能禁用!"); + } + // 修改角色信息 + baseMapper.updateById(role); + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().eq(Sys2RoleMenu::getRoleId, role.getRoleId())); + return insertRoleMenu(bo); + } + + /** + * 修改角色状态 + * + * @param roleId 角色ID + * @param status 角色状态 + * @return 结果 + */ + @Override + public int updateRoleStatus(Long roleId, String status) { + if (UserConstants.ROLE_DISABLE.equals(status) && this.countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException("角色已分配,不能禁用!"); + } + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(Sys2Role::getStatus, status) + .eq(Sys2Role::getRoleId, roleId)); + } + + /** + * 修改数据权限信息 + * + * @param bo 角色信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int authDataScope(Sys2RoleBo bo) { + Sys2Role role = MapstructUtils.convert(bo, Sys2Role.class); + // 修改角色信息 + baseMapper.updateById(role); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().eq(Sys2RoleDept::getRoleId, role.getRoleId())); + // 新增角色和部门信息(数据权限) + return insertRoleDept(bo); + } + + /** + * 新增角色菜单信息 + * + * @param role 角色对象 + */ + private int insertRoleMenu(Sys2RoleBo role) { + int rows = 1; + // 新增用户与角色管理 + List list = new ArrayList(); + for (Long menuId : role.getMenuIds()) { + Sys2RoleMenu rm = new Sys2RoleMenu(); + rm.setRoleId(role.getRoleId()); + rm.setMenuId(menuId); + list.add(rm); + } + if (list.size() > 0) { + rows = roleMenuMapper.insertBatch(list) ? list.size() : 0; + } + return rows; + } + + /** + * 新增角色部门信息(数据权限) + * + * @param role 角色对象 + */ + private int insertRoleDept(Sys2RoleBo role) { + int rows = 1; + // 新增角色与部门(数据权限)管理 + List list = new ArrayList(); + for (Long deptId : role.getDeptIds()) { + Sys2RoleDept rd = new Sys2RoleDept(); + rd.setRoleId(role.getRoleId()); + rd.setDeptId(deptId); + list.add(rd); + } + if (list.size() > 0) { + rows = roleDeptMapper.insertBatch(list) ? list.size() : 0; + } + return rows; + } + + /** + * 通过角色ID删除角色 + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteRoleById(Long roleId) { + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().eq(Sys2RoleMenu::getRoleId, roleId)); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().eq(Sys2RoleDept::getRoleId, roleId)); + return baseMapper.deleteById(roleId); + } + + /** + * 批量删除角色信息 + * + * @param roleIds 需要删除的角色ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteRoleByIds(Long[] roleIds) { + for (Long roleId : roleIds) { + Sys2Role role = baseMapper.selectById(roleId); + checkRoleAllowed(BeanUtil.toBean(role, Sys2RoleBo.class)); + checkRoleDataScope(roleId); + if (countUserRoleByRoleId(roleId) > 0) { + throw new ServiceException(String.format("%1$s已分配,不能删除!", role.getRoleName())); + } + } + List ids = Arrays.asList(roleIds); + // 删除角色与菜单关联 + roleMenuMapper.delete(new LambdaQueryWrapper().in(Sys2RoleMenu::getRoleId, ids)); + // 删除角色与部门关联 + roleDeptMapper.delete(new LambdaQueryWrapper().in(Sys2RoleDept::getRoleId, ids)); + return baseMapper.deleteByIds(ids); + } + + /** + * 取消授权用户角色 + * + * @param userRole 用户和角色关联信息 + * @return 结果 + */ + @Override + public int deleteAuthUser(Sys2UserRole userRole) { + int rows = userRoleMapper.delete(new LambdaQueryWrapper() + .eq(Sys2UserRole::getRoleId, userRole.getRoleId()) + .eq(Sys2UserRole::getUserId, userRole.getUserId())); + if (rows > 0) { + cleanOnlineUserByRole(userRole.getRoleId()); + } + return rows; + } + + /** + * 批量取消授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要取消授权的用户数据ID + * @return 结果 + */ + @Override + public int deleteAuthUsers(Long roleId, Long[] userIds) { + int rows = userRoleMapper.delete(new LambdaQueryWrapper() + .eq(Sys2UserRole::getRoleId, roleId) + .in(Sys2UserRole::getUserId, Arrays.asList(userIds))); + if (rows > 0) { + cleanOnlineUserByRole(roleId); + } + return rows; + } + + /** + * 批量选择授权用户角色 + * + * @param roleId 角色ID + * @param userIds 需要授权的用户数据ID + * @return 结果 + */ + @Override + public int insertAuthUsers(Long roleId, Long[] userIds) { + // 新增用户与角色管理 + int rows = 1; + List list = StreamUtils.toList(List.of(userIds), userId -> { + Sys2UserRole ur = new Sys2UserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + return ur; + }); + if (CollUtil.isNotEmpty(list)) { + rows = userRoleMapper.insertBatch(list) ? list.size() : 0; + } + if (rows > 0) { + cleanOnlineUserByRole(roleId); + } + return rows; + } + + @Override + public void cleanOnlineUserByRole(Long roleId) { + // 如果角色未绑定用户 直接返回 + Long num = userRoleMapper.selectCount(new LambdaQueryWrapper().eq(Sys2UserRole::getRoleId, roleId)); + if (num == 0) { + return; + } + List keys = StpUtil.searchTokenValue("", 0, -1, false); + if (CollUtil.isEmpty(keys)) { + return; + } + // 角色关联的在线用户量过大会导致redis阻塞卡顿 谨慎操作 + keys.parallelStream().forEach(key -> { + String token = StringUtils.substringAfterLast(key, ":"); + // 如果已经过期则跳过 + if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) { + return; + } + LoginUser loginUser = LoginHelper.getLoginUser(token); + if (loginUser.getRoles().stream().anyMatch(r -> r.getRoleId().equals(roleId))) { + try { + StpUtil.logoutByTokenValue(token); + } catch (NotLoginException ignored) { + } + } + }); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2SensitiveServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2SensitiveServiceImpl.java new file mode 100644 index 000000000..0e7793aba --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2SensitiveServiceImpl.java @@ -0,0 +1,47 @@ +package org.dromara.system.saas.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.sensitive.core.SensitiveService; +import org.dromara.common.tenant.helper.TenantHelper; +import org.springframework.stereotype.Service; + +/** + * 脱敏服务 + * 默认管理员不过滤 + * 需自行根据业务重写实现 + * + * @author Lion Li + * @version 3.6.0 + */ +@Service +public class Sys2SensitiveServiceImpl implements SensitiveService { + + /** + * 是否脱敏 + */ + @Override + public boolean isSensitive(String roleKey, String perms) { + if (!LoginHelper.isLogin()) { + return true; + } + boolean roleExist = StringUtils.isNotBlank(roleKey); + boolean permsExist = StringUtils.isNotBlank(perms); + if (roleExist && permsExist) { + if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) { + return false; + } + } else if (roleExist && StpUtil.hasRole(roleKey)) { + return false; + } else if (permsExist && StpUtil.hasPermission(perms)) { + return false; + } + + if (TenantHelper.isEnable()) { + return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); + } + return !LoginHelper.isSuperAdmin(); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2SocialServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2SocialServiceImpl.java new file mode 100644 index 000000000..dc884fcac --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2SocialServiceImpl.java @@ -0,0 +1,112 @@ +package org.dromara.system.saas.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.system.saas.domain.Sys2Social; +import org.dromara.system.saas.domain.bo.Sys2SocialBo; +import org.dromara.system.saas.domain.vo.Sys2SocialVo; +import org.dromara.system.saas.mapper.Sys2SocialMapper; +import org.dromara.system.saas.service.ISys2SocialService; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 社会化关系Service业务层处理 + * + * @author thiszhc + * @date 2023-06-12 + */ +@RequiredArgsConstructor +@Service +public class Sys2SocialServiceImpl implements ISys2SocialService { + + private final Sys2SocialMapper baseMapper; + + + /** + * 查询社会化关系 + */ + @Override + public Sys2SocialVo queryById(String id) { + return baseMapper.selectVoById(id); + } + + /** + * 授权列表 + */ + @Override + public List queryList(Sys2SocialBo bo) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper() + .eq(ObjectUtil.isNotNull(bo.getUserId()), Sys2Social::getUserId, bo.getUserId()) + .eq(StringUtils.isNotBlank(bo.getAuthId()), Sys2Social::getAuthId, bo.getAuthId()) + .eq(StringUtils.isNotBlank(bo.getSource()), Sys2Social::getSource, bo.getSource()); + return baseMapper.selectVoList(lqw); + } + + @Override + public List queryListByUserId(Long userId) { + return baseMapper.selectVoList(new LambdaQueryWrapper().eq(Sys2Social::getUserId, userId)); + } + + + /** + * 新增社会化关系 + */ + @Override + public Boolean insertByBo(Sys2SocialBo bo) { + Sys2Social add = MapstructUtils.convert(bo, Sys2Social.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + if (add != null) { + bo.setId(add.getId()); + } else { + return false; + } + } + return flag; + } + + /** + * 更新社会化关系 + */ + @Override + public Boolean updateByBo(Sys2SocialBo bo) { + Sys2Social update = MapstructUtils.convert(bo, Sys2Social.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(Sys2Social entity) { + //TODO 做一些数据校验,如唯一约束 + } + + + /** + * 删除社会化关系 + */ + @Override + public Boolean deleteWithValidById(Long id) { + return baseMapper.deleteById(id) > 0; + } + + + /** + * 根据 authId 查询用户信息 + * + * @param authId 认证id + * @return 授权信息 + */ + @Override + public List selectByAuthId(String authId) { + return baseMapper.selectVoList(new LambdaQueryWrapper().eq(Sys2Social::getAuthId, authId)); + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantApplicationServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantApplicationServiceImpl.java new file mode 100644 index 000000000..df00dc2b0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantApplicationServiceImpl.java @@ -0,0 +1,127 @@ +package org.dromara.system.saas.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import lombok.RequiredArgsConstructor; +import org.dromara.system.saas.domain.Sys2TenantApplication; +import org.dromara.system.saas.domain.bo.Sys2TenantApplicationBo; +import org.dromara.system.saas.domain.vo.Sys2TenantApplicationVo; +import org.dromara.system.saas.mapper.Sys2TenantApplicationMapper; +import org.dromara.system.saas.service.ISys2TenantApplicationService; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 租户和应用关联Service业务层处理 + * + * @author Lion Li + * @date 2024-09-22 + */ +@RequiredArgsConstructor +@Service +public class Sys2TenantApplicationServiceImpl implements ISys2TenantApplicationService { + + private final Sys2TenantApplicationMapper baseMapper; + + /** + * 查询租户和应用关联 + * + * @param tenantId 主键 + * @return 租户和应用关联 + */ + @Override + public Sys2TenantApplicationVo queryById(Long tenantId){ + return baseMapper.selectVoById(tenantId); + } + + /** + * 分页查询租户和应用关联列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 租户和应用关联分页列表 + */ + @Override + public TableDataInfo queryPageList(Sys2TenantApplicationBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的租户和应用关联列表 + * + * @param bo 查询条件 + * @return 租户和应用关联列表 + */ + @Override + public List queryList(Sys2TenantApplicationBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2TenantApplicationBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + return lqw; + } + + /** + * 新增租户和应用关联 + * + * @param bo 租户和应用关联 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(Sys2TenantApplicationBo bo) { + Sys2TenantApplication add = MapstructUtils.convert(bo, Sys2TenantApplication.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setTenantId(add.getTenantId()); + } + return flag; + } + + /** + * 修改租户和应用关联 + * + * @param bo 租户和应用关联 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(Sys2TenantApplicationBo bo) { + Sys2TenantApplication update = MapstructUtils.convert(bo, Sys2TenantApplication.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(Sys2TenantApplication entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除租户和应用关联信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantPackageServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantPackageServiceImpl.java new file mode 100644 index 000000000..1c3777d6a --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantPackageServiceImpl.java @@ -0,0 +1,157 @@ +package org.dromara.system.saas.service.impl; + +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.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.saas.domain.Sys2Tenant; +import org.dromara.system.saas.domain.Sys2TenantPackage; +import org.dromara.system.saas.domain.bo.Sys2TenantPackageBo; +import org.dromara.system.saas.domain.vo.Sys2TenantPackageVo; +import org.dromara.system.saas.mapper.Sys2TenantMapper; +import org.dromara.system.saas.mapper.Sys2TenantPackageMapper; +import org.dromara.system.saas.service.ISys2TenantPackageService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +/** + * 租户套餐Service业务层处理 + * + * @author Michelle.Chung + */ +@RequiredArgsConstructor +@Service +public class Sys2TenantPackageServiceImpl implements ISys2TenantPackageService { + + private final Sys2TenantPackageMapper baseMapper; + private final Sys2TenantMapper tenantMapper; + + /** + * 查询租户套餐 + */ + @Override + public Sys2TenantPackageVo queryById(Long packageId){ + return baseMapper.selectVoById(packageId); + } + + /** + * 查询租户套餐列表 + */ + @Override + public TableDataInfo queryPageList(Sys2TenantPackageBo 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(Sys2TenantPackage::getStatus, TenantConstants.NORMAL)); + } + + /** + * 查询租户套餐列表 + */ + @Override + public List queryList(Sys2TenantPackageBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2TenantPackageBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.like(StringUtils.isNotBlank(bo.getPackageName()), Sys2TenantPackage::getPackageName, bo.getPackageName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), Sys2TenantPackage::getStatus, bo.getStatus()); + lqw.orderByAsc(Sys2TenantPackage::getPackageId); + return lqw; + } + + /** + * 新增租户套餐 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(Sys2TenantPackageBo bo) { + Sys2TenantPackage add = MapstructUtils.convert(bo, Sys2TenantPackage.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(Sys2TenantPackageBo bo) { + Sys2TenantPackage update = MapstructUtils.convert(bo, Sys2TenantPackage.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; + } + + /** + * 校验套餐名称是否唯一 + */ + @Override + public boolean checkPackageNameUnique(Sys2TenantPackageBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2TenantPackage::getPackageName, bo.getPackageName()) + .ne(ObjectUtil.isNotNull(bo.getPackageId()), Sys2TenantPackage::getPackageId, bo.getPackageId())); + return !exist; + } + + /** + * 修改套餐状态 + * + * @param bo 套餐信息 + * @return 结果 + */ + @Override + public int updatePackageStatus(Sys2TenantPackageBo bo) { + Sys2TenantPackage tenantPackage = MapstructUtils.convert(bo, Sys2TenantPackage.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(Sys2Tenant::getPackageId, ids)); + if (exists) { + throw new ServiceException("租户套餐已被使用"); + } + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantServiceImpl.java new file mode 100644 index 000000000..e3961557f --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2TenantServiceImpl.java @@ -0,0 +1,372 @@ +package org.dromara.system.saas.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.saas.domain.bo.Sys2TenantBo; +import org.dromara.system.saas.domain.vo.Sys2TenantVo; +import org.dromara.system.saas.service.ISys2TenantService; +import org.dromara.system.saas.domain.*; +import org.dromara.system.saas.mapper.*; +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 Sys2TenantServiceImpl implements ISys2TenantService { + + private final Sys2TenantMapper baseMapper; + private final Sys2TenantPackageMapper tenantPackageMapper; + private final Sys2UserMapper userMapper; + private final Sys2DeptMapper deptMapper; + private final Sys2RoleMapper roleMapper; + private final Sys2RoleMenuMapper roleMenuMapper; + private final Sys2RoleDeptMapper roleDeptMapper; + private final Sys2UserRoleMapper userRoleMapper; + private final Sys2DictTypeMapper dictTypeMapper; + private final Sys2DictDataMapper dictDataMapper; + private final Sys2ConfigMapper configMapper; + + /** + * 查询租户 + */ + @Override + public Sys2TenantVo queryById(Long id) { + return baseMapper.selectVoById(id); + } + + /** + * 基于租户ID查询租户 + */ + @Cacheable(cacheNames = CacheNames.SYS_TENANT, key = "#tenantId") + @Override + public Sys2TenantVo queryByTenantId(String tenantId) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(Sys2Tenant::getTenantId, tenantId)); + } + + /** + * 查询租户列表 + */ + @Override + public TableDataInfo queryPageList(Sys2TenantBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询租户列表 + */ + @Override + public List queryList(Sys2TenantBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(Sys2TenantBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(StringUtils.isNotBlank(bo.getTenantId()), Sys2Tenant::getTenantId, bo.getTenantId()); + lqw.like(StringUtils.isNotBlank(bo.getContactUserName()), Sys2Tenant::getContactUserName, bo.getContactUserName()); + lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), Sys2Tenant::getContactPhone, bo.getContactPhone()); + lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), Sys2Tenant::getCompanyName, bo.getCompanyName()); + lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), Sys2Tenant::getLicenseNumber, bo.getLicenseNumber()); + lqw.eq(StringUtils.isNotBlank(bo.getAddress()), Sys2Tenant::getAddress, bo.getAddress()); + lqw.eq(StringUtils.isNotBlank(bo.getIntro()), Sys2Tenant::getIntro, bo.getIntro()); + lqw.like(StringUtils.isNotBlank(bo.getDomain()), Sys2Tenant::getDomain, bo.getDomain()); + lqw.eq(bo.getPackageId() != null, Sys2Tenant::getPackageId, bo.getPackageId()); + lqw.eq(bo.getExpireTime() != null, Sys2Tenant::getExpireTime, bo.getExpireTime()); + lqw.eq(bo.getAccountCount() != null, Sys2Tenant::getAccountCount, bo.getAccountCount()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), Sys2Tenant::getStatus, bo.getStatus()); + lqw.orderByAsc(Sys2Tenant::getId); + return lqw; + } + + /** + * 新增租户 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean insertByBo(Sys2TenantBo bo) { + Sys2Tenant add = MapstructUtils.convert(bo, Sys2Tenant.class); + + // 获取所有租户编号 + List tenantIds = baseMapper.selectObjs( + new LambdaQueryWrapper().select(Sys2Tenant::getTenantId), x -> {return Convert.toStr(x);}); + 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()); + + // 创建部门: 公司名是部门名称 + Sys2Dept dept = new Sys2Dept(); + dept.setTenantId(tenantId); + dept.setDeptName(bo.getCompanyName()); + dept.setParentId(Constants.TOP_PARENT_ID); + dept.setAncestors(Constants.TOP_PARENT_ID.toString()); + deptMapper.insert(dept); + Long deptId = dept.getDeptId(); + + // 角色和部门关联表 + Sys2RoleDept roleDept = new Sys2RoleDept(); + roleDept.setRoleId(roleId); + roleDept.setDeptId(deptId); + roleDeptMapper.insert(roleDept); + + // 创建系统用户 + Sys2User user = new Sys2User(); + user.setTenantId(tenantId); + user.setUserName(bo.getUsername()); + user.setNickName(bo.getUsername()); + user.setPassword(BCrypt.hashpw(bo.getPassword())); + user.setDeptId(deptId); + userMapper.insert(user); + //新增系统用户后,默认当前用户为部门的负责人 + Sys2Dept sd = new Sys2Dept(); + sd.setLeader(user.getUserId()); + sd.setDeptId(deptId); + deptMapper.updateById(sd); + + // 用户和角色关联表 + Sys2UserRole userRole = new Sys2UserRole(); + userRole.setUserId(user.getUserId()); + userRole.setRoleId(roleId); + userRoleMapper.insert(userRole); + + String defaultTenantId = TenantConstants.DEFAULT_TENANT_ID; + List dictTypeList = dictTypeMapper.selectList( + new LambdaQueryWrapper().eq(Sys2DictType::getTenantId, defaultTenantId)); + List dictDataList = dictDataMapper.selectList( + new LambdaQueryWrapper().eq(Sys2DictData::getTenantId, defaultTenantId)); + for (Sys2DictType dictType : dictTypeList) { + dictType.setDictId(null); + dictType.setTenantId(tenantId); + } + for (Sys2DictData dictData : dictDataList) { + dictData.setDictCode(null); + dictData.setTenantId(tenantId); + } + dictTypeMapper.insertBatch(dictTypeList); + dictDataMapper.insertBatch(dictDataList); + + List sys2ConfigList = configMapper.selectList( + new LambdaQueryWrapper().eq(Sys2Config::getTenantId, defaultTenantId)); + for (Sys2Config config : sys2ConfigList) { + config.setConfigId(null); + config.setTenantId(tenantId); + } + configMapper.insertBatch(sys2ConfigList); + 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) { + // 获取租户套餐 + Sys2TenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + if (ObjectUtil.isNull(tenantPackage)) { + throw new ServiceException("套餐不存在"); + } + // 获取套餐菜单id + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + + // 创建角色 + Sys2Role role = new Sys2Role(); + 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 -> { + Sys2RoleMenu roleMenu = new Sys2RoleMenu(); + 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(Sys2TenantBo bo) { + Sys2Tenant tenant = MapstructUtils.convert(bo, Sys2Tenant.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(Sys2TenantBo bo) { + Sys2Tenant tenant = MapstructUtils.convert(bo, Sys2Tenant.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.deleteByIds(ids) > 0; + } + + /** + * 校验企业名称是否唯一 + */ + @Override + public boolean checkCompanyNameUnique(Sys2TenantBo bo) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2Tenant::getCompanyName, bo.getCompanyName()) + .ne(ObjectUtil.isNotNull(bo.getTenantId()), Sys2Tenant::getTenantId, bo.getTenantId())); + return !exist; + } + + /** + * 校验账号余额 + */ + @Override + public boolean checkAccountBalance(String tenantId) { + Sys2TenantVo 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) { + Sys2TenantVo 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, Long packageId) { + Sys2TenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List roles = roleMapper.selectList( + new LambdaQueryWrapper().eq(Sys2Role::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 -> { + Sys2RoleMenu roleMenu = new Sys2RoleMenu(); + roleMenu.setRoleId(item.getRoleId()); + roleMenu.setMenuId(menuId); + roleMenus.add(roleMenu); + }); + roleMenuMapper.delete(new LambdaQueryWrapper().eq(Sys2RoleMenu::getRoleId, item.getRoleId())); + roleMenuMapper.insertBatch(roleMenus); + } else { + roleIds.add(item.getRoleId()); + } + }); + if (!roleIds.isEmpty()) { + roleMenuMapper.delete( + new LambdaQueryWrapper().in(Sys2RoleMenu::getRoleId, roleIds).notIn(!menuIds.isEmpty(), Sys2RoleMenu::getMenuId, menuIds)); + } + return true; + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2UserServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2UserServiceImpl.java new file mode 100644 index 000000000..4ce1f24ae --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/Sys2UserServiceImpl.java @@ -0,0 +1,673 @@ +package org.dromara.system.saas.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.ArrayUtil; +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 lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CacheNames; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.domain.dto.UserDTO; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.service.SaasUserService; +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.mybatis.helper.DataBaseHelper; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.system.saas.domain.bo.Sys2UserBo; +import org.dromara.system.saas.domain.vo.Sys2PostVo; +import org.dromara.system.saas.domain.vo.Sys2RoleVo; +import org.dromara.system.saas.domain.vo.Sys2UserExportVo; +import org.dromara.system.saas.domain.vo.Sys2UserVo; +import org.dromara.system.saas.service.ISys2UserService; +import org.dromara.system.saas.domain.*; +import org.dromara.system.saas.mapper.*; +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.List; +import java.util.Map; + +/** + * 用户 业务层处理 + * + * @author Lion Li + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class Sys2UserServiceImpl implements ISys2UserService, SaasUserService { + + private final Sys2UserMapper baseMapper; + private final Sys2DeptMapper deptMapper; + private final Sys2RoleMapper roleMapper; + private final Sys2PostMapper postMapper; + private final Sys2UserRoleMapper userRoleMapper; + private final Sys2UserPostMapper userPostMapper; + + @Override + public TableDataInfo selectPageUserList(Sys2UserBo user, PageQuery pageQuery) { + Page page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user)); + return TableDataInfo.build(page); + + } + + /** + * 根据条件分页查询用户列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public List selectUserExportList(Sys2UserBo user) { + return baseMapper.selectUserExportList(this.buildQueryWrapper(user)); + } + + private Wrapper buildQueryWrapper(Sys2UserBo user) { + Map params = user.getParams(); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) + .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId()) + .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()) + .between(params.get("beginTime") != null && params.get("endTime") != null, + "u.create_time", params.get("beginTime"), params.get("endTime")) + .and(ObjectUtil.isNotNull(user.getDeptId()), w -> { + List deptList = deptMapper.selectList(new LambdaQueryWrapper() + .select(Sys2Dept::getDeptId) + .apply(DataBaseHelper.findInSet(user.getDeptId(), "ancestors"))); + List ids = StreamUtils.toList(deptList, Sys2Dept::getDeptId); + ids.add(user.getDeptId()); + w.in("u.dept_id", ids); + }).orderByAsc("u.user_id"); + if (StringUtils.isNotBlank(user.getExcludeUserIds())) { + wrapper.notIn("u.user_id", StringUtils.splitTo(user.getExcludeUserIds(), Convert::toLong)); + } + return wrapper; + } + + /** + * 根据条件分页查询已分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public TableDataInfo selectAllocatedList(Sys2UserBo 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()) + .orderByAsc("u.user_id"); + Page page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper); + return TableDataInfo.build(page); + } + + /** + * 根据条件分页查询未分配用户角色列表 + * + * @param user 用户信息 + * @return 用户信息集合信息 + */ + @Override + public TableDataInfo selectUnallocatedList(Sys2UserBo user, PageQuery pageQuery) { + List userIds = userRoleMapper.selectUserIdsByRoleId(user.getRoleId()); + QueryWrapper wrapper = Wrappers.query(); + wrapper.eq("u.del_flag", UserConstants.USER_NORMAL) + .and(w -> w.ne("r.role_id", user.getRoleId()).or().isNull("r.role_id")) + .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()) + .orderByAsc("u.user_id"); + Page page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper); + return TableDataInfo.build(page); + } + + /** + * 通过用户名查询用户 + * + * @param userName 用户名 + * @return 用户对象信息 + */ + @Override + public Sys2UserVo selectUserByUserName(String userName) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(Sys2User::getUserName, userName)); + } + + /** + * 通过手机号查询用户 + * + * @param phonenumber 手机号 + * @return 用户对象信息 + */ + @Override + public Sys2UserVo selectUserByPhonenumber(String phonenumber) { + return baseMapper.selectVoOne(new LambdaQueryWrapper().eq(Sys2User::getPhonenumber, phonenumber)); + } + + /** + * 通过用户ID查询用户 + * + * @param userId 用户ID + * @return 用户对象信息 + */ + @Override + public Sys2UserVo selectUserById(Long userId) { + Sys2UserVo user = baseMapper.selectVoById(userId); + if (ObjectUtil.isNull(user)) { + return user; + } + user.setRoles(roleMapper.selectRolesByUserId(user.getUserId())); + return user; + } + + /** + * 通过用户ID串查询用户 + * + * @param userIds 用户ID串 + * @param deptId 部门id + * @return 用户列表信息 + */ + @Override + public List selectUserByIds(List userIds, Long deptId) { + return baseMapper.selectUserList(new LambdaQueryWrapper() + .select(Sys2User::getUserId, Sys2User::getUserName, Sys2User::getNickName) + .eq(Sys2User::getStatus, UserConstants.USER_NORMAL) + .eq(ObjectUtil.isNotNull(deptId), Sys2User::getDeptId, deptId) + .in(CollUtil.isNotEmpty(userIds), Sys2User::getUserId, userIds)); + } + + /** + * 查询用户所属角色组 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + public String selectUserRoleGroup(Long userId) { + List list = roleMapper.selectRolesByUserId(userId); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return StreamUtils.join(list, Sys2RoleVo::getRoleName); + } + + /** + * 查询用户所属岗位组 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + public String selectUserPostGroup(Long userId) { + List list = postMapper.selectPostsByUserId(userId); + if (CollUtil.isEmpty(list)) { + return StringUtils.EMPTY; + } + return StreamUtils.join(list, Sys2PostVo::getPostName); + } + + /** + * 校验用户名称是否唯一 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean checkUserNameUnique(Sys2UserBo user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2User::getUserName, user.getUserName()) + .ne(ObjectUtil.isNotNull(user.getUserId()), Sys2User::getUserId, user.getUserId())); + return !exist; + } + + /** + * 校验手机号码是否唯一 + * + * @param user 用户信息 + */ + @Override + public boolean checkPhoneUnique(Sys2UserBo user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2User::getPhonenumber, user.getPhonenumber()) + .ne(ObjectUtil.isNotNull(user.getUserId()), Sys2User::getUserId, user.getUserId())); + return !exist; + } + + /** + * 校验email是否唯一 + * + * @param user 用户信息 + */ + @Override + public boolean checkEmailUnique(Sys2UserBo user) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(Sys2User::getEmail, user.getEmail()) + .ne(ObjectUtil.isNotNull(user.getUserId()), Sys2User::getUserId, user.getUserId())); + return !exist; + } + + /** + * 校验用户是否允许操作 + * + * @param userId 用户ID + */ + @Override + public void checkUserAllowed(Long userId) { + if (ObjectUtil.isNotNull(userId) && LoginHelper.isSuperAdmin(userId)) { + throw new ServiceException("不允许操作超级管理员用户"); + } + } + + /** + * 校验用户是否有数据权限 + * + * @param userId 用户id + */ + @Override + public void checkUserDataScope(Long userId) { + if (ObjectUtil.isNull(userId)) { + return; + } + if (LoginHelper.isSuperAdmin()) { + return; + } + if (baseMapper.countUserById(userId) == 0) { + throw new ServiceException("没有权限访问用户数据!"); + } + } + + /** + * 新增保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int insertUser(Sys2UserBo user) { + Sys2User sys2User = MapstructUtils.convert(user, Sys2User.class); + // 新增用户信息 + int rows = baseMapper.insert(sys2User); + user.setUserId(sys2User.getUserId()); + // 新增用户岗位关联 + insertUserPost(user, false); + // 新增用户与角色管理 + insertUserRole(user, false); + return rows; + } + + /** + * 注册用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + public boolean registerUser(Sys2UserBo user, String tenantId) { + user.setCreateBy(0L); + user.setUpdateBy(0L); + Sys2User sys2User = MapstructUtils.convert(user, Sys2User.class); + sys2User.setTenantId(tenantId); + return baseMapper.insert(sys2User) > 0; + } + + /** + * 修改保存用户信息 + * + * @param user 用户信息 + * @return 结果 + */ + @Override + @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") + @Transactional(rollbackFor = Exception.class) + public int updateUser(Sys2UserBo user) { + // 新增用户与角色管理 + insertUserRole(user, true); + // 新增用户与岗位管理 + insertUserPost(user, true); + Sys2User sys2User = MapstructUtils.convert(user, Sys2User.class); + // 防止错误更新后导致的数据误删除 + int flag = baseMapper.updateById(sys2User); + if (flag < 1) { + throw new ServiceException("修改用户" + user.getUserName() + "信息失败"); + } + return flag; + } + + /** + * 用户授权角色 + * + * @param userId 用户ID + * @param roleIds 角色组 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public void insertUserAuth(Long userId, Long[] roleIds) { + insertUserRole(userId, roleIds, true); + } + + /** + * 修改用户状态 + * + * @param userId 用户ID + * @param status 帐号状态 + * @return 结果 + */ + @Override + public int updateUserStatus(Long userId, String status) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(Sys2User::getStatus, status) + .eq(Sys2User::getUserId, userId)); + } + + /** + * 修改用户基本信息 + * + * @param user 用户信息 + * @return 结果 + */ + @CacheEvict(cacheNames = CacheNames.SYS_NICKNAME, key = "#user.userId") + @Override + public int updateUserProfile(Sys2UserBo user) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(ObjectUtil.isNotNull(user.getNickName()), Sys2User::getNickName, user.getNickName()) + .set(Sys2User::getPhonenumber, user.getPhonenumber()) + .set(Sys2User::getEmail, user.getEmail()) + .set(Sys2User::getSex, user.getSex()) + .eq(Sys2User::getUserId, user.getUserId())); + } + + /** + * 修改用户头像 + * + * @param userId 用户ID + * @param avatar 头像地址 + * @return 结果 + */ + @Override + public boolean updateUserAvatar(Long userId, Long avatar) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(Sys2User::getAvatar, avatar) + .eq(Sys2User::getUserId, userId)) > 0; + } + + /** + * 重置用户密码 + * + * @param userId 用户ID + * @param password 密码 + * @return 结果 + */ + @Override + public int resetUserPwd(Long userId, String password) { + return baseMapper.update(null, + new LambdaUpdateWrapper() + .set(Sys2User::getPassword, password) + .eq(Sys2User::getUserId, userId)); + } + + /** + * 新增用户角色信息 + * + * @param user 用户对象 + * @param clear 清除已存在的关联数据 + */ + private void insertUserRole(Sys2UserBo user, boolean clear) { + this.insertUserRole(user.getUserId(), user.getRoleIds(), clear); + } + + /** + * 新增用户岗位信息 + * + * @param user 用户对象 + * @param clear 清除已存在的关联数据 + */ + private void insertUserPost(Sys2UserBo user, boolean clear) { + Long[] posts = user.getPostIds(); + if (ArrayUtil.isNotEmpty(posts)) { + if (clear) { + // 删除用户与岗位关联 + userPostMapper.delete(new LambdaQueryWrapper().eq(Sys2UserPost::getUserId, user.getUserId())); + } + // 新增用户与岗位管理 + List list = StreamUtils.toList(List.of(posts), postId -> { + Sys2UserPost up = new Sys2UserPost(); + up.setUserId(user.getUserId()); + up.setPostId(postId); + return up; + }); + userPostMapper.insertBatch(list); + } + } + + /** + * 新增用户角色信息 + * + * @param userId 用户ID + * @param roleIds 角色组 + * @param clear 清除已存在的关联数据 + */ + private void insertUserRole(Long userId, Long[] roleIds, boolean clear) { + if (ArrayUtil.isNotEmpty(roleIds)) { + List roleList = new ArrayList<>(List.of(roleIds)); + if (!LoginHelper.isSuperAdmin(userId)) { + roleList.remove(UserConstants.SUPER_ADMIN_ID); + } + // 判断是否具有此角色的操作权限 + List roles = roleMapper.selectRoleList( + new QueryWrapper().in("r.role_id", roleList)); + if (CollUtil.isEmpty(roles)) { + throw new ServiceException("没有权限访问角色的数据"); + } + if (clear) { + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().eq(Sys2UserRole::getUserId, userId)); + } + // 新增用户与角色管理 + List list = StreamUtils.toList(roleList, roleId -> { + Sys2UserRole ur = new Sys2UserRole(); + ur.setUserId(userId); + ur.setRoleId(roleId); + return ur; + }); + userRoleMapper.insertBatch(list); + } + } + + /** + * 通过用户ID删除用户 + * + * @param userId 用户ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteUserById(Long userId) { + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().eq(Sys2UserRole::getUserId, userId)); + // 删除用户与岗位表 + userPostMapper.delete(new LambdaQueryWrapper().eq(Sys2UserPost::getUserId, userId)); + // 防止更新失败导致的数据删除 + int flag = baseMapper.deleteById(userId); + if (flag < 1) { + throw new ServiceException("删除用户失败!"); + } + return flag; + } + + /** + * 批量删除用户信息 + * + * @param userIds 需要删除的用户ID + * @return 结果 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteUserByIds(Long[] userIds) { + for (Long userId : userIds) { + checkUserAllowed(userId); + checkUserDataScope(userId); + } + List ids = List.of(userIds); + // 删除用户与角色关联 + userRoleMapper.delete(new LambdaQueryWrapper().in(Sys2UserRole::getUserId, ids)); + // 删除用户与岗位表 + userPostMapper.delete(new LambdaQueryWrapper().in(Sys2UserPost::getUserId, ids)); + // 防止更新失败导致的数据删除 + int flag = baseMapper.deleteByIds(ids); + if (flag < 1) { + throw new ServiceException("删除用户失败!"); + } + return flag; + } + + /** + * 通过部门id查询当前部门所有用户 + * + * @param deptId 部门ID + * @return 用户信息集合信息 + */ + @Override + public List selectUserListByDept(Long deptId) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(Sys2User::getDeptId, deptId); + lqw.orderByAsc(Sys2User::getUserId); + return baseMapper.selectVoList(lqw); + } + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + @Cacheable(cacheNames = CacheNames.SYS_USER_NAME, key = "#userId") + @Override + public String selectUserNameById(Long userId) { + Sys2User sys2User = baseMapper.selectOne(new LambdaQueryWrapper() + .select(Sys2User::getUserName).eq(Sys2User::getUserId, userId)); + return ObjectUtil.isNull(sys2User) ? null : sys2User.getUserName(); + } + + /** + * 通过用户ID查询用户账户 + * + * @param userId 用户ID + * @return 用户账户 + */ + @Override + @Cacheable(cacheNames = CacheNames.SYS_NICKNAME, key = "#userId") + public String selectNicknameById(Long userId) { + Sys2User sys2User = baseMapper.selectOne(new LambdaQueryWrapper() + .select(Sys2User::getNickName).eq(Sys2User::getUserId, userId)); + return ObjectUtil.isNull(sys2User) ? null : sys2User.getNickName(); + } + + /** + * 通过用户ID查询用户账户 + * + * @param userIds 用户ID 多个用逗号隔开 + * @return 用户账户 + */ + @Override + public String selectNicknameByIds(String userIds) { + List list = new ArrayList<>(); + for (Long id : StringUtils.splitTo(userIds, Convert::toLong)) { + String nickname = SpringUtils.getAopProxy(this).selectNicknameById(id); + if (StringUtils.isNotBlank(nickname)) { + list.add(nickname); + } + } + return String.join(StringUtils.SEPARATOR, list); + } + + /** + * 通过用户ID查询用户手机号 + * + * @param userId 用户id + * @return 用户手机号 + */ + @Override + public String selectPhonenumberById(Long userId) { + Sys2User sys2User = baseMapper.selectOne(new LambdaQueryWrapper() + .select(Sys2User::getPhonenumber).eq(Sys2User::getUserId, userId)); + return ObjectUtil.isNull(sys2User) ? null : sys2User.getPhonenumber(); + } + + /** + * 通过用户ID查询用户邮箱 + * + * @param userId 用户id + * @return 用户邮箱 + */ + @Override + public String selectEmailById(Long userId) { + Sys2User sys2User = baseMapper.selectOne(new LambdaQueryWrapper() + .select(Sys2User::getEmail).eq(Sys2User::getUserId, userId)); + return ObjectUtil.isNull(sys2User) ? null : sys2User.getEmail(); + } + + @Override + public List selectListByIds(List userIds) { + if (CollUtil.isEmpty(userIds)) { + return List.of(); + } + List list = baseMapper.selectVoList(new LambdaQueryWrapper() + .select(Sys2User::getUserId, Sys2User::getUserName, Sys2User::getNickName, Sys2User::getEmail, Sys2User::getPhonenumber) + .eq(Sys2User::getStatus, UserConstants.USER_NORMAL) + .in(CollUtil.isNotEmpty(userIds), Sys2User::getUserId, userIds)); + return BeanUtil.copyToList(list, UserDTO.class); + } + + @Override + public List selectUserIdsByRoleIds(List roleIds) { + List userRoles = userRoleMapper.selectList( + new LambdaQueryWrapper().in(Sys2UserRole::getRoleId, roleIds)); + return StreamUtils.toList(userRoles, Sys2UserRole::getUserId); + } + + @Override + public List selectUsersByRoleIds(List roleIds) { + if (CollUtil.isEmpty(roleIds)) { + return List.of(); + } + List userRoles = userRoleMapper.selectList( + new LambdaQueryWrapper().in(Sys2UserRole::getRoleId, roleIds)); + List userIds = StreamUtils.toList(userRoles, Sys2UserRole::getUserId); + return selectListByIds(userIds); + } + + @Override + public List selectUsersByDeptIds(List deptIds) { + if (CollUtil.isEmpty(deptIds)) { + return List.of(); + } + List list = baseMapper.selectVoList(new LambdaQueryWrapper() + .select(Sys2User::getUserId, Sys2User::getUserName, Sys2User::getNickName, Sys2User::getEmail, Sys2User::getPhonenumber) + .eq(Sys2User::getStatus, UserConstants.USER_NORMAL) + .in(CollUtil.isNotEmpty(deptIds), Sys2User::getDeptId, deptIds)); + return BeanUtil.copyToList(list, UserDTO.class); + } +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/SysSaasMenuServiceImpl.java b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/SysSaasMenuServiceImpl.java new file mode 100644 index 000000000..d6c4fd11a --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/java/org/dromara/system/saas/service/impl/SysSaasMenuServiceImpl.java @@ -0,0 +1,379 @@ +package org.dromara.system.saas.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 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.saas.domain.*; +import org.dromara.system.saas.domain.bo.SysSaasMenuBo; +import org.dromara.system.saas.domain.vo.TwoMetaVo; +import org.dromara.system.saas.domain.vo.TwoRouterVo; +import org.dromara.system.saas.domain.vo.SysSaasMenuVo; +import org.dromara.system.saas.mapper.*; +import org.dromara.system.saas.service.ISysSaasMenuService; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * 菜单 业务层处理 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class SysSaasMenuServiceImpl implements ISysSaasMenuService { + + private final SysSaasMenuMapper baseMapper; + private final Sys2ApplicationMapper applicationMapper; + private final Sys2RoleMapper roleMapper; + private final Sys2RoleMenuMapper roleMenuMapper; + private final Sys2TenantPackageMapper tenantPackageMapper; + + /** + * 根据用户查询系统菜单列表 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @Override + public List selectMenuList(Long userId) { + return selectMenuList(new SysSaasMenuBo(), userId); + } + + /** + * 查询系统菜单列表 + * + * @param menu 菜单信息 + * @return 菜单列表 + */ + @Override + public List selectMenuList(SysSaasMenuBo menu, Long userId) { + List menuList; + // 管理员显示所有菜单信息 + if (LoginHelper.isSuperAdmin(userId)) { + menuList = baseMapper.selectVoList(new LambdaQueryWrapper() + .like(StringUtils.isNotBlank(menu.getMenuName()), SysSaasMenu::getMenuName, menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), SysSaasMenu::getVisible, menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), SysSaasMenu::getStatus, menu.getStatus()) + .orderByAsc(SysSaasMenu::getParentId) + .orderByAsc(SysSaasMenu::getOrderNum)); + + List appIds = menuList.stream().map(SysSaasMenuVo::getApplicationId).distinct().toList(); + if (!appIds.isEmpty()){ + List appList = applicationMapper.selectVoBatchIds(appIds) + .stream() + .map(item -> { + SysSaasMenuVo sysSaasMenuVo = new SysSaasMenuVo(); + sysSaasMenuVo.setMenuName(item.getApplicationName()); + sysSaasMenuVo.setMenuId(item.getApplicationId()); + sysSaasMenuVo.setMenuType("A"); + return sysSaasMenuVo; + }).toList(); + //TODO 继续完善,展示应用后展示菜单 + menuList.addAll(appList); + } + } else { + QueryWrapper wrapper = Wrappers.query(); + wrapper.inSql("r.role_id", "select role_id from sys2_user_role where user_id = " + userId) + .like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName()) + .eq(StringUtils.isNotBlank(menu.getVisible()), "m.visible", menu.getVisible()) + .eq(StringUtils.isNotBlank(menu.getStatus()), "m.status", menu.getStatus()) + .orderByAsc("m.parent_id") + .orderByAsc("m.order_num"); + List list = baseMapper.selectMenuListByUserId(wrapper); + menuList = MapstructUtils.convert(list, SysSaasMenuVo.class); + } + return menuList; + } + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByUserId(Long userId) { + List perms = baseMapper.selectMenuPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(StringUtils.splitList(perm.trim())); + } + } + return permsSet; + } + + /** + * 根据角色ID查询权限 + * + * @param roleId 角色ID + * @return 权限列表 + */ + @Override + public Set selectMenuPermsByRoleId(Long roleId) { + List perms = baseMapper.selectMenuPermsByRoleId(roleId); + Set permsSet = new HashSet<>(); + for (String perm : perms) { + if (StringUtils.isNotEmpty(perm)) { + permsSet.addAll(StringUtils.splitList(perm.trim())); + } + } + return permsSet; + } + + /** + * 根据用户ID查询菜单 + * + * @param userId 用户名称 + * @return 菜单列表 + */ + @Override + public List selectMenuTreeByUserId(Long userId) { + List menus; + if (LoginHelper.isSuperAdmin(userId)) { + menus = baseMapper.selectMenuTreeAll(); + } else { + menus = baseMapper.selectMenuTreeByUserId(userId); + } + return getChildPerms(menus, 0); + } + + /** + * 根据角色ID查询菜单树信息 + * + * @param roleId 角色ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByRoleId(Long roleId) { + Sys2Role role = roleMapper.selectById(roleId); + return baseMapper.selectMenuListByRoleId(roleId, role.getMenuCheckStrictly()); + } + + /** + * 根据租户套餐ID查询菜单树信息 + * + * @param packageId 租户套餐ID + * @return 选中菜单列表 + */ + @Override + public List selectMenuListByPackageId(Long packageId) { + Sys2TenantPackage tenantPackage = tenantPackageMapper.selectById(packageId); + List menuIds = StringUtils.splitTo(tenantPackage.getMenuIds(), Convert::toLong); + if (CollUtil.isEmpty(menuIds)) { + return List.of(); + } + List parentIds = null; + if (tenantPackage.getMenuCheckStrictly()) { + parentIds = baseMapper.selectObjs(new LambdaQueryWrapper() + .select(SysSaasMenu::getParentId) + .in(SysSaasMenu::getMenuId, menuIds), x -> {return Convert.toLong(x);}); + } + return baseMapper.selectObjs(new LambdaQueryWrapper() + .in(SysSaasMenu::getMenuId, menuIds) + .notIn(CollUtil.isNotEmpty(parentIds), SysSaasMenu::getMenuId, parentIds), x -> {return Convert.toLong(x);}); + } + + /** + * 构建前端路由所需要的菜单 + * 路由name命名规则 path首字母转大写 + id + * + * @param menus 菜单列表 + * @return 路由列表 + */ + @Override + public List buildMenus(List menus) { + List routers = new LinkedList<>(); + for (SysSaasMenu menu : menus) { + String name = menu.getRouteName() + menu.getMenuId(); + TwoRouterVo router = new TwoRouterVo(); + router.setHidden("1".equals(menu.getVisible())); + router.setName(name); + router.setPath(menu.getRouterPath()); + router.setComponent(menu.getComponentInfo()); + router.setQuery(menu.getQueryParam()); + router.setMeta(new TwoMetaVo(menu.getMenuName(), menu.getIcon(), StringUtils.equals("1", menu.getIsCache()), menu.getPath())); + List cMenus = menu.getChildren(); + if (CollUtil.isNotEmpty(cMenus) && UserConstants.TYPE_DIR.equals(menu.getMenuType())) { + router.setAlwaysShow(true); + router.setRedirect("noRedirect"); + router.setChildren(buildMenus(cMenus)); + } else if (menu.isMenuFrame()) { + String frameName = StringUtils.capitalize(menu.getPath()) + menu.getMenuId(); + router.setMeta(null); + List childrenList = new ArrayList<>(); + TwoRouterVo children = new TwoRouterVo(); + children.setPath(menu.getPath()); + children.setComponent(menu.getComponent()); + children.setName(frameName); + children.setMeta(new TwoMetaVo(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 && menu.isInnerLink()) { + router.setMeta(new TwoMetaVo(menu.getMenuName(), menu.getIcon())); + router.setPath("/"); + List childrenList = new ArrayList<>(); + TwoRouterVo children = new TwoRouterVo(); + String routerPath = SysSaasMenu.innerLinkReplaceEach(menu.getPath()); + String innerLinkName = StringUtils.capitalize(routerPath) + menu.getMenuId(); + children.setPath(routerPath); + children.setComponent(UserConstants.INNER_LINK); + children.setName(innerLinkName); + children.setMeta(new TwoMetaVo(menu.getMenuName(), menu.getIcon(), menu.getPath())); + childrenList.add(children); + router.setChildren(childrenList); + } + routers.add(router); + } + return routers; + } + + /** + * 构建前端所需要下拉树结构 + * + * @param menus 菜单列表 + * @return 下拉树结构列表 + */ + @Override + public List> buildMenuTreeSelect(List menus) { + if (CollUtil.isEmpty(menus)) { + return CollUtil.newArrayList(); + } + return TreeBuildUtils.build(menus, (menu, tree) -> + tree.setId(menu.getMenuId()) + .setParentId(menu.getParentId()) + .setName(menu.getMenuName()) + .setWeight(menu.getOrderNum())); + } + + /** + * 根据菜单ID查询信息 + * + * @param menuId 菜单ID + * @return 菜单信息 + */ + @Override + public SysSaasMenuVo selectMenuById(Long menuId) { + return baseMapper.selectVoById(menuId); + } + + /** + * 是否存在菜单子节点 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean hasChildByMenuId(Long menuId) { + return baseMapper.exists(new LambdaQueryWrapper().eq(SysSaasMenu::getParentId, menuId)); + } + + /** + * 查询菜单使用数量 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public boolean checkMenuExistRole(Long menuId) { + return roleMenuMapper.exists(new LambdaQueryWrapper().eq(Sys2RoleMenu::getMenuId, menuId)); + } + + /** + * 新增保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + @Override + public int insertMenu(SysSaasMenuBo bo) { + SysSaasMenu menu = MapstructUtils.convert(bo, SysSaasMenu.class); + return baseMapper.insert(menu); + } + + /** + * 修改保存菜单信息 + * + * @param bo 菜单信息 + * @return 结果 + */ + @Override + public int updateMenu(SysSaasMenuBo bo) { + SysSaasMenu menu = MapstructUtils.convert(bo, SysSaasMenu.class); + return baseMapper.updateById(menu); + } + + /** + * 删除菜单管理信息 + * + * @param menuId 菜单ID + * @return 结果 + */ + @Override + public int deleteMenuById(Long menuId) { + return baseMapper.deleteById(menuId); + } + + /** + * 校验菜单名称是否唯一 + * + * @param menu 菜单信息 + * @return 结果 + */ + @Override + public boolean checkMenuNameUnique(SysSaasMenuBo menu) { + boolean exist = baseMapper.exists(new LambdaQueryWrapper() + .eq(SysSaasMenu::getMenuName, menu.getMenuName()) + .eq(SysSaasMenu::getParentId, menu.getParentId()) + .ne(ObjectUtil.isNotNull(menu.getMenuId()), SysSaasMenu::getMenuId, menu.getMenuId())); + return !exist; + } + + /** + * 根据父节点的ID获取所有子节点 + * + * @param list 分类表 + * @param parentId 传入的父节点ID + * @return String + */ + private List getChildPerms(List list, int parentId) { + List returnList = new ArrayList<>(); + for (SysSaasMenu t : list) { + // 一、根据传入的某个父节点ID,遍历该父节点的所有子节点 + if (t.getParentId() == parentId) { + recursionFn(list, t); + returnList.add(t); + } + } + return returnList; + } + + /** + * 递归列表 + */ + private void recursionFn(List list, SysSaasMenu t) { + // 得到子节点列表 + List childList = StreamUtils.filter(list, n -> n.getParentId().equals(t.getMenuId())); + t.setChildren(childList); + for (SysSaasMenu tChild : childList) { + // 判断是否有子节点 + if (list.stream().anyMatch(n -> n.getParentId().equals(tChild.getMenuId()))) { + recursionFn(list, tChild); + } + } + } + +} diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/package-info.md b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/package-info.md new file mode 100644 index 000000000..c938b1e50 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/package-info.md @@ -0,0 +1,3 @@ +java包使用 `.` 分割 resource 目录使用 `/` 分割 +
+此文件目的 防止文件夹粘连找不到 `xml` 文件 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysApplicationMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysApplicationMapper.xml new file mode 100644 index 000000000..d70a6517d --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysApplicationMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysClientMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysClientMapper.xml new file mode 100644 index 000000000..271ec3ee5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysClientMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysConfigMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysConfigMapper.xml new file mode 100644 index 000000000..525648a6a --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysConfigMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDeptMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDeptMapper.xml new file mode 100644 index 000000000..f603daf80 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDeptMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDictDataMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDictDataMapper.xml new file mode 100644 index 000000000..8fe321028 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDictDataMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDictTypeMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDictTypeMapper.xml new file mode 100644 index 000000000..bee9cbddb --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysDictTypeMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysLogininforMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysLogininforMapper.xml new file mode 100644 index 000000000..bdc476791 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysLogininforMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysNoticeMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysNoticeMapper.xml new file mode 100644 index 000000000..e66646dc9 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysNoticeMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOperLogMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOperLogMapper.xml new file mode 100644 index 000000000..e4b225ea8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOperLogMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOssConfigMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOssConfigMapper.xml new file mode 100644 index 000000000..009cb8e7b --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOssConfigMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOssMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOssMapper.xml new file mode 100644 index 000000000..1a502a9d5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysOssMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysPostMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysPostMapper.xml new file mode 100644 index 000000000..12d428eea --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysPostMapper.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleDeptMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleDeptMapper.xml new file mode 100644 index 000000000..0baf6593e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleDeptMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleMapper.xml new file mode 100644 index 000000000..f46e5c67b --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + select distinct r.role_id, + r.role_name, + r.role_key, + r.role_sort, + r.data_scope, + r.menu_check_strictly, + r.dept_check_strictly, + r.status, + r.del_flag, + r.create_time, + r.remark + from sys2_role r + left join sys2_user_role sur on sur.role_id = r.role_id + left join sys2_user u on u.user_id = sur.user_id + left join sys2_dept d on u.dept_id = d.dept_id + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleMenuMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleMenuMapper.xml new file mode 100644 index 000000000..ad68f4fdd --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysRoleMenuMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysSaasMenuMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysSaasMenuMapper.xml new file mode 100644 index 000000000..2b7cb948e --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysSaasMenuMapper.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysSocialMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysSocialMapper.xml new file mode 100644 index 000000000..6ee49bee6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysSocialMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantApplicationMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantApplicationMapper.xml new file mode 100644 index 000000000..6b0406090 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantApplicationMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantMapper.xml new file mode 100644 index 000000000..f9288fb45 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantPackageMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantPackageMapper.xml new file mode 100644 index 000000000..f4927f0c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysTenantPackageMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserMapper.xml new file mode 100644 index 000000000..b26db5831 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserMapper.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserPostMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserPostMapper.xml new file mode 100644 index 000000000..8d5f2f904 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserPostMapper.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserRoleMapper.xml b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserRoleMapper.xml new file mode 100644 index 000000000..55c16bfd6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system-saas/src/main/resources/mapper/systemTenant/SysUserRoleMapper.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 3e3562d27..f8f4cd8c2 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -402,6 +402,16 @@ insert into sys_menu values('1509', '测试树表修改', '1506', '3', '#', insert into sys_menu values('1510', '测试树表删除', '1506', '4', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:remove', '#', 103, 1, sysdate(), null, null, ''); insert into sys_menu values('1511', '测试树表导出', '1506', '5', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:export', '#', 103, 1, sysdate(), null, null, ''); +-- lizhw 后加 +insert into sys_menu values (1837445872877223939, '多应用菜单管理', '6', '3', 'menu', 'systemSaas/menu/index', '', 1, 0, 'C', '0', '0', 'systemSaas:menu:list', 'tree-table', 103, 1, sysdate(), null, null, '多应用菜单管理菜单'); +-- 菜单管理按钮 +insert into sys_menu values (1837445872877223940, '菜单查询', '6', '1', '', '', '', 1, 0, 'F', '0', '0', 'systemSaas:menu:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values (1837445872877223941, '菜单新增', '6', '2', '', '', '', 1, 0, 'F', '0', '0', 'systemSaas:menu:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values (1837445872877223942, '菜单修改', '6', '3', '', '', '', 1, 0, 'F', '0', '0', 'systemSaas:menu:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values (1837445872877223943, '菜单删除', '6', '4', '', '', '', 1, 0, 'F', '0', '0', 'systemSaas:menu:remove', '#', 103, 1, sysdate(), null, null, ''); + + + -- ---------------------------- -- 6、用户和角色关联表 用户N-1角色 -- ---------------------------- diff --git a/script/sql/tenant/ry_vue_5.X.sql b/script/sql/tenant/ry_vue_5.X.sql new file mode 100644 index 000000000..b3a0e18eb --- /dev/null +++ b/script/sql/tenant/ry_vue_5.X.sql @@ -0,0 +1,842 @@ +create table sys_saas_application +( + application_id bigint not null comment 'id' + primary key, + application_name varchar(255) not null comment '应用名称', + application_code varchar(10) not null comment '应用code', + create_dept bigint null comment '创建部门', + create_time datetime null comment '创建时间', + create_by bigint null comment '上传人', + update_time datetime null comment '更新时间', + update_by bigint null comment '更新人', + constraint application_code + unique (application_code), + constraint application_name + unique (application_name) +) + comment '应用'; + +-- ---------------------------- +-- 第三方平台授权表 +-- ---------------------------- +create table sys2_social +( + id bigint not null comment '主键', + user_id bigint not null comment '用户ID', + tenant_id varchar(20) default null comment '租户id', + auth_id varchar(255) not null comment '平台+平台唯一id', + source varchar(255) not null comment '用户来源', + open_id varchar(255) default null comment '平台编号唯一id', + user_name varchar(30) not null comment '登录账号', + nick_name varchar(30) default '' comment '用户昵称', + email varchar(255) default '' comment '用户邮箱', + avatar varchar(500) default '' comment '头像地址', + access_token varchar(255) not null comment '用户的授权令牌', + expire_in int default null comment '用户的授权令牌的有效期,部分平台可能没有', + refresh_token varchar(255) default null comment '刷新令牌,部分平台可能没有', + access_code varchar(255) default null comment '平台的授权信息,部分平台可能没有', + union_id varchar(255) default null comment '用户的 unionid', + scope varchar(255) default null comment '授予的权限,部分平台可能没有', + token_type varchar(255) default null comment '个别平台的授权信息,部分平台可能没有', + id_token varchar(2000) default null comment 'id token,部分平台可能没有', + mac_algorithm varchar(255) default null comment '小米平台用户的附带属性,部分平台可能没有', + mac_key varchar(255) default null comment '小米平台用户的附带属性,部分平台可能没有', + code varchar(255) default null comment '用户的授权code,部分平台可能没有', + oauth_token varchar(255) default null comment 'Twitter平台用户的附带属性,部分平台可能没有', + oauth_token_secret varchar(255) default null comment 'Twitter平台用户的附带属性,部分平台可能没有', + create_dept bigint(20) comment '创建部门', + create_by bigint(20) comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) comment '更新者', + update_time datetime comment '更新时间', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + PRIMARY KEY (id) +) engine=innodb comment = '社会化关系表'; + + +-- ---------------------------- +-- 租户表 +-- ---------------------------- +create table sys2_tenant +( + id bigint(20) not null comment 'id', + tenant_id varchar(20) not null comment '租户编号', + contact_user_name varchar(20) comment '联系人', + contact_phone varchar(20) comment '联系电话', + company_name varchar(50) comment '企业名称', + license_number varchar(30) comment '统一社会信用代码', + address varchar(200) comment '地址', + intro varchar(200) comment '企业简介', + domain varchar(200) comment '域名', + remark varchar(200) comment '备注', + package_id bigint(20) comment '租户套餐编号', + expire_time datetime comment '过期时间', + account_count int default -1 comment '用户数量(-1不限制)', + status char(1) default '0' comment '租户状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_dept bigint(20) comment '创建部门', + create_by bigint(20) comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) comment '更新者', + update_time datetime comment '更新时间', + primary key (id) +) engine=innodb comment = '租户表'; + + +-- ---------------------------- +-- 初始化-租户表数据 +-- ---------------------------- + +insert into sys2_tenant values(1, '000000', '管理组', '15888888888', 'XXX有限公司', null, null, '多租户通用后台管理管理系统', null, null, null, null, -1, '0', '0', 103, 1, sysdate(), null, null); + + +-- ---------------------------- +-- 租户套餐表 +-- ---------------------------- +create table sys2_tenant_package ( + package_id bigint(20) not null comment '租户套餐id', + package_name varchar(20) comment '套餐名称', + menu_ids varchar(3000) comment '关联菜单id', + remark varchar(200) comment '备注', + menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示', + status char(1) default '0' comment '状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_dept bigint(20) comment '创建部门', + create_by bigint(20) comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) comment '更新者', + update_time datetime comment '更新时间', + primary key (package_id) +) engine=innodb comment = '租户套餐表'; + + +-- ---------------------------- +-- 1、部门表 +-- ---------------------------- +create table sys2_dept ( + dept_id bigint(20) not null comment '部门id', + tenant_id varchar(20) default '000000' comment '租户编号', + parent_id bigint(20) default 0 comment '父部门id', + ancestors varchar(500) default '' comment '祖级列表', + dept_name varchar(30) default '' comment '部门名称', + dept_category varchar(100) default null comment '部门类别编码', + order_num int(4) default 0 comment '显示顺序', + leader bigint(20) default null comment '负责人', + phone varchar(11) default null comment '联系电话', + email varchar(50) default null comment '邮箱', + status char(1) default '0' comment '部门状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime comment '更新时间', + primary key (dept_id) +) engine=innodb comment = '部门表'; + +-- ---------------------------- +-- 初始化-部门表数据 +-- ---------------------------- + + +insert into sys2_dept values(100, '000000', 0, '0', 'XXX科技', null,0, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); +insert into sys2_dept values(101, '000000', 100, '0,100', '深圳总公司', null,1, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); +insert into sys2_dept values(102, '000000', 100, '0,100', '长沙分公司', null,2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); +insert into sys2_dept values(103, '000000', 101, '0,100,101', '研发部门', null,1, 1, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); +insert into sys2_dept values(104, '000000', 101, '0,100,101', '市场部门', null,2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); +insert into sys2_dept values(105, '000000', 101, '0,100,101', '测试部门', null,3, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); +insert into sys2_dept values(106, '000000', 101, '0,100,101', '财务部门', null,4, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); +insert into sys2_dept values(107, '000000', 101, '0,100,101', '运维部门', null,5, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); +insert into sys2_dept values(108, '000000', 102, '0,100,102', '市场部门', null,1, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); +insert into sys2_dept values(109, '000000', 102, '0,100,102', '财务部门', null,2, null, '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null); + + +-- ---------------------------- +-- 2、用户信息表 +-- ---------------------------- +create table sys2_user ( + user_id bigint(20) not null comment '用户ID', + tenant_id varchar(20) default '000000' comment '租户编号', + dept_id bigint(20) default null comment '部门ID', + user_name varchar(30) not null comment '用户账号', + nick_name varchar(30) not null comment '用户昵称', + user_type varchar(10) default 'sys2_user' comment '用户类型(sys2_user系统用户)', + email varchar(50) default '' comment '用户邮箱', + phonenumber varchar(11) default '' comment '手机号码', + sex char(1) default '0' comment '用户性别(0男 1女 2未知)', + avatar bigint(20) comment '头像地址', + password varchar(100) default '' comment '密码', + status char(1) default '0' comment '帐号状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + login_ip varchar(128) default '' comment '最后登录IP', + login_date datetime comment '最后登录时间', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (user_id) +) engine=innodb comment = '用户信息表'; + +-- ---------------------------- +-- 初始化-用户信息表数据 +-- ---------------------------- +insert into sys2_user values(1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys2_user', 'crazyLionLi@163.com', '15888888888', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), null, null, '管理员'); +insert into sys2_user values(3, '000000', 108, 'test', '本部门及以下 密码666666', 'sys2_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), 3, sysdate(), null); +insert into sys2_user values(4, '000000', 102, 'test1', '仅本人 密码666666', 'sys2_user', '', '', '0', null, '$2a$10$b8yUzN0C71sbz.PhNOCgJe.Tu1yWC3RNrTyjSQ8p1W0.aaUXUJ.Ne', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), 4, sysdate(), null); + +-- ---------------------------- +-- 3、岗位信息表 +-- ---------------------------- +create table sys2_post +( + post_id bigint(20) not null comment '岗位ID', + tenant_id varchar(20) default '000000' comment '租户编号', + dept_id bigint(20) not null comment '部门id', + post_code varchar(64) not null comment '岗位编码', + post_category varchar(100) default null comment '岗位类别编码', + post_name varchar(50) not null comment '岗位名称', + post_sort int(4) not null comment '显示顺序', + status char(1) not null comment '状态(0正常 1停用)', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (post_id) +) engine=innodb comment = '岗位信息表'; + +-- ---------------------------- +-- 初始化-岗位信息表数据 +-- ---------------------------- +insert into sys2_post values(1, '000000', 103, 'ceo', null, '董事长', 1, '0', 103, 1, sysdate(), null, null, ''); +insert into sys2_post values(2, '000000', 100, 'se', null, '项目经理', 2, '0', 103, 1, sysdate(), null, null, ''); +insert into sys2_post values(3, '000000', 100, 'hr', null, '人力资源', 3, '0', 103, 1, sysdate(), null, null, ''); +insert into sys2_post values(4, '000000', 100, 'user', null, '普通员工', 4, '0', 103, 1, sysdate(), null, null, ''); + + +-- ---------------------------- +-- 4、角色信息表 +-- ---------------------------- +create table sys2_role ( + role_id bigint(20) not null comment '角色ID', + tenant_id varchar(20) default '000000' comment '租户编号', + role_name varchar(30) not null comment '角色名称', + role_key varchar(100) not null comment '角色权限字符串', + role_sort int(4) not null comment '显示顺序', + data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', + menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示', + dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示', + status char(1) not null comment '角色状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (role_id) +) engine=innodb comment = '角色信息表'; + +-- ---------------------------- +-- 初始化-角色信息表数据 +-- ---------------------------- +insert into sys2_role values(1, '000000', '超级管理员', 'superadmin', 1, 1, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '超级管理员'); +insert into sys2_role values(3, '000000', '本部门及以下', 'test1', 3, 4, 1, 1, '0', '0', 103, 1, sysdate(), null, null, ''); +insert into sys2_role values(4, '000000', '仅本人', 'test2', 4, 5, 1, 1, '0', '0', 103, 1, sysdate(), null, null, ''); + +-- ---------------------------- +-- 5、菜单权限表 +-- ---------------------------- +-- ---------------------------- +-- 5、菜单权限表 +-- ---------------------------- +create table sys_saas_menu +( + application_id bigint not null comment '应用id', + menu_id bigint(20) not null comment '菜单ID', + menu_name varchar(50) not null comment '菜单名称', + parent_id bigint(20) default 0 comment '父菜单ID', + order_num int(4) default 0 comment '显示顺序', + path varchar(200) default '' comment '路由地址', + component varchar(255) default null comment '组件路径', + query_param varchar(255) default null comment '路由参数', + is_frame int(1) default 1 comment '是否为外链(0是 1否)', + is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)', + menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)', + visible char(1) default 0 comment '显示状态(0显示 1隐藏)', + status char(1) default 0 comment '菜单状态(0正常 1停用)', + perms varchar(100) default null comment '权限标识', + icon varchar(100) default '#' comment '菜单图标', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default '' comment '备注', + primary key (application_id, menu_id) +) engine = innodb comment = '菜单权限表'; + +-- ---------------------------- +-- 初始化-菜单信息表数据 +-- ---------------------------- +-- 一级菜单 +insert into sys_saas_menu values (1837790678245658626,'1', '系统管理', '0', '1', 'system', null, '', 1, 0, 'M', '0', '0', '', 'system', 103, 1, sysdate(), null, null, '系统管理目录'); +insert into sys_saas_menu values (1837790678245658626,'6', '租户管理', '0', '2', 'tenant', null, '', 1, 0, 'M', '0', '0', '', 'chart', 103, 1, sysdate(), null, null, '租户管理目录'); +insert into sys_saas_menu values (1837790678245658626,'2', '系统监控', '0', '3', 'monitor', null, '', 1, 0, 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), null, null, '系统监控目录'); +insert into sys_saas_menu values (1837790678245658626,'3', '系统工具', '0', '4', 'tool', null, '', 1, 0, 'M', '0', '0', '', 'tool', 103, 1, sysdate(), null, null, '系统工具目录'); +insert into sys_saas_menu values (1837790678245658626,'4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '', 'guide', 103, 1, sysdate(), null, null, 'RuoYi-Vue-Plus官网地址'); +insert into sys_saas_menu values (1837790678245658626,'5', '测试菜单', '0', '5', 'demo', null, '', 1, 0, 'M', '0', '0', '', 'star', 103, 1, sysdate(), null, null, '测试菜单'); +-- 二级菜单 +insert into sys_saas_menu values (1837790678245658626,'100', '用户管理', '1', '1', 'user', 'system2/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 103, 1, sysdate(), null, null, '用户管理菜单'); +insert into sys_saas_menu values (1837790678245658626,'101', '角色管理', '1', '2', 'role', 'system2/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 103, 1, sysdate(), null, null, '角色管理菜单'); +insert into sys_saas_menu values (1837790678245658626,'102', '菜单管理', '1', '3', 'menu', 'system2/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 103, 1, sysdate(), null, null, '菜单管理菜单'); +insert into sys_saas_menu values (1837790678245658626,'103', '部门管理', '1', '4', 'dept', 'system2/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 103, 1, sysdate(), null, null, '部门管理菜单'); +insert into sys_saas_menu values (1837790678245658626,'104', '岗位管理', '1', '5', 'post', 'system2/post/index', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 103, 1, sysdate(), null, null, '岗位管理菜单'); +insert into sys_saas_menu values (1837790678245658626,'105', '字典管理', '1', '6', 'dict', 'system2/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 103, 1, sysdate(), null, null, '字典管理菜单'); +insert into sys_saas_menu values (1837790678245658626,'106', '参数设置', '1', '7', 'config', 'system2/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 103, 1, sysdate(), null, null, '参数设置菜单'); +insert into sys_saas_menu values (1837790678245658626,'107', '通知公告', '1', '8', 'notice', 'system2/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 103, 1, sysdate(), null, null, '通知公告菜单'); +insert into sys_saas_menu values (1837790678245658626,'108', '日志管理', '1', '9', 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, sysdate(), null, null, '日志管理菜单'); +insert into sys_saas_menu values (1837790678245658626,'109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, sysdate(), null, null, '在线用户菜单'); +insert into sys_saas_menu values (1837790678245658626,'113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, sysdate(), null, null, '缓存监控菜单'); +insert into sys_saas_menu values (1837790678245658626,'115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, sysdate(), null, null, '代码生成菜单'); +insert into sys_saas_menu values (1837790678245658626,'121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单'); +insert into sys_saas_menu values (1837790678245658626,'122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, + '租户套餐管理菜单'); +insert into sys_saas_menu values (1837790678245658626,'123', '客户端管理', '1', '11', 'client', 'system/client/index', '', 1, 0, 'C', '0', '0', 'system:client:list', 'international', 103, 1, sysdate(), null, null, '客户端管理菜单'); + +-- springboot-admin监控 +insert into sys_saas_menu values (1837790678245658626,'117', 'Admin监控', '2', '5', 'Admin', 'monitor/admin/index', '', 1, 0, 'C', '0', '0', 'monitor:admin:list', 'dashboard', 103, 1, sysdate(), null, null, 'Admin监控菜单'); +-- oss菜单 +insert into sys_saas_menu values (1837790678245658626,'118', '文件管理', '1', '10', 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload', 103, 1, sysdate(), null, null, '文件管理菜单'); +-- snail-job server控制台 +insert into sys_saas_menu values (1837790678245658626,'120', '任务调度中心', '2', '6', 'snailjob', 'monitor/snailjob/index', '', 1, 0, 'C', '0', '0', 'monitor:snailjob:list', 'job', 103, 1, sysdate(), null, null, 'SnailJob控制台菜单'); + +-- 三级菜单 +insert into sys_saas_menu values (1837790678245658626,'500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单'); +insert into sys_saas_menu values (1837790678245658626,'501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate(), null, null, '登录日志菜单'); +-- 用户管理按钮 +insert into sys_saas_menu values (1837790678245658626,'1001', '用户查询', '100', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1002', '用户新增', '100', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1003', '用户修改', '100', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1004', '用户删除', '100', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1005', '用户导出', '100', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1006', '用户导入', '100', '6', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1007', '重置密码', '100', '7', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 103, 1, sysdate(), null, null, ''); +-- 角色管理按钮 +insert into sys_saas_menu values (1837790678245658626,'1008', '角色查询', '101', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1009', '角色新增', '101', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1010', '角色修改', '101', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1011', '角色删除', '101', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1012', '角色导出', '101', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 103, 1, sysdate(), null, null, ''); +-- 菜单管理按钮 +insert into sys_saas_menu values (1837790678245658626,'1013', '菜单查询', '102', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1014', '菜单新增', '102', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1015', '菜单修改', '102', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1016', '菜单删除', '102', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 103, 1, sysdate(), null, null, ''); +-- 部门管理按钮 +insert into sys_saas_menu values (1837790678245658626,'1017', '部门查询', '103', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1018', '部门新增', '103', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1019', '部门修改', '103', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1020', '部门删除', '103', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 103, 1, sysdate(), null, null, ''); +-- 岗位管理按钮 +insert into sys_saas_menu values (1837790678245658626,'1021', '岗位查询', '104', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1022', '岗位新增', '104', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1023', '岗位修改', '104', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1024', '岗位删除', '104', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1025', '岗位导出', '104', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 103, 1, sysdate(), null, null, ''); +-- 字典管理按钮 +insert into sys_saas_menu values (1837790678245658626,'1026', '字典查询', '105', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1027', '字典新增', '105', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1028', '字典修改', '105', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1029', '字典删除', '105', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1030', '字典导出', '105', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 103, 1, sysdate(), null, null, ''); +-- 参数设置按钮 +insert into sys_saas_menu values (1837790678245658626,'1031', '参数查询', '106', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1032', '参数新增', '106', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1033', '参数修改', '106', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1034', '参数删除', '106', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1035', '参数导出', '106', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 103, 1, sysdate(), null, null, ''); +-- 通知公告按钮 +insert into sys_saas_menu values (1837790678245658626,'1036', '公告查询', '107', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1037', '公告新增', '107', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1038', '公告修改', '107', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1039', '公告删除', '107', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 103, 1, sysdate(), null, null, ''); +-- 操作日志按钮 +insert into sys_saas_menu values (1837790678245658626,'1040', '操作查询', '500', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1041', '操作删除', '500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1042', '日志导出', '500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1, sysdate(), null, null, ''); +-- 登录日志按钮 +insert into sys_saas_menu values (1837790678245658626,'1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1, sysdate(), null, null, ''); +-- 在线用户按钮 +insert into sys_saas_menu values (1837790678245658626,'1046', '在线查询', '109', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1047', '批量强退', '109', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1048', '单条强退', '109', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 103, 1, sysdate(), null, null, ''); +-- 代码生成按钮 +insert into sys_saas_menu values (1837790678245658626,'1055', '生成查询', '115', '1', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1056', '生成修改', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1057', '生成删除', '115', '3', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1058', '导入代码', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1059', '预览代码', '115', '4', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1060', '生成代码', '115', '5', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 103, 1, sysdate(), null, null, ''); +-- oss相关按钮 +insert into sys_saas_menu values (1837790678245658626,'1600', '文件查询', '118', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1601', '文件上传', '118', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1602', '文件下载', '118', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:download', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1603', '文件删除', '118', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1620', '配置列表', '118', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:list', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1621', '配置添加', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1622', '配置编辑', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1623', '配置删除', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:ossConfig:remove', '#', 103, 1, sysdate(), null, null, ''); + +-- 租户管理相关按钮 +insert into sys_saas_menu values (1837790678245658626,'1606', '租户查询', '121', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1607', '租户新增', '121', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1608', '租户修改', '121', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1609', '租户删除', '121', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1610', '租户导出', '121', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export', '#', 103, 1, sysdate(), null, null, ''); +-- 租户套餐管理相关按钮 +insert into sys_saas_menu values (1837790678245658626,'1611', '租户套餐查询', '122', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1612', '租户套餐新增', '122', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1613', '租户套餐修改', '122', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1614', '租户套餐删除', '122', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1615', '租户套餐导出', '122', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', '#', 103, 1, sysdate(), null, null, ''); +-- 客户端管理按钮 +insert into sys_saas_menu values (1837790678245658626,'1061', '客户端管理查询', '123', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1062', '客户端管理新增', '123', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1063', '客户端管理修改', '123', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1064', '客户端管理删除', '123', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1065', '客户端管理导出', '123', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:client:export', '#', 103, 1, sysdate(), null, null, ''); +-- 测试菜单 +insert into sys_saas_menu values (1837790678245658626,'1500', '测试单表', '5', '1', 'demo', 'demo/demo/index', '', 1, 0, 'C', '0', '0', 'demo:demo:list', '#', 103, 1, sysdate(), null, null, '测试单表菜单'); +insert into sys_saas_menu values (1837790678245658626,'1501', '测试单表查询', '1500', '1', '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1502', '测试单表新增', '1500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1503', '测试单表修改', '1500', '3', '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1504', '测试单表删除', '1500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1505', '测试单表导出', '1500', '5', '#', '', '', 1, 0, 'F', '0', '0', 'demo:demo:export', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1506', '测试树表', '5', '1', 'tree', 'demo/tree/index', '', 1, 0, 'C', '0', '0', 'demo:tree:list', '#', 103, 1, sysdate(), null, null, '测试树表菜单'); +insert into sys_saas_menu values (1837790678245658626,'1507', '测试树表查询', '1506', '1', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1508', '测试树表新增', '1506', '2', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1509', '测试树表修改', '1506', '3', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1510', '测试树表删除', '1506', '4', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:remove', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_saas_menu values (1837790678245658626,'1511', '测试树表导出', '1506', '5', '#', '', '', 1, 0, 'F', '0', '0', 'demo:tree:export', '#', 103, 1, sysdate(), null, null, ''); + + +-- lizhw后加的 +insert into sys_menu values (1837445872877223939, '多应用菜单管理', '6', '3', 'menu', 'system2/menu/index', '', 1, 0, 'C', '0', '0', 'system2:menu:list', 'tree-table', 103, 1, sysdate(), null, null, '多应用菜单管理菜单'); +-- 多应用菜单管理 +insert into sys_menu values (1837445872877223940, '多应用菜单查询', '6', '1', '', '', '', 1, 0, 'F', '0', '0', 'system2:menu:query', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values (1837445872877223941, '多应用菜单新增', '6', '2', '', '', '', 1, 0, 'F', '0', '0', 'system2:menu:add', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values (1837445872877223942, '多应用菜单修改', '6', '3', '', '', '', 1, 0, 'F', '0', '0', 'system2:menu:edit', '#', 103, 1, sysdate(), null, null, ''); +insert into sys_menu values (1837445872877223943, '多应用菜单删除', '6', '4', '', '', '', 1, 0, 'F', '0', '0', 'system2:menu:remove', '#', 103, 1, sysdate(), null, null, ''); + + +-- ---------------------------- +-- 6、用户和角色关联表 用户N-1角色 +-- ---------------------------- +create table sys2_user_role ( + user_id bigint(20) not null comment '用户ID', + role_id bigint(20) not null comment '角色ID', + primary key(user_id, role_id) +) engine=innodb comment = '用户和角色关联表'; + +-- ---------------------------- +-- 初始化-用户和角色关联表数据 +-- ---------------------------- +insert into sys2_user_role values ('1', '1'); +insert into sys2_user_role values ('3', '3'); +insert into sys2_user_role values ('4', '4'); + +-- ---------------------------- +-- 7、角色和菜单关联表 角色1-N菜单 +-- ---------------------------- +create table sys2_role_menu ( + role_id bigint(20) not null comment '角色ID', + menu_id bigint(20) not null comment '菜单ID', + primary key(role_id, menu_id) +) engine=innodb comment = '角色和菜单关联表'; + +-- ---------------------------- +-- 初始化-角色和菜单关联表数据 +-- ---------------------------- +insert into sys2_role_menu values ('3', '1'); +insert into sys2_role_menu values ('3', '5'); +insert into sys2_role_menu values ('3', '100'); +insert into sys2_role_menu values ('3', '101'); +insert into sys2_role_menu values ('3', '102'); +insert into sys2_role_menu values ('3', '103'); +insert into sys2_role_menu values ('3', '104'); +insert into sys2_role_menu values ('3', '105'); +insert into sys2_role_menu values ('3', '106'); +insert into sys2_role_menu values ('3', '107'); +insert into sys2_role_menu values ('3', '108'); +insert into sys2_role_menu values ('3', '500'); +insert into sys2_role_menu values ('3', '501'); +insert into sys2_role_menu values ('3', '1001'); +insert into sys2_role_menu values ('3', '1002'); +insert into sys2_role_menu values ('3', '1003'); +insert into sys2_role_menu values ('3', '1004'); +insert into sys2_role_menu values ('3', '1005'); +insert into sys2_role_menu values ('3', '1006'); +insert into sys2_role_menu values ('3', '1007'); +insert into sys2_role_menu values ('3', '1008'); +insert into sys2_role_menu values ('3', '1009'); +insert into sys2_role_menu values ('3', '1010'); +insert into sys2_role_menu values ('3', '1011'); +insert into sys2_role_menu values ('3', '1012'); +insert into sys2_role_menu values ('3', '1013'); +insert into sys2_role_menu values ('3', '1014'); +insert into sys2_role_menu values ('3', '1015'); +insert into sys2_role_menu values ('3', '1016'); +insert into sys2_role_menu values ('3', '1017'); +insert into sys2_role_menu values ('3', '1018'); +insert into sys2_role_menu values ('3', '1019'); +insert into sys2_role_menu values ('3', '1020'); +insert into sys2_role_menu values ('3', '1021'); +insert into sys2_role_menu values ('3', '1022'); +insert into sys2_role_menu values ('3', '1023'); +insert into sys2_role_menu values ('3', '1024'); +insert into sys2_role_menu values ('3', '1025'); +insert into sys2_role_menu values ('3', '1026'); +insert into sys2_role_menu values ('3', '1027'); +insert into sys2_role_menu values ('3', '1028'); +insert into sys2_role_menu values ('3', '1029'); +insert into sys2_role_menu values ('3', '1030'); +insert into sys2_role_menu values ('3', '1031'); +insert into sys2_role_menu values ('3', '1032'); +insert into sys2_role_menu values ('3', '1033'); +insert into sys2_role_menu values ('3', '1034'); +insert into sys2_role_menu values ('3', '1035'); +insert into sys2_role_menu values ('3', '1036'); +insert into sys2_role_menu values ('3', '1037'); +insert into sys2_role_menu values ('3', '1038'); +insert into sys2_role_menu values ('3', '1039'); +insert into sys2_role_menu values ('3', '1040'); +insert into sys2_role_menu values ('3', '1041'); +insert into sys2_role_menu values ('3', '1042'); +insert into sys2_role_menu values ('3', '1043'); +insert into sys2_role_menu values ('3', '1044'); +insert into sys2_role_menu values ('3', '1045'); +insert into sys2_role_menu values ('3', '1500'); +insert into sys2_role_menu values ('3', '1501'); +insert into sys2_role_menu values ('3', '1502'); +insert into sys2_role_menu values ('3', '1503'); +insert into sys2_role_menu values ('3', '1504'); +insert into sys2_role_menu values ('3', '1505'); +insert into sys2_role_menu values ('3', '1506'); +insert into sys2_role_menu values ('3', '1507'); +insert into sys2_role_menu values ('3', '1508'); +insert into sys2_role_menu values ('3', '1509'); +insert into sys2_role_menu values ('3', '1510'); +insert into sys2_role_menu values ('3', '1511'); +insert into sys2_role_menu values ('4', '5'); +insert into sys2_role_menu values ('4', '1500'); +insert into sys2_role_menu values ('4', '1501'); +insert into sys2_role_menu values ('4', '1502'); +insert into sys2_role_menu values ('4', '1503'); +insert into sys2_role_menu values ('4', '1504'); +insert into sys2_role_menu values ('4', '1505'); +insert into sys2_role_menu values ('4', '1506'); +insert into sys2_role_menu values ('4', '1507'); +insert into sys2_role_menu values ('4', '1508'); +insert into sys2_role_menu values ('4', '1509'); +insert into sys2_role_menu values ('4', '1510'); +insert into sys2_role_menu values ('4', '1511'); + +-- ---------------------------- +-- 8、角色和部门关联表 角色1-N部门 +-- ---------------------------- +create table sys2_role_dept ( + role_id bigint(20) not null comment '角色ID', + dept_id bigint(20) not null comment '部门ID', + primary key(role_id, dept_id) +) engine=innodb comment = '角色和部门关联表'; + +-- ---------------------------- +-- 9、用户与岗位关联表 用户1-N岗位 +-- ---------------------------- +create table sys2_user_post +( + user_id bigint(20) not null comment '用户ID', + post_id bigint(20) not null comment '岗位ID', + primary key (user_id, post_id) +) engine=innodb comment = '用户与岗位关联表'; + +-- ---------------------------- +-- 初始化-用户与岗位关联表数据 +-- ---------------------------- +insert into sys2_user_post values ('1', '1'); + +-- ---------------------------- +-- 10、操作日志记录 +-- ---------------------------- +create table sys2_oper_log ( + oper_id bigint(20) not null comment '日志主键', + tenant_id varchar(20) default '000000' comment '租户编号', + title varchar(50) default '' comment '模块标题', + business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)', + method varchar(100) default '' comment '方法名称', + request_method varchar(10) default '' comment '请求方式', + operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)', + oper_name varchar(50) default '' comment '操作人员', + dept_name varchar(50) default '' comment '部门名称', + oper_url varchar(255) default '' comment '请求URL', + oper_ip varchar(128) default '' comment '主机地址', + oper_location varchar(255) default '' comment '操作地点', + oper_param varchar(2000) default '' comment '请求参数', + json_result varchar(2000) default '' comment '返回参数', + status int(1) default 0 comment '操作状态(0正常 1异常)', + error_msg varchar(2000) default '' comment '错误消息', + oper_time datetime comment '操作时间', + cost_time bigint(20) default 0 comment '消耗时间', + primary key (oper_id), + key idx_sys2_oper_log_bt (business_type), + key idx_sys2_oper_log_s (status), + key idx_sys2_oper_log_ot (oper_time) +) engine=innodb comment = '操作日志记录'; + + +-- ---------------------------- +-- 11、字典类型表 +-- ---------------------------- +create table sys2_dict_type +( + dict_id bigint(20) not null comment '字典主键', + tenant_id varchar(20) default '000000' comment '租户编号', + dict_name varchar(100) default '' comment '字典名称', + dict_type varchar(100) default '' comment '字典类型', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (dict_id), + unique (tenant_id, dict_type) +) engine=innodb comment = '字典类型表'; + +insert into sys2_dict_type values(1, '000000', '用户性别', 'sys2_user_sex', 103, 1, sysdate(), null, null, '用户性别列表'); +insert into sys2_dict_type values(2, '000000', '菜单状态', 'sys2_show_hide', 103, 1, sysdate(), null, null, '菜单状态列表'); +insert into sys2_dict_type values(3, '000000', '系统开关', 'sys2_normal_disable', 103, 1, sysdate(), null, null, '系统开关列表'); +insert into sys2_dict_type values(6, '000000', '系统是否', 'sys2_yes_no', 103, 1, sysdate(), null, null, '系统是否列表'); +insert into sys2_dict_type values(7, '000000', '通知类型', 'sys2_notice_type', 103, 1, sysdate(), null, null, '通知类型列表'); +insert into sys2_dict_type values(8, '000000', '通知状态', 'sys2_notice_status', 103, 1, sysdate(), null, null, '通知状态列表'); +insert into sys2_dict_type values(9, '000000', '操作类型', 'sys2_oper_type', 103, 1, sysdate(), null, null, '操作类型列表'); +insert into sys2_dict_type values(10, '000000', '系统状态', 'sys2_common_status', 103, 1, sysdate(), null, null, '登录状态列表'); +insert into sys2_dict_type values(11, '000000', '授权类型', 'sys2_grant_type', 103, 1, sysdate(), null, null, '认证授权类型'); +insert into sys2_dict_type values(12, '000000', '设备类型', 'sys2_device_type', 103, 1, sysdate(), null, null, '客户端设备类型'); + + +-- ---------------------------- +-- 12、字典数据表 +-- ---------------------------- +create table sys2_dict_data +( + dict_code bigint(20) not null comment '字典编码', + tenant_id varchar(20) default '000000' comment '租户编号', + dict_sort int(4) default 0 comment '字典排序', + dict_label varchar(100) default '' comment '字典标签', + dict_value varchar(100) default '' comment '字典键值', + dict_type varchar(100) default '' comment '字典类型', + css_class varchar(100) default null comment '样式属性(其他样式扩展)', + list_class varchar(100) default null comment '表格回显样式', + is_default char(1) default 'N' comment '是否默认(Y是 N否)', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (dict_code) +) engine=innodb comment = '字典数据表'; + +insert into sys2_dict_data values(1, '000000', 1, '男', '0', 'sys2_user_sex', '', '', 'Y', 103, 1, sysdate(), null, null, '性别男'); +insert into sys2_dict_data values(2, '000000', 2, '女', '1', 'sys2_user_sex', '', '', 'N', 103, 1, sysdate(), null, null, '性别女'); +insert into sys2_dict_data values(3, '000000', 3, '未知', '2', 'sys2_user_sex', '', '', 'N', 103, 1, sysdate(), null, null, '性别未知'); +insert into sys2_dict_data values(4, '000000', 1, '显示', '0', 'sys2_show_hide', '', 'primary', 'Y', 103, 1, sysdate(), null, null, '显示菜单'); +insert into sys2_dict_data values(5, '000000', 2, '隐藏', '1', 'sys2_show_hide', '', 'danger', 'N', 103, 1, sysdate(), null, null, '隐藏菜单'); +insert into sys2_dict_data values(6, '000000', 1, '正常', '0', 'sys2_normal_disable', '', 'primary', 'Y', 103, 1, sysdate(), null, null, '正常状态'); +insert into sys2_dict_data values(7, '000000', 2, '停用', '1', 'sys2_normal_disable', '', 'danger', 'N', 103, 1, sysdate(), null, null, '停用状态'); +insert into sys2_dict_data values(12, '000000', 1, '是', 'Y', 'sys2_yes_no', '', 'primary', 'Y', 103, 1, sysdate(), null, null, '系统默认是'); +insert into sys2_dict_data values(13, '000000', 2, '否', 'N', 'sys2_yes_no', '', 'danger', 'N', 103, 1, sysdate(), null, null, '系统默认否'); +insert into sys2_dict_data values(14, '000000', 1, '通知', '1', 'sys2_notice_type', '', 'warning', 'Y', 103, 1, sysdate(), null, null, '通知'); +insert into sys2_dict_data values(15, '000000', 2, '公告', '2', 'sys2_notice_type', '', 'success', 'N', 103, 1, sysdate(), null, null, '公告'); +insert into sys2_dict_data values(16, '000000', 1, '正常', '0', 'sys2_notice_status', '', 'primary', 'Y', 103, 1, sysdate(), null, null, '正常状态'); +insert into sys2_dict_data values(17, '000000', 2, '关闭', '1', 'sys2_notice_status', '', 'danger', 'N', 103, 1, sysdate(), null, null, '关闭状态'); +insert into sys2_dict_data values(29, '000000', 99, '其他', '0', 'sys2_oper_type', '', 'info', 'N', 103, 1, sysdate(), null, null, '其他操作'); +insert into sys2_dict_data values(18, '000000', 1, '新增', '1', 'sys2_oper_type', '', 'info', 'N', 103, 1, sysdate(), null, null, '新增操作'); +insert into sys2_dict_data values(19, '000000', 2, '修改', '2', 'sys2_oper_type', '', 'info', 'N', 103, 1, sysdate(), null, null, '修改操作'); +insert into sys2_dict_data values(20, '000000', 3, '删除', '3', 'sys2_oper_type', '', 'danger', 'N', 103, 1, sysdate(), null, null, '删除操作'); +insert into sys2_dict_data values(21, '000000', 4, '授权', '4', 'sys2_oper_type', '', 'primary', 'N', 103, 1, sysdate(), null, null, '授权操作'); +insert into sys2_dict_data values(22, '000000', 5, '导出', '5', 'sys2_oper_type', '', 'warning', 'N', 103, 1, sysdate(), null, null, '导出操作'); +insert into sys2_dict_data values(23, '000000', 6, '导入', '6', 'sys2_oper_type', '', 'warning', 'N', 103, 1, sysdate(), null, null, '导入操作'); +insert into sys2_dict_data values(24, '000000', 7, '强退', '7', 'sys2_oper_type', '', 'danger', 'N', 103, 1, sysdate(), null, null, '强退操作'); +insert into sys2_dict_data values(25, '000000', 8, '生成代码', '8', 'sys2_oper_type', '', 'warning', 'N', 103, 1, sysdate(), null, null, '生成操作'); +insert into sys2_dict_data values(26, '000000', 9, '清空数据', '9', 'sys2_oper_type', '', 'danger', 'N', 103, 1, sysdate(), null, null, '清空操作'); +insert into sys2_dict_data values(27, '000000', 1, '成功', '0', 'sys2_common_status', '', 'primary', 'N', 103, 1, sysdate(), null, null, '正常状态'); +insert into sys2_dict_data values(28, '000000', 2, '失败', '1', 'sys2_common_status', '', 'danger', 'N', 103, 1, sysdate(), null, null, '停用状态'); +insert into sys2_dict_data values(30, '000000', 0, '密码认证', 'password', 'sys2_grant_type', 'el-check-tag', 'default', 'N', 103, 1, sysdate(), null, null, '密码认证'); +insert into sys2_dict_data values(31, '000000', 0, '短信认证', 'sms', 'sys2_grant_type', 'el-check-tag', 'default', 'N', 103, 1, sysdate(), null, null, '短信认证'); +insert into sys2_dict_data values(32, '000000', 0, '邮件认证', 'email', 'sys2_grant_type', 'el-check-tag', 'default', 'N', 103, 1, sysdate(), null, null, '邮件认证'); +insert into sys2_dict_data values(33, '000000', 0, '小程序认证', 'xcx', 'sys2_grant_type', 'el-check-tag', 'default', 'N', 103, 1, sysdate(), null, null, '小程序认证'); +insert into sys2_dict_data values(34, '000000', 0, '三方登录认证', 'social', 'sys2_grant_type', 'el-check-tag', 'default', 'N', 103, 1, sysdate(), null, null, '三方登录认证'); +insert into sys2_dict_data values(35, '000000', 0, 'PC', 'pc', 'sys2_device_type', '', 'default', 'N', 103, 1, sysdate(), null, null, 'PC'); +insert into sys2_dict_data values(36, '000000', 0, '安卓', 'android', 'sys2_device_type', '', 'default', 'N', 103, 1, sysdate(), null, null, '安卓'); +insert into sys2_dict_data values(37, '000000', 0, 'iOS', 'ios', 'sys2_device_type', '', 'default', 'N', 103, 1, sysdate(), null, null, 'iOS'); +insert into sys2_dict_data values(38, '000000', 0, '小程序', 'xcx', 'sys2_device_type', '', 'default', 'N', 103, 1, sysdate(), null, null, '小程序'); + + +-- ---------------------------- +-- 13、参数配置表 +-- ---------------------------- +create table sys2_config ( + config_id bigint(20) not null comment '参数主键', + tenant_id varchar(20) default '000000' comment '租户编号', + config_name varchar(100) default '' comment '参数名称', + config_key varchar(100) default '' comment '参数键名', + config_value varchar(500) default '' comment '参数键值', + config_type char(1) default 'N' comment '系统内置(Y是 N否)', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (config_id) +) engine=innodb comment = '参数配置表'; + +insert into sys2_config values(1, '000000', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 103, 1, sysdate(), null, null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' ); +insert into sys2_config values(2, '000000', '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 103, 1, sysdate(), null, null, '初始化密码 123456' ); +insert into sys2_config values(3, '000000', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 103, 1, sysdate(), null, null, '深色主题theme-dark,浅色主题theme-light' ); +insert into sys2_config values(5, '000000', '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 103, 1, sysdate(), null, null, '是否开启注册用户功能(true开启,false关闭)'); +insert into sys2_config values(11, '000000', 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 103, 1, sysdate(), null, null, 'true:开启, false:关闭'); + + +-- ---------------------------- +-- 14、系统访问记录 +-- ---------------------------- +create table sys2_logininfor ( + info_id bigint(20) not null comment '访问ID', + tenant_id varchar(20) default '000000' comment '租户编号', + user_name varchar(50) default '' comment '用户账号', + client_key varchar(32) default '' comment '客户端', + device_type varchar(32) default '' comment '设备类型', + ipaddr varchar(128) default '' comment '登录IP地址', + login_location varchar(255) default '' comment '登录地点', + browser varchar(50) default '' comment '浏览器类型', + os varchar(50) default '' comment '操作系统', + status char(1) default '0' comment '登录状态(0成功 1失败)', + msg varchar(255) default '' comment '提示消息', + login_time datetime comment '访问时间', + primary key (info_id), + key idx_sys2_logininfor_s (status), + key idx_sys2_logininfor_lt (login_time) +) engine=innodb comment = '系统访问记录'; + + +-- ---------------------------- +-- 17、通知公告表 +-- ---------------------------- +create table sys2_notice ( + notice_id bigint(20) not null comment '公告ID', + tenant_id varchar(20) default '000000' comment '租户编号', + notice_title varchar(50) not null comment '公告标题', + notice_type char(1) not null comment '公告类型(1通知 2公告)', + notice_content longblob default null comment '公告内容', + status char(1) default '0' comment '公告状态(0正常 1关闭)', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime comment '更新时间', + remark varchar(255) default null comment '备注', + primary key (notice_id) +) engine=innodb comment = '通知公告表'; + +-- ---------------------------- +-- 初始化-公告信息表数据 +-- ---------------------------- +insert into sys2_notice values('1', '000000', '温馨提醒:2018-07-01 新版本发布啦', '2', '新版本内容', '0', 103, 1, sysdate(), null, null, '管理员'); +insert into sys2_notice values('2', '000000', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容', '0', 103, 1, sysdate(), null, null, '管理员'); + +-- ---------------------------- +-- OSS对象存储表 +-- ---------------------------- +create table sys2_oss ( + oss_id bigint(20) not null comment '对象存储主键', + tenant_id varchar(20) default '000000' comment '租户编号', + file_name varchar(255) not null default '' comment '文件名', + original_name varchar(255) not null default '' comment '原名', + file_suffix varchar(10) not null default '' comment '文件后缀名', + url varchar(500) not null comment 'URL地址', + create_dept bigint(20) default null comment '创建部门', + create_time datetime default null comment '创建时间', + create_by bigint(20) default null comment '上传人', + update_time datetime default null comment '更新时间', + update_by bigint(20) default null comment '更新人', + service varchar(20) not null default 'minio' comment '服务商', + primary key (oss_id) +) engine=innodb comment ='OSS对象存储表'; + +-- ---------------------------- +-- OSS对象存储动态配置表 +-- ---------------------------- +create table sys2_oss_config ( + oss_config_id bigint(20) not null comment '主键', + tenant_id varchar(20) default '000000'comment '租户编号', + config_key varchar(20) not null default '' comment '配置key', + access_key varchar(255) default '' comment 'accessKey', + secret_key varchar(255) default '' comment '秘钥', + bucket_name varchar(255) default '' comment '桶名称', + prefix varchar(255) default '' comment '前缀', + endpoint varchar(255) default '' comment '访问站点', + domain varchar(255) default '' comment '自定义域名', + is_https char(1) default 'N' comment '是否https(Y=是,N=否)', + region varchar(255) default '' comment '域', + access_policy char(1) not null default '1' comment '桶权限类型(0=private 1=public 2=custom)', + status char(1) default '1' comment '是否默认(0=是,1=否)', + ext1 varchar(255) default '' comment '扩展字段', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime default null comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime default null comment '更新时间', + remark varchar(500) default null comment '备注', + primary key (oss_config_id) +) engine=innodb comment='对象存储配置表'; + +insert into sys2_oss_config values (1, '000000', 'minio', 'ruoyi', 'ruoyi123', 'ruoyi', '', '127.0.0.1:9000', '','N', '', '1' ,'0', '', 103, 1, sysdate(), 1, sysdate(), null); +insert into sys2_oss_config values (2, '000000', 'qiniu', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 's3-cn-north-1.qiniucs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); +insert into sys2_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 'oss-cn-beijing.aliyuncs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); +insert into sys2_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); +insert into sys2_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), null); + +-- ---------------------------- +-- 系统授权表 +-- ---------------------------- +create table sys2_client ( + id bigint(20) not null comment 'id', + client_id varchar(64) default null comment '客户端id', + client_key varchar(32) default null comment '客户端key', + client_secret varchar(255) default null comment '客户端秘钥', + grant_type varchar(255) default null comment '授权类型', + device_type varchar(32) default null comment '设备类型', + active_timeout int(11) default 1800 comment 'token活跃超时时间', + timeout int(11) default 604800 comment 'token固定超时', + status char(1) default '0' comment '状态(0正常 1停用)', + del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)', + create_dept bigint(20) default null comment '创建部门', + create_by bigint(20) default null comment '创建者', + create_time datetime default null comment '创建时间', + update_by bigint(20) default null comment '更新者', + update_time datetime default null comment '更新时间', + primary key (id) +) engine=innodb comment='系统授权表'; + +insert into sys2_client values (1, 'e5cd7e4891bf95d1d19206ce24a7b32e', 'pc', 'pc123', 'password,social', 'pc', 1800, 604800, 0, 0, 103, 1, sysdate(), 1, sysdate()); +insert into sys2_client values (2, '428a8310cd442757ae699df5d894f051', 'app', 'app123', 'password,sms,social', 'android', 1800, 604800, 0, 0, 103, 1, sysdate(), 1, sysdate()); \ No newline at end of file