From 8d094e48ac9ae27eb25d7d170afd475bbf546877 Mon Sep 17 00:00:00 2001 From: njydsz Date: Wed, 25 Sep 2024 11:38:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=BF=AE=E5=A4=8D=E5=B7=B2=E7=9F=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E6=8F=90=E5=8D=87=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=A8=B3=E5=AE=9A=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/config/nacos/bootstrap.yml | 48 - .../config/application-local.yml | 60 +- docs/{config => envs}/config/application.yml | 55 +- .../nacos/remi-boot-web-dev.yaml} | 56 +- .../nacos/remi-cloud-dev.yaml | 35 +- docs/envs/nacos/remi-demo-web-dev.yaml | 106 + docs/generator/EasyCodeConfig.json | 139 - docs/images/ai-remi.png | Bin 0 -> 4532874 bytes docs/pdmaner/remi-cloud.pdma.json | 19082 ---------------- pom.xml | 489 +- remi-boot/pom.xml | 229 + remi-boot/remi-boot-api/pom.xml | 39 + .../ai/remi/boot/api/client/IamClientApi.java | 31 + .../boot/api/factory/IamClientFactory.java | 18 + .../boot/api/fallback/IamClientFallback.java | 35 + .../remi-boot-app}/pom.xml | 43 +- .../java/ai/remi/boot}/app/Application.java | 6 +- .../src/main/resources/bootstrap.yml | 6 +- .../src/main/resources/docker}/Dockerfile | 10 +- .../src/main/resources/docker/README.md | 5 + .../main/resources/docker/docker_deploy.sh | 7 + .../src/main/resources/logback-spring.xml | 0 .../remi-boot-domain}/pom.xml | 30 +- .../boot}/domain/constant/Cas3Constant.java | 2 +- .../boot}/domain/constant/JwtConstant.java | 2 +- .../boot}/domain/constant/Oauth2Constant.java | 2 +- .../boot/domain/constant/OidcConstant.java | 4 + .../boot}/domain/constant/Saml2Constant.java | 2 +- .../boot}/domain/constant/SsoConstant.java | 2 +- .../converter/AccessTokenConverter.java | 12 +- .../boot}/domain/converter/AppConverter.java | 12 +- .../domain/converter/AppGroupConverter.java | 12 +- .../domain/converter/AppMenuConverter.java | 12 +- .../domain/converter/AppPublishConverter.java | 12 +- .../boot}/domain/converter/AreaConverter.java | 12 +- .../domain/converter/BucketConverter.java | 12 +- .../domain/converter/CompanyConverter.java | 12 +- .../converter/CompanyDeptConverter.java | 12 +- .../domain/converter/ConfigConverter.java | 12 +- .../domain/converter/CordRoleConverter.java | 12 +- .../boot}/domain/converter/DeptConverter.java | 12 +- .../domain/converter/DeptUserConverter.java | 12 +- .../boot}/domain/converter/DictConverter.java | 12 +- .../domain/converter/DictItemConverter.java | 12 +- .../boot}/domain/converter/FileConverter.java | 12 +- .../domain/converter/GradeConverter.java | 12 +- .../domain/converter/GroupConverter.java | 12 +- .../domain/converter/GroupRoleConverter.java | 12 +- .../domain/converter/GroupUserConverter.java | 12 +- .../domain/converter/LogRecordConverter.java | 12 +- .../boot}/domain/converter/MenuConverter.java | 12 +- .../domain/converter/NoticeConverter.java | 12 +- .../domain/converter/OauthCodeConverter.java | 12 +- .../domain/converter/PositionConverter.java | 12 +- .../domain/converter/PostRoleConverter.java | 12 +- .../boot}/domain/converter/RankConverter.java | 12 +- .../converter/RefreshTokenConverter.java | 12 +- .../domain/converter/RestrictIpConverter.java | 12 +- .../boot}/domain/converter/RoleConverter.java | 12 +- .../domain/converter/RoleMenuConverter.java | 12 +- .../boot}/domain/converter/UserConverter.java | 12 +- .../domain/converter/UserPostConverter.java | 12 +- .../domain/converter/UserRoleConverter.java | 12 +- .../domain/dto/post/AccessTokenPostDTO.java | 2 +- .../domain/dto/post/AppGroupPostDTO.java | 2 +- .../boot}/domain/dto/post/AppMenuPostDTO.java | 2 +- .../boot}/domain/dto/post/AppPostDTO.java | 2 +- .../domain/dto/post/AppPublishPostDTO.java | 2 +- .../boot}/domain/dto/post/AreaPostDTO.java | 2 +- .../boot}/domain/dto/post/BucketPostDTO.java | 2 +- .../domain/dto/post/CompanyDeptPostDTO.java | 2 +- .../boot}/domain/dto/post/CompanyPostDTO.java | 2 +- .../boot}/domain/dto/post/ConfigPostDTO.java | 2 +- .../domain/dto/post/CordRolePostDTO.java | 2 +- .../boot}/domain/dto/post/DeptPostDTO.java | 2 +- .../domain/dto/post/DeptUserPostDTO.java | 2 +- .../domain/dto/post/DictItemPostDTO.java | 2 +- .../boot}/domain/dto/post/DictPostDTO.java | 2 +- .../boot}/domain/dto/post/FilePostDTO.java | 2 +- .../boot}/domain/dto/post/GradePostDTO.java | 2 +- .../boot}/domain/dto/post/GroupPostDTO.java | 2 +- .../domain/dto/post/GroupRolePostDTO.java | 2 +- .../domain/dto/post/GroupUserPostDTO.java | 2 +- .../domain/dto/post/LogRecordPostDTO.java | 2 +- .../boot}/domain/dto/post/LoginPostDTO.java | 2 +- .../boot}/domain/dto/post/MenuPostDTO.java | 2 +- .../boot}/domain/dto/post/NoticePostDTO.java | 6 +- .../domain/dto/post/OauthCodePostDTO.java | 2 +- .../domain/dto/post/PositionPostDTO.java | 2 +- .../domain/dto/post/PostRolePostDTO.java | 2 +- .../boot}/domain/dto/post/RankPostDTO.java | 2 +- .../domain/dto/post/RefreshTokenPostDTO.java | 2 +- .../domain/dto/post/RestrictIpPostDTO.java | 2 +- .../domain/dto/post/RoleMenuPostDTO.java | 2 +- .../boot}/domain/dto/post/RolePostDTO.java | 2 +- .../boot}/domain/dto/post/UserPostDTO.java | 2 +- .../domain/dto/post/UserPostPostDTO.java | 2 +- .../domain/dto/post/UserRolePostDTO.java | 2 +- .../domain/dto/put/AccessTokenPutDTO.java | 2 +- .../boot}/domain/dto/put/AppGroupPutDTO.java | 2 +- .../boot}/domain/dto/put/AppMenuPutDTO.java | 2 +- .../domain/dto/put/AppPublishPutDTO.java | 2 +- .../remi/boot}/domain/dto/put/AppPutDTO.java | 4 +- .../remi/boot}/domain/dto/put/AreaPutDTO.java | 2 +- .../boot}/domain/dto/put/BucketPutDTO.java | 2 +- .../domain/dto/put/CompanyDeptPutDTO.java | 2 +- .../boot}/domain/dto/put/CompanyPutDTO.java | 2 +- .../boot}/domain/dto/put/ConfigPutDTO.java | 2 +- .../boot}/domain/dto/put/CordRolePutDTO.java | 2 +- .../remi/boot}/domain/dto/put/DeptPutDTO.java | 2 +- .../boot}/domain/dto/put/DeptUserPutDTO.java | 2 +- .../boot}/domain/dto/put/DictItemPutDTO.java | 2 +- .../remi/boot}/domain/dto/put/DictPutDTO.java | 2 +- .../remi/boot}/domain/dto/put/FilePutDTO.java | 2 +- .../boot}/domain/dto/put/GradePutDTO.java | 2 +- .../boot}/domain/dto/put/GroupPutDTO.java | 2 +- .../boot}/domain/dto/put/GroupRolePutDTO.java | 2 +- .../boot}/domain/dto/put/GroupUserPutDTO.java | 2 +- .../boot}/domain/dto/put/LogRecordPutDTO.java | 2 +- .../remi/boot}/domain/dto/put/MenuPutDTO.java | 2 +- .../boot}/domain/dto/put/NoticePutDTO.java | 6 +- .../boot}/domain/dto/put/OauthCodePutDTO.java | 2 +- .../boot}/domain/dto/put/PositionPutDTO.java | 2 +- .../boot}/domain/dto/put/PostRolePutDTO.java | 2 +- .../remi/boot}/domain/dto/put/RankPutDTO.java | 2 +- .../domain/dto/put/RefreshTokenPutDTO.java | 2 +- .../domain/dto/put/RestrictIpPutDTO.java | 2 +- .../boot}/domain/dto/put/RoleMenuPutDTO.java | 2 +- .../remi/boot}/domain/dto/put/RolePutDTO.java | 2 +- .../boot}/domain/dto/put/UserPostPutDTO.java | 2 +- .../remi/boot}/domain/dto/put/UserPutDTO.java | 2 +- .../boot}/domain/dto/put/UserRolePutDTO.java | 2 +- .../remi/boot}/domain/entity/AccessToken.java | 4 +- .../java/ai/remi/boot}/domain/entity/App.java | 4 +- .../ai/remi/boot}/domain/entity/AppGroup.java | 4 +- .../ai/remi/boot}/domain/entity/AppMenu.java | 4 +- .../remi/boot}/domain/entity/AppPublish.java | 4 +- .../ai/remi/boot}/domain/entity/Area.java | 4 +- .../ai/remi/boot}/domain/entity/Bucket.java | 4 +- .../ai/remi/boot}/domain/entity/Company.java | 4 +- .../remi/boot}/domain/entity/CompanyDept.java | 4 +- .../ai/remi/boot}/domain/entity/Config.java | 4 +- .../ai/remi/boot}/domain/entity/CordRole.java | 4 +- .../ai/remi/boot}/domain/entity/Dept.java | 4 +- .../ai/remi/boot}/domain/entity/DeptUser.java | 4 +- .../ai/remi/boot}/domain/entity/Dict.java | 4 +- .../ai/remi/boot}/domain/entity/DictItem.java | 4 +- .../ai/remi/boot}/domain/entity/File.java | 4 +- .../ai/remi/boot}/domain/entity/Grade.java | 4 +- .../ai/remi/boot}/domain/entity/Group.java | 4 +- .../remi/boot}/domain/entity/GroupRole.java | 4 +- .../remi/boot}/domain/entity/GroupUser.java | 4 +- .../remi/boot}/domain/entity/LogRecord.java | 4 +- .../ai/remi/boot}/domain/entity/Menu.java | 4 +- .../ai/remi/boot}/domain/entity/Notice.java | 8 +- .../remi/boot}/domain/entity/OauthCode.java | 4 +- .../ai/remi/boot}/domain/entity/Position.java | 4 +- .../ai/remi/boot}/domain/entity/PostRole.java | 4 +- .../ai/remi/boot}/domain/entity/Rank.java | 4 +- .../boot}/domain/entity/RefreshToken.java | 4 +- .../remi/boot}/domain/entity/RestrictIp.java | 4 +- .../ai/remi/boot}/domain/entity/Role.java | 4 +- .../ai/remi/boot}/domain/entity/RoleMenu.java | 4 +- .../ai/remi/boot}/domain/entity/User.java | 4 +- .../ai/remi/boot}/domain/entity/UserPost.java | 4 +- .../ai/remi/boot}/domain/entity/UserRole.java | 4 +- .../boot}/domain/enums/Oauth2TypeEnum.java | 2 +- .../remi/boot}/domain/enums/RedisKeyEnum.java | 2 +- .../boot}/domain/query/AccessTokenQuery.java | 2 +- .../boot}/domain/query/AppGroupQuery.java | 2 +- .../remi/boot}/domain/query/AppMenuQuery.java | 2 +- .../boot}/domain/query/AppPublishQuery.java | 2 +- .../ai/remi/boot}/domain/query/AppQuery.java | 2 +- .../ai/remi/boot}/domain/query/AreaQuery.java | 2 +- .../remi/boot}/domain/query/BucketQuery.java | 2 +- .../boot}/domain/query/CompanyDeptQuery.java | 2 +- .../remi/boot}/domain/query/CompanyQuery.java | 2 +- .../remi/boot}/domain/query/ConfigQuery.java | 2 +- .../boot}/domain/query/CordRoleQuery.java | 2 +- .../ai/remi/boot}/domain/query/DeptQuery.java | 2 +- .../boot}/domain/query/DeptUserQuery.java | 2 +- .../boot}/domain/query/DictItemQuery.java | 2 +- .../ai/remi/boot}/domain/query/DictQuery.java | 2 +- .../ai/remi/boot}/domain/query/FileQuery.java | 2 +- .../remi/boot}/domain/query/GradeQuery.java | 2 +- .../remi/boot}/domain/query/GroupQuery.java | 2 +- .../boot}/domain/query/GroupRoleQuery.java | 2 +- .../boot}/domain/query/GroupUserQuery.java | 2 +- .../boot}/domain/query/LogRecordQuery.java | 2 +- .../ai/remi/boot}/domain/query/MenuQuery.java | 2 +- .../remi/boot}/domain/query/NoticeQuery.java | 7 +- .../boot}/domain/query/OauthCodeQuery.java | 2 +- .../boot}/domain/query/PositionQuery.java | 2 +- .../boot}/domain/query/PostRoleQuery.java | 2 +- .../ai/remi/boot}/domain/query/RankQuery.java | 2 +- .../boot}/domain/query/RefreshTokenQuery.java | 2 +- .../boot}/domain/query/RestrictIpQuery.java | 2 +- .../boot}/domain/query/RoleMenuQuery.java | 2 +- .../ai/remi/boot}/domain/query/RoleQuery.java | 2 +- .../boot}/domain/query/UserPostQuery.java | 2 +- .../ai/remi/boot}/domain/query/UserQuery.java | 2 +- .../boot}/domain/query/UserRoleQuery.java | 2 +- .../remi/boot}/domain/tree/CompanyTree.java | 4 +- .../ai/remi/boot}/domain/tree/DeptTree.java | 4 +- .../ai/remi/boot}/domain/tree/GroupTree.java | 4 +- .../ai/remi/boot}/domain/tree/MenuTree.java | 4 +- .../remi/boot}/domain/vo/AccessTokenVO.java | 2 +- .../ai/remi/boot}/domain/vo/AppGroupVO.java | 4 +- .../ai/remi/boot}/domain/vo/AppMenuVO.java | 4 +- .../ai/remi/boot}/domain/vo/AppPublishVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/AppVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/AreaVO.java | 2 +- .../ai/remi/boot}/domain/vo/BucketVO.java | 2 +- .../remi/boot}/domain/vo/CompanyDeptVO.java | 2 +- .../ai/remi/boot}/domain/vo/CompanyVO.java | 2 +- .../ai/remi/boot}/domain/vo/ConfigVO.java | 2 +- .../ai/remi/boot}/domain/vo/CordRoleVO.java | 2 +- .../ai/remi/boot}/domain/vo/DeptUserVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/DeptVO.java | 2 +- .../ai/remi/boot}/domain/vo/DictItemVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/DictVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/FileVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/GradeVO.java | 2 +- .../ai/remi/boot}/domain/vo/GroupRoleVO.java | 2 +- .../ai/remi/boot}/domain/vo/GroupUserVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/GroupVO.java | 2 +- .../ai/remi/boot}/domain/vo/LogRecordVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/MenuVO.java | 2 +- .../ai/remi/boot}/domain/vo/NoticeVO.java | 7 +- .../ai/remi/boot}/domain/vo/OauthCodeVO.java | 2 +- .../ai/remi/boot}/domain/vo/PositionVO.java | 2 +- .../ai/remi/boot}/domain/vo/PostRoleVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/RankVO.java | 2 +- .../remi/boot}/domain/vo/RefreshTokenVO.java | 2 +- .../ai/remi/boot}/domain/vo/RestrictIpVO.java | 2 +- .../ai/remi/boot}/domain/vo/RoleMenuVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/RoleVO.java | 2 +- .../ai/remi/boot}/domain/vo/UserPostVO.java | 2 +- .../ai/remi/boot}/domain/vo/UserRoleVO.java | 2 +- .../java/ai/remi/boot}/domain/vo/UserVO.java | 2 +- remi-boot/remi-boot-infra/pom.xml | 36 + .../boot}/infra/mapper/AccessTokenMapper.java | 4 +- .../boot}/infra/mapper/AppGroupMapper.java | 4 +- .../ai/remi/boot}/infra/mapper/AppMapper.java | 4 +- .../boot}/infra/mapper/AppMenuMapper.java | 4 +- .../boot}/infra/mapper/AppPublishMapper.java | 4 +- .../remi/boot}/infra/mapper/AreaMapper.java | 4 +- .../remi/boot}/infra/mapper/BucketMapper.java | 4 +- .../boot}/infra/mapper/CompanyDeptMapper.java | 4 +- .../boot}/infra/mapper/CompanyMapper.java | 4 +- .../remi/boot}/infra/mapper/ConfigMapper.java | 4 +- .../boot}/infra/mapper/CordRoleMapper.java | 4 +- .../remi/boot}/infra/mapper/DeptMapper.java | 16 +- .../boot}/infra/mapper/DeptUserMapper.java | 4 +- .../boot}/infra/mapper/DictItemMapper.java | 4 +- .../remi/boot}/infra/mapper/DictMapper.java | 4 +- .../remi/boot}/infra/mapper/FileMapper.java | 4 +- .../remi/boot}/infra/mapper/GradeMapper.java | 4 +- .../remi/boot}/infra/mapper/GroupMapper.java | 10 +- .../boot}/infra/mapper/GroupRoleMapper.java | 4 +- .../boot}/infra/mapper/GroupUserMapper.java | 4 +- .../boot}/infra/mapper/LogRecordMapper.java | 4 +- .../remi/boot}/infra/mapper/MenuMapper.java | 20 +- .../remi/boot}/infra/mapper/NoticeMapper.java | 4 +- .../boot}/infra/mapper/OauthCodeMapper.java | 4 +- .../boot}/infra/mapper/PositionMapper.java | 4 +- .../boot}/infra/mapper/PostRoleMapper.java | 4 +- .../remi/boot}/infra/mapper/RankMapper.java | 4 +- .../infra/mapper/RefreshTokenMapper.java | 4 +- .../boot}/infra/mapper/RestrictIpMapper.java | 4 +- .../remi/boot}/infra/mapper/RoleMapper.java | 4 +- .../boot}/infra/mapper/RoleMenuMapper.java | 4 +- .../remi/boot}/infra/mapper/UserMapper.java | 36 +- .../boot}/infra/mapper/UserPostMapper.java | 4 +- .../boot}/infra/mapper/UserRoleMapper.java | 4 +- .../remi-boot-job}/README.md | 0 remi-boot/remi-boot-job/pom.xml | 37 + .../boot}/job/handler/DemoJobHandler.java | 2 +- remi-boot/remi-boot-server/pom.xml | 50 + .../server/exception/IamExceptionCode.java | 2 +- .../server/exception/IamServiceException.java | 2 +- .../server/service/AccessTokenService.java | 6 +- .../boot}/server/service/AppGroupService.java | 4 +- .../boot}/server/service/AppMenuService.java | 4 +- .../server/service/AppPublishService.java | 4 +- .../remi/boot}/server/service/AppService.java | 4 +- .../boot}/server/service/AreaService.java | 4 +- .../boot}/server/service/BucketService.java | 4 +- .../server/service/CompanyDeptService.java | 4 +- .../boot}/server/service/CompanyService.java | 4 +- .../boot}/server/service/ConfigService.java | 4 +- .../boot}/server/service/CordRoleService.java | 4 +- .../boot}/server/service/DeptService.java | 4 +- .../boot}/server/service/DeptUserService.java | 4 +- .../boot}/server/service/DictItemService.java | 4 +- .../boot}/server/service/DictService.java | 4 +- .../boot}/server/service/FileService.java | 4 +- .../boot}/server/service/GradeService.java | 4 +- .../server/service/GroupRoleService.java | 4 +- .../boot}/server/service/GroupService.java | 4 +- .../server/service/GroupUserService.java | 4 +- .../server/service/LogRecordService.java | 4 +- .../boot}/server/service/MenuService.java | 4 +- .../boot}/server/service/NoticeService.java | 4 +- .../server/service/OauthCodeService.java | 6 +- .../boot}/server/service/PositionService.java | 4 +- .../boot}/server/service/PostRoleService.java | 4 +- .../boot}/server/service/RankService.java | 4 +- .../server/service/RefreshTokenService.java | 6 +- .../server/service/RestrictIpService.java | 4 +- .../boot}/server/service/RoleMenuService.java | 4 +- .../boot}/server/service/RoleService.java | 4 +- .../boot}/server/service/UserPostService.java | 4 +- .../boot}/server/service/UserRoleService.java | 4 +- .../boot}/server/service/UserService.java | 8 +- .../service/impl/AccessTokenServiceImpl.java | 16 +- .../service/impl/AppGroupServiceImpl.java | 8 +- .../service/impl/AppMenuServiceImpl.java | 8 +- .../service/impl/AppPublishServiceImpl.java | 8 +- .../server/service/impl/AppServiceImpl.java | 8 +- .../server/service/impl/AreaServiceImpl.java | 8 +- .../service/impl/BucketServiceImpl.java | 8 +- .../service/impl/CompanyDeptServiceImpl.java | 8 +- .../service/impl/CompanyServiceImpl.java | 8 +- .../service/impl/ConfigServiceImpl.java | 8 +- .../service/impl/CordRoleServiceImpl.java | 8 +- .../server/service/impl/DeptServiceImpl.java | 8 +- .../service/impl/DeptUserServiceImpl.java | 8 +- .../service/impl/DictItemServiceImpl.java | 8 +- .../server/service/impl/DictServiceImpl.java | 8 +- .../server/service/impl/FileServiceImpl.java | 8 +- .../server/service/impl/GradeServiceImpl.java | 8 +- .../service/impl/GroupRoleServiceImpl.java | 8 +- .../server/service/impl/GroupServiceImpl.java | 8 +- .../service/impl/GroupUserServiceImpl.java | 8 +- .../service/impl/LogRecordServiceImpl.java | 8 +- .../server/service/impl/MenuServiceImpl.java | 8 +- .../service/impl/NoticeServiceImpl.java | 8 +- .../service/impl/OauthCodeServiceImpl.java | 16 +- .../service/impl/PositionServiceImpl.java | 8 +- .../service/impl/PostRoleServiceImpl.java | 8 +- .../server/service/impl/RankServiceImpl.java | 8 +- .../service/impl/RefreshTokenServiceImpl.java | 12 +- .../service/impl/RestrictIpServiceImpl.java | 8 +- .../service/impl/RoleMenuServiceImpl.java | 8 +- .../server/service/impl/RoleServiceImpl.java | 8 +- .../service/impl/UserPostServiceImpl.java | 8 +- .../service/impl/UserRoleServiceImpl.java | 8 +- .../server/service/impl/UserServiceImpl.java | 32 +- .../ai/remi/boot}/server/util/AppUtils.java | 4 +- .../ai/remi/boot}/server/util/AuthUtils.java | 2 +- .../remi-boot-web}/pom.xml | 74 +- .../java/ai/remi/boot}/web/Application.java | 8 +- .../boot}/web/controller/AppController.java | 34 +- .../web/controller/AppGroupController.java | 24 +- .../web/controller/AppMenuController.java | 26 +- .../web/controller/AppPublishController.java | 16 +- .../boot}/web/controller/AreaController.java | 24 +- .../web/controller/CompanyController.java | 30 +- .../web/controller/ConfigController.java | 18 +- .../web/controller/CordRoleController.java | 28 +- .../boot}/web/controller/DeptController.java | 40 +- .../boot}/web/controller/DictController.java | 24 +- .../web/controller/DictItemController.java | 24 +- .../boot}/web/controller/GradeController.java | 24 +- .../boot}/web/controller/GroupController.java | 26 +- .../web/controller/GroupRoleController.java | 24 +- .../web/controller/GroupUserController.java | 24 +- .../web/controller/LogRecordController.java | 18 +- .../boot}/web/controller/LoginController.java | 42 +- .../web/controller/LogoutController.java | 16 +- .../boot}/web/controller/MenuController.java | 32 +- .../web/controller/NoticeController.java | 16 +- .../web/controller/Oauth2Controller.java | 32 +- .../web/controller/PositionController.java | 24 +- .../web/controller/PostRoleController.java | 24 +- .../boot}/web/controller/RankController.java | 24 +- .../web/controller/RestrictIpController.java | 24 +- .../boot}/web/controller/RoleController.java | 24 +- .../web/controller/RoleMenuController.java | 22 +- .../boot}/web/controller/UserController.java | 61 +- .../web/controller/UserRoleController.java | 24 +- .../src/main/resources/bootstrap.yml | 2 +- .../src/main/resources/docker/Dockerfile | 6 +- .../src/main/resources/docker/README.md | 2 +- .../main/resources/docker/docker_deploy.sh | 12 + .../resources/i18n/messages_en_US.properties | 1 - .../resources/i18n/messages_zh_CN.properties | 1 - .../src/main/resources/k8s/Dockerfile | 6 +- .../src/main/resources/k8s/README.md | 4 +- .../main/resources/k8s/dev-remi-sys-web.yaml | 20 +- .../src/main/resources/k8s/docker_deploy.sh | 10 + .../src/main/resources/k8s/k8s_deploy.sh | 5 + .../src/main/resources/logback-spring.xml | 10 +- remi-comm/pom.xml | 526 +- remi-comm/remi-comm-auth/pom.xml | 14 +- remi-comm/remi-comm-core/pom.xml | 8 +- .../ai/remi/comm/core/spring/SpringBeans.java | 8 +- remi-comm/remi-comm-domain/pom.xml | 12 +- remi-comm/remi-comm-email/pom.xml | 10 +- remi-comm/remi-comm-exception/pom.xml | 10 +- remi-comm/remi-comm-feign/pom.xml | 20 +- remi-comm/remi-comm-jdbc/pom.xml | 41 +- remi-comm/remi-comm-job/pom.xml | 10 +- remi-comm/remi-comm-log/pom.xml | 19 +- .../remi/comm/log/aspect/LogRecordAspect.java | 20 +- .../{RedisKeyEnum.java => OperatorUser.java} | 10 +- .../comm/log/service/AsyncLogService.java | 25 +- remi-comm/remi-comm-minio/pom.xml | 10 +- remi-comm/remi-comm-redis/pom.xml | 10 +- remi-comm/remi-comm-safe/pom.xml | 16 +- remi-comm/remi-comm-swagger/pom.xml | 10 +- remi-comm/remi-comm-thread/pom.xml | 12 +- .../config/CustomThreadPollTaskExecutor.java | 2 +- .../config/ThreadPoolConfiguration.java | 2 +- .../pool/OverrideDefaultThreadPool.java | 3 +- .../src/main/resources/rebel.xml | 16 - remi-comm/remi-comm-util/pom.xml | 16 +- .../ai/remi/comm/util/array/SortUtils.java | 15 +- .../comm/util/bytes/ConvertBytesUtils.java | 51 + .../ai/remi/comm/util/cron/CronUtils.java | 8 - .../ai/remi/comm/util/security/Rsa2Demo.java | 2 +- remi-comm/remi-comm-web/pom.xml | 18 +- remi-demo/pom.xml | 202 +- remi-demo/remi-demo-api/pom.xml | 22 +- .../ai/remi/boot/api/client/IamClientApi.java | 10 +- .../boot/api/factory/IamClientFactory.java | 18 + .../boot/api/fallback/IamClientFallback.java | 8 +- .../remi/demo/api/client/FeignClientApi.java | 14 - .../demo/api/factory/FeignClientFactory.java | 18 - .../api/fallback/FeignClientFallback.java | 17 - remi-demo/remi-demo-app/pom.xml | 41 +- .../java/ai/remi/boot}/app/Application.java | 6 +- .../src/main/resources/bootstrap.yml | 14 +- .../src/main/resources/docker/Dockerfile | 8 +- .../src/main/resources/docker/README.md | 2 +- .../main/resources/docker/docker_deploy.sh | 10 +- .../src/main/resources/logback-spring.xml | 161 +- remi-demo/remi-demo-domain/pom.xml | 22 +- .../boot}/domain/constant/SsoConstant.java | 2 +- .../boot/domain/converter/UserConverter.java | 56 + .../boot/domain/dto/post/UserPostDTO.java | 195 + .../remi/boot/domain/dto/put/UserPutDTO.java | 201 + .../java/ai/remi/boot/domain/entity/User.java | 123 + .../remi/boot/domain/enums/SsoCacheEnum.java | 39 + .../ai/remi/boot/domain/query/UserQuery.java | 177 + .../ai/remi/boot/domain/tree/GroupTree.java | 131 + .../java/ai/remi/boot/domain/vo/UserVO.java | 294 + remi-demo/remi-demo-infra/pom.xml | 31 +- .../ai/remi/boot/infra/mapper/UserMapper.java | 143 + remi-demo/remi-demo-job/README.md | 4 +- remi-demo/remi-demo-job/pom.xml | 31 +- .../boot}/job/handler/DemoJobHandler.java | 2 +- remi-demo/remi-demo-server/pom.xml | 51 +- .../server/exception/IamExceptionCode.java} | 4 +- .../server/exception/IamServiceException.java | 22 + .../remi/boot/server/service/UserService.java | 19 + .../server/service/impl/UserServiceImpl.java | 176 + .../ai/remi/boot/server/util/AppUtils.java | 178 + .../ai/remi/boot/server/util/AuthUtils.java | 21 + .../server/exception/BpmServiceException.java | 22 - remi-demo/remi-demo-web/pom.xml | 50 +- .../remi/{demo => boot}/web/Application.java | 7 +- .../boot/web/controller/UserController.java | 202 + .../src/main/resources/bootstrap.yml | 11 +- .../src/main/resources/docker/Dockerfile | 6 +- .../src/main/resources/docker/README.md | 4 +- .../main/resources/docker/docker_deploy.sh | 17 +- .../resources/i18n/messages_en_US.properties | 16 + .../resources/i18n/messages_zh_CN.properties | 16 + .../src/main/resources/k8s}/Dockerfile | 8 +- .../src/main/resources/k8s/README.md | 4 +- .../main/resources/k8s/dev-remi-sys-web.yaml | 28 +- .../src/main/resources/k8s/docker_deploy.sh | 10 + .../src/main/resources/k8s/k8s_deploy.sh | 5 + remi-nacos/pom.xml | 2 +- remi-sys/pom.xml | 47 - remi-sys/remi-sys-api/pom.xml | 53 - .../sys/api/factory/SysClientFactory.java | 18 - .../main/resources/docker/docker_deploy.sh | 12 - .../src/main/resources/k8s/docker_deploy.sh | 10 - .../src/main/resources/k8s/k8s_deploy.sh | 5 - .../sys/domain/constant/OidcConstant.java | 4 - remi-sys/remi-sys-infra/pom.xml | 50 - remi-sys/remi-sys-job/pom.xml | 51 - remi-sys/remi-sys-server/pom.xml | 68 - .../sys/web/controller/BucketController.java | 135 - .../sys/web/controller/FileController.java | 198 - .../src/main/resources/docker/README.md | 7 - .../main/resources/docker/docker_deploy.sh | 12 - .../src/main/resources/k8s/docker_deploy.sh | 10 - .../src/main/resources/k8s/k8s_deploy.sh | 5 - 493 files changed, 5108 insertions(+), 22521 deletions(-) delete mode 100644 docs/config/nacos/bootstrap.yml rename docs/{config => envs}/config/application-local.yml (69%) rename docs/{config => envs}/config/application.yml (68%) rename docs/{config/nacos/remi-sys-web-dev.yaml => envs/nacos/remi-boot-web-dev.yaml} (72%) rename docs/{config => envs}/nacos/remi-cloud-dev.yaml (88%) create mode 100644 docs/envs/nacos/remi-demo-web-dev.yaml delete mode 100644 docs/generator/EasyCodeConfig.json create mode 100644 docs/images/ai-remi.png delete mode 100644 docs/pdmaner/remi-cloud.pdma.json create mode 100644 remi-boot/pom.xml create mode 100644 remi-boot/remi-boot-api/pom.xml create mode 100644 remi-boot/remi-boot-api/src/main/java/ai/remi/boot/api/client/IamClientApi.java create mode 100644 remi-boot/remi-boot-api/src/main/java/ai/remi/boot/api/factory/IamClientFactory.java create mode 100644 remi-boot/remi-boot-api/src/main/java/ai/remi/boot/api/fallback/IamClientFallback.java rename {remi-sys/remi-sys-app => remi-boot/remi-boot-app}/pom.xml (76%) rename {remi-demo/remi-demo-app/src/main/java/ai/remi/demo => remi-boot/remi-boot-app/src/main/java/ai/remi/boot}/app/Application.java (85%) rename {remi-sys/remi-sys-app => remi-boot/remi-boot-app}/src/main/resources/bootstrap.yml (95%) rename {remi-sys/remi-sys-app/src/main/resources/k8s => remi-boot/remi-boot-app/src/main/resources/docker}/Dockerfile (81%) create mode 100644 remi-boot/remi-boot-app/src/main/resources/docker/README.md create mode 100644 remi-boot/remi-boot-app/src/main/resources/docker/docker_deploy.sh rename {remi-sys/remi-sys-app => remi-boot/remi-boot-app}/src/main/resources/logback-spring.xml (100%) rename {remi-sys/remi-sys-domain => remi-boot/remi-boot-domain}/pom.xml (72%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/constant/Cas3Constant.java (74%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/constant/JwtConstant.java (71%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/constant/Oauth2Constant.java (97%) create mode 100644 remi-boot/remi-boot-domain/src/main/java/ai/remi/boot/domain/constant/OidcConstant.java rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/constant/Saml2Constant.java (74%) rename {remi-demo/remi-demo-domain/src/main/java/ai/remi/demo => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/constant/SsoConstant.java (94%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/AccessTokenConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/AppConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/AppGroupConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/AppMenuConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/AppPublishConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/AreaConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/BucketConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/CompanyConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/CompanyDeptConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/ConfigConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/CordRoleConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/DeptConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/DeptUserConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/DictConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/DictItemConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/FileConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/GradeConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/GroupConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/GroupRoleConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/GroupUserConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/LogRecordConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/MenuConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/NoticeConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/OauthCodeConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/PositionConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/PostRoleConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/RankConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/RefreshTokenConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/RestrictIpConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/RoleConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/RoleMenuConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/UserConverter.java (87%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/UserPostConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/converter/UserRoleConverter.java (86%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/AccessTokenPostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/AppGroupPostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/AppMenuPostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/AppPostDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/AppPublishPostDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/AreaPostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/BucketPostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/CompanyDeptPostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/CompanyPostDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/ConfigPostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/CordRolePostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/DeptPostDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/DeptUserPostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/DictItemPostDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/DictPostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/FilePostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/GradePostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/GroupPostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/GroupRolePostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/GroupUserPostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/LogRecordPostDTO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/LoginPostDTO.java (95%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/MenuPostDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/NoticePostDTO.java (90%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/OauthCodePostDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/PositionPostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/PostRolePostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/RankPostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/RefreshTokenPostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/RestrictIpPostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/RoleMenuPostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/RolePostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/UserPostDTO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/UserPostPostDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/post/UserRolePostDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/AccessTokenPutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/AppGroupPutDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/AppMenuPutDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/AppPublishPutDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/AppPutDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/AreaPutDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/BucketPutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/CompanyDeptPutDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/CompanyPutDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/ConfigPutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/CordRolePutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/DeptPutDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/DeptUserPutDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/DictItemPutDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/DictPutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/FilePutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/GradePutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/GroupPutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/GroupRolePutDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/GroupUserPutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/LogRecordPutDTO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/MenuPutDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/NoticePutDTO.java (90%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/OauthCodePutDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/PositionPutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/PostRolePutDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/RankPutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/RefreshTokenPutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/RestrictIpPutDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/RoleMenuPutDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/RolePutDTO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/UserPostPutDTO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/UserPutDTO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/dto/put/UserRolePutDTO.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/AccessToken.java (93%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/App.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/AppGroup.java (92%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/AppMenu.java (92%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/AppPublish.java (95%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Area.java (95%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Bucket.java (94%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Company.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/CompanyDept.java (92%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Config.java (94%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/CordRole.java (93%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Dept.java (95%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/DeptUser.java (92%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Dict.java (93%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/DictItem.java (95%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/File.java (94%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Grade.java (93%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Group.java (94%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/GroupRole.java (92%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/GroupUser.java (92%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/LogRecord.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Menu.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Notice.java (90%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/OauthCode.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Position.java (94%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/PostRole.java (92%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Rank.java (94%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/RefreshToken.java (93%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/RestrictIp.java (92%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/Role.java (95%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/RoleMenu.java (92%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/User.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/UserPost.java (93%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/entity/UserRole.java (92%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/enums/Oauth2TypeEnum.java (89%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/enums/RedisKeyEnum.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/AccessTokenQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/AppGroupQuery.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/AppMenuQuery.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/AppPublishQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/AppQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/AreaQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/BucketQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/CompanyDeptQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/CompanyQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/ConfigQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/CordRoleQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/DeptQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/DeptUserQuery.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/DictItemQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/DictQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/FileQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/GradeQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/GroupQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/GroupRoleQuery.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/GroupUserQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/LogRecordQuery.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/MenuQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/NoticeQuery.java (90%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/OauthCodeQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/PositionQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/PostRoleQuery.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/RankQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/RefreshTokenQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/RestrictIpQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/RoleMenuQuery.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/RoleQuery.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/UserPostQuery.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/UserQuery.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/query/UserRoleQuery.java (96%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/tree/CompanyTree.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/tree/DeptTree.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/tree/GroupTree.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/tree/MenuTree.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/AccessTokenVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/AppGroupVO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/AppMenuVO.java (97%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/AppPublishVO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/AppVO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/AreaVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/BucketVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/CompanyDeptVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/CompanyVO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/ConfigVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/CordRoleVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/DeptUserVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/DeptVO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/DictItemVO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/DictVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/FileVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/GradeVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/GroupRoleVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/GroupUserVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/GroupVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/LogRecordVO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/MenuVO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/NoticeVO.java (95%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/OauthCodeVO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/PositionVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/PostRoleVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/RankVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/RefreshTokenVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/RestrictIpVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/RoleMenuVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/RoleVO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/UserPostVO.java (99%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/UserRoleVO.java (98%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-boot/remi-boot-domain/src/main/java/ai/remi/boot}/domain/vo/UserVO.java (99%) create mode 100644 remi-boot/remi-boot-infra/pom.xml rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/AccessTokenMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/AppGroupMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/AppMapper.java (78%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/AppMenuMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/AppPublishMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/AreaMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/BucketMapper.java (78%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/CompanyDeptMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/CompanyMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/ConfigMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/CordRoleMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/DeptMapper.java (81%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/DeptUserMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/DictItemMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/DictMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/FileMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/GradeMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/GroupMapper.java (84%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/GroupRoleMapper.java (78%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/GroupUserMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/LogRecordMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/MenuMapper.java (85%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/NoticeMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/OauthCodeMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/PositionMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/PostRoleMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/RankMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/RefreshTokenMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/RestrictIpMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/RoleMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/RoleMenuMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/UserMapper.java (88%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/UserPostMapper.java (77%) rename {remi-sys/remi-sys-infra/src/main/java/ai/remi/sys => remi-boot/remi-boot-infra/src/main/java/ai/remi/boot}/infra/mapper/UserRoleMapper.java (77%) rename {remi-sys/remi-sys-job => remi-boot/remi-boot-job}/README.md (100%) create mode 100644 remi-boot/remi-boot-job/pom.xml rename {remi-demo/remi-demo-job/src/main/java/ai/remi/demo => remi-boot/remi-boot-job/src/main/java/ai/remi/boot}/job/handler/DemoJobHandler.java (99%) create mode 100644 remi-boot/remi-boot-server/pom.xml rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/exception/IamExceptionCode.java (95%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/exception/IamServiceException.java (94%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/AccessTokenService.java (80%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/AppGroupService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/AppMenuService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/AppPublishService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/AppService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/AreaService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/BucketService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/CompanyDeptService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/CompanyService.java (73%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/ConfigService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/CordRoleService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/DeptService.java (73%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/DeptUserService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/DictItemService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/DictService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/FileService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/GradeService.java (73%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/GroupRoleService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/GroupService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/GroupUserService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/LogRecordService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/MenuService.java (73%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/NoticeService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/OauthCodeService.java (77%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/PositionService.java (73%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/PostRoleService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/RankService.java (73%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/RefreshTokenService.java (78%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/RestrictIpService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/RoleMenuService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/RoleService.java (73%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/UserPostService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/UserRoleService.java (74%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/UserService.java (64%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/AccessTokenServiceImpl.java (90%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/AppGroupServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/AppMenuServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/AppPublishServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/AppServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/AreaServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/BucketServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/CompanyDeptServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/CompanyServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/ConfigServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/CordRoleServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/DeptServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/DeptUserServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/DictItemServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/DictServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/FileServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/GradeServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/GroupRoleServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/GroupServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/GroupUserServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/LogRecordServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/MenuServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/NoticeServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/OauthCodeServiceImpl.java (87%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/PositionServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/PostRoleServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/RankServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/RefreshTokenServiceImpl.java (89%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/RestrictIpServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/RoleMenuServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/RoleServiceImpl.java (65%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/UserPostServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/UserRoleServiceImpl.java (66%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/service/impl/UserServiceImpl.java (90%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/util/AppUtils.java (98%) rename {remi-sys/remi-sys-server/src/main/java/ai/remi/sys => remi-boot/remi-boot-server/src/main/java/ai/remi/boot}/server/util/AuthUtils.java (94%) rename {remi-sys/remi-sys-web => remi-boot/remi-boot-web}/pom.xml (69%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/Application.java (78%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/AppController.java (86%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/AppGroupController.java (85%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/AppMenuController.java (83%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/AppPublishController.java (91%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/AreaController.java (85%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/CompanyController.java (87%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/ConfigController.java (91%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/CordRoleController.java (86%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/DeptController.java (85%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/DictController.java (85%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/DictItemController.java (85%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/GradeController.java (85%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/GroupController.java (88%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/GroupRoleController.java (87%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/GroupUserController.java (85%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/LogRecordController.java (94%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/LoginController.java (82%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/LogoutController.java (81%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/MenuController.java (83%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/NoticeController.java (92%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/Oauth2Controller.java (86%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/PositionController.java (85%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/PostRoleController.java (87%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/RankController.java (85%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/RestrictIpController.java (86%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/RoleController.java (85%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/RoleMenuController.java (87%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/UserController.java (80%) rename {remi-sys/remi-sys-web/src/main/java/ai/remi/sys => remi-boot/remi-boot-web/src/main/java/ai/remi/boot}/web/controller/UserRoleController.java (87%) rename {remi-sys/remi-sys-web => remi-boot/remi-boot-web}/src/main/resources/bootstrap.yml (98%) rename {remi-sys/remi-sys-web => remi-boot/remi-boot-web}/src/main/resources/docker/Dockerfile (87%) rename {remi-sys/remi-sys-app => remi-boot/remi-boot-web}/src/main/resources/docker/README.md (76%) create mode 100644 remi-boot/remi-boot-web/src/main/resources/docker/docker_deploy.sh rename {remi-sys/remi-sys-web => remi-boot/remi-boot-web}/src/main/resources/i18n/messages_en_US.properties (94%) rename {remi-sys/remi-sys-web => remi-boot/remi-boot-web}/src/main/resources/i18n/messages_zh_CN.properties (96%) rename {remi-sys/remi-sys-web => remi-boot/remi-boot-web}/src/main/resources/k8s/Dockerfile (87%) rename {remi-sys/remi-sys-app => remi-boot/remi-boot-web}/src/main/resources/k8s/README.md (57%) rename {remi-sys/remi-sys-web => remi-boot/remi-boot-web}/src/main/resources/k8s/dev-remi-sys-web.yaml (79%) create mode 100644 remi-boot/remi-boot-web/src/main/resources/k8s/docker_deploy.sh create mode 100644 remi-boot/remi-boot-web/src/main/resources/k8s/k8s_deploy.sh rename {remi-sys/remi-sys-web => remi-boot/remi-boot-web}/src/main/resources/logback-spring.xml (93%) rename remi-comm/remi-comm-log/src/main/java/ai/remi/comm/log/enums/{RedisKeyEnum.java => OperatorUser.java} (67%) delete mode 100644 remi-comm/remi-comm-thread/src/main/resources/rebel.xml create mode 100644 remi-comm/remi-comm-util/src/main/java/ai/remi/comm/util/bytes/ConvertBytesUtils.java rename remi-sys/remi-sys-api/src/main/java/ai/remi/sys/api/client/SysClientApi.java => remi-demo/remi-demo-api/src/main/java/ai/remi/boot/api/client/IamClientApi.java (75%) create mode 100644 remi-demo/remi-demo-api/src/main/java/ai/remi/boot/api/factory/IamClientFactory.java rename remi-sys/remi-sys-api/src/main/java/ai/remi/sys/api/fallback/SysClientFallback.java => remi-demo/remi-demo-api/src/main/java/ai/remi/boot/api/fallback/IamClientFallback.java (75%) delete mode 100644 remi-demo/remi-demo-api/src/main/java/ai/remi/demo/api/client/FeignClientApi.java delete mode 100644 remi-demo/remi-demo-api/src/main/java/ai/remi/demo/api/factory/FeignClientFactory.java delete mode 100644 remi-demo/remi-demo-api/src/main/java/ai/remi/demo/api/fallback/FeignClientFallback.java rename {remi-sys/remi-sys-app/src/main/java/ai/remi/sys => remi-demo/remi-demo-app/src/main/java/ai/remi/boot}/app/Application.java (85%) rename {remi-sys/remi-sys-domain/src/main/java/ai/remi/sys => remi-demo/remi-demo-domain/src/main/java/ai/remi/boot}/domain/constant/SsoConstant.java (94%) create mode 100644 remi-demo/remi-demo-domain/src/main/java/ai/remi/boot/domain/converter/UserConverter.java create mode 100644 remi-demo/remi-demo-domain/src/main/java/ai/remi/boot/domain/dto/post/UserPostDTO.java create mode 100644 remi-demo/remi-demo-domain/src/main/java/ai/remi/boot/domain/dto/put/UserPutDTO.java create mode 100644 remi-demo/remi-demo-domain/src/main/java/ai/remi/boot/domain/entity/User.java create mode 100644 remi-demo/remi-demo-domain/src/main/java/ai/remi/boot/domain/enums/SsoCacheEnum.java create mode 100644 remi-demo/remi-demo-domain/src/main/java/ai/remi/boot/domain/query/UserQuery.java create mode 100644 remi-demo/remi-demo-domain/src/main/java/ai/remi/boot/domain/tree/GroupTree.java create mode 100644 remi-demo/remi-demo-domain/src/main/java/ai/remi/boot/domain/vo/UserVO.java create mode 100644 remi-demo/remi-demo-infra/src/main/java/ai/remi/boot/infra/mapper/UserMapper.java rename {remi-sys/remi-sys-job/src/main/java/ai/remi/sys => remi-demo/remi-demo-job/src/main/java/ai/remi/boot}/job/handler/DemoJobHandler.java (99%) rename remi-demo/remi-demo-server/src/main/java/ai/remi/{demo/server/exception/BpmExceptionCode.java => boot/server/exception/IamExceptionCode.java} (88%) create mode 100644 remi-demo/remi-demo-server/src/main/java/ai/remi/boot/server/exception/IamServiceException.java create mode 100644 remi-demo/remi-demo-server/src/main/java/ai/remi/boot/server/service/UserService.java create mode 100644 remi-demo/remi-demo-server/src/main/java/ai/remi/boot/server/service/impl/UserServiceImpl.java create mode 100644 remi-demo/remi-demo-server/src/main/java/ai/remi/boot/server/util/AppUtils.java create mode 100644 remi-demo/remi-demo-server/src/main/java/ai/remi/boot/server/util/AuthUtils.java delete mode 100644 remi-demo/remi-demo-server/src/main/java/ai/remi/demo/server/exception/BpmServiceException.java rename remi-demo/remi-demo-web/src/main/java/ai/remi/{demo => boot}/web/Application.java (78%) create mode 100644 remi-demo/remi-demo-web/src/main/java/ai/remi/boot/web/controller/UserController.java rename {remi-sys/remi-sys-app/src/main/resources/docker => remi-demo/remi-demo-web/src/main/resources/k8s}/Dockerfile (86%) rename {remi-sys/remi-sys-web => remi-demo/remi-demo-web}/src/main/resources/k8s/README.md (57%) rename {remi-sys/remi-sys-app => remi-demo/remi-demo-web}/src/main/resources/k8s/dev-remi-sys-web.yaml (72%) create mode 100644 remi-demo/remi-demo-web/src/main/resources/k8s/docker_deploy.sh create mode 100644 remi-demo/remi-demo-web/src/main/resources/k8s/k8s_deploy.sh delete mode 100644 remi-sys/pom.xml delete mode 100644 remi-sys/remi-sys-api/pom.xml delete mode 100644 remi-sys/remi-sys-api/src/main/java/ai/remi/sys/api/factory/SysClientFactory.java delete mode 100644 remi-sys/remi-sys-app/src/main/resources/docker/docker_deploy.sh delete mode 100644 remi-sys/remi-sys-app/src/main/resources/k8s/docker_deploy.sh delete mode 100644 remi-sys/remi-sys-app/src/main/resources/k8s/k8s_deploy.sh delete mode 100644 remi-sys/remi-sys-domain/src/main/java/ai/remi/sys/domain/constant/OidcConstant.java delete mode 100644 remi-sys/remi-sys-infra/pom.xml delete mode 100644 remi-sys/remi-sys-job/pom.xml delete mode 100644 remi-sys/remi-sys-server/pom.xml delete mode 100644 remi-sys/remi-sys-web/src/main/java/ai/remi/sys/web/controller/BucketController.java delete mode 100644 remi-sys/remi-sys-web/src/main/java/ai/remi/sys/web/controller/FileController.java delete mode 100644 remi-sys/remi-sys-web/src/main/resources/docker/README.md delete mode 100644 remi-sys/remi-sys-web/src/main/resources/docker/docker_deploy.sh delete mode 100644 remi-sys/remi-sys-web/src/main/resources/k8s/docker_deploy.sh delete mode 100644 remi-sys/remi-sys-web/src/main/resources/k8s/k8s_deploy.sh diff --git a/README.md b/README.md index 3fe0ee7..8960db3 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Remi Cloud (瑞米) 是一款企业级AI+微服务架构的快速开发平台,

您的 Star 是对我们开源团队的最大肯定。

瑞米平台的设计理念:**所见即所得,极简且易用**。 我相信大家在使用过程中能体验到设计师的用心之处,**颜色的高对比度**、**左侧菜单的设计**、**减少了弹框的嵌套**、**三等分的抽屉使用**等,让用户体验更加友好。瑞米平台目前还在公测阶段,可能会些许不足,也请您给些包容并及时反馈给我们,24年年底我们定会按时交出让您满意的瑞米快速开发平台。 + ## 项目规划 diff --git a/docs/config/nacos/bootstrap.yml b/docs/config/nacos/bootstrap.yml deleted file mode 100644 index ec94460..0000000 --- a/docs/config/nacos/bootstrap.yml +++ /dev/null @@ -1,48 +0,0 @@ -# 服务端口号 -server: - port: 1010 - -spring: - application: - name: remi-sys-web - profiles: - active: dev - cloud: - # nacos - nacos: - # 注册中心 - username: nacos - password: nacos - discovery: - # 配置中心的地址 - server-addr: ${NACOS_HOST:192.168.31.88}:${NACOS_PORT:8848} - #命名空间 - namespace: ${SERVICE_NAME_SPACE_NAME:cloud} - # 配置文件的环境 - group: ${SERVICE_DISCOVERY_GROUP_NAME:dev} - # 配置中心 - config: - # 配置中心的地址 - server-addr: ${spring.cloud.nacos.discovery.server-addr} - #命名空间 - namespace: ${spring.cloud.nacos.discovery.namespace} - # 配置文件prefix - prefix: ${spring.application.name} - # 配置文件的环境 - group: ${spring.cloud.nacos.discovery.group} - # 配置文件的格式 - file-extension: yaml - # 配置的编码 - encode: UTF-8 - # 是否开启监听和自动刷新 - refresh-enabled: true - # 共享配置 - shared-configs: - # Data Id 的默认完整格式为: ${prefix}-${spring.profile.active}.${file-extension}。 - - dataId: cloud-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} - group: ${spring.cloud.nacos.discovery.group} - #是否自动刷新 - refresh: true - - - diff --git a/docs/config/config/application-local.yml b/docs/envs/config/application-local.yml similarity index 69% rename from docs/config/config/application-local.yml rename to docs/envs/config/application-local.yml index 98a4666..aab5165 100644 --- a/docs/config/config/application-local.yml +++ b/docs/envs/config/application-local.yml @@ -10,10 +10,10 @@ spring: max-file-size: 100MB datasource: # mysql - url: jdbc:mysql://192.168.2.202:3306/remi-paas-ids?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true + url: jdbc:mysql://192.168.31.200:30636/dev-remi-boot?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true driver-class-name: com.mysql.cj.jdbc.Driver username: root - password: Sdt@1020 + password: Remi@123 type: com.alibaba.druid.pool.DruidDataSource # 下面为连接池的补充设置,应用到上面所有数据源中 # 初始化大小,最小,最大 @@ -28,8 +28,6 @@ spring: min-evictable-idle-time-millis: 300000 # mysql validation-query: SELECT 1 FROM DUAL - # postgre - #validation-query: SELECT 1 test-while-idle: true test-on-borrow: false test-on-return: false @@ -43,37 +41,39 @@ spring: connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 redis: database: 0 - host: 192.168.2.202 - password: - port: 6379 + host: 192.168.31.200 + password: Remi@123 + port: 30210 jedis: pool: max-active: 8 max-idle: 8 min-idle: 0 timeout: 1000 -# MinIO -minio: - #对象存储服务的URL - url: http://192.168.2.202:9000 - #账户 - accessKey: admin - #密码 - secretKey: Sdt@1020 - #存储桶 - bucketName: remi-paas-ids + # 异步线程配置 async: executor: thread: # 核心线程数 - corePoolSize: 5 + corePoolSize: 10 # 最大线程数 - maxPoolSize: 20 + maxPoolSize: 30 # 任务队列大小 - queueCapacity: 1000 + queueCapacity: 3000 # 缓冲队列中线程的空闲时间 - keepAliveSeconds: 3000 + keepAliveSeconds: 300 + +# MinIO +minio: + #对象存储服务的URL + endpoint: http://192.168.31.200:30090 + #账户 + username: minioadmin + #密码 + password: minioadmin + #存储桶 + bucketName: dev-remi # 拦截器 sql-intercept: @@ -82,7 +82,7 @@ sql-intercept: enable: true companyTenant: enable: true - anonUrlSet: /user/getUserInfoByUserCode,/appInfo/list,/common/getUserInfo,/dept/getDeptByUserCode,/company/getCompanyInfoById,/operateLog/add,/operateLog/page,/operateLog/logPage + anonUrlSet: /sso/login/ticket,/sso/login/other,/sso/login/local,/sso/logout,/sso/oauth2/accessToken,/sso/oauth2/refreshToken,/sso/oauth2/checkToken,/logRecord/add,/logRecord/pageLogin,/logRecord/pageOperate,/logRecord/pageException,/logRecord/get field-fill: createdByIntercept: enable: true @@ -93,19 +93,9 @@ sql-intercept: updateAtIntercept: enable: true -## 开启店铺id 拦截器 -interceptor: - company: - enabled: true - # 开启系统操作日志 -log: +remi-log: record: enabled: true - pushUrl: http://localhost:6103/operateLog/add - appName: IDS - -# 日志输出路径配置 -logback: -# logDir: /Users/dianjiu/Logs/remi/remi-ids-web - logDir: D:\\Logs\\sdt\\paas\\remi-ids-web \ No newline at end of file + appName: remi-iam-web + pushUrl: http://192.168.31.18:1010/logRecord/add \ No newline at end of file diff --git a/docs/config/config/application.yml b/docs/envs/config/application.yml similarity index 68% rename from docs/config/config/application.yml rename to docs/envs/config/application.yml index 30bd75a..0917db8 100644 --- a/docs/config/config/application.yml +++ b/docs/envs/config/application.yml @@ -1,6 +1,6 @@ # 服务端口号 server: - port: 8081 + port: 8080 # tomcat 配置 tomcat: # tomcat的URI编码 @@ -12,7 +12,7 @@ server: spring: application: - name: remi-ids-web + name: remi-boot-web profiles: active: ${cfg.env} # 循环依赖的问题 @@ -29,7 +29,7 @@ mybatis-plus: #控制台打印完整带参数SQL语句 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #mapper映射文件路径 - mapper-locations: classpath*:/*-infra/src/main/resources/mapper/*.xml,classpath*:/common-log/src/main/resources/mapper/*.xml, classpath*:/mapper/**.xml + mapper-locations: classpath*:/*-infra/src/main/resources/mapper/*.xml, classpath*:/mapper/**.xml #pagehelper pagehelper: @@ -49,6 +49,8 @@ pagehelper: feign: okhttp: enabled: true + hystrix: + enabled: true sentinel: enabled: true client: @@ -57,44 +59,23 @@ feign: connectTimeout: 100000 readTimeout: 100000 -# knife4j配置 -knife4j: - #启用 - enable: true - #基础认证 - basic: - enable: false - username: remi - password: 123456 - #增强配置 - setting: - enableSwaggerModels: true - enableDocumentManage: true - enableHost: false - enableHostText: http://localhost - enableRequestCache: true - enableFilterMultipartApis: false - enableFilterMultipartApiMethodType: POST - language: zh-CN - enableFooter: false - enableFooterCustom: true - footerCustomContent: Copyright © 2021 Remi All Rights Reserved +# springdoc +springdoc: + group-configs: + - group: web + packages-to-scan: ai.remi.boot.web + - group: app + packages-to-scan: ai.remi.boot.app # 定义日志输出级别 logging: - config: classpath:logback-spring.xml level: - ai.remi: info - #spring 包日志输出级别 + com.startdis: debug + # spring 包日志输出级别 org.springframework: info + # alibaba 包日志输出级别 com.alibaba.cloud: info - # undertow - io.undertow: info + # nacos 心跳 INFO 屏蔽 + com.alibaba.nacos: off # mybatis-plus - com.baomidou.mybatisplus: debug - com.scm.scheduling.infra.mapper: debug - -# 日志配置 -logback: - appName: remi-ids-web - fileType: log + com.baomidou.mybatisplus: debug \ No newline at end of file diff --git a/docs/config/nacos/remi-sys-web-dev.yaml b/docs/envs/nacos/remi-boot-web-dev.yaml similarity index 72% rename from docs/config/nacos/remi-sys-web-dev.yaml rename to docs/envs/nacos/remi-boot-web-dev.yaml index 48f31b0..e93c12d 100644 --- a/docs/config/nacos/remi-sys-web-dev.yaml +++ b/docs/envs/nacos/remi-boot-web-dev.yaml @@ -1,6 +1,6 @@ spring: application: - name: remi-sys-web + name: remi-boot-web config: activate: on-profile: dev @@ -12,10 +12,10 @@ spring: max-file-size: 100MB datasource: # mysql - url: jdbc:mysql://192.168.31.66:3306/remi-saas-iam?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true + url: jdbc:mysql://192.168.31.200:30336/remi-boot?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true driver-class-name: com.mysql.cj.jdbc.Driver username: root - password: 123456 + password: Remi@123 type: com.alibaba.druid.pool.DruidDataSource # 下面为连接池的补充设置,应用到上面所有数据源中 # 初始化大小,最小,最大 @@ -43,9 +43,9 @@ spring: connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 redis: database: 0 - host: 192.168.31.66 - password: ydsz1020 - port: 6379 + host: 192.168.31.200 + password: Remi@123 + port: 30120 jedis: pool: max-active: 8 @@ -66,16 +66,11 @@ async: # 缓冲队列中线程的空闲时间 keepAliveSeconds: 300 -# MinIO minio: - #对象存储服务的URL - url: http://192.168.31.88:9000 - #账户 - accessKey: admin - #密码 - secretKey: Sdt@1020~ - #存储桶 - bucketName: remi-paas-iam + endpoint: http://192.168.31.200:30900 + username: minioadmin + password: minioadmin + bucketName: remi # 拦截器 sql-intercept: @@ -84,7 +79,7 @@ sql-intercept: enable: true companyTenant: enable: true - anonUrlSet: /sso/login/ticket,/sso/login/other,/sso/login/local,/sso/logout,/sso/oauth2/accessToken,/sso/oauth2/refreshToken,/sso/oauth2/checkToken,/logRecord/add,/logRecord/pageLogin,/logRecord/pageOperate,/logRecord/pageException + anonUrlSet: /sso/login/ticket,/sso/login/other,/sso/login/local,/sso/logout,/sso/oauth2/accessToken,/sso/oauth2/refreshToken,/sso/oauth2/checkToken,/logRecord/add,/logRecord/pageLogin,/logRecord/pageOperate,/logRecord/pageException,/logRecord/get field-fill: createdByIntercept: enable: true @@ -94,29 +89,18 @@ sql-intercept: enable: true updateAtIntercept: enable: true -# springdoc-openapi项目配置 + +# springdoc springdoc: - #是否开启文档功能 group-configs: - - group: 'iam-web' - paths-to-match: '/**' - packages-to-scan: ai.remi.iam.web + - group: web + packages-to-scan: ai.remi.boot.web + - group: app + packages-to-scan: ai.remi.boot.app # 开启系统操作日志 -log: +remi-log: record: enabled: true - appName: IAM - pushUrl: http://localhost:6103/operateLog/add - -# 日志输出路径配置 -logback: - logDir: D:\Logs\sdt\cloud\${spring.application.name}\ - maxSize: 500MB - maxDays: 30 - -# 应用信息 -appInfo: - code: iam - key: kxxyuc46 - secret: f62b0078aa9b9bcc953b71d614fe999b \ No newline at end of file + appName: remi-sys-web + pushUrl: http://192.168.31.200:8080/logRecord/add \ No newline at end of file diff --git a/docs/config/nacos/remi-cloud-dev.yaml b/docs/envs/nacos/remi-cloud-dev.yaml similarity index 88% rename from docs/config/nacos/remi-cloud-dev.yaml rename to docs/envs/nacos/remi-cloud-dev.yaml index c09f550..25bcd8f 100644 --- a/docs/config/nacos/remi-cloud-dev.yaml +++ b/docs/envs/nacos/remi-cloud-dev.yaml @@ -9,6 +9,15 @@ server: # Tomcat启动初始化的线程数,默认值25 min-spare-threads: 30 +spring: + # 循环依赖的问题 + main: + allow-circular-references: true + # MVC默认的路径匹配策略为PATH_PATTERN_PARSER,需要修改为ANT_PATH_MATCHER 解决swagger兼容性问题 + mvc: + pathmatch: + matching-strategy: ANT_PATH_MATCHER + # mybatis-plus mybatis-plus: configuration: @@ -45,23 +54,10 @@ feign: connectTimeout: 100000 readTimeout: 100000 -# springdoc-openapi项目配置 -springdoc: - swagger-ui: - path: /swagger-ui.html - api-docs: - path: /v3/api-docs - -# knife4j的增强配置,不需要增强可以不配 -knife4j: - enable: true - setting: - language: zh-CN - # 定义日志输出级别 logging: level: - ai.remi: debug + com.startdis: debug # spring 包日志输出级别 org.springframework: info # alibaba 包日志输出级别 @@ -73,11 +69,6 @@ logging: # mybatis-plus com.baomidou.mybatisplus: debug -spring: - # 循环依赖的问题 - main: - allow-circular-references: true - # MVC默认的路径匹配策略为PATH_PATTERN_PARSER,需要修改为ANT_PATH_MATCHER 解决swagger兼容性问题 - mvc: - pathmatch: - matching-strategy: ANT_PATH_MATCHER \ No newline at end of file +# 日志输出路径配置 +logback: + logDir: D:\Logs\remi\cloud\${spring.application.name}\ \ No newline at end of file diff --git a/docs/envs/nacos/remi-demo-web-dev.yaml b/docs/envs/nacos/remi-demo-web-dev.yaml new file mode 100644 index 0000000..56d2369 --- /dev/null +++ b/docs/envs/nacos/remi-demo-web-dev.yaml @@ -0,0 +1,106 @@ +spring: + application: + name: remi-demo-web + config: + activate: + on-profile: dev + servlet: + multipart: + # 上传文件总的最大值 + max-request-size: 100MB + # 单个文件的最大值 + max-file-size: 100MB + datasource: + # mysql + url: jdbc:mysql://192.168.31.200:30336/remi-boot?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false&nullCatalogMeansCurrent=true + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: Remi@123 + type: com.alibaba.druid.pool.DruidDataSource + # 下面为连接池的补充设置,应用到上面所有数据源中 + # 初始化大小,最小,最大 + initial-size: 5 + min-idle: 5 + max-active: 20 + # 配置获取连接等待超时的时间 + max-wait: 60000 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + time-between-eviction-runs-millis: 60000 + # 配置一个连接在池中最小生存的时间,单位是毫秒 + min-evictable-idle-time-millis: 300000 + # mysql + validation-query: SELECT 1 FROM DUAL + test-while-idle: true + test-on-borrow: false + test-on-return: false + # 打开PSCache,并且指定每个连接上PSCache的大小 + pool-prepared-statements: true + # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 + max-pool-prepared-statement-per-connection-size: 20 + filters: stat,wall + use-global-data-source-stat: true + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + redis: + database: 0 + host: 192.168.31.200 + password: Remi@123 + port: 30120 + jedis: + pool: + max-active: 8 + max-idle: 8 + min-idle: 0 + timeout: 1000 + +# 异步线程配置 +async: + executor: + thread: + # 核心线程数 + corePoolSize: 10 + # 最大线程数 + maxPoolSize: 30 + # 任务队列大小 + queueCapacity: 3000 + # 缓冲队列中线程的空闲时间 + keepAliveSeconds: 300 + +minio: + endpoint: http://192.168.31.200:30900 + username: minioadmin + password: minioadmin + bucketName: remi + +# 拦截器 +sql-intercept: + tenant: + deptTenant: + enable: true + companyTenant: + enable: true + anonUrlSet: /sso/login/ticket,/sso/login/other,/sso/login/local,/sso/logout,/sso/oauth2/accessToken,/sso/oauth2/refreshToken,/sso/oauth2/checkToken,/logRecord/add,/logRecord/pageLogin,/logRecord/pageOperate,/logRecord/pageException,/logRecord/get + field-fill: + createdByIntercept: + enable: true + updateByIntercept: + enable: true + createAtIntercept: + enable: true + updateAtIntercept: + enable: true + +# springdoc +springdoc: + group-configs: + - group: web + packages-to-scan: ai.remi.demo.web + - group: app + packages-to-scan: ai.remi.demo.app + +# 开启系统操作日志 +remi-log: + record: + enabled: true + appName: remi-sys-web + pushUrl: http://192.168.31.200:8080/logRecord/add \ No newline at end of file diff --git a/docs/generator/EasyCodeConfig.json b/docs/generator/EasyCodeConfig.json deleted file mode 100644 index d5079bb..0000000 --- a/docs/generator/EasyCodeConfig.json +++ /dev/null @@ -1,139 +0,0 @@ -{ - "author" : "dianjiu", - "version" : "1.2.8", - "userSecure" : "", - "currTypeMapperGroupName" : "Default", - "currTemplateGroupName" : "Remi", - "currColumnConfigGroupName" : "Default", - "currGlobalConfigGroupName" : "Default", - "typeMapper" : { - "Default" : { - "name" : "Default", - "elementList" : [ { - "matchType" : "REGEX", - "columnType" : "varchar(\\(\\d+\\))?", - "javaType" : "java.lang.String" - }, { - "matchType" : "REGEX", - "columnType" : "char(\\(\\d+\\))?", - "javaType" : "java.lang.String" - }, { - "matchType" : "REGEX", - "columnType" : "(tiny|medium|long)*text", - "javaType" : "java.lang.String" - }, { - "matchType" : "REGEX", - "columnType" : "decimal(\\(\\d+,\\d+\\))?", - "javaType" : "java.math.BigDecimal" - }, { - "matchType" : "ORDINARY", - "columnType" : "integer", - "javaType" : "java.lang.Integer" - }, { - "matchType" : "REGEX", - "columnType" : "(tiny|small|medium)*int(\\(\\d+\\))?", - "javaType" : "java.lang.Integer" - }, { - "matchType" : "ORDINARY", - "columnType" : "int4", - "javaType" : "java.lang.Integer" - }, { - "matchType" : "ORDINARY", - "columnType" : "int8", - "javaType" : "java.lang.Long" - }, { - "matchType" : "REGEX", - "columnType" : "bigint(\\(\\d+\\))?", - "javaType" : "java.lang.Long" - }, { - "matchType" : "ORDINARY", - "columnType" : "date", - "javaType" : "java.time.LocalDateTime" - }, { - "matchType" : "ORDINARY", - "columnType" : "datetime", - "javaType" : "java.time.LocalDateTime" - }, { - "matchType" : "ORDINARY", - "columnType" : "timestamp", - "javaType" : "java.time.LocalDateTime" - }, { - "matchType" : "ORDINARY", - "columnType" : "time", - "javaType" : "java.time.LocalDateTime" - }, { - "matchType" : "ORDINARY", - "columnType" : "boolean", - "javaType" : "java.lang.Boolean" - } ] - } - }, - "template" : { - "Remi" : { - "name" : "Remi", - "elementList" : [ { - "name" : "converter.java.vm", - "code" : "##引入宏定义\n$!{init.vm}\n$!{define.vm}\n\n##使用宏定义设置回调(保存位置与文件后缀)\n#save(\"/converter\", \"Converter.java\")\n\n##使用宏定义设置包后缀\n#setPackageSuffix(\"converter\")\n\n##使用全局变量实现默认包导入\n$!autoImport\nimport org.mapstruct.Mapper;\nimport org.mapstruct.Mapping;\nimport org.mapstruct.factory.Mappers;\n\n/**\n * @author DianJiu\n * @email dianjiuxyz@gmail.com\n * @desc $!{tableInfo.comment} $!{tableInfo.name}Converter转换接口\n */\n@Mapper\npublic interface $!{tableInfo.name}Converter {\n\n public static $!{tableInfo.name}Converter INSTANT = Mappers.getMapper($!{tableInfo.name}Converter.class);\n\n @Mapping(target = \"id\", ignore = true)\n @Mapping(target = \"deleted\", ignore = true)\n @Mapping(target = \"revision\", ignore = true)\n @Mapping(target = \"deptTenantId\", ignore = true)\n @Mapping(target = \"companyTenantId\", ignore = true)\n @Mapping(target = \"createdBy\", ignore = true)\n @Mapping(target = \"createdAt\", ignore = true)\n @Mapping(target = \"updatedBy\", ignore = true)\n @Mapping(target = \"updatedAt\", ignore = true)\n $!{tableInfo.name} postDtoToEntity($!{tableInfo.name}PostDTO $!tool.firstLowerCase($tableInfo.name)DTO);\n \n @Mapping(target = \"deleted\", ignore = true)\n @Mapping(target = \"revision\", ignore = true)\n @Mapping(target = \"deptTenantId\", ignore = true)\n @Mapping(target = \"companyTenantId\", ignore = true)\n @Mapping(target = \"createdBy\", ignore = true)\n @Mapping(target = \"createdAt\", ignore = true)\n @Mapping(target = \"updatedBy\", ignore = true)\n @Mapping(target = \"updatedAt\", ignore = true)\n $!{tableInfo.name} putDtoToEntity($!{tableInfo.name}PutDTO $!tool.firstLowerCase($tableInfo.name)DTO);\n \n @Mapping(target = \"deleted\", ignore = true)\n @Mapping(target = \"revision\", ignore = true)\n @Mapping(target = \"deptTenantId\", ignore = true)\n @Mapping(target = \"companyTenantId\", ignore = true)\n @Mapping(target = \"createdBy\", ignore = true)\n @Mapping(target = \"createdAt\", ignore = true)\n @Mapping(target = \"updatedBy\", ignore = true)\n @Mapping(target = \"updatedAt\", ignore = true)\n $!{tableInfo.name} queryToEntity($!{tableInfo.name}Query $!tool.firstLowerCase($tableInfo.name)Query);\n \n $!{tableInfo.name}VO entityToVO($!{tableInfo.name} $!tool.firstLowerCase($tableInfo.name));\n \n}" - }, { - "name" : "entity.java.vm", - "code" : "##引入宏定义\n$!{init.vm}\n$!{define.vm}\n\n##使用宏定义设置回调(保存位置与文件后缀)\n#save(\"/entity\", \".java\")\n\n##使用宏定义设置包后缀\n#setPackageSuffix(\"entity\")\n\n##使用全局变量实现默认包导入\n$!autoImport\nimport java.io.Serializable;\nimport com.baomidou.mybatisplus.extension.activerecord.Model;\nimport lombok.Data;\nimport lombok.AllArgsConstructor;\nimport lombok.NoArgsConstructor;\nimport lombok.Builder;\n\n/**\n * @author DianJiu\n * @email dianjiuxyz@gmail.com\n * @desc $!{tableInfo.comment} $!{tableInfo.name}DTO对象\n */\n@Data\n@SuperBuilder\n@AllArgsConstructor\n@NoArgsConstructor\n@TableName(\"$tableInfo.obj.name\")\npublic class $!{tableInfo.name} extends BaseEntity {\n#foreach($column in $tableInfo.fullColumn)\n\n #if(!$column.name.equals(\"id\") && !$column.name.equals(\"deleted\") && !$column.name.equals(\"revision\") && !$column.name.equals(\"deptTenantId\") && !$column.name.equals(\"companyTenantId\") && !$column.name.equals(\"createdBy\") && !$column.name.equals(\"createdAt\") && !$column.name.equals(\"updatedBy\") && !$column.name.equals(\"updatedAt\"))\n #if(${column.comment})/**\n * ${column.comment}\n */#end\n private $!{tool.getClsNameByFullName($column.type)} $!{column.name};\n #end\n#end\n\n}" - }, { - "name" : "query.java.vm", - "code" : "##引入宏定义\n$!{init.vm}\n$!{define.vm}\n\n##使用宏定义设置回调(保存位置与文件后缀)\n#save(\"/query\", \"Query.java\")\n\n##使用宏定义设置包后缀\n#setPackageSuffix(\"query\")\n\n##使用全局变量实现默认包导入\n$!autoImport\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.*;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\n\n/**\n * @author DianJiu\n * @email dianjiuxyz@gmail.com\n * @desc $!{tableInfo.comment} $!{tableInfo.name}Query对象\n */\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\n@ToString(callSuper = true)\n@Schema(description = \"$!{tableInfo.comment}\")\npublic class $!{tableInfo.name}Query implements Serializable {\n private static final long serialVersionUID = $!tool.serial();\n#foreach($column in $tableInfo.fullColumn)\n #if(!$column.name.equals(\"deleted\") && !$column.name.equals(\"revision\") && !$column.name.equals(\"deptTenantId\") && !$column.name.equals(\"companyTenantId\") && !$column.name.equals(\"createdBy\") && !$column.name.equals(\"createdAt\") && !$column.name.equals(\"updatedBy\") && !$column.name.equals(\"updatedAt\"))\n #if(${column.comment})/**\n * ${column.comment}\n */#end\n #if($column.type.equals(\"java.time.LocalDateTime\"))\n @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n #end\n @Schema(description = \"$column.comment\")\n private $!{tool.getClsNameByFullName($column.type)} $!{column.name};\n #end\n#end\n\n}\n" - }, { - "name" : "vo.java.vm", - "code" : "##引入宏定义\n$!{init.vm}\n$!{define.vm}\n\n##使用宏定义设置回调(保存位置与文件后缀)\n#save(\"/vo\", \"VO.java\")\n\n##使用宏定义设置包后缀\n#setPackageSuffix(\"vo\")\n\n##使用全局变量实现默认包导入\n$!{autoImport.vm}\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.*;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\nimport java.time.LocalDateTime;\n\n/**\n * @author DianJiu\n * @email dianjiuxyz@gmail.com\n * @desc $!{tableInfo.comment} $!{tableInfo.name}VO对象\n */\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\n@ToString(callSuper = true)\n@Schema(description = \"$!{tableInfo.comment}\")\npublic class $!{tableInfo.name}VO implements Serializable {\n private static final long serialVersionUID = $!tool.serial();\n#foreach($column in $tableInfo.fullColumn)\n #if(${column.comment})/**\n * ${column.comment}\n */#end\n #if($column.type.equals(\"java.time.LocalDateTime\"))\n @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n #end\n @Schema(description = \"$column.comment\")\n private $!{tool.getClsNameByFullName($column.type)} $!{column.name};\n#end\n\n}" - }, { - "name" : "putdto.java.vm", - "code" : "##引入宏定义\n$!{init.vm}\n$!{define.vm}\n\n##使用宏定义设置回调(保存位置与文件后缀)\n#save(\"/dto/put\", \"PutDTO.java\")\n\n##使用宏定义设置包后缀\n#setPackageSuffix(\"dto.put\")\n\n##使用全局变量实现默认包导入\n$!autoImport\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.*;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\n\n/**\n * @author DianJiu\n * @email dianjiuxyz@gmail.com\n * @desc $!{tableInfo.comment} $!{tableInfo.name}DTO对象\n */\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\n@ToString(callSuper = true)\n@Schema(description = \"$!{tableInfo.comment}\")\npublic class $!{tableInfo.name}PutDTO implements Serializable {\n private static final long serialVersionUID = $!tool.serial();\n#foreach($column in $tableInfo.fullColumn)\n\n #if(!$column.name.equals(\"deleted\") && !$column.name.equals(\"revision\") && !$column.name.equals(\"deptTenantId\") && !$column.name.equals(\"companyTenantId\") && !$column.name.equals(\"createdBy\") && !$column.name.equals(\"createdAt\") && !$column.name.equals(\"updatedBy\") && !$column.name.equals(\"updatedAt\"))\n #if(${column.comment})/**\n * ${column.comment}\n */#end\n #if($column.type.equals(\"java.time.LocalDateTime\"))\n @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n #end\n @Schema(description = \"$column.comment\")\n private $!{tool.getClsNameByFullName($column.type)} $!{column.name};\n #end\n#end\n\n}" - }, { - "name" : "postdto.java.vm", - "code" : "##引入宏定义\n$!{init.vm}\n$!{define.vm}\n\n##使用宏定义设置回调(保存位置与文件后缀)\n#save(\"/dto/post\", \"PostDTO.java\")\n\n##使用宏定义设置包后缀\n#setPackageSuffix(\"dto.post\")\n\n##使用全局变量实现默认包导入\n$!autoImport\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.*;\n\nimport java.io.Serializable;\nimport java.math.BigDecimal;\n\n/**\n * @author DianJiu\n * @email dianjiuxyz@gmail.com\n * @desc $!{tableInfo.comment} $!{tableInfo.name}DTO对象\n */\n@Data\n@Builder\n@AllArgsConstructor\n@NoArgsConstructor\n@ToString(callSuper = true)\n@Schema(description = \"$!{tableInfo.comment}\")\npublic class $!{tableInfo.name}PostDTO implements Serializable {\n private static final long serialVersionUID = $!tool.serial();\n#foreach($column in $tableInfo.fullColumn)\n\n #if(!$column.name.equals(\"id\") && !$column.name.equals(\"deleted\") && !$column.name.equals(\"revision\") && !$column.name.equals(\"deptTenantId\") && !$column.name.equals(\"companyTenantId\") && !$column.name.equals(\"createdBy\") && !$column.name.equals(\"createdAt\") && !$column.name.equals(\"updatedBy\") && !$column.name.equals(\"updatedAt\"))\n #if(${column.comment})/**\n * ${column.comment}\n */#end\n #if($column.type.equals(\"java.time.LocalDateTime\"))\n @DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")\n @JsonFormat(pattern = \"yyyy-MM-dd HH:mm:ss\", timezone = \"GMT+8\")\n #end\n @Schema(description = \"$column.comment\")\n private $!{tool.getClsNameByFullName($column.type)} $!{column.name};\n #end\n#end\n\n}" - }, { - "name" : "controller.java.vm", - "code" : "##导入宏定义\n$!{init.vm}\n$!{define.vm}\n\n##设置表后缀(宏定义)\n#setTableSuffix(\"Controller\")\n\n##保存文件(宏定义)\n#save(\"/controller\", \"Controller.java\")\n\n##包路径(宏定义)\n#setPackageSuffix(\"controller\")\n\n##定义服务名\n#set($serviceName = $!tool.append($!tool.firstLowerCase($!tableInfo.name), \"Service\"))\n\n##定义实体对象名\n#set($entityName = $!tool.firstLowerCase($!tableInfo.name))\n\nimport com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;\nimport com.baomidou.mybatisplus.extension.api.ApiController;\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport org.springframework.web.bind.annotation.*;\n\nimport javax.annotation.Resource;\nimport javax.validation.constraints.NotBlank;\nimport java.util.List;\n\n##表注释(宏定义)\n/**\n * @author DianJiu\n * @email dianjiuxyz@gmail.com\n * @desc $!{tableInfo.comment}($!{tableInfo.name})控制层\n */\n@Validated\n@RestController\n@ApiSort(value = 1)\n@Tag(name = \"$!{tableInfo.comment}\")\n@RequestMapping(\"$!tool.firstLowerCase($!tableInfo.name)\")\npublic class $!{tableName} {\n /**\n * 服务对象\n */\n @Resource\n private $!{tableInfo.name}Service $!{serviceName};\n\n \n /**\n * 通过主键查询单条数据\n *\n * @param id 主键\n * @return 单条数据\n */\n @GetMapping(\"{id}\")\n @Operation(summary = \"查询单条\")\n public ResultBean<$!{tableInfo.name}VO> get(@PathVariable @Validated @NotBlank(message = \"ID不能为空\") String id) {\n $!{tableInfo.name} $!{tool.firstLowerCase($!{tableInfo.name})} = $!{tool.firstLowerCase($tableInfo.name)}Service.getById(id);\n //处理格式转换\n $!{tableInfo.name}VO $!{tool.firstLowerCase($!{tableInfo.name})}VO = $!{tableInfo.name}Converter.INSTANT.entityToVO($!tool.firstLowerCase($!{tableInfo.name}));\n return ResultBean.success($!{tool.firstLowerCase($!{tableInfo.name})}VO);\n }\n \n /**\n * 通过实体不为空的属性作为筛选条件查询对象列表\n *\n * @param $!tool.firstLowerCase($tableInfo.name)Query 实例对象\n * @return 对象列表\n */\n @PostMapping(value = \"/list\")\n @Operation(summary = \"查询所有\")\n public ResultBean> list(@RequestBody $!{tableInfo.name}Query $!tool.firstLowerCase($tableInfo.name)Query) { \n //处理格式转换\n $!{tableInfo.name} $!{tool.firstLowerCase($!{tableInfo.name})} = $!{tableInfo.name}Converter.INSTANT.queryToEntity($!tool.firstLowerCase($tableInfo.name)Query);\n //执行分页查询\n List<$!{tableInfo.name}> listResult = $!{tool.firstLowerCase($tableInfo.name)}Service.list(new QueryWrapper<>($!{tool.firstLowerCase($!{tableInfo.name})}));\n return ResultBean.success(BeanCopyUtils.coverList(listResult, $!{tableInfo.name}VO.class));\n }\n \n /**\n * 分页查询所有数据\n *\n * @param pageQuery 分页对象\n * @param $!tool.firstLowerCase($!{tableInfo.name})Query 查询实体\n * @return 分页对象\n */\n @PostMapping(value = \"/page\")\n @Operation(summary = \"分页查询\")\n public ResultBean> page(PageQuery pageQuery,$!{tableInfo.name}Query $!tool.firstLowerCase($tableInfo.name)Query) {\n //处理分页条件\n Page<$!tableInfo.name> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());\n //处理格式转换\n $!{tableInfo.name} $!{tool.firstLowerCase($!{tableInfo.name})} = $!{tableInfo.name}Converter.INSTANT.queryToEntity($!tool.firstLowerCase($tableInfo.name)Query);\n //执行分页查询\n Page<$!{tableInfo.name}> pageResult = $!{tool.firstLowerCase($tableInfo.name)}Service.page(page, new QueryWrapper<>($!{tool.firstLowerCase($!{tableInfo.name})}));\n PagerBean<$!{tableInfo.name}VO> pageBean = new PagerBean<>(pageResult.getTotal(), pageResult.getCurrent(),\n pageResult.getSize(), BeanCopyUtils.coverList(pageResult.getRecords(), $!{tableInfo.name}VO.class));\n return ResultBean.success(pageBean);\n }\n\n /**\n * 新增数据\n *\n * @param $!tool.firstLowerCase($tableInfo.name)DTO 实体对象\n * @return 新增结果\n */\n @PostMapping(\"/add\")\n @Operation(summary = \"新增数据\")\n public ResultBean insert(@RequestBody @Validated $!{tableInfo.name}PostDTO $!tool.firstLowerCase($tableInfo.name)DTO) {\n //处理格式转换\n $!{tableInfo.name} $!{tool.firstLowerCase($!{tableInfo.name})} = $!{tableInfo.name}Converter.INSTANT.postDtoToEntity($!tool.firstLowerCase($tableInfo.name)DTO);\n //执行数据保存\n return ResultBean.success($!{tool.firstLowerCase($tableInfo.name)}Service.save($!{tool.firstLowerCase($!{tableInfo.name})}));\n }\n\n /**\n * 修改数据\n *\n * @param $!tool.firstLowerCase($tableInfo.name)DTO 实体对象\n * @return 修改结果\n */\n @PutMapping(\"/update\")\n @Operation(summary = \"修改数据\")\n public ResultBean update(@RequestBody @Validated $!{tableInfo.name}PutDTO $!tool.firstLowerCase($tableInfo.name)DTO) {\n //处理格式转换\n $!{tableInfo.name} $!{tool.firstLowerCase($!{tableInfo.name})} = $!{tableInfo.name}Converter.INSTANT.putDtoToEntity($!tool.firstLowerCase($tableInfo.name)DTO);\n //执行数据更新\n return ResultBean.success($!{tool.firstLowerCase($tableInfo.name)}Service.updateById($!{tool.firstLowerCase($!{tableInfo.name})}));\n }\n\n /**\n * 删除数据\n *\n * @param ids 主键结合\n * @return 删除结果\n */\n @DeleteMapping(\"/delete\")\n @Operation(summary = \"删除数据\")\n public ResultBean delete(@RequestParam(\"ids\") List ids) {\n return ResultBean.success($!{tool.firstLowerCase($tableInfo.name)}Service.removeByIds(ids));\n } \n\n}\n" - }, { - "name" : "service.java.vm", - "code" : "##导入宏定义\n$!{init.vm}\n$!{define.vm}\n\n##设置表后缀(宏定义)\n#setTableSuffix(\"Service\")\n\n##保存文件(宏定义)\n#save(\"/service\", \"Service.java\")\n\n##包路径(宏定义)\n#setPackageSuffix(\"service\")\n\nimport com.baomidou.mybatisplus.extension.service.IService;\n\n##表注释(宏定义)\n/**\n * @author DianJiu\n * @email dianjiuxyz@gmail.com\n * @desc $!{tableInfo.comment}($!{tableInfo.name})服务定义层\n */\npublic interface $!{tableName} extends IService<$!tableInfo.name> {\n\n}" - }, { - "name" : "serviceimpl.java.vm", - "code" : "##导入宏定义\n$!{init.vm}\n$!{define.vm}\n\n##设置表后缀(宏定义)\n#setTableSuffix(\"ServiceImpl\")\n\n##保存文件(宏定义)\n#save(\"/service/impl\", \"ServiceImpl.java\")\n\n##包路径(宏定义)\n#setPackageSuffix(\"service.impl\")\n\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;\nimport org.springframework.stereotype.Service;\n\n##表注释(宏定义)\n/**\n * @author DianJiu\n * @email dianjiuxyz@gmail.com\n * @desc $!{tableInfo.comment}($!{tableInfo.name})服务实现层\n */\n@Service(\"$!tool.firstLowerCase($tableInfo.name)Service\")\npublic class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Mapper, $!{tableInfo.name}> implements $!{tableInfo.name}Service {\n\n}\n" - }, { - "name" : "mapper.java.vm", - "code" : "##导入宏定义\n$!{init.vm}\n$!{define.vm}\n\n##设置表后缀(宏定义)\n#setTableSuffix(\"Mapper\")\n\n##保存文件(宏定义)\n#save(\"/mapper\", \"Mapper.java\")\n\n##包路径(宏定义)\n#setPackageSuffix(\"mapper\")\nimport org.apache.ibatis.annotations.Mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\n\n##表注释(宏定义)\n/**\n * @author DianJiu\n * @email dianjiuxyz@gmail.com\n * @desc $!{tableInfo.comment}($!{tableInfo.name})数据层\n */\n@Mapper\npublic interface $!{tableName} extends BaseMapper<$!tableInfo.name> {\n\n}" - } ] - } - }, - "columnConfig" : { - "Default" : { - "name" : "Default", - "elementList" : [ { - "title" : "disable", - "type" : "BOOLEAN", - "selectValue" : "" - }, { - "title" : "support", - "type" : "SELECT", - "selectValue" : "add,edit,query,del,ui" - } ] - } - }, - "globalConfig" : { - "Default" : { - "name" : "Default", - "elementList" : [ { - "name" : "autoImport.vm", - "value" : "##自动导入包(仅导入实体属性需要的包,通常用于实体类)\n#foreach($import in $importList)\nimport $!import;\n#end" - }, { - "name" : "define.vm", - "value" : "##(Velocity宏定义)\n\n##定义设置表名后缀的宏定义,调用方式:#setTableSuffix(\"Test\")\n#macro(setTableSuffix $suffix)\n #set($tableName = $!tool.append($tableInfo.name, $suffix))\n#end\n\n##定义设置包名后缀的宏定义,调用方式:#setPackageSuffix(\"Test\")\n#macro(setPackageSuffix $suffix)\n#if($suffix!=\"\")package #end#if($tableInfo.savePackageName!=\"\")$!{tableInfo.savePackageName}.#{end}$!suffix;\n#end\n\n##定义直接保存路径与文件名简化的宏定义,调用方式:#save(\"/entity\", \".java\")\n#macro(save $path $fileName)\n $!callback.setSavePath($tool.append($tableInfo.savePath, $path))\n $!callback.setFileName($tool.append($tableInfo.name, $fileName))\n#end\n\n##定义表注释的宏定义,调用方式:#tableComment(\"注释信息\")\n#macro(tableComment $desc)\n/**\n * $!{tableInfo.comment}($!{tableInfo.name})$desc\n *\n * @author $!author\n * @since $!time.currTime()\n */\n#end\n\n##定义GET,SET方法的宏定义,调用方式:#getSetMethod($column)\n#macro(getSetMethod $column)\n\n public $!{tool.getClsNameByFullName($column.type)} get$!{tool.firstUpperCase($column.name)}() {\n return $!{column.name};\n }\n\n public void set$!{tool.firstUpperCase($column.name)}($!{tool.getClsNameByFullName($column.type)} $!{column.name}) {\n this.$!{column.name} = $!{column.name};\n }\n#end" - }, { - "name" : "init.vm", - "value" : "##初始化区域\n\n##去掉表的sdt_前缀\n#if($tableInfo.obj.name.startsWith(\"sdt_\"))\n $!tableInfo.setName($tool.getClassName($tableInfo.obj.name.substring(4)))\n#end\n\n##去掉表的ids_前缀\n#if($tableInfo.obj.name.startsWith(\"ids_\"))\n $!tableInfo.setName($tool.getClassName($tableInfo.obj.name.substring(4)))\n#end\n\n##去掉表的ams_前缀\n#if($tableInfo.obj.name.startsWith(\"ams_\"))\n $!tableInfo.setName($tool.getClassName($tableInfo.obj.name.substring(4)))\n#end\n\n##去掉表的mps_前缀\n#if($tableInfo.obj.name.startsWith(\"mps_\"))\n $!tableInfo.setName($tool.getClassName($tableInfo.obj.name.substring(4)))\n#end\n\n##去掉表的mps_前缀\n#if($tableInfo.obj.name.startsWith(\"sys_\"))\n $!tableInfo.setName($tool.getClassName($tableInfo.obj.name.substring(4)))\n#end\n\n##去掉表的cms_前缀\n#if($tableInfo.obj.name.startsWith(\"cms_\"))\n $!tableInfo.setName($tool.getClassName($tableInfo.obj.name.substring(4)))\n#end\n\n##参考阿里巴巴开发手册,POJO 类中布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误\n#foreach($column in $tableInfo.fullColumn)\n#if($column.name.startsWith(\"is\") && $column.type.equals(\"java.lang.Boolean\"))\n $!column.setName($tool.firstLowerCase($column.name.substring(2)))\n#end\n#end\n\n##实现动态排除列\n#set($temp = $tool.newHashSet(\"testCreateTime\", \"otherColumn\"))\n#foreach($item in $temp)\n #set($newList = $tool.newArrayList())\n #foreach($column in $tableInfo.fullColumn)\n #if($column.name!=$item)\n ##带有反回值的方法调用时使用$tool.call来消除返回值\n $tool.call($newList.add($column))\n #end\n #end\n ##重新保存\n $tableInfo.setFullColumn($newList)\n#end\n\n##对importList进行篡改\n#set($temp = $tool.newHashSet())\n#foreach($column in $tableInfo.fullColumn)\n #if(!$column.type.startsWith(\"java.lang.\"))\n ##带有反回值的方法调用时使用$tool.call来消除返回值\n $tool.call($temp.add($column.type))\n #end\n#end\n##覆盖\n#set($importList = $temp)" - }, { - "name" : "mybatisSupport.vm", - "value" : "##针对Mybatis 进行支持,主要用于生成xml文件\n#foreach($column in $tableInfo.fullColumn)\n ##储存列类型\n $tool.call($column.ext.put(\"sqlType\", $tool.getField($column.obj.dataType, \"typeName\")))\n #if($tool.newHashSet(\"java.lang.String\").contains($column.type))\n #set($jdbcType=\"VARCHAR\")\n #elseif($tool.newHashSet(\"java.lang.Boolean\", \"boolean\").contains($column.type))\n #set($jdbcType=\"BOOLEAN\")\n #elseif($tool.newHashSet(\"java.lang.Byte\", \"byte\").contains($column.type))\n #set($jdbcType=\"BYTE\")\n #elseif($tool.newHashSet(\"java.lang.Integer\", \"int\", \"java.lang.Short\", \"short\").contains($column.type))\n #set($jdbcType=\"INTEGER\")\n #elseif($tool.newHashSet(\"java.lang.Long\", \"long\").contains($column.type))\n #set($jdbcType=\"INTEGER\")\n #elseif($tool.newHashSet(\"java.lang.Float\", \"float\", \"java.lang.Double\", \"double\").contains($column.type))\n #set($jdbcType=\"NUMERIC\")\n #elseif($tool.newHashSet(\"java.util.Date\", \"java.sql.Timestamp\", \"java.time.Instant\", \"java.time.LocalDateTime\", \"java.time.OffsetDateTime\", \"\tjava.time.ZonedDateTime\").contains($column.type))\n #set($jdbcType=\"TIMESTAMP\")\n #elseif($tool.newHashSet(\"java.sql.Date\", \"java.time.LocalDate\").contains($column.type))\n #set($jdbcType=\"TIMESTAMP\")\n #else\n ##其他类型\n #set($jdbcType=\"VARCHAR\")\n #end\n $tool.call($column.ext.put(\"jdbcType\", $jdbcType))\n#end\n\n##定义宏,查询所有列\n#macro(allSqlColumn)#foreach($column in $tableInfo.fullColumn)$column.obj.name#if($velocityHasNext), #end#end#end\n" - } ] - } - } -} \ No newline at end of file diff --git a/docs/images/ai-remi.png b/docs/images/ai-remi.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa08c3395d07ead82f87c6405222c001f37dcdb GIT binary patch literal 4532874 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