From 8bb33f5c6c5ca552be101b585b48887ec8f6a411 Mon Sep 17 00:00:00 2001 From: Himit_ZH <372347736@qq.com> Date: Mon, 26 Oct 2020 21:57:25 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=BB=BA=E7=AB=8B=EF=BC=8C?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=B9=A6=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.en.md | 36 -- README.md | 37 -- hoj/.idea/.gitignore | 8 + hoj/.idea/compiler.xml | 14 + hoj/.idea/jarRepositories.xml | 25 + hoj/.idea/misc.xml | 14 + hoj/.idea/uiDesigner.xml | 124 ++++ hoj/DataBackup/pom.xml | 124 ++++ .../java/top/hcode/DataBackupApplication.java | 22 + .../java/top/hcode/common/dto/LoginDto.java | 20 + .../top/hcode/common/dto/RegisterDto.java | 41 ++ .../exception/GlobalExceptionHandler.java | 76 +++ .../top/hcode/common/result/CommonResult.java | 57 ++ .../java/top/hcode/config/CorsConfig.java | 22 + .../top/hcode/config/MybatisPlusConfig.java | 25 + .../java/top/hcode/config/RedisConfig.java | 50 ++ .../java/top/hcode/config/ShiroConfig.java | 98 +++ .../java/top/hcode/config/SwaggerConfig.java | 56 ++ .../hcode/controller/AccountController.java | 157 +++++ .../main/java/top/hcode/dao/AuthMapper.java | 16 + .../java/top/hcode/dao/CommentMapper.java | 16 + .../java/top/hcode/dao/CommentTagMapper.java | 16 + .../hcode/dao/ContestAnnouncementMapper.java | 16 + .../hcode/dao/ContestExplanationMapper.java | 16 + .../java/top/hcode/dao/ContestMapper.java | 16 + .../top/hcode/dao/ContestProblemMapper.java | 16 + .../top/hcode/dao/ContestRecordMapper.java | 16 + .../top/hcode/dao/ContestRegisterMapper.java | 16 + .../top/hcode/dao/ContestScoreMapper.java | 16 + .../java/top/hcode/dao/JudgeCaseMapper.java | 16 + .../main/java/top/hcode/dao/JudgeMapper.java | 16 + .../top/hcode/dao/ProblemCountMapper.java | 16 + .../java/top/hcode/dao/ProblemMapper.java | 16 + .../java/top/hcode/dao/RoleAuthMapper.java | 16 + .../main/java/top/hcode/dao/RoleMapper.java | 16 + .../top/hcode/dao/UserAcproblemMapper.java | 16 + .../java/top/hcode/dao/UserInfoMapper.java | 23 + .../java/top/hcode/dao/UserRecordMapper.java | 20 + .../java/top/hcode/dao/UserRoleMapper.java | 20 + .../java/top/hcode/dao/xml/AuthMapper.xml | 5 + .../java/top/hcode/dao/xml/CommentMapper.xml | 5 + .../top/hcode/dao/xml/CommentTagMapper.xml | 5 + .../dao/xml/ContestAnnouncementMapper.xml | 5 + .../dao/xml/ContestExplanationMapper.xml | 5 + .../java/top/hcode/dao/xml/ContestMapper.xml | 5 + .../hcode/dao/xml/ContestProblemMapper.xml | 5 + .../top/hcode/dao/xml/ContestRecordMapper.xml | 5 + .../hcode/dao/xml/ContestRegisterMapper.xml | 5 + .../top/hcode/dao/xml/ContestScoreMapper.xml | 5 + .../top/hcode/dao/xml/JudgeCaseMapper.xml | 5 + .../java/top/hcode/dao/xml/JudgeMapper.xml | 5 + .../top/hcode/dao/xml/ProblemCountMapper.xml | 5 + .../java/top/hcode/dao/xml/ProblemMapper.xml | 5 + .../java/top/hcode/dao/xml/RoleAuthMapper.xml | 5 + .../java/top/hcode/dao/xml/RoleMapper.xml | 5 + .../top/hcode/dao/xml/UserAcproblemMapper.xml | 5 + .../java/top/hcode/dao/xml/UserInfoMapper.xml | 9 + .../top/hcode/dao/xml/UserRecordMapper.xml | 5 + .../java/top/hcode/dao/xml/UserRoleMapper.xml | 5 + .../java/top/hcode/service/AuthService.java | 16 + .../top/hcode/service/CommentService.java | 16 + .../top/hcode/service/CommentTagService.java | 16 + .../service/ContestAnnouncementService.java | 16 + .../service/ContestExplanationService.java | 16 + .../hcode/service/ContestProblemService.java | 16 + .../hcode/service/ContestRecordService.java | 16 + .../hcode/service/ContestRegisterService.java | 16 + .../hcode/service/ContestScoreService.java | 16 + .../top/hcode/service/ContestService.java | 16 + .../java/top/hcode/service/EmailService.java | 7 + .../top/hcode/service/JudgeCaseService.java | 16 + .../java/top/hcode/service/JudgeService.java | 16 + .../hcode/service/ProblemCountService.java | 16 + .../top/hcode/service/ProblemService.java | 16 + .../top/hcode/service/RoleAuthService.java | 16 + .../java/top/hcode/service/RoleService.java | 16 + .../hcode/service/UserAcproblemService.java | 16 + .../top/hcode/service/UserInfoService.java | 17 + .../top/hcode/service/UserRecordService.java | 16 + .../top/hcode/service/UserRoleService.java | 16 + .../hcode/service/impl/AuthServiceImpl.java | 20 + .../service/impl/CommentServiceImpl.java | 20 + .../service/impl/CommentTagServiceImpl.java | 20 + .../impl/ContestAnnouncementServiceImpl.java | 20 + .../impl/ContestExplanationServiceImpl.java | 20 + .../impl/ContestProblemServiceImpl.java | 20 + .../impl/ContestRecordServiceImpl.java | 20 + .../impl/ContestRegisterServiceImpl.java | 20 + .../service/impl/ContestScoreServiceImpl.java | 20 + .../service/impl/ContestServiceImpl.java | 20 + .../hcode/service/impl/EmailServiceImpl.java | 101 +++ .../service/impl/JudgeCaseServiceImpl.java | 20 + .../hcode/service/impl/JudgeServiceImpl.java | 20 + .../service/impl/ProblemCountServiceImpl.java | 20 + .../service/impl/ProblemServiceImpl.java | 20 + .../service/impl/RoleAuthServiceImpl.java | 20 + .../hcode/service/impl/RoleServiceImpl.java | 20 + .../impl/UserAcproblemServiceImpl.java | 20 + .../service/impl/UserInfoServiceImpl.java | 29 + .../service/impl/UserRecordServiceImpl.java | 20 + .../service/impl/UserRoleServiceImpl.java | 20 + .../java/top/hcode/shiro/AccountProfile.java | 43 ++ .../java/top/hcode/shiro/AccountRealm.java | 53 ++ .../main/java/top/hcode/shiro/JwtFilter.java | 90 +++ .../main/java/top/hcode/shiro/JwtToken.java | 23 + .../main/java/top/hcode/utils/JwtUtils.java | 59 ++ .../main/java/top/hcode/utils/RedisUtils.java | 576 ++++++++++++++++++ .../main/java/top/hcode/utils/ShiroUtils.java | 16 + .../src/main/resources/application.yml | 76 +++ .../top/hcode/DataBackupApplicationTests.java | 28 + hoj/DataBackup/target/classes/application.yml | 76 +++ .../top/hcode/DataBackupApplication.class | Bin 0 -> 769 bytes .../top/hcode/common/dto/LoginDto.class | Bin 0 -> 2102 bytes .../top/hcode/common/dto/RegisterDto.class | Bin 0 -> 4666 bytes .../exception/GlobalExceptionHandler.class | Bin 0 -> 3385 bytes .../hcode/common/result/CommonResult.class | Bin 0 -> 3476 bytes .../classes/top/hcode/config/CorsConfig.class | Bin 0 -> 1529 bytes .../top/hcode/config/MybatisPlusConfig.class | Bin 0 -> 861 bytes .../top/hcode/config/RedisConfig.class | Bin 0 -> 3117 bytes .../top/hcode/config/ShiroConfig.class | Bin 0 -> 5005 bytes .../top/hcode/config/SwaggerConfig.class | Bin 0 -> 3079 bytes .../hcode/controller/AccountController.class | Bin 0 -> 6926 bytes .../classes/top/hcode/dao/AuthMapper.class | Bin 0 -> 285 bytes .../classes/top/hcode/dao/CommentMapper.class | Bin 0 -> 294 bytes .../top/hcode/dao/CommentTagMapper.class | Bin 0 -> 303 bytes .../hcode/dao/ContestAnnouncementMapper.class | Bin 0 -> 330 bytes .../hcode/dao/ContestExplanationMapper.class | Bin 0 -> 327 bytes .../classes/top/hcode/dao/ContestMapper.class | Bin 0 -> 294 bytes .../top/hcode/dao/ContestProblemMapper.class | Bin 0 -> 315 bytes .../top/hcode/dao/ContestRecordMapper.class | Bin 0 -> 312 bytes .../top/hcode/dao/ContestRegisterMapper.class | Bin 0 -> 318 bytes .../top/hcode/dao/ContestScoreMapper.class | Bin 0 -> 309 bytes .../top/hcode/dao/JudgeCaseMapper.class | Bin 0 -> 300 bytes .../classes/top/hcode/dao/JudgeMapper.class | Bin 0 -> 288 bytes .../top/hcode/dao/ProblemCountMapper.class | Bin 0 -> 309 bytes .../classes/top/hcode/dao/ProblemMapper.class | Bin 0 -> 294 bytes .../top/hcode/dao/RoleAuthMapper.class | Bin 0 -> 297 bytes .../classes/top/hcode/dao/RoleMapper.class | Bin 0 -> 285 bytes .../top/hcode/dao/UserAcproblemMapper.class | Bin 0 -> 312 bytes .../top/hcode/dao/UserInfoMapper.class | Bin 0 -> 486 bytes .../top/hcode/dao/UserRecordMapper.class | Bin 0 -> 434 bytes .../top/hcode/dao/UserRoleMapper.class | Bin 0 -> 428 bytes .../classes/top/hcode/dao/xml/AuthMapper.xml | 5 + .../top/hcode/dao/xml/CommentMapper.xml | 5 + .../top/hcode/dao/xml/CommentTagMapper.xml | 5 + .../dao/xml/ContestAnnouncementMapper.xml | 5 + .../dao/xml/ContestExplanationMapper.xml | 5 + .../top/hcode/dao/xml/ContestMapper.xml | 5 + .../hcode/dao/xml/ContestProblemMapper.xml | 5 + .../top/hcode/dao/xml/ContestRecordMapper.xml | 5 + .../hcode/dao/xml/ContestRegisterMapper.xml | 5 + .../top/hcode/dao/xml/ContestScoreMapper.xml | 5 + .../top/hcode/dao/xml/JudgeCaseMapper.xml | 5 + .../classes/top/hcode/dao/xml/JudgeMapper.xml | 5 + .../top/hcode/dao/xml/ProblemCountMapper.xml | 5 + .../top/hcode/dao/xml/ProblemMapper.xml | 5 + .../top/hcode/dao/xml/RoleAuthMapper.xml | 5 + .../classes/top/hcode/dao/xml/RoleMapper.xml | 5 + .../top/hcode/dao/xml/UserAcproblemMapper.xml | 5 + .../top/hcode/dao/xml/UserInfoMapper.xml | 9 + .../top/hcode/dao/xml/UserRecordMapper.xml | 5 + .../top/hcode/dao/xml/UserRoleMapper.xml | 5 + .../top/hcode/service/AuthService.class | Bin 0 -> 299 bytes .../top/hcode/service/CommentService.class | Bin 0 -> 308 bytes .../top/hcode/service/CommentTagService.class | Bin 0 -> 317 bytes .../service/ContestAnnouncementService.class | Bin 0 -> 344 bytes .../service/ContestExplanationService.class | Bin 0 -> 341 bytes .../hcode/service/ContestProblemService.class | Bin 0 -> 329 bytes .../hcode/service/ContestRecordService.class | Bin 0 -> 326 bytes .../service/ContestRegisterService.class | Bin 0 -> 332 bytes .../hcode/service/ContestScoreService.class | Bin 0 -> 323 bytes .../top/hcode/service/ContestService.class | Bin 0 -> 308 bytes .../top/hcode/service/EmailService.class | Bin 0 -> 260 bytes .../top/hcode/service/JudgeCaseService.class | Bin 0 -> 314 bytes .../top/hcode/service/JudgeService.class | Bin 0 -> 302 bytes .../hcode/service/ProblemCountService.class | Bin 0 -> 323 bytes .../top/hcode/service/ProblemService.class | Bin 0 -> 308 bytes .../top/hcode/service/RoleAuthService.class | Bin 0 -> 311 bytes .../top/hcode/service/RoleService.class | Bin 0 -> 299 bytes .../hcode/service/UserAcproblemService.class | Bin 0 -> 326 bytes .../top/hcode/service/UserInfoService.class | Bin 0 -> 387 bytes .../top/hcode/service/UserRecordService.class | Bin 0 -> 317 bytes .../top/hcode/service/UserRoleService.class | Bin 0 -> 311 bytes .../hcode/service/impl/AuthServiceImpl.class | Bin 0 -> 645 bytes .../service/impl/CommentServiceImpl.class | Bin 0 -> 666 bytes .../service/impl/CommentTagServiceImpl.class | Bin 0 -> 687 bytes .../impl/ContestAnnouncementServiceImpl.class | Bin 0 -> 750 bytes .../impl/ContestExplanationServiceImpl.class | Bin 0 -> 743 bytes .../impl/ContestProblemServiceImpl.class | Bin 0 -> 715 bytes .../impl/ContestRecordServiceImpl.class | Bin 0 -> 708 bytes .../impl/ContestRegisterServiceImpl.class | Bin 0 -> 722 bytes .../impl/ContestScoreServiceImpl.class | Bin 0 -> 701 bytes .../service/impl/ContestServiceImpl.class | Bin 0 -> 666 bytes .../hcode/service/impl/EmailServiceImpl.class | Bin 0 -> 4760 bytes .../service/impl/JudgeCaseServiceImpl.class | Bin 0 -> 680 bytes .../hcode/service/impl/JudgeServiceImpl.class | Bin 0 -> 652 bytes .../impl/ProblemCountServiceImpl.class | Bin 0 -> 701 bytes .../service/impl/ProblemServiceImpl.class | Bin 0 -> 666 bytes .../service/impl/RoleAuthServiceImpl.class | Bin 0 -> 673 bytes .../hcode/service/impl/RoleServiceImpl.class | Bin 0 -> 645 bytes .../impl/UserAcproblemServiceImpl.class | Bin 0 -> 708 bytes .../service/impl/UserInfoServiceImpl.class | Bin 0 -> 1163 bytes .../service/impl/UserRecordServiceImpl.class | Bin 0 -> 687 bytes .../service/impl/UserRoleServiceImpl.class | Bin 0 -> 673 bytes .../top/hcode/shiro/AccountProfile.class | Bin 0 -> 6675 bytes .../top/hcode/shiro/AccountRealm.class | Bin 0 -> 3044 bytes .../classes/top/hcode/shiro/JwtFilter.class | Bin 0 -> 4595 bytes .../classes/top/hcode/shiro/JwtToken.class | Bin 0 -> 602 bytes .../classes/top/hcode/utils/JwtUtils.class | Bin 0 -> 4401 bytes .../classes/top/hcode/utils/RedisUtils.class | Bin 0 -> 10483 bytes .../classes/top/hcode/utils/ShiroUtils.class | Bin 0 -> 607 bytes .../hcode/DataBackupApplicationTests.class | Bin 0 -> 1345 bytes hoj/api/pom.xml | 42 ++ .../src/main/java/top/hcode/entity/Auth.java | 51 ++ .../main/java/top/hcode/entity/Comment.java | 59 ++ .../java/top/hcode/entity/CommentTag.java | 48 ++ .../main/java/top/hcode/entity/Contest.java | 72 +++ .../top/hcode/entity/ContestAnnouncement.java | 53 ++ .../top/hcode/entity/ContestExplanation.java | 50 ++ .../java/top/hcode/entity/ContestProblem.java | 54 ++ .../java/top/hcode/entity/ContestRecord.java | 60 ++ .../top/hcode/entity/ContestRegister.java | 51 ++ .../java/top/hcode/entity/ContestScore.java | 53 ++ .../src/main/java/top/hcode/entity/Judge.java | 84 +++ .../main/java/top/hcode/entity/JudgeCase.java | 68 +++ .../main/java/top/hcode/entity/Problem.java | 76 +++ .../java/top/hcode/entity/ProblemCount.java | 70 +++ .../src/main/java/top/hcode/entity/Role.java | 53 ++ .../main/java/top/hcode/entity/RoleAuth.java | 40 ++ .../java/top/hcode/entity/UserAcproblem.java | 48 ++ .../main/java/top/hcode/entity/UserInfo.java | 80 +++ .../java/top/hcode/entity/UserRecord.java | 61 ++ .../main/java/top/hcode/entity/UserRole.java | 40 ++ .../classes/top/hcode/entity/Auth.class | Bin 0 -> 4529 bytes .../classes/top/hcode/entity/Comment.class | Bin 0 -> 5765 bytes .../classes/top/hcode/entity/CommentTag.class | Bin 0 -> 3977 bytes .../classes/top/hcode/entity/Contest.class | Bin 0 -> 8009 bytes .../hcode/entity/ContestAnnouncement.class | Bin 0 -> 4978 bytes .../top/hcode/entity/ContestExplanation.class | Bin 0 -> 4520 bytes .../top/hcode/entity/ContestProblem.class | Bin 0 -> 4960 bytes .../top/hcode/entity/ContestRecord.class | Bin 0 -> 6386 bytes .../top/hcode/entity/ContestRegister.class | Bin 0 -> 4579 bytes .../top/hcode/entity/ContestScore.class | Bin 0 -> 4898 bytes .../classes/top/hcode/entity/Judge.class | Bin 0 -> 10557 bytes .../classes/top/hcode/entity/JudgeCase.class | Bin 0 -> 7611 bytes .../classes/top/hcode/entity/Problem.class | Bin 0 -> 9026 bytes .../top/hcode/entity/ProblemCount.class | Bin 0 -> 7635 bytes .../classes/top/hcode/entity/Role.class | Bin 0 -> 4566 bytes .../classes/top/hcode/entity/RoleAuth.class | Bin 0 -> 3275 bytes .../top/hcode/entity/UserAcproblem.class | Bin 0 -> 3977 bytes .../classes/top/hcode/entity/UserInfo.class | Bin 0 -> 8742 bytes .../classes/top/hcode/entity/UserRecord.class | Bin 0 -> 5955 bytes .../classes/top/hcode/entity/UserRole.class | Bin 0 -> 3325 bytes hoj/hoj.iml | 2 + hoj/pom.xml | 101 +++ hoj开发文档.md | 496 +++++++++++++++ 256 files changed, 5166 insertions(+), 73 deletions(-) delete mode 100644 README.en.md delete mode 100644 README.md create mode 100644 hoj/.idea/.gitignore create mode 100644 hoj/.idea/compiler.xml create mode 100644 hoj/.idea/jarRepositories.xml create mode 100644 hoj/.idea/misc.xml create mode 100644 hoj/.idea/uiDesigner.xml create mode 100644 hoj/DataBackup/pom.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/DataBackupApplication.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/common/dto/LoginDto.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/common/dto/RegisterDto.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/common/exception/GlobalExceptionHandler.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/common/result/CommonResult.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/config/CorsConfig.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/config/MybatisPlusConfig.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/config/RedisConfig.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/config/ShiroConfig.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/config/SwaggerConfig.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/controller/AccountController.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/AuthMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/CommentMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/CommentTagMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/ContestAnnouncementMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/ContestExplanationMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/ContestMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/ContestProblemMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/ContestRecordMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/ContestRegisterMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/ContestScoreMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/JudgeCaseMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/JudgeMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/ProblemCountMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/ProblemMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/RoleAuthMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/RoleMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/UserAcproblemMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/UserInfoMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/UserRecordMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/UserRoleMapper.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/AuthMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/CommentMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/CommentTagMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestAnnouncementMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestExplanationMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestProblemMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestRecordMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestRegisterMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestScoreMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/JudgeCaseMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/JudgeMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/ProblemCountMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/ProblemMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/RoleAuthMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/RoleMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserAcproblemMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserInfoMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserRecordMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserRoleMapper.xml create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/AuthService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/CommentService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/CommentTagService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/ContestAnnouncementService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/ContestExplanationService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/ContestProblemService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/ContestRecordService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/ContestRegisterService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/ContestScoreService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/ContestService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/EmailService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/JudgeCaseService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/JudgeService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/ProblemCountService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/ProblemService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/RoleAuthService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/RoleService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/UserAcproblemService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/UserInfoService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/UserRecordService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/UserRoleService.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/AuthServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/CommentServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/CommentTagServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestAnnouncementServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestExplanationServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestProblemServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestRecordServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestRegisterServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestScoreServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/EmailServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/JudgeCaseServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/JudgeServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/ProblemCountServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/ProblemServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/RoleAuthServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/RoleServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/UserAcproblemServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/UserInfoServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/UserRecordServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/service/impl/UserRoleServiceImpl.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/shiro/AccountProfile.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/shiro/AccountRealm.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/shiro/JwtFilter.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/shiro/JwtToken.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/utils/JwtUtils.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/utils/RedisUtils.java create mode 100644 hoj/DataBackup/src/main/java/top/hcode/utils/ShiroUtils.java create mode 100644 hoj/DataBackup/src/main/resources/application.yml create mode 100644 hoj/DataBackup/src/test/java/top/hcode/DataBackupApplicationTests.java create mode 100644 hoj/DataBackup/target/classes/application.yml create mode 100644 hoj/DataBackup/target/classes/top/hcode/DataBackupApplication.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/common/dto/LoginDto.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/common/dto/RegisterDto.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/common/exception/GlobalExceptionHandler.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/common/result/CommonResult.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/config/CorsConfig.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/config/MybatisPlusConfig.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/config/RedisConfig.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/config/ShiroConfig.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/config/SwaggerConfig.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/controller/AccountController.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/AuthMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/CommentMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/CommentTagMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/ContestAnnouncementMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/ContestExplanationMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/ContestMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/ContestProblemMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/ContestRecordMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/ContestRegisterMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/ContestScoreMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/JudgeCaseMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/JudgeMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/ProblemCountMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/ProblemMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/RoleAuthMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/RoleMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/UserAcproblemMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/UserInfoMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/UserRecordMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/UserRoleMapper.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/AuthMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/CommentMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/CommentTagMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestAnnouncementMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestExplanationMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestProblemMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestRecordMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestRegisterMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestScoreMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/JudgeCaseMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/JudgeMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/ProblemCountMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/ProblemMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/RoleAuthMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/RoleMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/UserAcproblemMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/UserInfoMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/UserRecordMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/dao/xml/UserRoleMapper.xml create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/AuthService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/CommentService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/CommentTagService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/ContestAnnouncementService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/ContestExplanationService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/ContestProblemService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/ContestRecordService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/ContestRegisterService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/ContestScoreService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/ContestService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/EmailService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/JudgeCaseService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/JudgeService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/ProblemCountService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/ProblemService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/RoleAuthService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/RoleService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/UserAcproblemService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/UserInfoService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/UserRecordService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/UserRoleService.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/AuthServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/CommentServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/CommentTagServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/ContestAnnouncementServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/ContestExplanationServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/ContestProblemServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/ContestRecordServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/ContestRegisterServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/ContestScoreServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/ContestServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/EmailServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/JudgeCaseServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/JudgeServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/ProblemCountServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/ProblemServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/RoleAuthServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/RoleServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/UserAcproblemServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/UserInfoServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/UserRecordServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/service/impl/UserRoleServiceImpl.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/shiro/AccountProfile.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/shiro/AccountRealm.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/shiro/JwtFilter.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/shiro/JwtToken.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/utils/JwtUtils.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/utils/RedisUtils.class create mode 100644 hoj/DataBackup/target/classes/top/hcode/utils/ShiroUtils.class create mode 100644 hoj/DataBackup/target/test-classes/top/hcode/DataBackupApplicationTests.class create mode 100644 hoj/api/pom.xml create mode 100644 hoj/api/src/main/java/top/hcode/entity/Auth.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/Comment.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/CommentTag.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/Contest.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/ContestAnnouncement.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/ContestExplanation.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/ContestProblem.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/ContestRecord.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/ContestRegister.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/ContestScore.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/Judge.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/JudgeCase.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/Problem.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/ProblemCount.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/Role.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/RoleAuth.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/UserAcproblem.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/UserInfo.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/UserRecord.java create mode 100644 hoj/api/src/main/java/top/hcode/entity/UserRole.java create mode 100644 hoj/api/target/classes/top/hcode/entity/Auth.class create mode 100644 hoj/api/target/classes/top/hcode/entity/Comment.class create mode 100644 hoj/api/target/classes/top/hcode/entity/CommentTag.class create mode 100644 hoj/api/target/classes/top/hcode/entity/Contest.class create mode 100644 hoj/api/target/classes/top/hcode/entity/ContestAnnouncement.class create mode 100644 hoj/api/target/classes/top/hcode/entity/ContestExplanation.class create mode 100644 hoj/api/target/classes/top/hcode/entity/ContestProblem.class create mode 100644 hoj/api/target/classes/top/hcode/entity/ContestRecord.class create mode 100644 hoj/api/target/classes/top/hcode/entity/ContestRegister.class create mode 100644 hoj/api/target/classes/top/hcode/entity/ContestScore.class create mode 100644 hoj/api/target/classes/top/hcode/entity/Judge.class create mode 100644 hoj/api/target/classes/top/hcode/entity/JudgeCase.class create mode 100644 hoj/api/target/classes/top/hcode/entity/Problem.class create mode 100644 hoj/api/target/classes/top/hcode/entity/ProblemCount.class create mode 100644 hoj/api/target/classes/top/hcode/entity/Role.class create mode 100644 hoj/api/target/classes/top/hcode/entity/RoleAuth.class create mode 100644 hoj/api/target/classes/top/hcode/entity/UserAcproblem.class create mode 100644 hoj/api/target/classes/top/hcode/entity/UserInfo.class create mode 100644 hoj/api/target/classes/top/hcode/entity/UserRecord.class create mode 100644 hoj/api/target/classes/top/hcode/entity/UserRole.class create mode 100644 hoj/hoj.iml create mode 100644 hoj/pom.xml create mode 100644 hoj开发文档.md diff --git a/README.en.md b/README.en.md deleted file mode 100644 index b8ad88d1..00000000 --- a/README.en.md +++ /dev/null @@ -1,36 +0,0 @@ -# HOJ - -#### Description -基于前后端分离,分布式架构的在线测评平台OJ - -#### Software Architecture -Software architecture description - -#### Installation - -1. xxxx -2. xxxx -3. xxxx - -#### Instructions - -1. xxxx -2. xxxx -3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md deleted file mode 100644 index 5b511430..00000000 --- a/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# HOJ - -#### 介绍 -基于前后端分离,分布式架构的在线测评平台OJ - -#### 软件架构 -软件架构说明 - - -#### 安装教程 - -1. xxxx -2. xxxx -3. xxxx - -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/hoj/.idea/.gitignore b/hoj/.idea/.gitignore new file mode 100644 index 00000000..73f69e09 --- /dev/null +++ b/hoj/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/hoj/.idea/compiler.xml b/hoj/.idea/compiler.xml new file mode 100644 index 00000000..a3e6f187 --- /dev/null +++ b/hoj/.idea/compiler.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/hoj/.idea/jarRepositories.xml b/hoj/.idea/jarRepositories.xml new file mode 100644 index 00000000..22e83c6b --- /dev/null +++ b/hoj/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/hoj/.idea/misc.xml b/hoj/.idea/misc.xml new file mode 100644 index 00000000..4b661a5f --- /dev/null +++ b/hoj/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/hoj/.idea/uiDesigner.xml b/hoj/.idea/uiDesigner.xml new file mode 100644 index 00000000..e96534fb --- /dev/null +++ b/hoj/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/hoj/DataBackup/pom.xml b/hoj/DataBackup/pom.xml new file mode 100644 index 00000000..faf57202 --- /dev/null +++ b/hoj/DataBackup/pom.xml @@ -0,0 +1,124 @@ + + + + hoj + top.hcode + 1.0-SNAPSHOT + + 4.0.0 + DataBackup + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + src/main/resources + + + src/main/java + + **/*.xml + + + + + + + + top.hcode + api + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-mail + + + + + + + + + + + org.projectlombok + lombok + true + + + com.alibaba + druid + + + com.baomidou + mybatis-plus-boot-starter + + + org.crazycake + shiro-redis-spring-boot-starter + + + mysql + mysql-connector-java + + + + cn.hutool + hutool-all + 5.3.3 + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + io.jsonwebtoken + jjwt + 0.9.1 + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework.boot + spring-boot-devtools + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/DataBackupApplication.java b/hoj/DataBackup/src/main/java/top/hcode/DataBackupApplication.java new file mode 100644 index 00000000..edb90cd3 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/DataBackupApplication.java @@ -0,0 +1,22 @@ +package top.hcode; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.scheduling.annotation.EnableAsync; + +/** + * @Author: Himit_ZH + * @Date: 2020/10/22 23:25 + * @Description: + */ +//@EnableDiscoveryClient +@SpringBootApplication +//@EnableFeignClients +@EnableAsync //开启异步注解 +public class DataBackupApplication { + public static void main(String[] args) { + SpringApplication.run(DataBackupApplication.class,args); + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/common/dto/LoginDto.java b/hoj/DataBackup/src/main/java/top/hcode/common/dto/LoginDto.java new file mode 100644 index 00000000..2fff1da4 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/common/dto/LoginDto.java @@ -0,0 +1,20 @@ +package top.hcode.common.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Author: Himit_ZH + * @Date: 2020/7/20 00:23 + * @Description: 登录数据实体类 + */ +@Data +public class LoginDto implements Serializable { + @NotBlank(message = "用户名不能为空") + private String username; + + @NotBlank(message = "密码不能为空") + private String password; +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/common/dto/RegisterDto.java b/hoj/DataBackup/src/main/java/top/hcode/common/dto/RegisterDto.java new file mode 100644 index 00000000..0c12f200 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/common/dto/RegisterDto.java @@ -0,0 +1,41 @@ +package top.hcode.common.dto; + +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.lang.Nullable; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import java.io.Serializable; + +/** + * @Author: Himit_ZH + * @Date: 2020/10/24 11:15 + * @Description: 注册数据实体类 + */ +@Data +@Accessors(chain = true) +public class RegisterDto implements Serializable { + + @Nullable + private String uuid; + + @NotBlank(message = "用户名不能为空") + private String username; + + @NotBlank(message = "密码不能为空") + private String password; + + @NotBlank(message = "昵称不能为空") + private String nickname; + + @NotBlank(message = "邮箱不能为空") + @Email(message = "邮箱格式错误") + private String email; + + @NotBlank(message = "验证码不能为空") + private String code; + + @NotBlank(message = "学号不能为空") + private String number; +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/common/exception/GlobalExceptionHandler.java b/hoj/DataBackup/src/main/java/top/hcode/common/exception/GlobalExceptionHandler.java new file mode 100644 index 00000000..fa0f76fd --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/common/exception/GlobalExceptionHandler.java @@ -0,0 +1,76 @@ +package top.hcode.common.exception; + + +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.ShiroException; +import org.apache.shiro.authc.ExpiredCredentialsException; +import org.springframework.http.HttpStatus; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import top.hcode.common.result.CommonResult; + + +import javax.mail.MessagingException; +import java.io.IOException; + +/** + * 全局异常处理 + */ +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + /** + * 处理shiro的异常 + */ + @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ExceptionHandler(ShiroException.class) + public CommonResult handle401(ShiroException e) { + return CommonResult.errorResponse( e.getCause().toString(),CommonResult.STATUS_ACCESS_DENIED); + } + + + /** + * 处理Assert的异常 断言的异常! + */ + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(value = IllegalArgumentException.class) + public CommonResult handler(IllegalArgumentException e) throws IOException { + log.error("Assert异常:-------------->{}",e.getMessage()); + return CommonResult.errorResponse(e.getMessage(),CommonResult.STATUS_FAIL); + } + + /** + * @Validated 校验错误异常处理 + */ + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(value = MethodArgumentNotValidException.class) + public CommonResult handler(MethodArgumentNotValidException e) throws IOException { + log.error("实体校验异常:-------------->",e); + BindingResult bindingResult = e.getBindingResult(); + ObjectError objectError = bindingResult.getAllErrors().stream().findFirst().get(); + return CommonResult.errorResponse(objectError.getDefaultMessage(),CommonResult.STATUS_FAIL); + } + /** + * 处理运行时出现的异常 + */ + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(value = RuntimeException.class) + public CommonResult handler(RuntimeException e) throws IOException { + log.error("运行时异常:-------------->",e); + return CommonResult.errorResponse(e.getMessage(),CommonResult.STATUS_ERROR); + } + + /** + * 处理邮件发送出现的异常 + */ + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(value = MessagingException.class) + public CommonResult handler(MessagingException e) throws Exception { + log.error("邮箱系统异常:-------------->",e); + return CommonResult.errorResponse(e.getMessage(),CommonResult.STATUS_ERROR); + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/common/result/CommonResult.java b/hoj/DataBackup/src/main/java/top/hcode/common/result/CommonResult.java new file mode 100644 index 00000000..a99b0004 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/common/result/CommonResult.java @@ -0,0 +1,57 @@ +package top.hcode.common.result; + +import lombok.Data; + +import java.io.Serializable; + + +@Data +public class CommonResult implements Serializable { + public final static Integer STATUS_SUCCESS = 200; + public final static Integer STATUS_FAIL = 400; + public final static Integer STATUS_ERROR = 500; + public final static Integer STATUS_ACCESS_DENIED = 401; + + private Integer status; // 状态码 + private Object data; // 返回的数据 + private String msg; // 自定义信息 + + public CommonResult(Integer status, Object data, String msg){ + this.status = status; + this.data = data; + this.msg = msg; + } + + + /** + * 成功的结果 + * @param data 返回结果 + * @param msg 返回信息 + */ + public static CommonResult successResponse(Object data, String msg) { + return new CommonResult(CommonResult.STATUS_SUCCESS, data, msg); + } + + /** + * 成功的结果 + * @param data 返回结果 + */ + public CommonResult successResponse(Object data) { + return new CommonResult(CommonResult.STATUS_SUCCESS, data, null); + } + + + /** + * 失败的结果,无异常 + * @param msg 返回信息 + */ + public static CommonResult errorResponse(String msg) { + return new CommonResult(CommonResult.STATUS_FAIL, null, msg); + } + + + public static CommonResult errorResponse(String msg,Integer status) { + return new CommonResult(status, null,msg); + } + +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/config/CorsConfig.java b/hoj/DataBackup/src/main/java/top/hcode/config/CorsConfig.java new file mode 100644 index 00000000..6a4d8e6f --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/config/CorsConfig.java @@ -0,0 +1,22 @@ +package top.hcode.config; + + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 解决跨域问题 + */ +@Configuration +public class CorsConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") + .allowCredentials(true) + .maxAge(3600) + .allowedHeaders("*"); + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/config/MybatisPlusConfig.java b/hoj/DataBackup/src/main/java/top/hcode/config/MybatisPlusConfig.java new file mode 100644 index 00000000..243b612f --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/config/MybatisPlusConfig.java @@ -0,0 +1,25 @@ +package top.hcode.config; +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * @Author: Himit_ZH + * @Date: 2020/7/19 21:04 + * @Description: + */ +@Configuration +@EnableTransactionManagement +@MapperScan("top.hcode.dao") +public class MybatisPlusConfig { + + + // 分页插件 + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } + +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/config/RedisConfig.java b/hoj/DataBackup/src/main/java/top/hcode/config/RedisConfig.java new file mode 100644 index 00000000..ed916d65 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/config/RedisConfig.java @@ -0,0 +1,50 @@ +package top.hcode.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * @Author: Himit_ZH + * @Date: 2020/10/23 23:47 + * @Description: + */ +@Configuration +public class RedisConfig { + // 自己定义了一个 RedisTemplate + @Bean + @SuppressWarnings("all") + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + // 我们为了自己开发方便,一般直接使用 + RedisTemplate template = new RedisTemplate(); + template.setConnectionFactory(factory); + + // Json序列化配置 + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper om = new ObjectMapper(); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + jackson2JsonRedisSerializer.setObjectMapper(om); + // String 的序列化 + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + + // key采用String的序列化方式 + template.setKeySerializer(stringRedisSerializer); + // hash的key也采用String的序列化方式 + template.setHashKeySerializer(stringRedisSerializer); + // value序列化方式采用jackson + template.setValueSerializer(jackson2JsonRedisSerializer); + // hash的value序列化方式采用jackson + template.setHashValueSerializer(jackson2JsonRedisSerializer); + template.afterPropertiesSet(); + + return template; + } + +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/config/ShiroConfig.java b/hoj/DataBackup/src/main/java/top/hcode/config/ShiroConfig.java new file mode 100644 index 00000000..a10fe661 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/config/ShiroConfig.java @@ -0,0 +1,98 @@ +package top.hcode.config; + +/** + * @Author: Himit_ZH + * @Date: 2020/7/19 22:53 + * @Description: + */ + +import org.apache.shiro.mgt.DefaultSessionStorageEvaluator; +import org.apache.shiro.mgt.DefaultSubjectDAO; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.session.mgt.SessionManager; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition; +import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.crazycake.shiro.RedisCacheManager; +import org.crazycake.shiro.RedisSessionDAO; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import top.hcode.shiro.AccountRealm; +import top.hcode.shiro.JwtFilter; + + +import javax.servlet.Filter; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * shiro启用注解拦截控制器 + */ +@Configuration +public class ShiroConfig { + @Autowired + JwtFilter jwtFilter; + @Bean + public SessionManager sessionManager(RedisSessionDAO redisSessionDAO) { + DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); + sessionManager.setSessionDAO(redisSessionDAO); + return sessionManager; + } + @Bean + public DefaultWebSecurityManager securityManager(AccountRealm accountRealm, + SessionManager sessionManager, + RedisCacheManager redisCacheManager) { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(accountRealm); + securityManager.setSessionManager(sessionManager); + securityManager.setCacheManager(redisCacheManager); + /* + * 关闭shiro自带的session,详情见文档 + */ + DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO(); + DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator(); + defaultSessionStorageEvaluator.setSessionStorageEnabled(false); + subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator); + securityManager.setSubjectDAO(subjectDAO); + return securityManager; + } + @Bean + public ShiroFilterChainDefinition shiroFilterChainDefinition() { + DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition(); + Map filterMap = new LinkedHashMap<>(); + filterMap.put("/**", "jwt"); // 主要通过注解方式校验权限 + chainDefinition.addPathDefinitions(filterMap); + return chainDefinition; + } + @Bean("shiroFilterFactoryBean") + public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager, + ShiroFilterChainDefinition shiroFilterChainDefinition) { + ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); + shiroFilter.setSecurityManager(securityManager); + Map filters = new HashMap<>(); + filters.put("jwt", jwtFilter); + shiroFilter.setFilters(filters); + Map filterMap = shiroFilterChainDefinition.getFilterChainMap(); + shiroFilter.setFilterChainDefinitionMap(filterMap); + return shiroFilter; + } + + // 开启注解代理(默认好像已经开启,可以不要) + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){ + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); + return authorizationAttributeSourceAdvisor; + } + @Bean + public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator() { + DefaultAdvisorAutoProxyCreator creator = new DefaultAdvisorAutoProxyCreator(); + creator.setProxyTargetClass(true); + return creator; + } +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/config/SwaggerConfig.java b/hoj/DataBackup/src/main/java/top/hcode/config/SwaggerConfig.java new file mode 100644 index 00000000..c4c3c0d1 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/config/SwaggerConfig.java @@ -0,0 +1,56 @@ +package top.hcode.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.core.env.Profiles; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.ArrayList; + +/** + * @Author: Himit_ZH + * @Date: 2020/5/29 22:28 + * @Description: + */ +@Configuration +@EnableSwagger2 //开启swagger2 +public class SwaggerConfig { + @Bean //配置swagger的docket的bean势力 + public Docket docket(Environment environment){ + //设置要显示的swagger环境 + Profiles profiles = Profiles.of("dev","test"); //线下环境 + //通过环境判断是否在自己所设定的环境当中 + boolean flag = environment.acceptsProfiles(profiles); + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .groupName("Himit_ZH") //分组 + .enable(flag) //开启 + .select() + //RequestHandlerSelectors扫描方式 + //any()全部 + //none 都不扫描 + //path 过滤什么路径 + .apis(RequestHandlerSelectors.basePackage("top.hcode")) + .build(); + } + //配置swagger信息 + private ApiInfo apiInfo(){ + //作者信息 + Contact contact = new Contact("Himit_ZH", "https://blog.csdn.net/weixin_43853097", "372347736@qq.com"); + return new ApiInfo( + "Himit_ZH的swaggerAPI文档", + "网站作者是个大帅哥!", + "v1.0", + "https://blog.csdn.net/weixin_43853097", + contact, + "Apache 2.0", + "http://www.apache.org/licenses/LICENSE-2.0", + new ArrayList()); + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/controller/AccountController.java b/hoj/DataBackup/src/main/java/top/hcode/controller/AccountController.java new file mode 100644 index 00000000..cbb3afe7 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/controller/AccountController.java @@ -0,0 +1,157 @@ +package top.hcode.controller; + +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.annotation.RequiresAuthentication; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import top.hcode.common.dto.LoginDto; +import top.hcode.common.dto.RegisterDto; +import top.hcode.common.result.CommonResult; +import top.hcode.dao.UserRecordMapper; +import top.hcode.dao.UserRoleMapper; +import top.hcode.entity.UserInfo; +import top.hcode.entity.UserRecord; +import top.hcode.entity.UserRole; +import top.hcode.service.UserInfoService; +import top.hcode.service.impl.EmailServiceImpl; +import top.hcode.utils.JwtUtils; +import top.hcode.utils.RedisUtils; + +import javax.mail.MessagingException; +import javax.servlet.http.HttpServletResponse; + +/** + * @Author: Himit_ZH + * @Date: 2020/10/23 12:00 + * @Description:账户处理控制类,负责处理登录请求和注册请求 + */ +@RestController +public class AccountController { + + @Autowired + private EmailServiceImpl emailService; + + @Autowired + private RedisUtils redisUtils; + + @Autowired + private UserInfoService userInfoDao; + + @Autowired + private UserRoleMapper userRoleDao; + + @Autowired + private UserRecordMapper userRecordDao; + + @Autowired + private JwtUtils jwtUtils; + + /** + * @MethodName getRegisterCode + * @Params * @param null + * @Description 调用邮件服务,发送注册流程的6位随机验证码 + * @Return + * @Since 2020/10/26 + */ + @RequestMapping("/get-register-code") + public CommonResult getRegisterCode(@RequestParam("username") String username, @RequestParam("email") String email) throws MessagingException { + String numbers = RandomUtil.randomNumbers(6); // 随机生成6位数字的组合 + redisUtils.set(username, numbers, 5 * 60);//默认验证码有效5分钟 + emailService.sendCode(email, username, numbers); + return CommonResult.successResponse(MapUtil.builder() + .put("username", username) + .put("email", email) + .put("code", numbers) + .put("expire", 5 * 60) + .map(), "验证码已发送至指定邮箱"); + } + + /** + * @MethodName register + * @Params * @param RegisterDto + * @Description 注册逻辑,具体参数请看RegisterDto类 + * @Return + * @Since 2020/10/24 + */ + @PostMapping("/register") + @Transactional + public CommonResult register(@Validated @RequestBody RegisterDto registerDto) { + + if (!redisUtils.hasKey(registerDto.getUsername())) { + return CommonResult.errorResponse("验证码不存在或已过期"); + } + if (!redisUtils.get(registerDto.getUsername()).equals(registerDto.getCode())) { //验证码判断 + return CommonResult.errorResponse("验证码不正确"); + } + String uuid = IdUtil.simpleUUID(); + //为新用户设置uuid + registerDto.setUuid(uuid); + //往user_info表插入数据 + int result1 = userInfoDao.addUser(registerDto); + //往user_role表插入数据 + int result2 = userRoleDao.insert(new UserRole().setRoleId(1002L).setUid(uuid)); + //往user_record表插入数据 + int result3 = userRecordDao.insert(new UserRecord().setUid(uuid)); + if (result1 == 1 && result2 == 1 && result3 == 1) { + return CommonResult.successResponse(null, "注册成功!"); + } else { + return CommonResult.errorResponse("注册失败!", CommonResult.STATUS_ERROR); // 插入数据库失败,返回500 + } + } + + + /** + * @MethodName login + * @Params * @param LoginDto + * @Description 处理登录逻辑 + * @Return CommonResult + * @Since 2020/10/24 + */ + @PostMapping("/login") + public CommonResult login(@Validated @RequestBody LoginDto loginDto, HttpServletResponse response) { + QueryWrapper wrapper = new QueryWrapper().eq("username", loginDto.getUsername()); + UserInfo user = userInfoDao.getOne(wrapper); + Assert.notNull(user, "用户不存在"); + if (user.getPassword().equals(SecureUtil.md5(loginDto.getPassword()))) { + return CommonResult.errorResponse("密码不正确"); + } + if (user.getStatus() != 0) { + return CommonResult.errorResponse("该账户已被封禁,请联系管理员进行处理。"); + } + String jwt = jwtUtils.generateToken(user.getUuid()); + response.setHeader("Authorization", jwt); //放到信息头部 + response.setHeader("Access-Control-Expose-Headers", "Authorization"); + + return CommonResult.successResponse(MapUtil.builder() + .put("uid", user.getUuid()) + .put("username", user.getUsername()) + .put("nickname", user.getNickname()) + .put("avatar", user.getAvatar()) + .put("email", user.getEmail()) + .map(), "登录成功" + ); + } + + + /** + * @MethodName logout + * @Params * @param null + * @Description 退出逻辑,将jwt在redis中清除,下次需要再次登录。 + * @Return CommonResult + * @Since 2020/10/24 + */ + @GetMapping("/logout") + @RequiresAuthentication + public CommonResult logout() { + SecurityUtils.getSubject().logout(); + return CommonResult.successResponse(null, "退出成功"); + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/AuthMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/AuthMapper.java new file mode 100644 index 00000000..c8b0f6a2 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/AuthMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.Auth; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface AuthMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/CommentMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/CommentMapper.java new file mode 100644 index 00000000..fe5583de --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/CommentMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.Comment; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface CommentMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/CommentTagMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/CommentTagMapper.java new file mode 100644 index 00000000..5390e287 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/CommentTagMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.CommentTag; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface CommentTagMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/ContestAnnouncementMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestAnnouncementMapper.java new file mode 100644 index 00000000..d3a86806 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestAnnouncementMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.ContestAnnouncement; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestAnnouncementMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/ContestExplanationMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestExplanationMapper.java new file mode 100644 index 00000000..164d9e7f --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestExplanationMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.ContestExplanation; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestExplanationMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/ContestMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestMapper.java new file mode 100644 index 00000000..9084e110 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.Contest; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/ContestProblemMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestProblemMapper.java new file mode 100644 index 00000000..b503c1f2 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestProblemMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.ContestProblem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestProblemMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/ContestRecordMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestRecordMapper.java new file mode 100644 index 00000000..f88382b5 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestRecordMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.ContestRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestRecordMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/ContestRegisterMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestRegisterMapper.java new file mode 100644 index 00000000..071eb445 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestRegisterMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.ContestRegister; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestRegisterMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/ContestScoreMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestScoreMapper.java new file mode 100644 index 00000000..c69efb40 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/ContestScoreMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.ContestScore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestScoreMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/JudgeCaseMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/JudgeCaseMapper.java new file mode 100644 index 00000000..bb32ffca --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/JudgeCaseMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.JudgeCase; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface JudgeCaseMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/JudgeMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/JudgeMapper.java new file mode 100644 index 00000000..bd30a3be --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/JudgeMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.Judge; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface JudgeMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/ProblemCountMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/ProblemCountMapper.java new file mode 100644 index 00000000..fa2eac18 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/ProblemCountMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.ProblemCount; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ProblemCountMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/ProblemMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/ProblemMapper.java new file mode 100644 index 00000000..16f77586 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/ProblemMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.Problem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ProblemMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/RoleAuthMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/RoleAuthMapper.java new file mode 100644 index 00000000..c2a7152a --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/RoleAuthMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.RoleAuth; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface RoleAuthMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/RoleMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/RoleMapper.java new file mode 100644 index 00000000..1ccb9558 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/RoleMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.Role; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface RoleMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/UserAcproblemMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/UserAcproblemMapper.java new file mode 100644 index 00000000..f066a362 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/UserAcproblemMapper.java @@ -0,0 +1,16 @@ +package top.hcode.dao; + +import top.hcode.entity.UserAcproblem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface UserAcproblemMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/UserInfoMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/UserInfoMapper.java new file mode 100644 index 00000000..20524da3 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/UserInfoMapper.java @@ -0,0 +1,23 @@ +package top.hcode.dao; + +import org.apache.ibatis.annotations.Mapper; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.stereotype.Repository; +import top.hcode.common.dto.RegisterDto; +import top.hcode.entity.UserInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Mapper +@Repository +public interface UserInfoMapper extends BaseMapper { + int addUser(RegisterDto registerDto); +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/UserRecordMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/UserRecordMapper.java new file mode 100644 index 00000000..cc55abee --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/UserRecordMapper.java @@ -0,0 +1,20 @@ +package top.hcode.dao; + +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; +import top.hcode.entity.UserRecord; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Mapper +@Repository +public interface UserRecordMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/UserRoleMapper.java b/hoj/DataBackup/src/main/java/top/hcode/dao/UserRoleMapper.java new file mode 100644 index 00000000..39ac235a --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/UserRoleMapper.java @@ -0,0 +1,20 @@ +package top.hcode.dao; + +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; +import top.hcode.entity.UserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Mapper +@Repository +public interface UserRoleMapper extends BaseMapper { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/AuthMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/AuthMapper.xml new file mode 100644 index 00000000..d2316d4c --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/AuthMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/CommentMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/CommentMapper.xml new file mode 100644 index 00000000..22d20be8 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/CommentMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/CommentTagMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/CommentTagMapper.xml new file mode 100644 index 00000000..611ed73b --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/CommentTagMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestAnnouncementMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestAnnouncementMapper.xml new file mode 100644 index 00000000..0b2c2672 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestAnnouncementMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestExplanationMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestExplanationMapper.xml new file mode 100644 index 00000000..ff9941ab --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestExplanationMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestMapper.xml new file mode 100644 index 00000000..af4de1d0 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestProblemMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestProblemMapper.xml new file mode 100644 index 00000000..1b091917 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestProblemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestRecordMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestRecordMapper.xml new file mode 100644 index 00000000..9315e9e4 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestRegisterMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestRegisterMapper.xml new file mode 100644 index 00000000..022d2cf6 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestRegisterMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestScoreMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestScoreMapper.xml new file mode 100644 index 00000000..f01f02d2 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ContestScoreMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/JudgeCaseMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/JudgeCaseMapper.xml new file mode 100644 index 00000000..b1b09574 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/JudgeCaseMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/JudgeMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/JudgeMapper.xml new file mode 100644 index 00000000..0abbce7e --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/JudgeMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ProblemCountMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ProblemCountMapper.xml new file mode 100644 index 00000000..76b5051e --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ProblemCountMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ProblemMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ProblemMapper.xml new file mode 100644 index 00000000..c436265e --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/ProblemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/RoleAuthMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/RoleAuthMapper.xml new file mode 100644 index 00000000..d1660d81 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/RoleAuthMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/RoleMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/RoleMapper.xml new file mode 100644 index 00000000..a71fdd36 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/RoleMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserAcproblemMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserAcproblemMapper.xml new file mode 100644 index 00000000..4ba9e06e --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserAcproblemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserInfoMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserInfoMapper.xml new file mode 100644 index 00000000..85e404a4 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserInfoMapper.xml @@ -0,0 +1,9 @@ + + + + + insert into user_info(uuid,username,password,nickname,email,number) values ( + #{uuid}, #{username},#{password},#{nickname},#{email},#{number} + ) + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserRecordMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserRecordMapper.xml new file mode 100644 index 00000000..d51473df --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserRoleMapper.xml b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserRoleMapper.xml new file mode 100644 index 00000000..0f583fbb --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/dao/xml/UserRoleMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/AuthService.java b/hoj/DataBackup/src/main/java/top/hcode/service/AuthService.java new file mode 100644 index 00000000..a9dc004f --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/AuthService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.Auth; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface AuthService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/CommentService.java b/hoj/DataBackup/src/main/java/top/hcode/service/CommentService.java new file mode 100644 index 00000000..14cbab57 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/CommentService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.Comment; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface CommentService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/CommentTagService.java b/hoj/DataBackup/src/main/java/top/hcode/service/CommentTagService.java new file mode 100644 index 00000000..f113881f --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/CommentTagService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.CommentTag; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface CommentTagService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/ContestAnnouncementService.java b/hoj/DataBackup/src/main/java/top/hcode/service/ContestAnnouncementService.java new file mode 100644 index 00000000..8bee48d0 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/ContestAnnouncementService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.ContestAnnouncement; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestAnnouncementService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/ContestExplanationService.java b/hoj/DataBackup/src/main/java/top/hcode/service/ContestExplanationService.java new file mode 100644 index 00000000..da30627d --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/ContestExplanationService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.ContestExplanation; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestExplanationService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/ContestProblemService.java b/hoj/DataBackup/src/main/java/top/hcode/service/ContestProblemService.java new file mode 100644 index 00000000..f1426ba4 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/ContestProblemService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.ContestProblem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestProblemService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/ContestRecordService.java b/hoj/DataBackup/src/main/java/top/hcode/service/ContestRecordService.java new file mode 100644 index 00000000..fab0e203 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/ContestRecordService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.ContestRecord; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestRecordService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/ContestRegisterService.java b/hoj/DataBackup/src/main/java/top/hcode/service/ContestRegisterService.java new file mode 100644 index 00000000..f6257f55 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/ContestRegisterService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.ContestRegister; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestRegisterService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/ContestScoreService.java b/hoj/DataBackup/src/main/java/top/hcode/service/ContestScoreService.java new file mode 100644 index 00000000..95bf8cf3 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/ContestScoreService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.ContestScore; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestScoreService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/ContestService.java b/hoj/DataBackup/src/main/java/top/hcode/service/ContestService.java new file mode 100644 index 00000000..f7e4d362 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/ContestService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.Contest; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ContestService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/EmailService.java b/hoj/DataBackup/src/main/java/top/hcode/service/EmailService.java new file mode 100644 index 00000000..50c52ecc --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/EmailService.java @@ -0,0 +1,7 @@ +package top.hcode.service; + +import javax.mail.MessagingException; + +public interface EmailService { + public void sendCode(String email,String username,String code) throws MessagingException; +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/JudgeCaseService.java b/hoj/DataBackup/src/main/java/top/hcode/service/JudgeCaseService.java new file mode 100644 index 00000000..d2b44ed6 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/JudgeCaseService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.JudgeCase; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface JudgeCaseService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/JudgeService.java b/hoj/DataBackup/src/main/java/top/hcode/service/JudgeService.java new file mode 100644 index 00000000..c9261c61 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/JudgeService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.Judge; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface JudgeService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/ProblemCountService.java b/hoj/DataBackup/src/main/java/top/hcode/service/ProblemCountService.java new file mode 100644 index 00000000..1dbd31cd --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/ProblemCountService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.ProblemCount; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ProblemCountService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/ProblemService.java b/hoj/DataBackup/src/main/java/top/hcode/service/ProblemService.java new file mode 100644 index 00000000..44b19b01 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/ProblemService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.Problem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface ProblemService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/RoleAuthService.java b/hoj/DataBackup/src/main/java/top/hcode/service/RoleAuthService.java new file mode 100644 index 00000000..09890f05 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/RoleAuthService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.RoleAuth; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface RoleAuthService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/RoleService.java b/hoj/DataBackup/src/main/java/top/hcode/service/RoleService.java new file mode 100644 index 00000000..c192f4b9 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/RoleService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.Role; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface RoleService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/UserAcproblemService.java b/hoj/DataBackup/src/main/java/top/hcode/service/UserAcproblemService.java new file mode 100644 index 00000000..23b1c583 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/UserAcproblemService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.UserAcproblem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface UserAcproblemService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/UserInfoService.java b/hoj/DataBackup/src/main/java/top/hcode/service/UserInfoService.java new file mode 100644 index 00000000..0633c6b6 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/UserInfoService.java @@ -0,0 +1,17 @@ +package top.hcode.service; + +import top.hcode.common.dto.RegisterDto; +import top.hcode.entity.UserInfo; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface UserInfoService extends IService { + public Integer addUser(RegisterDto registerDto); +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/UserRecordService.java b/hoj/DataBackup/src/main/java/top/hcode/service/UserRecordService.java new file mode 100644 index 00000000..906c92fb --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/UserRecordService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.UserRecord; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface UserRecordService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/UserRoleService.java b/hoj/DataBackup/src/main/java/top/hcode/service/UserRoleService.java new file mode 100644 index 00000000..b8131893 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/UserRoleService.java @@ -0,0 +1,16 @@ +package top.hcode.service; + +import top.hcode.entity.UserRole; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +public interface UserRoleService extends IService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/AuthServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/AuthServiceImpl.java new file mode 100644 index 00000000..44cec5a1 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/AuthServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.Auth; +import top.hcode.dao.AuthMapper; +import top.hcode.service.AuthService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class AuthServiceImpl extends ServiceImpl implements AuthService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/CommentServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/CommentServiceImpl.java new file mode 100644 index 00000000..d05f5087 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/CommentServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.Comment; +import top.hcode.dao.CommentMapper; +import top.hcode.service.CommentService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class CommentServiceImpl extends ServiceImpl implements CommentService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/CommentTagServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/CommentTagServiceImpl.java new file mode 100644 index 00000000..68c6a1ef --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/CommentTagServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.CommentTag; +import top.hcode.dao.CommentTagMapper; +import top.hcode.service.CommentTagService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class CommentTagServiceImpl extends ServiceImpl implements CommentTagService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestAnnouncementServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestAnnouncementServiceImpl.java new file mode 100644 index 00000000..94e977c6 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestAnnouncementServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.ContestAnnouncement; +import top.hcode.dao.ContestAnnouncementMapper; +import top.hcode.service.ContestAnnouncementService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class ContestAnnouncementServiceImpl extends ServiceImpl implements ContestAnnouncementService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestExplanationServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestExplanationServiceImpl.java new file mode 100644 index 00000000..6a89c11f --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestExplanationServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.ContestExplanation; +import top.hcode.dao.ContestExplanationMapper; +import top.hcode.service.ContestExplanationService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class ContestExplanationServiceImpl extends ServiceImpl implements ContestExplanationService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestProblemServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestProblemServiceImpl.java new file mode 100644 index 00000000..91d093e7 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestProblemServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.ContestProblem; +import top.hcode.dao.ContestProblemMapper; +import top.hcode.service.ContestProblemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class ContestProblemServiceImpl extends ServiceImpl implements ContestProblemService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestRecordServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestRecordServiceImpl.java new file mode 100644 index 00000000..fdb542c2 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestRecordServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.ContestRecord; +import top.hcode.dao.ContestRecordMapper; +import top.hcode.service.ContestRecordService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class ContestRecordServiceImpl extends ServiceImpl implements ContestRecordService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestRegisterServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestRegisterServiceImpl.java new file mode 100644 index 00000000..f7713a04 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestRegisterServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.ContestRegister; +import top.hcode.dao.ContestRegisterMapper; +import top.hcode.service.ContestRegisterService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class ContestRegisterServiceImpl extends ServiceImpl implements ContestRegisterService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestScoreServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestScoreServiceImpl.java new file mode 100644 index 00000000..4bc98f07 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestScoreServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.ContestScore; +import top.hcode.dao.ContestScoreMapper; +import top.hcode.service.ContestScoreService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class ContestScoreServiceImpl extends ServiceImpl implements ContestScoreService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestServiceImpl.java new file mode 100644 index 00000000..93f621d1 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ContestServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.Contest; +import top.hcode.dao.ContestMapper; +import top.hcode.service.ContestService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class ContestServiceImpl extends ServiceImpl implements ContestService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/EmailServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/EmailServiceImpl.java new file mode 100644 index 00000000..2cef9806 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/EmailServiceImpl.java @@ -0,0 +1,101 @@ +package top.hcode.service.impl; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; +import top.hcode.service.EmailService; + +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.util.Date; + + +/** + * @Author: Himit_ZH + * @Date: 2020/10/24 13:21 + * @Description: + */ +@Service +public class EmailServiceImpl implements EmailService { + + @Autowired + JavaMailSender mailSender; + + @Override + public void sendCode(String email, String username, String code) throws MessagingException { + DateTime dateTime = DateUtil.offsetMinute(new Date(), 5); + MimeMessage mimeMessage = mailSender.createMimeMessage(); + MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, + true); + mimeMessageHelper.setSubject("HOJ的邮件提醒"); + mimeMessageHelper.setText("
\n" + + "\t\t\t\t
\n" + + "\t\t\t\t\t
\n" + + "\t\t\t\t\t\t\n" + + "\t\t\t\t\t
\n" + + "\t\t\t\t
\n" + + "\t\t\t\t
\n" + + "\t\t\t\t\t

\n" + + "\t\t\t\t\t\tDear "+username+"\n" + + "\t\t\t\t\t

\n" + + "\t\t\t\t\t
\n" + + "\t\t\t\t\t
\n" + + "\t\t\t\t\t\t

\n" + + "\t\t\t\t\t\t\t来自 HOJ 邮件提醒\n" + + "\t\t\t\t\t\t

\n" + + "\t\t\t\t\t

\n" + + "\t\t\t\t\t\t您收到这封电子邮件是因为您 (也可能是某人冒充您的名义) 在 HOJ 上进行注册。假如这不是您本人所申请, 请不用理会这封电子邮件, 但是如果您持续收到这类的信件骚扰, 请您尽快联络管理员。\n" + + "\t\t\t\t\t

\n" + + "\t\t\t\t\t
\n" + + "\t\t\t\t\t\t请使用以下验证码完成后续注册流程:
\n" + + "\t\t\t\t\t\t "+code+"
\n" + + "\t\t\t\t\t\t 注意:请您在收到邮件5分钟内("+dateTime.toString()+"前)使用,否则该验证码将会失效。\n" + + "\t\t\t\t\t\t
\n" + + "\t\t\t\t\t   \n" + + "\n" + + "\t\t\t\t\t
\n" + + "\t\t\t\t\t
\n" + + "\t\t\t\t\t\tHOJ|传送门\uD83D\uDEAA\n" + + "\t\t\t\t\t
\n" + + "\t\t\t\t\t

\n" + + "\t\t\t\t\t\t欢迎常来访问!
\n" + + "\t\t\t\t\t\t© 2020 \n" + + "\t\t\t\t\t\t\tHODE-OJ \n" + + "\t\t\t\t\t

\n" + + "\t\t\t\t\t

\n" + + "\t\t\t\t
\n" + + "\t\t\t
",true); + + + mimeMessageHelper.setTo(email); + mimeMessageHelper.setFrom("372347736@qq.com"); + mailSender.send(mimeMessage); + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/JudgeCaseServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/JudgeCaseServiceImpl.java new file mode 100644 index 00000000..9dc19713 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/JudgeCaseServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.JudgeCase; +import top.hcode.dao.JudgeCaseMapper; +import top.hcode.service.JudgeCaseService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class JudgeCaseServiceImpl extends ServiceImpl implements JudgeCaseService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/JudgeServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/JudgeServiceImpl.java new file mode 100644 index 00000000..73c2cb2c --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/JudgeServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.Judge; +import top.hcode.dao.JudgeMapper; +import top.hcode.service.JudgeService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class JudgeServiceImpl extends ServiceImpl implements JudgeService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/ProblemCountServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ProblemCountServiceImpl.java new file mode 100644 index 00000000..4a4b6c0a --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ProblemCountServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.ProblemCount; +import top.hcode.dao.ProblemCountMapper; +import top.hcode.service.ProblemCountService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class ProblemCountServiceImpl extends ServiceImpl implements ProblemCountService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/ProblemServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ProblemServiceImpl.java new file mode 100644 index 00000000..ae1b5ebd --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/ProblemServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.Problem; +import top.hcode.dao.ProblemMapper; +import top.hcode.service.ProblemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class ProblemServiceImpl extends ServiceImpl implements ProblemService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/RoleAuthServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/RoleAuthServiceImpl.java new file mode 100644 index 00000000..04060e56 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/RoleAuthServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.RoleAuth; +import top.hcode.dao.RoleAuthMapper; +import top.hcode.service.RoleAuthService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class RoleAuthServiceImpl extends ServiceImpl implements RoleAuthService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/RoleServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/RoleServiceImpl.java new file mode 100644 index 00000000..7db1ffe0 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/RoleServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.Role; +import top.hcode.dao.RoleMapper; +import top.hcode.service.RoleService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class RoleServiceImpl extends ServiceImpl implements RoleService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserAcproblemServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserAcproblemServiceImpl.java new file mode 100644 index 00000000..cd79f81f --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserAcproblemServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.UserAcproblem; +import top.hcode.dao.UserAcproblemMapper; +import top.hcode.service.UserAcproblemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class UserAcproblemServiceImpl extends ServiceImpl implements UserAcproblemService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserInfoServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserInfoServiceImpl.java new file mode 100644 index 00000000..8feb19fe --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserInfoServiceImpl.java @@ -0,0 +1,29 @@ +package top.hcode.service.impl; + +import org.springframework.beans.factory.annotation.Autowired; +import top.hcode.common.dto.RegisterDto; +import top.hcode.entity.UserInfo; +import top.hcode.dao.UserInfoMapper; +import top.hcode.service.UserInfoService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class UserInfoServiceImpl extends ServiceImpl implements UserInfoService { + + @Autowired + private UserInfoMapper userInfoMapper; + + @Override + public Integer addUser(RegisterDto registerDto) { + return userInfoMapper.addUser(registerDto); + } +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserRecordServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserRecordServiceImpl.java new file mode 100644 index 00000000..17e5f7c8 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserRecordServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.UserRecord; +import top.hcode.dao.UserRecordMapper; +import top.hcode.service.UserRecordService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class UserRecordServiceImpl extends ServiceImpl implements UserRecordService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserRoleServiceImpl.java b/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserRoleServiceImpl.java new file mode 100644 index 00000000..7cf9968d --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/service/impl/UserRoleServiceImpl.java @@ -0,0 +1,20 @@ +package top.hcode.service.impl; + +import top.hcode.entity.UserRole; +import top.hcode.dao.UserRoleMapper; +import top.hcode.service.UserRoleService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Service +public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { + +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/shiro/AccountProfile.java b/hoj/DataBackup/src/main/java/top/hcode/shiro/AccountProfile.java new file mode 100644 index 00000000..4bde601c --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/shiro/AccountProfile.java @@ -0,0 +1,43 @@ +package top.hcode.shiro; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @Author: Himit_ZH + * @Date: 2020/7/19 22:59 + * @Description: + */ +@Data +public class AccountProfile implements Serializable { + private String uuid; + + private String username; + + private String password; + + private String nickname; + + private String school; + + private String course; + + private String number; + + private String realname; + + private String cfUsername; + + private String email; + + private String avatar; + + private String signature; + + private int status; + + public String getId(){ //shiro登录用户实体默认主键获取方法要为getId + return uuid; + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/shiro/AccountRealm.java b/hoj/DataBackup/src/main/java/top/hcode/shiro/AccountRealm.java new file mode 100644 index 00000000..33e82a25 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/shiro/AccountRealm.java @@ -0,0 +1,53 @@ +package top.hcode.shiro; + +import cn.hutool.core.bean.BeanUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.authc.*; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import top.hcode.entity.UserInfo; +import top.hcode.service.impl.UserInfoServiceImpl; +import top.hcode.utils.JwtUtils; + +/** + * @Author: Himit_ZH + * @Date: 2020/7/19 22:57 + * @Description: + */ +@Slf4j +@Component +public class AccountRealm extends AuthorizingRealm { + @Autowired + JwtUtils jwtUtils; + @Autowired + UserInfoServiceImpl userInfoService; + @Override + public boolean supports(AuthenticationToken token) { + return token instanceof JwtToken; + } + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { + return null; + } + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { + JwtToken jwt = (JwtToken) token; + log.info("jwt----------------->{}", jwt); + String userId = jwtUtils.getClaimByToken((String) jwt.getPrincipal()).getSubject(); + UserInfo user = userInfoService.getById(userId); + if(user == null) { + throw new UnknownAccountException("账户不存在!"); + } + if(user.getStatus() == 1) { + throw new LockedAccountException("账户已被锁定!"); + } + AccountProfile profile = new AccountProfile(); + BeanUtil.copyProperties(user, profile); + log.info("profile----------------->{}", profile.toString()); + return new SimpleAuthenticationInfo(profile, jwt.getCredentials(), getName()); + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/shiro/JwtFilter.java b/hoj/DataBackup/src/main/java/top/hcode/shiro/JwtFilter.java new file mode 100644 index 00000000..1e3ecaa7 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/shiro/JwtFilter.java @@ -0,0 +1,90 @@ +package top.hcode.shiro; + +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import io.jsonwebtoken.Claims; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.ExpiredCredentialsException; +import org.apache.shiro.web.filter.authc.AuthenticatingFilter; +import org.apache.shiro.web.util.WebUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestMethod; +import top.hcode.common.result.CommonResult; +import top.hcode.utils.JwtUtils; + + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * @Author: Himit_ZH + * @Date: 2020/7/19 23:16 + * @Description: + */ +@Component +public class JwtFilter extends AuthenticatingFilter { + + @Autowired + JwtUtils jwtUtils; + @Override + protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { + // 获取 token + HttpServletRequest request = (HttpServletRequest) servletRequest; + String jwt = request.getHeader("Authorization"); + if(StringUtils.isEmpty(jwt)){ + return null; + } + return new JwtToken(jwt); + } + @Override + protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { + HttpServletRequest request = (HttpServletRequest) servletRequest; + String token = request.getHeader("Authorization"); + if(StringUtils.isEmpty(token)) { + return true; + } else { + // 判断是否已过期 + Claims claim = jwtUtils.getClaimByToken(token); + if(claim == null || jwtUtils.isTokenExpired(claim.getExpiration())) { + throw new ExpiredCredentialsException("token已失效,请重新登录!"); + } + } + // 执行自动登录 + return executeLogin(servletRequest, servletResponse); + } + @Override + protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) { + HttpServletResponse httpResponse = (HttpServletResponse) response; + try { + //处理登录失败的异常 + Throwable throwable = e.getCause() == null ? e : e.getCause(); + CommonResult result = CommonResult.errorResponse(throwable.getMessage(),CommonResult.STATUS_ERROR); + String json = JSONUtil.toJsonStr(result); + httpResponse.getWriter().print(json); + } catch (IOException e1) { + } + return false; + } + /** + * 对跨域提供支持 + */ + @Override + protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { + HttpServletRequest httpServletRequest = WebUtils.toHttp(request); + HttpServletResponse httpServletResponse = WebUtils.toHttp(response); + httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin")); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers")); + // 跨域时会首先发送一个OPTIONS请求,这里我们给OPTIONS请求直接返回正常状态 + if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) { + httpServletResponse.setStatus(org.springframework.http.HttpStatus.OK.value()); + return false; + } + return super.preHandle(request, response); + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/shiro/JwtToken.java b/hoj/DataBackup/src/main/java/top/hcode/shiro/JwtToken.java new file mode 100644 index 00000000..f9fb4bfb --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/shiro/JwtToken.java @@ -0,0 +1,23 @@ +package top.hcode.shiro; + +import org.apache.shiro.authc.AuthenticationToken; + +/** + * @Author: Himit_ZH + * @Date: 2020/7/19 22:58 + * @Description: + */ +public class JwtToken implements AuthenticationToken { + private String token; + public JwtToken(String token) { + this.token = token; + } + @Override + public Object getPrincipal() { + return token; + } + @Override + public Object getCredentials() { + return token; + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/utils/JwtUtils.java b/hoj/DataBackup/src/main/java/top/hcode/utils/JwtUtils.java new file mode 100644 index 00000000..0464c27f --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/utils/JwtUtils.java @@ -0,0 +1,59 @@ +package top.hcode.utils; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Slf4j +@Data +@Component +@ConfigurationProperties(prefix = "hoj.jwt") +public class JwtUtils { + + private String secret; + private long expire; + private String header; + + /** + * 生成jwt token + */ + public String generateToken(String userId) { + Date nowDate = new Date(); + //过期时间 + Date expireDate = new Date(nowDate.getTime() + expire * 1000); + + return Jwts.builder() + .setHeaderParam("type", "JWT") + .setSubject(userId) + .setIssuedAt(nowDate) + .setExpiration(expireDate) + .signWith(SignatureAlgorithm.HS512, secret) + .compact(); + } + + public Claims getClaimByToken(String token) { + try { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(token) + .getBody(); + }catch (Exception e){ + log.debug("validate is token error ", e); + return null; + } + } + + /** + * token是否过期 + * @return true:过期 + */ + public boolean isTokenExpired(Date expiration) { + return expiration.before(new Date()); + } +} diff --git a/hoj/DataBackup/src/main/java/top/hcode/utils/RedisUtils.java b/hoj/DataBackup/src/main/java/top/hcode/utils/RedisUtils.java new file mode 100644 index 00000000..95e36cb3 --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/utils/RedisUtils.java @@ -0,0 +1,576 @@ +package top.hcode.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +/** + * @Author: Himit_ZH + * @Date: 2020/10/23 23:48 + * @Description: + */ + +@Component +public final class RedisUtils { + + @Autowired + private RedisTemplate redisTemplate; + + // =============================common============================ + /** + * 指定缓存失效时间 + * @param key 键 + * @param time 时间(秒) + */ + public boolean expire(String key, long time) { + try { + if (time > 0) { + redisTemplate.expire(key, time, TimeUnit.SECONDS); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据key 获取过期时间 + * @param key 键 不能为null + * @return 时间(秒) 返回0代表为永久有效 + */ + public long getExpire(String key) { + return redisTemplate.getExpire(key, TimeUnit.SECONDS); + } + + + /** + * 判断key是否存在 + * @param key 键 + * @return true 存在 false不存在 + */ + public boolean hasKey(String key) { + try { + return redisTemplate.hasKey(key); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + + /** + * 删除缓存 + * @param key 可以传一个值 或多个 + */ + @SuppressWarnings("unchecked") + public void del(String... key) { + if (key != null && key.length > 0) { + if (key.length == 1) { + redisTemplate.delete(key[0]); + } else { + redisTemplate.delete(CollectionUtils.arrayToList(key)); + } + } + } + + + // ============================String============================= + + /** + * 普通缓存获取 + * @param key 键 + * @return 值 + */ + public Object get(String key) { + return key == null ? null : redisTemplate.opsForValue().get(key); + } + + /** + * 普通缓存放入 + * @param key 键 + * @param value 值 + * @return true成功 false失败 + */ + + public boolean set(String key, Object value) { + try { + redisTemplate.opsForValue().set(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + + /** + * 普通缓存放入并设置时间 + * @param key 键 + * @param value 值 + * @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期 + * @return true成功 false 失败 + */ + + public boolean set(String key, Object value, long time) { + try { + if (time > 0) { + redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS); + } else { + set(key, value); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + + /** + * 递增 + * @param key 键 + * @param delta 要增加几(大于0) + */ + public long incr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递增因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, delta); + } + + + /** + * 递减 + * @param key 键 + * @param delta 要减少几(小于0) + */ + public long decr(String key, long delta) { + if (delta < 0) { + throw new RuntimeException("递减因子必须大于0"); + } + return redisTemplate.opsForValue().increment(key, -delta); + } + + + // ================================Map================================= + + /** + * HashGet + * @param key 键 不能为null + * @param item 项 不能为null + */ + public Object hget(String key, String item) { + return redisTemplate.opsForHash().get(key, item); + } + + /** + * 获取hashKey对应的所有键值 + * @param key 键 + * @return 对应的多个键值 + */ + public Map hmget(String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * HashSet + * @param key 键 + * @param map 对应多个键值 + */ + public boolean hmset(String key, Map map) { + try { + redisTemplate.opsForHash().putAll(key, map); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + + /** + * HashSet 并设置时间 + * @param key 键 + * @param map 对应多个键值 + * @param time 时间(秒) + * @return true成功 false失败 + */ + public boolean hmset(String key, Map map, long time) { + try { + redisTemplate.opsForHash().putAll(key, map); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value) { + try { + redisTemplate.opsForHash().put(key, item, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 向一张hash表中放入数据,如果不存在将创建 + * + * @param key 键 + * @param item 项 + * @param value 值 + * @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间 + * @return true 成功 false失败 + */ + public boolean hset(String key, String item, Object value, long time) { + try { + redisTemplate.opsForHash().put(key, item, value); + if (time > 0) { + expire(key, time); + } + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + + /** + * 删除hash表中的值 + * + * @param key 键 不能为null + * @param item 项 可以使多个 不能为null + */ + public void hdel(String key, Object... item) { + redisTemplate.opsForHash().delete(key, item); + } + + + /** + * 判断hash表中是否有该项的值 + * + * @param key 键 不能为null + * @param item 项 不能为null + * @return true 存在 false不存在 + */ + public boolean hHasKey(String key, String item) { + return redisTemplate.opsForHash().hasKey(key, item); + } + + + /** + * hash递增 如果不存在,就会创建一个 并把新增后的值返回 + * + * @param key 键 + * @param item 项 + * @param by 要增加几(大于0) + */ + public double hincr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, by); + } + + + /** + * hash递减 + * + * @param key 键 + * @param item 项 + * @param by 要减少记(小于0) + */ + public double hdecr(String key, String item, double by) { + return redisTemplate.opsForHash().increment(key, item, -by); + } + + + // ============================set============================= + + /** + * 根据key获取Set中的所有值 + * @param key 键 + */ + public Set sGet(String key) { + try { + return redisTemplate.opsForSet().members(key); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + + /** + * 根据value从一个set中查询,是否存在 + * + * @param key 键 + * @param value 值 + * @return true 存在 false不存在 + */ + public boolean sHasKey(String key, Object value) { + try { + return redisTemplate.opsForSet().isMember(key, value); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + + /** + * 将数据放入set缓存 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSet(String key, Object... values) { + try { + return redisTemplate.opsForSet().add(key, values); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + + /** + * 将set数据放入缓存 + * + * @param key 键 + * @param time 时间(秒) + * @param values 值 可以是多个 + * @return 成功个数 + */ + public long sSetAndTime(String key, long time, Object... values) { + try { + Long count = redisTemplate.opsForSet().add(key, values); + if (time > 0) + expire(key, time); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + + /** + * 获取set缓存的长度 + * + * @param key 键 + */ + public long sGetSetSize(String key) { + try { + return redisTemplate.opsForSet().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + + /** + * 移除值为value的 + * + * @param key 键 + * @param values 值 可以是多个 + * @return 移除的个数 + */ + + public long setRemove(String key, Object... values) { + try { + Long count = redisTemplate.opsForSet().remove(key, values); + return count; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + // ===============================list================================= + + /** + * 获取list缓存的内容 + * + * @param key 键 + * @param start 开始 + * @param end 结束 0 到 -1代表所有值 + */ + public List lGet(String key, long start, long end) { + try { + return redisTemplate.opsForList().range(key, start, end); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + + /** + * 获取list缓存的长度 + * + * @param key 键 + */ + public long lGetListSize(String key) { + try { + return redisTemplate.opsForList().size(key); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + + /** + * 通过索引 获取list中的值 + * + * @param key 键 + * @param index 索引 index>=0时, 0 表头,1 第二个元素,依次类推;index<0时,-1,表尾,-2倒数第二个元素,依次类推 + */ + public Object lGetIndex(String key, long index) { + try { + return redisTemplate.opsForList().index(key, index); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + */ + public boolean lSet(String key, Object value) { + try { + redisTemplate.opsForList().rightPush(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + + /** + * 将list放入缓存 + * @param key 键 + * @param value 值 + * @param time 时间(秒) + */ + public boolean lSet(String key, Object value, long time) { + try { + redisTemplate.opsForList().rightPush(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + } + + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @return + */ + public boolean lSet(String key, List value) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + + } + + + /** + * 将list放入缓存 + * + * @param key 键 + * @param value 值 + * @param time 时间(秒) + * @return + */ + public boolean lSet(String key, List value, long time) { + try { + redisTemplate.opsForList().rightPushAll(key, value); + if (time > 0) + expire(key, time); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 根据索引修改list中的某条数据 + * + * @param key 键 + * @param index 索引 + * @param value 值 + * @return + */ + + public boolean lUpdateIndex(String key, long index, Object value) { + try { + redisTemplate.opsForList().set(key, index, value); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 移除N个值为value + * + * @param key 键 + * @param count 移除多少个 + * @param value 值 + * @return 移除的个数 + */ + + public long lRemove(String key, long count, Object value) { + try { + Long remove = redisTemplate.opsForList().remove(key, count, value); + return remove; + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + + } + +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/java/top/hcode/utils/ShiroUtils.java b/hoj/DataBackup/src/main/java/top/hcode/utils/ShiroUtils.java new file mode 100644 index 00000000..d88cb85d --- /dev/null +++ b/hoj/DataBackup/src/main/java/top/hcode/utils/ShiroUtils.java @@ -0,0 +1,16 @@ +package top.hcode.utils; + +import org.apache.shiro.SecurityUtils; +import top.hcode.shiro.AccountProfile; + + +/** + * @Author: Himit_ZH + * @Date: 2020/7/20 14:13 + * @Description: + */ +public class ShiroUtils { + public static AccountProfile getProfile(){ + return (AccountProfile) SecurityUtils.getSubject().getPrincipal(); + } +} \ No newline at end of file diff --git a/hoj/DataBackup/src/main/resources/application.yml b/hoj/DataBackup/src/main/resources/application.yml new file mode 100644 index 00000000..b886f6e0 --- /dev/null +++ b/hoj/DataBackup/src/main/resources/application.yml @@ -0,0 +1,76 @@ +server: + port: 8080 + +# 消费者将要去访问的微服务名称(注册成功进入nacos的微服务提供者) + +#service-url: +# nacos-user-service: http://sentinel-dept-provider + +# 激活Sentinel对Feign的支持 +#feign: +# sentinel: +# enabled: true + +spring: + profiles: + active: dev + mail: + properties.mail.smtp.ssl.enable: true + username: 372347736@qq.com + password: neainmvuetxhbgfa + host: smtp.qq.com + redis: + host: 129.204.177.72 + port: 6371 +# application: +# name: hoj-data-backup +# cloud: +# nacos: +# discovery: +# server-addr: 129.204.177.72:8848 + datasource: + username: root + password: Hzh&hy2020 + url: jdbc:mysql://129.204.177.72:3306/hoj?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8 + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + initial-size: 10 # 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 + min-idle: 10 # 最小连接池数量 + maxActive: 200 # 最大连接池数量 + maxWait: 60000 # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置 + timeBetweenEvictionRunsMillis: 60000 # 关闭空闲连接的检测时间间隔.Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 + minEvictableIdleTimeMillis: 300000 # 连接的最小生存时间.连接保持空闲而不被驱逐的最小时间 + validationQuery: SELECT 1 FROM DUAL # 验证数据库服务可用性的sql.用来检测连接是否有效的sql 因数据库方言而差, 例如 oracle 应该写成 SELECT 1 FROM DUAL + testWhileIdle: true # 申请连接时检测空闲时间,根据空闲时间再检测连接是否有效.建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRun + testOnBorrow: false # 申请连接时直接检测连接是否有效.申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 + testOnReturn: false # 归还连接时检测连接是否有效.归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 + poolPreparedStatements: true # 开启PSCache + maxPoolPreparedStatementPerConnectionSize: 20 #设置PSCache值 + connectionErrorRetryAttempts: 3 # 连接出错后再尝试连接三次 + breakAfterAcquireFailure: true # 数据库服务宕机自动重连机制 + timeBetweenConnectErrorMillis: 300000 # 连接出错后重试时间间隔 + asyncInit: true # 异步初始化策略 + remove-abandoned: true # 是否自动回收超时连接 + remove-abandoned-timeout: 1800 # 超时时间(以秒数为单位) + transaction-query-timeout: 6000 # 事务超时时间 + filters: stat,wall,log4j #数据库日志 + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 + + + + +mybatis-plus: + mapper-locations: classpath*:top/hcode/dao/xml/**Mapper.xml + type-aliases-package: top.hcode.entity + +shiro-redis: + enabled: true + redis-manager: + host: 129.204.177.72:6371 +hoj: + jwt: + # 加密秘钥 + secret: zsc-acm-hoj + # token有效时长,1小时,单位秒 + expire: 3600 + header: token \ No newline at end of file diff --git a/hoj/DataBackup/src/test/java/top/hcode/DataBackupApplicationTests.java b/hoj/DataBackup/src/test/java/top/hcode/DataBackupApplicationTests.java new file mode 100644 index 00000000..c2d34df9 --- /dev/null +++ b/hoj/DataBackup/src/test/java/top/hcode/DataBackupApplicationTests.java @@ -0,0 +1,28 @@ +package top.hcode; + +import cn.hutool.core.util.IdUtil; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import top.hcode.common.dto.RegisterDto; +import top.hcode.dao.UserInfoMapper; +import top.hcode.entity.UserInfo; + +/** + * @Author: Himit_ZH + * @Date: 2020/10/24 17:24 + * @Description: + */ +@SpringBootTest +public class DataBackupApplicationTests { + + @Autowired + UserInfoMapper userInfoMapper; + + @Test + public void Test1(){ + int test = userInfoMapper.addUser(new RegisterDto().setUuid(IdUtil.simpleUUID()).setEmail("372347736@qq.com").setNickname("test") + .setUsername("111").setPassword("123456").setNumber("2018030801054")); + System.out.println(test); + } +} \ No newline at end of file diff --git a/hoj/DataBackup/target/classes/application.yml b/hoj/DataBackup/target/classes/application.yml new file mode 100644 index 00000000..b886f6e0 --- /dev/null +++ b/hoj/DataBackup/target/classes/application.yml @@ -0,0 +1,76 @@ +server: + port: 8080 + +# 消费者将要去访问的微服务名称(注册成功进入nacos的微服务提供者) + +#service-url: +# nacos-user-service: http://sentinel-dept-provider + +# 激活Sentinel对Feign的支持 +#feign: +# sentinel: +# enabled: true + +spring: + profiles: + active: dev + mail: + properties.mail.smtp.ssl.enable: true + username: 372347736@qq.com + password: neainmvuetxhbgfa + host: smtp.qq.com + redis: + host: 129.204.177.72 + port: 6371 +# application: +# name: hoj-data-backup +# cloud: +# nacos: +# discovery: +# server-addr: 129.204.177.72:8848 + datasource: + username: root + password: Hzh&hy2020 + url: jdbc:mysql://129.204.177.72:3306/hoj?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2b8 + driver-class-name: com.mysql.cj.jdbc.Driver + type: com.alibaba.druid.pool.DruidDataSource + initial-size: 10 # 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 + min-idle: 10 # 最小连接池数量 + maxActive: 200 # 最大连接池数量 + maxWait: 60000 # 获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置 + timeBetweenEvictionRunsMillis: 60000 # 关闭空闲连接的检测时间间隔.Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。 + minEvictableIdleTimeMillis: 300000 # 连接的最小生存时间.连接保持空闲而不被驱逐的最小时间 + validationQuery: SELECT 1 FROM DUAL # 验证数据库服务可用性的sql.用来检测连接是否有效的sql 因数据库方言而差, 例如 oracle 应该写成 SELECT 1 FROM DUAL + testWhileIdle: true # 申请连接时检测空闲时间,根据空闲时间再检测连接是否有效.建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRun + testOnBorrow: false # 申请连接时直接检测连接是否有效.申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 + testOnReturn: false # 归还连接时检测连接是否有效.归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 + poolPreparedStatements: true # 开启PSCache + maxPoolPreparedStatementPerConnectionSize: 20 #设置PSCache值 + connectionErrorRetryAttempts: 3 # 连接出错后再尝试连接三次 + breakAfterAcquireFailure: true # 数据库服务宕机自动重连机制 + timeBetweenConnectErrorMillis: 300000 # 连接出错后重试时间间隔 + asyncInit: true # 异步初始化策略 + remove-abandoned: true # 是否自动回收超时连接 + remove-abandoned-timeout: 1800 # 超时时间(以秒数为单位) + transaction-query-timeout: 6000 # 事务超时时间 + filters: stat,wall,log4j #数据库日志 + connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 + + + + +mybatis-plus: + mapper-locations: classpath*:top/hcode/dao/xml/**Mapper.xml + type-aliases-package: top.hcode.entity + +shiro-redis: + enabled: true + redis-manager: + host: 129.204.177.72:6371 +hoj: + jwt: + # 加密秘钥 + secret: zsc-acm-hoj + # token有效时长,1小时,单位秒 + expire: 3600 + header: token \ No newline at end of file diff --git a/hoj/DataBackup/target/classes/top/hcode/DataBackupApplication.class b/hoj/DataBackup/target/classes/top/hcode/DataBackupApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..cb4a5a978c5cb261a62820f5e9499b37b2e1fca9 GIT binary patch literal 769 zcmah{O>fgc5Pj>WO=aNxAwZk=tNU2DDO<7aUK zao`8=qY$%hMS^6653`zivv1zK_0M15e*k!lhcP}X;sJ)feoa?-Hicg!CQv&|p z;b|*DCFkm_E{K$iKjZid6MPz1pN&lVSjPs#qyMNKLP^gs`lt3Q zwJS>LEnQ7sXTue%Cxxi0q{ZE%)}_b{uReJ`xi+O)X8E904se1)MD$CAF9Hi|QtVR3 z>11@SkG_I^Y2Y5k00RSTQtV$fAjS>KHYvYJm2mkb>1~eX@EeTIH?PSmz|V0O-fUeG{hwmte7~Xcv^eLc*fSM`OdlH-~QSE z3BWY+QS{(K1PU(7WiE_MQSS3{S&(O!rSyuFu7t4|MHCk_T$TH)8kRIHOK~NPYhkPk zXf?;ET6)2#=7a48ztkSW!bLonzrQ#oT)p! zo4KWz%+0zoQ{aJH)lJKFGAp(_$6z-ZC0sTfN8e(SfrC%K{Nv-j`=8vtcjxw>AO3jn z&i=ty`vRxh^IU(g(wpM9m`7ERW3ddambnPP#iETmkvt<0utXO`?O)0%f} z*3q?PxUU}))}I>hM42>NJw)5(w7LwWj(bSF(yHkbGTyG~B_e7wzqWD1D7d-tHwA>< z-Y)-0K(*bXQ5A^GipH9~?XK%v6rMqoRNtVfi056saC2F&)H&jmabh?w1>IVZ;3yV# zr|8j4&KH?`b!~BZf#4{Is)kc5xdM@voRP6+c+IuF854-+?OL^9TsCEY;tjUX%3+LQ z1gB!?Lw^j9pr2#%pB;+fIZVXx1jb?*m(r6`dLAzb3>}^AxtdwplvHsdy#A&dbj`-_ z8rIm9$BAk8{}`u!AT^kh(q+DsR~Gvj@u3&w;e`=aY!!LM;R!?U2sYV84%*J$Z4jy&x>*)Lx&iKw* zrV21&Xd?YR0-bRWdKNxzS(7AGmYeDvC-{HkNU~)djv80V#9z!6=3Y!sd;wM2N&f=n zGpNCx^v_V1Cnt8H)*mT^RwlV*m8oCRl~nGcXB)Apq_T@}!$QldG|{r5q$+JfchS3z zcv4M<8b-WYWqu;L=pm?XjhMWH5Udt--AgTB#nxv3NBb}+4 z_M-Z^gUt6LBxIE(WGMys-*^r=;t6uVhcH7)snc*3%0ns?(jWv&hY$~G)O-#|#Q@ZX zLBmFASJ905_#*KuU1LtcN>e`|`oA0 IlKGea1#mHpSpWb4 literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/common/dto/RegisterDto.class b/hoj/DataBackup/target/classes/top/hcode/common/dto/RegisterDto.class new file mode 100644 index 0000000000000000000000000000000000000000..2c8bca637e53e954bd192dc179eb7e88d97c4125 GIT binary patch literal 4666 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 AJpcdz literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/common/result/CommonResult.class b/hoj/DataBackup/target/classes/top/hcode/common/result/CommonResult.class new file mode 100644 index 0000000000000000000000000000000000000000..045101f036042284412fb5f4e95f9b497781bbb8 GIT binary patch literal 3476 zcma)7YjaaY7=AW6x1=X+lir9Tf);3#mI@-5w1A~880iI@7P$$e>7fmzNy!Be^(Qc+ zU;P2{g%92+j?6gv1s#8nA4Pn2&q;bxBhyJ{_ubv+efN29d;a|A=U)IE#us6{jw>PP zxGINFO%=OIT#Kcr4BhWQ{D|8= znep_rfbFfO=I7_;1-iZExH55la%wg`H7Q_Js@ZC-BA_j2t671V&+^>TEhkr{;ow?j zrTHjRE$53XJTk`e#eDUoKx)9JS?A>2@{IX*JR5@-c=<$W*%9cN&KI58+S-y+UdS#L zxD%T$<+6nf*>Ya4y-lsUnkVCZ)78@Y$ZC$NBe~MrTB$fvb}F?(b!0-V=GB56J1VtY z&Z$(mv0f@xXm;99_Wzk}_kt$hJ#&NGRgO62a;dz@t;twDM%y(u<9Ezc_JzEjmu-^^ ztvJ<;S0OzEgDp%6n8Zw~;^}TeG|I;yU`AF@^Le9&LY2)+di@SG=(0pig4|nr{E&LI zi7<#z*E9j@5tIPuPAywtSt~zBllPt3SdUx1rx3LVVL$_nX?vcB& z)PZW3kh`zs2xFMLJ(FEm70ic&oh@MHvc)M$iQ;Ouvg$TLa9}V^8t3QJGgG8Q*>KC6 zF=!Cb``!Drer4aPmRvt+X)IUpT9TINbvRS1m2=LSyzHl_zcmiXN5sZ{T(t2PcG-9v z{WkVupFsb1TFb^8Qfog3Y`iI@8I0R}E#I^8zLbvOsEuPdZetd60)3lrmP__@Enirc zvF`S>8gOHN!p1$^m&2!Yd}z1y_XJ}xw3{AN5Q8=@;JAqgHa^4WHg-z}d$3EObMqoM zxx7Jb$mI;>{;%sC)asAgtS%}gZcPUoANC34Em+-VI-1IVSdYv08Ii0VPFpB6}>J{mLpeGku}M4 zL38hLl#XmQmlQ3`4K$gnGma?3g6t0BkZ0~F*+~K(J4-M=|6zAfnX_G>;sj;nUC+oV z&&4+BVzQ-)BR)oLo(Z7Mi=mLs;~A52lZ^Dlj|gmyQ-_ay6KtYeyWTS0VcKFq!xUy7oBv8}zTC2OlSYg+4Qs*g!}vDTHT-IHa`U-_aJ= zo+J7Q_HbO=KwBMQr*uN>lo8h@#(0j{BShkQ-0*=SDU+Z`%8Hv3WO*PnZq-5BV-gDb z+Q$v=RhMWZybp0&g{24gF~P14aFxd-N2!~`6eSI3afZKsmhcQ;@3WK)z7~7%0VNY< zzC&qB7Cz*iN!X_KH`+~{dx2gP)BIcF1$MY%$S=|~KMP(qWQob@&}H}}dw=u$i=$rD zgp#wHRDMLfWE`NLLG8uP(J}3W3i-~?(NzZA>P$X@IlO`P8*<-HY4RYhc_)@kgL@Q7 z>FS6XP)b%@S4TTr2lb?Tp%>I3=5Zb$k&e!Jo>Bl|oI{3GgM3~NVS$pyI_$$DC0&K> z9*mdV&=@u$7%B+ylJL!SKyLIvuLJ5Bt$E9X89vx1a_cU^q{%O(8#`PhRr#(Qeuj=q zPth5RZXhN@xPh)%w=3IH?s4S^r&uqC4fJh&4BU*l58`1jG!{O_MenY(x(V1D#UDRm u#}6=~;!7o1QSp}&;!*LH5?+%%E>tnc)F&p)GHyc*HcKzUlS`^xF8>R^UW%Il literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/config/CorsConfig.class b/hoj/DataBackup/target/classes/top/hcode/config/CorsConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..7c3f8a7427a00f8d8752c63894a63278a6a93221 GIT binary patch literal 1529 zcmcIk>r&HD5dIFmB-ThvL=;iHYbi>+0E$JRlmcp@9a6#Sue3dsV4HMKQ^0reCHzxo zoY4pHp&a-0BH%END7G`Z+0EH+_uJi^Z{I(E1u%}q5c+XT#qAL8AgW+QMJ$9-+*NT; z#h401#eEeIR6LaKM^cOjD3pG^5ot|GF{$9Of+q^57=qKbV|z0UzUat0gFoq(I72vX zJAAcKEpU;u3KjC`X}4%q)-7R6yW{kGTXvn{a@uoi##WI+jiT#p+GQi@ih8p37$-EV zRFaMrt5&m}GDRe#X;+kudQFhMDXc2rb;UblmlupW7dsX1b%89$aXrhkU8jY)#>;ly z6Yt})SXFc^hPi*mV+fgULlpUTEp?|DqpwjHgzEJvo4}Dd1Q8K zg~#_i;}8YeorY);ifb6adFs3oiz#@jA&zN=h)icxET?Rko@@^Tqu0+g%wU!dFQsxc zrsY&(fmAkQlI6?3A{ksrrBk^SgObVSo@Z7~4Re^)kifi#Bo;KJB*4&bW_2igrm)S6 z9>e_cC$+%~D?7#Z{2PJ`hMD7o$O&}EP1B(r>g*50>uCDdF2zTVoWUP&RC^+S#r8m< zEfj`ct5R`yc_}08vhC1<bGBOQo+0{hr{JxDUxa%#9p z&szHchH!~2x|=XeQU-rOfZ%}asNU0r&;JGfyiX69O#~yswxO7Lzpk43fPTu%2lbGd zSM<|nUez@^b;jRBZ$H9K^c{%RH}>lohC=vZ`bRK`GVr>Qf^kYuX` z_yhb=;!Sq33l;?HF_|bP!m4negDrok9K)@|n~EQ1MCF;$2P)^|PpREM`8AW(IF*fI}vP$O%R+RFCvF}5yp7go+?aCiZp-HR1 zZ)%F~nF^^7|43$ZB#s5c-G5b`m7umU9Fl*2Ced4=oybCc7DIZfW5rJ&$3lx-mQs6? z+Ky85ip?`zWRFEvNxPrLwA#m_s41gm>endtYcv&R2_1A99{z6+7;gT34j2ZZc)Sog z=daQunR(nmi$*hi4bViQOM8!QoGc^T-aY~Q5}(h}-ihD? literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/config/RedisConfig.class b/hoj/DataBackup/target/classes/top/hcode/config/RedisConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..60d40239b0c747ee3d52869d8d623f7cdf68d112 GIT binary patch literal 3117 zcmc&$|56iI6#j00uq0iC282efwJmKy5?2ImC5QwN1w){Og4kBQEH_~>+0E>3s_DD5 z&(Qium?<-TfId{G=k7)tV&cL~XUYs`_uicI-E+S4r8owB>jx5IS&D~JJd$EX z!74+~tYI4N97A|)e48P%XzdGz{+wZoe66x4>@B`mrkzC2(s_BC+lE{>HzV$W;V@jy zxmHy>(8*NOEwgBpv`w*ZIE&tUhM~`v%PmoA~oG5Fn-GM0XkX2zw=X9&06}jUI`*o$PHP7~V z-!sg8ZGG>MNMGaCs<6rEqT|X0z2jE)9BvglK@j%v>3XVH-`3P_5V&r&^EjJ3d#J1rW)NxtUv|KJ5f*LN} zkt6CESG;yLexj-^2yRl`@q$&eb+K&7P9E^`>G$RhNgTtSv*P(yHQRF}qv9hZ872dJ zxjkVj9wW!_Ai(f!)lCuon|?pp(y=v$iF1^@g1m}#Y$(`N@g25R?BI!lT@~Ns2Ngf! znTqFl!EpcVPIs(*6&!mibSd_w5KTZ(MMwrF0s^{lQ7$FXQ`g|j(I?^Ks@^B&WTf)c|_;E{4#W^1msBwQL; zqh5~~Wy7sgt+y`J6{5@bf)Ug=;cR}FVK&&WuK3hUeUygQGkzTl#%rf26KvAmh4C)N z^7`yF#_x8fv!nXxk|^?8+1;vFY4TIBZR=QmJ^y@pC7-4Ib_?PRz(nJqFy)s-8~$N8 zGS32fUSj$wldV@C!_9LY@Abz3fjk!V)@yq%up?V0TifmGVaiT_#GQjS+=Q$=UapDO z!-ku>@BEP9MY`vkm1hX2AY2Ceukgk{gg!;(UkFUjdyhEH$}VQI`l^pv14juF~DLU=7T(Lm%F(cMJP5tRHf zdTBd06G=wiApQm)G@$Ot_r3-$?4*;C2KtXNKsq1JL{rIV0|`$KrqT@zNpUgNz;Nm} zIwK6}*9|6rLiDXB4Q6WzP4v z84Gz%HlI;Uy?8>FqeRXKR`3NOgb8sTUlC4(5U*gI(4v?i49SPDpCbJ9 g(ld-nZ}-;8?i8)J=s!Wa_wX$W^GQPQ#nbuZKb6tV!~g&Q literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/config/ShiroConfig.class b/hoj/DataBackup/target/classes/top/hcode/config/ShiroConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..b4a9332c151f134c733711fee05d22322fc8c450 GIT binary patch literal 5005 zcmb_gTUQ&`75)xLNDO0hNrNquI>vEqar5M2r!m;L3J!H0zyusSPTDjFX+UEONu3#i zaqnr9HoZ5!H-Dgy?OI)UrL5JrzVx9#sjJ^PGm=KqC}y>JKr?e@@BMxIa`xH7zy9<0 ze*n0Ej}2rYQ`j)j1F3%UDHIGOVXL1_^|O^i(Llcva|{e9u>ssuEBDpwQVQD!hSck_ zff2|wDrr;)@O8Lq-AlnYa9pV!M=gaN17nc=IEP)e@?Zdac&P5ak-|3(j4Q!$CHO4^ zXVk+Pd^?5jr0`vV{(HOrqEqs1S72<(uT-sKzEZF)ujsfH>qhy)=PUAb-VR^0p6hAqpUwJGy{#oe=HL&3_`{K~H5 z+69{JyX=%5e_o(BJ8@eeu|RZz!6m0`uhh0TZ1zwYmvU2wehK=xYh=G=sq zl2w^6)ZYxbtBmHa#QMhEVU)^3kK zL*d&G{AlD~VM-KF&(7Ce$KPuNhi41?t7^7#r=zGlnPb_~5JwKhWCeO^$Jtj8-R zy2@u2*{H8AOiA995n`>$k0CA)1n2Nc9M(yUG8H&?NS6dI#3%A`P8nWp<-fs`*aI z;sSw3TRX{KwcbrGwu)X39!s*!cH*nnHrKf_uM9>)wHS0ewa)}T?vlv$*4-DkxpXT% zWGp{D7m-Ls$dUHh&Ty;BXeTFdwNtP&FAXN7=L$QHr*_Z7LuRmh z3hJHKa@dS%y2@Rt4#3A@lj>U6xc?tU$G2=h+(V(4>NH+;D-ZS-Ts!C)E8+GIveG=z zCC7uv6ZNV}uimY@*rO+@eBJbt_USV-Yy|mYeworCT{^*`e_ri+ftO<8Vh+YYtLExz zm@_eh^Q<#9)wHzX!=A||zK8b&UWhdi>A(6gZ#m!;^!H8t0Pmal06*k5?XVHiZ=MAL zFMg_Ee4{tpbHU(|sPxw&aspc3SMm$p3EOYIyK9+9knL*%)XZzs6+ccsK7&H(Z znuNI0ZPOfT)MMH3$O(+;$v_8Vm`6-Ye0WNXH9*@Y2(9r1-|A!PmUL-wp(H(zpS9=s zxeW;Zam({M#k)RUr+H2B%0|v#i%%A>N-jD12;#52>A`dSRl>koJkMV<5Wov~kx!gd zaFJ3<`3+usc^y1J&)rApU7nuWM`HRfTnfw_)vu?JCh`%YDs!g-mCziO@e;m3vuQHB zfS0LRXM2g#0<)M4;r>a@6xXgEAbEG{5&C8mnZ)!yQklfeKGFy1CkbOVd4K`ln6rJE zzTSNt$s{v<`#73OWRm+B%p{uh&hnoNpjQTghv?NPF5zhcW(j#7m$`Cl4eFNT zd2;e^_~qBL)+fDbkZ4~B$QW#6G(Yk2#q^>zrC z<5iUsH_{oxJ^R`uBY1YQS*gKBdWUddBiy?hPGwG+{tCWI)oA8=@D5jcC|h5B7x*u# CXtbgL literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/config/SwaggerConfig.class b/hoj/DataBackup/target/classes/top/hcode/config/SwaggerConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..daea231993f1edd7603da4727269d9e52a76bd48 GIT binary patch literal 3079 zcmbVOYf~Fl7=D)9hOoAEd%x2vHbBX?fkJ8MB~S`zN|97*s1`Syldxs88+JDd^)jO~ zcKqx((OsTfc*QLz{cUE@QIpzwO2}CVBtvFd*H`6Iw&9H)H&ykwV6lUg?VKcAW zmYHFu8*Y!5#HgayTFA`02>~6OcPGG?wXKwH zFpB9!ZM}(-Ao*)Z8ERU9FfCyJWX^Q;44cv&ow5`$O{)l)40cs9Xu52{Rn$kK${ zs?D<25MOj~@PxfkCQ*AllGCwW`VZnAz%1=Lw70Rw@X(Wi+-U1n1zh{=JPf=_fVYM`p7v8?Mn z2GH@0#GtES=cq*p0}@$nfM$NPtrPyj4=BxI%#~s_>iQ zRt=@6no^BMaCa|Y7k1=veE{>m@^r=Ik}QDVY8&JsV*Y~=c^$o?r+Fqc?i@H)GU7kXo2W6ooy-K z<-Q1Pqn8!|XSSC5M{k4v3Rx;=R{0Jm{Ljy+TW+oTY1?=$ge$0)wXdR#*H4EmgENyJ zNa6M=9HZZHdTavq5cn-hV;ij$`U>=I>{x>ED^2R~3XM(P=3bnjxl|ND0PVD*29HjX z;>!2XKtEup@jmL}^>TeI-XJ%`meF{%^W^Vns>6j9i1FXxTS7BA@Gqi8mKO2C;YDm) z#CCbdGG1JSyojB@keQo=#c7J5hhpd_P!|czApOVTbrd0# z;1L*{BzbzbkVcT=t0ODzI7O>^gh-x;*6n$tTb<@SkOW#tj%=-9S6r6l-SVC#?2WEq zUtHcVACM2qyF2AW^5GR6i7(;k5?UYQ^?RCK*hbzso;^iNB|O`32)*bdKXo|kdF}U5 LaIJH+4g>!KQ17sf literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/controller/AccountController.class b/hoj/DataBackup/target/classes/top/hcode/controller/AccountController.class new file mode 100644 index 0000000000000000000000000000000000000000..199856bf99879534fd2545af0ba6e88e96bb658a GIT binary patch literal 6926 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 R72*N;{It}G>(qlp{|9NXC+z?L literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/AuthMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/AuthMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..f0b0374ac287dd2225014a10deb9c60ae97d37d7 GIT binary patch literal 285 zcmb7=Jr2S!4256#D}@0@PJtJ;A|x1?iWpc~+%$qzZBw-g5?5p302~St%7DbiVEf6| z)A!`Z^L7WYz&OA#Kp0>o5FYfYWb0}raEvp)Fy&mHXrE+C+9;N$poC4KQ{$+(CTw+6 z<*p%VYDEQCm8xmOjoP(x8Cz4)S(;RlDy_CxT047=R*}HyU|cQLR_C5Id9Od7`I{;* k`#MuLt?hFcnEvJx@ch4m4Fm)_zPkPe@T%ALJ_hX!UXlV;%K!iX literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/CommentMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/CommentMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..196898bb803218d96121abd9dadbcb8e9192d415 GIT binary patch literal 294 zcmb7=F>b;@5Jmq&VgqR+TJFF!bVd|JO64ep4}iw&6)f_4EPEZvS4)utKO60nREwjW#o0nS za(&L;wsqOHq@^+BxUNk@dv49!fZNndO(!jdAyawldwLP)0w%jeVUbDKX!B~zV7L6= rjLP+&x5DbGFIX<(@kHVIHlRWXa#zAgL17YV8h(L54?}-MG|c!HW@cHJ literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/CommentTagMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/CommentTagMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..bf282f9b6f9f9aa27f61cc7a26fd3226b229c776 GIT binary patch literal 303 zcmb7=v2MaZ42J)sEos8ig_TFBmu{&TsKgZ1fxduqIi(ln;wZTw<<%H?03HhU8U|3e z4z_>E_U}(VUydgLZ&*Zlju1yk6ym)t8}>tI6!NU%15?dSNuPOTv`;fFj&c@f3mM3b zIeXi;_0W@+&XD7_H63lZH@iu`XI@(R)>0TUjkkWJ4{1?%%FT;jX6>^r1{*g!LHi!2UE*oLvQs~Y%D9Qo@!R_8cpQ) zHAgpeZ5qgGFXXxFq^A`R@;btYDr!gXRvRG+(ZxMIYlt$$rw}v+D?YEw$I@W2*3?^h zacw?*dxmvVT>f}6xck*@SkH-`=ms}`Ll|VU|4K16Fu2Hdng4~1CS$+CbezRE`ATS` literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/ContestExplanationMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/ContestExplanationMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..fc170a457159f5ada4a06e27a70b15456cd09b6b GIT binary patch literal 327 zcmb7AyH3ME5S-%?lceDXXerr-&WHj;DkF+~!TP)kXW6$W`y3^|M!^U0QBe-3h!kj2 z?Cun^vorg%`}zj(hpzkQw!!Ub0)yoAtOyeWgNsy`=~+nVYV6mTj5FHV+K429nmO8D7S-S!UkhFuT~kXQw=-~g2~vFM;Aj*n&;82JmfRMWD z!uFHwPw&a6^Up7UDJBty5k?Wl2BWRpmF(ME48D>*ADD73ceF|OVtt%gEhuFzT&67* z$CSNms=RH;YAsZ7RY^??Ze-obS>m;#Z>yP*l-~IxEw%L0_;?;0jJMj>R#q+#cJKGi rjr_cN8+<(ZjP(KEP7L1u1~dpk{*`cGVDJ*E7k+`D`dxp;pqtSJd=y!} literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/ContestProblemMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/ContestProblemMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..c22fda72191077852774b028f475ddddb4595397 GIT binary patch literal 315 zcmb7=F;2rk5JmqIh?CIJ(sF=Ilg?3!Af++_DJK}OC&@-$kF{P$%GD@10Ea>>PJu{A zF*CpT`t$TZzurFpEO4J;l3|)*W-#5leZ#R2Vz4WYd}6A(+0$!z6dUuxs;83GyGncV z=aQrA+Pd$^Y7p|=wi0N~oxBWkSwwB=V6_sGCc1d0XKkW%@hxasi_cfN!ECF2u(EM= w`uh0SaLJkfkQhAurd6z0Q5UDd!!@-*qWc&2*udZ>%_tRwq;7|Ohw*T;Z^A@kMgRZ+ literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/ContestRecordMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/ContestRecordMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..331db82c8281bc1f2a8bd2aca33907bf38855fea GIT binary patch literal 312 zcmb7=J&wXa429n;3*o1s+;%U38@eD0R@y2nBshUHv0zXVN6BO*u13KDIMj+E6f5W` zY(L5N^Cw^aPG;j3SH;Mq9Tl*|)VANOIs`rku+itUjx68xP ukB9!7x#4291HO88m2vGN3XVGHU|B&Jjy@&wL}1s5f8l-wZkY79I84^{ONhL&y} zY#+(?@h9KDE>{3+%p*)9Oe4$;rm5Rk?7Kz`^5n=Trh=Fb|f1GmGC!5Ed!RudMgTVDK;IVzX literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/JudgeCaseMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/JudgeCaseMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..56fb827b74abcdb02ee2c852da43019e09948946 GIT binary patch literal 300 zcmb7AyN<#@44mZ^9u38{{KC1R3!(st0tHd<1eU{5MFyeKrFg;n{XxW(}7=HZk r9@n3De}%HU}Nh~xQ!jg!otE}ET}D(V}nP4BXDQJuUYs3ew6Wq!o<#EcPEpX z%w(Uh`vU+ru<&5+f$u>ez>if{k+BU6xI{VK2n(t*JSRCz6Gl>(n2;`2sx6jXLPoW9 zVOx~CVJxYxxxqcPeCpvgGP=gA)F~rZMwt$eHqAKPg#vjyuRZlgmca0|U zyPBgL`Zf(@H3)g`dkM7UK~|%Ds-pJvZnY7TF1om*x1e<^{#jEO%SCB0TWbndUR;|q v@BXfj9uGeh2KT>C4eLLfeag706i39NU18Z zV`2MA_NVvc)7SA6z!HlL(+sl=bA#E&Z5xh#5QFz($9txln=QSTJFzh@ta>V0y{oh* ze<(S+uC4oytOg;^Z7YGExs#Vcu8OEFeORr8q=_yb=q+eji_f2OgZW1LU}f#zGA(==M#gwzX1(Wkbfnd7#Q578l_(#sqxTnF&Sp|4P*IPkpKVy literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/RoleAuthMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/RoleAuthMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..62eb41ed179776df218bbe2c8a66c1298edd14b6 GIT binary patch literal 297 zcmb7AOKQVF41Lpl+@za8w>?9&>CU0hEV^n&=%Gp`4o#uE zEF?XU-UogEe0~9V#zTVp1d{|)gUQD2YWATOgKc);52ljq9j)?%Sf6HAE6Q0bS7@N> zn6r0XQ-+SLwn7y*jkL7nPTqUC$hcX9$-3^}p6bjZW{c>Y4`=8MuX1OWk*udZ})*!wE5e@r3!nmKw35l;-jQ{`u literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/RoleMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/RoleMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..c4eaf9d3d7debb48460bffe665e0b4ecdd3aba11 GIT binary patch literal 285 zcmb7=v2Map3`OswloUF^$XDQ{TdEEnI;BD)D~t1D(T9>aN?wriYaRLl{iuqUWT?c( zVEf9})w%NT-}euI7d%IJim;5ZGFYbWRI%?GF*qh?zAzPBooJt(#rin0T2jVZx?DRd z`;5J7>!NGPY9mx~T}wmn+{))DUlXr2eOb+gr1H-9bkIWLx7c8nYS&o#a7AFPhxO#y o4OD~ezcXhYZPVRgbDPT`@b3z?Fff>fdI&E-Q1h`rVlmF>3X)${%K!iX literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/UserAcproblemMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/UserAcproblemMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..dabfd294e77efe92f96afc8ba391bd0ecf4fcb8b GIT binary patch literal 312 zcmb7=Jx&8b429qDlO;(*Ny`OrL$@eWD5y4~h&X_E)(R8ttVgr6NVysX2gso!hE0Kz zE`{wU*?RAj_lNHv0MD2gxGOL%Ff*90-KOI-L@|(R%U?__cN==Iw_;OSS@l%2de`Vc zephpHeQ1ZCtVSWvAxNZG?qxN~mnvzXPpgfPbjhV1ee@ESHbkvk@#Ug4n5}h)R^D8j wLmy7|N0+BR4ui*kuZH#1=y+&we~xUB(Jo@17#LjTy3XH0RySk6#blhtFFeg)%m4rY literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/UserInfoMapper.class b/hoj/DataBackup/target/classes/top/hcode/dao/UserInfoMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..b7fcdf510cb165f5478440b8345eae5398cbae47 GIT binary patch literal 486 zcmb7B%}N6?5T3NPYwKUZli*cR1n1(dA}AshRs@Tl&F)UOsk@nwWR-n24?choC1$s1 z#hZs@hUEL1eEIl%dk26s7)7uZ!FB{Y0wS4Z500#WgQM89!FkFVVajF68Z*y$Pq}iQ z?6v3d@kGF2s&XxTWl6wOypS&v3#oIwOBR&+aU7_aNG?^z6_#}(y>h0gT+ps{|n2?xRknqA*gaiXq5mHYubl{f7hZQj{mQ{Ocf}Y#Iq590Ak#X TaROT~9Wa6Ii1YX|8xXz#63m5S literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/AuthMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/AuthMapper.xml new file mode 100644 index 00000000..d2316d4c --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/AuthMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/CommentMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/CommentMapper.xml new file mode 100644 index 00000000..22d20be8 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/CommentMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/CommentTagMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/CommentTagMapper.xml new file mode 100644 index 00000000..611ed73b --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/CommentTagMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestAnnouncementMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestAnnouncementMapper.xml new file mode 100644 index 00000000..0b2c2672 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestAnnouncementMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestExplanationMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestExplanationMapper.xml new file mode 100644 index 00000000..ff9941ab --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestExplanationMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestMapper.xml new file mode 100644 index 00000000..af4de1d0 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestProblemMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestProblemMapper.xml new file mode 100644 index 00000000..1b091917 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestProblemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestRecordMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestRecordMapper.xml new file mode 100644 index 00000000..9315e9e4 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestRegisterMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestRegisterMapper.xml new file mode 100644 index 00000000..022d2cf6 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestRegisterMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestScoreMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestScoreMapper.xml new file mode 100644 index 00000000..f01f02d2 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ContestScoreMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/JudgeCaseMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/JudgeCaseMapper.xml new file mode 100644 index 00000000..b1b09574 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/JudgeCaseMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/JudgeMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/JudgeMapper.xml new file mode 100644 index 00000000..0abbce7e --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/JudgeMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/ProblemCountMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ProblemCountMapper.xml new file mode 100644 index 00000000..76b5051e --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ProblemCountMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/ProblemMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ProblemMapper.xml new file mode 100644 index 00000000..c436265e --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/ProblemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/RoleAuthMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/RoleAuthMapper.xml new file mode 100644 index 00000000..d1660d81 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/RoleAuthMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/RoleMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/RoleMapper.xml new file mode 100644 index 00000000..a71fdd36 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/RoleMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserAcproblemMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserAcproblemMapper.xml new file mode 100644 index 00000000..4ba9e06e --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserAcproblemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserInfoMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserInfoMapper.xml new file mode 100644 index 00000000..85e404a4 --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserInfoMapper.xml @@ -0,0 +1,9 @@ + + + + + insert into user_info(uuid,username,password,nickname,email,number) values ( + #{uuid}, #{username},#{password},#{nickname},#{email},#{number} + ) + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserRecordMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserRecordMapper.xml new file mode 100644 index 00000000..d51473df --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserRoleMapper.xml b/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserRoleMapper.xml new file mode 100644 index 00000000..0f583fbb --- /dev/null +++ b/hoj/DataBackup/target/classes/top/hcode/dao/xml/UserRoleMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/hoj/DataBackup/target/classes/top/hcode/service/AuthService.class b/hoj/DataBackup/target/classes/top/hcode/service/AuthService.class new file mode 100644 index 0000000000000000000000000000000000000000..a4eb55dfebb4fd634fb6007b72af20e2363af4cc GIT binary patch literal 299 zcmbVIOA5j;5S{p|ts5`k6`Y0cDuNq9D7feaOw*x_w28Dyu~&290X&o#e<&_p%*j67xUm&6*hPEZa4fjWaGUH&m@pE$#DwcorrKiJCfvyS zP}myjXh_vkE3Bz%q#)eHPq2uLK430%N=V8`)8fjSJY0qhf>_&1&{`JGZ+u_BNYlGD kgUN^bmi;<%l;4C5W`9H+FksMe)pZX6hkB3RhrwfdH@)RtA^-pY literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/CommentService.class b/hoj/DataBackup/target/classes/top/hcode/service/CommentService.class new file mode 100644 index 0000000000000000000000000000000000000000..8a189603289ca277e87edc16d0a0a7a970ac629a GIT binary patch literal 308 zcmX^0Z`VEs1_l!bZgvI^b_Py%1};Vh&fv`Syu^~yqEtqPWS^|WvPAuy#JqHU|D>$c z$c z3pN*Ngh(A~_)U`&Ri*%%oZ8JK{W85l$iKo$#_WMyCj)9e7XT4PH9 literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/ContestAnnouncementService.class b/hoj/DataBackup/target/classes/top/hcode/service/ContestAnnouncementService.class new file mode 100644 index 0000000000000000000000000000000000000000..6b8f988277722cf099f25cd4e339f7b2546f0e87 GIT binary patch literal 344 zcmbVIOG*Sm41MKi+8H>(KfzUFx}wLRb0!vxwxL@U<777?nkDd1+VyqqFl#lB zf$w5pK zf!MIH{TKH8wvTVG2LLl%XSm8R&M+|;mwp|r_8l99Vq>?KY8%${Ty5BCUN~u}veNjK z^wjJtt3I}MABlI$A$kcEx!Zcj^i+O`d7;wMi<1=-2lcwAr3B@u54$$O6GB41$PFf? z^qu2JUnlq5-%X#u`_ozmci-4A%Rfg9ZhqckF#X3dBLjnr6qo6BNNRA-LyXQfdk3>a BZNC5j literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/ContestProblemService.class b/hoj/DataBackup/target/classes/top/hcode/service/ContestProblemService.class new file mode 100644 index 0000000000000000000000000000000000000000..543fe05142d0a6f02a005cd28933ccf5b3ae9643 GIT binary patch literal 329 zcmbVIJ8r^25Ph2f2GXR?1=2A^=p4}?MT%r8NIt=O8IiT@9poJ&xLOJhz@efTNE9Wa zqL`UiJiX5xK0o#VrnpNmOfX6?HW=l86|A-m8@>}s)Kplh{Zd-0 zcZF3S*Hs&dx5^=U2^6{6c*pdbpTTpcvZi+@OC}ELbw_gv%25}M6cyL$EHxPC(l(A? xeAPKW{3Uz~O^$I49)IP2tS-_G?*HdEc)Fs%z`)?9o7?VP=uq#p`xu;V@&%-8Xq^B6 literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/ContestRecordService.class b/hoj/DataBackup/target/classes/top/hcode/service/ContestRecordService.class new file mode 100644 index 0000000000000000000000000000000000000000..5f42b9c519f0d429f3a443dbaf3ccbcd8ae6204e GIT binary patch literal 326 zcmbV|!D_-l5QhJ?)~LPo>I-=69O^Blmx53T6q+a4YzDiM>_~PZ`f48f0DY*^)GDHQ z>S1PnnBo6F=IeX+31Ei11j7WQ1Y?6y?iayo+pvMpmUeBavSC4Q#gd(-nUk6dE444B zrFvUf^>J0Tk$9sVqL)CCo3(dLulb*N%2ZbL;iP2ZpkBB1B0)LoJ3DF0^f@&c=h8Ng x=f3KKCujSE&BHH@!SrNy47zr0aDNGJ@c0k^=T7P=d86A%IeS0CcuLSuFfi!neif`XH5;t6jon!)ZCKHJv0GlPJE=LHrv`&un%eQg wmu>FodVMi@`9?7q|5^RU+&MNF-jW+k{(;^zFzB@P&^`*SdOY_odgqyZ0lMgB7ytkO literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/ContestService.class b/hoj/DataBackup/target/classes/top/hcode/service/ContestService.class new file mode 100644 index 0000000000000000000000000000000000000000..77a702335b872821d3cb0eda1aae95f4ea3a2b8e GIT binary patch literal 308 zcmX^0Z`VEs1_l!bZgvI^b_Py%1};Vh&fv`Syu^~yqEtqPWS^|WvPAuy#JqHU|D>$c zWhY*#Zl2lEp`fUt+03U^Lg#?TYmVIaI z?)-S(?f_=!1?U6_32m?Kap{hlFduKuvXCN?HWpEy85=MDVJ3S*xGI%SbK|TJ&}AIC zYo_$tBrH5wU8G4OofSsuY2`r}Wl}Ak_FffEt848jPEas@~!Xc&?%S0>rgP-2eap literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/JudgeCaseService.class b/hoj/DataBackup/target/classes/top/hcode/service/JudgeCaseService.class new file mode 100644 index 0000000000000000000000000000000000000000..804168a471cd0b80e461f18d10621ad3f645e040 GIT binary patch literal 314 zcmX^0Z`VEs1_l!bZgvI^b_Py%1};Vh&fv`Syu^~yqEtqPRG+NGvPAuy#JqHU|D>$c zdD>%QjC^^+FGY4p?C|nMzT@U04 uMg}E>AutQjRWdRNpgWk6!I%sevoSI-GB5!#GcbG@fGid;$;!Y6rr7}?Dq*|; literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/JudgeService.class b/hoj/DataBackup/target/classes/top/hcode/service/JudgeService.class new file mode 100644 index 0000000000000000000000000000000000000000..6362196e8b85486b745846513938eecafa573e67 GIT binary patch literal 302 zcmbVIOK!q25PjwsNH=f+j?h`aE>)LERFS&K2^?pXI!f#)u@Sji7d=1^RW$?@E o_IffGSl`H3;rlCrxm<==d2m5MWJOBUy literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/ProblemCountService.class b/hoj/DataBackup/target/classes/top/hcode/service/ProblemCountService.class new file mode 100644 index 0000000000000000000000000000000000000000..be5995235cf9172a6bc988d400792a4ee842a101 GIT binary patch literal 323 zcmbV|&uYRz5XQf?)l|KB^aZ?j4(%hCq2u~4)5k?Bb)UKWOp<#thQs}LwQoA)Rvx1F}6C)L6S}L1M zplX+CZ`-;IE%B#k*IIGZaI!!pj}#0|kX%R}bBz(5c5`?_+SB(J!{NW)c7Z literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/ProblemService.class b/hoj/DataBackup/target/classes/top/hcode/service/ProblemService.class new file mode 100644 index 0000000000000000000000000000000000000000..b52ddaa09df20029da8220b7883f125726e8edd7 GIT binary patch literal 308 zcmbV|O$x$5429qLSF0Pr3wQ#v&|Sr)AQTjOg6SCQNIN6#wCL4bcmNM2);~m-E|NS* z^74_(^>hX>Mc+f$gYTgy;72+!(v>+2sBkAMNvSjmt>PUk7lg`Y6ib`wjV&oV#?t9x zpOyvj!Lcc{HB@k3X~ndRo?;d{yQi(P8zweRyCbc08>gHF^FW{%*)mtW&}n^g`0Bh? n$9DjM(Z}Fz{yir!_(c_%{K4805NOoVtUrTVwH~>R&ZBxa#>8Lf literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/RoleAuthService.class b/hoj/DataBackup/target/classes/top/hcode/service/RoleAuthService.class new file mode 100644 index 0000000000000000000000000000000000000000..336e30f84e13708a1e3102d31a5741109aa51871 GIT binary patch literal 311 zcmbV|OA5k342J*lRUaD{Ucd{Oh3+bX8$l=t_5{;u(2;gV+8NQSx$poUN~|vgmoAe0 zkmS!tuDA0Azy!Sj?EswsU4c%lH%2;Nus|B^hM7YD7FmhnqWBWL%tRW@Z}gM3n pdM}S22m-^e#mD|QJVWjq2*fJ*uyYMI~fvM1Y+{8zcHVCE3Fcv0Li77FwV_{Ws zO3MQ2Y)Kc&Xe=nNlq6h7Pp}BBIpIN?gpjmVw#KbVDOd&!{K%BKq?JmY-?&-7NYloe k!Q?}I%YGd>%5Opjvp*tw3>b7=b=^b2pRb+KVymf3UZ4FgiHd-;wlM9%{&K9&*cFDxXX}6<=*UVH=+BD-lnnnU)V(U`z wkIsDX;DNu|4FAgreBaG(L9f&TU(e+QMsKw52nc-mY58BlqxN}!qI15%2@2F_BLDyZ literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/UserInfoService.class b/hoj/DataBackup/target/classes/top/hcode/service/UserInfoService.class new file mode 100644 index 0000000000000000000000000000000000000000..4944e04a1c11f74cbd9ce1d8b6157b0352a03db4 GIT binary patch literal 387 zcmbV|%}T>S5XWa~?b@o~!58qR7w4ehA>v7dK%ijo0XDm1+>-2;&7{~@^WX#cP~x_= zw0QI|A21*P-^|zd$0q>X!l{CZf@1|I2ufS~(s4w%yDTKk>CFVoWJ22pPgVjwbL~3e z_$VQ}DrS12snNcs+zZznGlX&JYOke_j9~XVrqzs%WJOv=l@6`5p{I6PX>r}W={w?g zVc)qVln55iFy-YYx!+@9FHV-UqRjnk$R3j9qzrvD{N$RXdA=?E4qvYz5iWM;Y}fy3 lL^#{sv!O+}`3LR@0b!8rAUzm|2tznb*#Jgsui$7M$3G@Ics&3B literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/UserRecordService.class b/hoj/DataBackup/target/classes/top/hcode/service/UserRecordService.class new file mode 100644 index 0000000000000000000000000000000000000000..ba8b4ecb3160628beb7ca703d3fc6d22d8a8b383 GIT binary patch literal 317 zcmbVIORB;^5UlYRKO0wGz`ecDUBsmz1cVnnz+}?uNHQbIMD%JdJb;IKym@{QbmyYG z3#zCp`ucmm0GOZ`pdFwSpexXc^~Ok76)dohcJd%8lV(H9WXH;dk+L}@(&jp~73HTy zI$iFwsw6%-Hl?vn@b(4S*? literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/UserRoleService.class b/hoj/DataBackup/target/classes/top/hcode/service/UserRoleService.class new file mode 100644 index 0000000000000000000000000000000000000000..613e609f903baca775bc22cf27a64d2c4b024f12 GIT binary patch literal 311 zcmbVINeaS15Ug>F%f*8q@B{WiZxN4z5D*MLU@~cRB$<(9BKkECKEOwbOSm`~xjcv4>EZJT@$9z(fvG-9ZnnXzPO z4V0EwX%t9%BZ3)u+5;1c*+^KG;ia?UrYd3R44jGiG^DFMk#?>^$yF53ct3U1;g{or zu+LB*s)-gZwUqK{5SoYw!bECpQXVY=;ZzdO(uB)LCv~EX{+X|kt6Qi!7A7xsDdJdK zzraZClw0Ja-zyT|G7AbxU1Mlc8_IK)b-Z2RGW92SVlEi=u2V`H$&pGFO`@;0airVm zd=SP?coJKsC%0Ba^1;}9o;Ycxaf?{;WdnW_Rn!;`|28)U{~wcL*#BLo&>Id=qEA6@ zPd|jwB57njLOjPn_4ozsnH(jokj-eIjXK$8ey*Z{RYGOLS=1WV^Sy-)+Ozmg;1dFB ByQcsE literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/CommentServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/CommentServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..27b8788fe1934d752b871fb6214e4eccd14b4dac GIT binary patch literal 666 zcmbtSO-lnY5Ph+>tM$8n;Z1KGK(%p(UrA#BTiAcM`sS=Nq^M0UmhU3WFj1Lle%5&)+RU*04S<26?*3$USPwtXZ zA;V%v^^Nd_qpB}aVl|J2)v9L;u7|PkD$mj)=knQ0lPhaxOHS2lO||U_JLz^MvP`;g ziX;ij4<~%sp5`WcXQh(NddC(nkr%3TzdK8pPEPK{qhQ#(DX6-ZU6m^u%$YIPlLu>P zF3rfgKF>3!O#jXaEuXA=;JKGhT0hJrADao6QALg6@Xupp2>&rShW+22W*y=HbF?Y6 z5VSUoJ`zYVAjC%)s2;t6y;5Qh3lvKlXkd}z^60;cI+h4k2$#23usS-|uuf-re*^di DT3W<| literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/CommentTagServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/CommentTagServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..44b391c5c68a39d3c861b2557145e22031291282 GIT binary patch literal 687 zcmbtSO-lnY5Pj*_YW=Pspf~ZNBF)9yiXa6+SUuR%d%BG^x=EI7R_)L6CwLM(_yhb= z;%u$3(vwJFlJ{mZ^JbWj&$o8~$JlD3idKO202=`|85$?bD1XXO-9P9v)H-%38CD`? znD+{UdxvGwE%1ZSG=uu8K+Q%tRDjweQ4(VA#ISsf?C=l_{FjnK9N= zKi1Hg_9N>?JWHK2qZ=o*e6;SKXI?sK{Wz6;+E}=VIvNZ|f0-&n_>Va;bM_mPwo}0(p|)_ F0bd7Q%v=Bf literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/ContestAnnouncementServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/ContestAnnouncementServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..4bcde131c7b4b635ee79fd00f01d54099140db68 GIT binary patch literal 750 zcmbtSO-lnY5Ph-M+WK8Tz@vCk5pz*ItO!yNgw=zU-qY<^qupdlvTA>pCqcv?;Exh# zt3pM4Q5GiqX5MDzy`9&$rxyUbSgE0edIgIWELE^9Fma%b4u=Azjm?(8c*Ax`U@q2% z&hoTP?n1SDoT9( z+21;!sw^WH4H0=99s0j3u%{cbbzSK*r%m_Lsg&-lyOBPSBOCe|$xrdoG|HF|*!$Bj5QzR^y1@3& zuA`M>4P(50ykxwJf*&57V}+3%V4%G92=Ty)F-&qS%0L}ej?;tpGHRG&RAOAPW-vQA M=P=J_!CwI00fx@!p8x;= literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/ContestExplanationServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/ContestExplanationServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..aaf2cbb31db3d4c3a73bd2c5402eb05aebf37234 GIT binary patch literal 743 zcmbtS%Sr<=6g}xv>!Vs9;8IsUz-)?}DFqP)VRT`o`*a#>bS4>+jM~p~CA#nf{3!8G ztx(Z!l!2Q$_nw=ZbGUEsFRuWaSg)aoMinbntX8qcP-!Wxe4C-Tz0+kV9htslsE10+ z^DOB}dntM`Wg4N0MBEit<#?Pd`D^7E4nl8IejQOOchcUeNOF~=F+VceOXrUt(pYHW zmC>Eg@+nmVhS`o9P(HIX;5m#;!h6Cbs&6u$413hz(l~QmK6t4eb$`Eo;;z=j3;M$R zGWblSskFfaPin9H@E2;(o}_&VnyQ6#)H)`!kvvhkQ(IG+x$6BJaVHoyE;1UQ$gXmV z{5;g!_>nla_6O$#t&1;$HIeolu==5{>6QU;2(Z7?EM@% zRW~+KptYmzq8()P(X%O53GopI%DYcskCZ52hGJd@8knUxKl(4DhB-n-!Z~XJi=(rS KB|3BdGVlS?s^q`` literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/ContestProblemServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/ContestProblemServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..b4cdb9e8c49b526a286929fa7a852945daddc199 GIT binary patch literal 715 zcmbtS%Sr<=6g}y~YOPl51KbF%tS*d*yD5SQf-s6$={}vtHrh#sBvb82xo{=8@B{oP z@lI8!wHuMZP0qb1_i?yy?=PryN?0vnjbWytwDLy``T9Se4lA#(Z zEiclzE$y{v_sLTWO(gm)VO55|oCV)gj^QBmCgHt^zH%q+Kt+X3?mcswlJ~kn3TuEw(!a&{nT;!;H7rT=%1O#ay7=PcZ8WJ zdM=Vg+F*<$wO4*PK?{z?Dc?g(?VoxtH%)3Id8#sHHm9<(Dfe#0Krn1vrBpJOE#(yH zaICfQG@sEVT|G3m%UxoX?%r4t%X?$*xbxCVHH> z)OoRm9IX~@5bYVGL+z3+5#l2Z6nCG&p2(5IEZHm!)G$Z3GI|$L#yp`s;f%F_#nD~G K65Sbp8TbGc2H3^` literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/ContestRecordServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/ContestRecordServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..f4fdd865efaae402d2508f83a889e95d9328725e GIT binary patch literal 708 zcmbtSO-lnY5Ph-MYW=9z5Afi@i>L>K;BBQK1wmLnSm{08jy2j%mL#k8FM0DMc<=}K zqr};&&|)tlfl1!X%gnrC-alU7032bXiW2G-tX8mA!MecAu{Jt11WLPmZGq{g?UFz( z)`l+fv_tMnb^7e7$2L*@wsN|_-_Gf9qrJdk9Bd|U686NuLL$PbFP0LXO(t~w((g$*6!yqI1Eizg_88ZU%k3$xS{xMd8o!|8) zsl_&?c&B)Ec)tzh6+A88Tn{#)w~>GZ78Yhb7|Fdesg0$X?xDL!&A-x<;K3i@ zk6N}S>q1s@5oxIIs(M{j?@`acAD;jmVXKK6S`B<|;7bFW3Jb?81Kznz>x}jmvr9N}Z4UCUPi7WzcjR$p&`z|I$;nj;GoW zjC`SWknx*cSNe>;bEVGL*|3V~{-wD#3fpI;bj_*9 zfknU*Yh4tM&We7!sq;e}3eR@<%bT2ToWIhQV&vkuApJr%Swu6$0yqfqGY6Yv4 MdkyPySNIL!5ANXG`2YX_ literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/ContestScoreServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/ContestScoreServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..fe8fce7d189b8f986dcc7a51e3c274707289c3e0 GIT binary patch literal 701 zcmbtSO-lnY5Ph-MYW=9z4-mX~5Y&V5;BBQK1wmLnSm{08jy2j%mL#k87kTz1c<=}K zqr};&&|)tlfl1!X%X~cM{p0lwz!5g8D4|}#Y6WW*tP9K>YokL$ptQT!7MO0@E(z3P zZRjFTJLIlZr_Y{xY!lUQE2j(m?VJub+6x@U!DjL%;jhw@yVnUxoo0R6v?h=bt;9NN zeFe_g9|_F0bkC@eJ5K!+CpMKGWmDa?xl9Kg6|~R#xtH`9$arndc;1m*$0N17%8r#h zS6N0b8exzLIt<20QDcz~*Jn#Zqc(uUWAZ zV{G8LtYN`+W9xd-XHJ{mwNoiQSa&CVAV)R~GLqi|MhhroM&RIY`U*ttM$8n;Z1K!0w!(9>; zGAwpfUkhJY%K8!|CgZU%nd+H>XTw-{_wes@+bot)f@N5QanQ&9Fyc9l~!m@}=7Cl5x` zT$+)weeQCrbpOtZOgADao6QALg6@Xupp2>&rShW+1_W*y=HbF?Y6 z5VSUoK5CF+K!}epP(6ABdnIBH3lvKkXkd}z^60;cI+h4k2$#23usS-|uuf-re*^di D)n~-s literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/EmailServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/EmailServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..44d4df34231b68f3892decb3d21dc7108e8cf901 GIT binary patch literal 4760 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 E0W`k8IRF3v literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/ProblemCountServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/ProblemCountServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..95afa273218e492987f862453c5b1c01ba5b72ce GIT binary patch literal 701 zcmbtSO-lnY5PfNFYwLIY0Ktm~K|M4cysZdQ5QJ64O7H15*3oXVWV332k!MeW2Y-M+ zN}R0~TI@w+VX|-XGBfWnAD?gU01mNHLlN}~Rx4PmU|pbmM27saKyi1kEiluxT`jN_ zlF=7g+|lk@b^4sChc;6EwsMr?QF6xLQYvr|dYj1Gh@Z+-y9bK2q&VrzOJ|uJH*IEo z>-*x2^MOFMMLnZ@=D7587};2Ml#QutGZ_y$%2S&3vsCIQuT4tUOx7K%bu`wytL#L} zbCo381!D|tJo&){DL5V{{EReFZXx+U`y>{CAL89eIU@(so$^wnQ`703o!%=~q-|ePo z#Wo7OOuRF^S%Nq`ecth&&D7gksbaR%LkREV!Xc7><2sVm=J%D^H{yt59+k#Up-W4FyNtAKxXp zJcdeF4YY8nrK~T0Xd)g66REyQc{B-xQ%O8Z6E2^f)QK{BIpspG_CnddF!O3xB95i? z7D%a`a+5jlbr!jKzss#so7JvKZ745Prhadk&Xk-yh_PVUzfCE7Bzr1Rr1eZ|<4A+i zG?%7t?0_e+ReEr5MI@h$edLLgRvI^nC7+4$YAB+_(E9Tj8N7cCj^W^UrDcUUM2(V+&(mI?7G28u^-V6WuJVTEi)0}WKj)~4?ws#qnIC!9sCVSRenu|anhzX^N; DNsGjF literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/RoleAuthServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/RoleAuthServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..ad15eadcb6fe315a0f2408ba0f9ff4b809285461 GIT binary patch literal 673 zcmbtS%Sr<=6g}y~(fX*?2fB2pMa;(C6hQ<*7+qNDJ~NGNbS4=xnQFhquW%)}@B{oP z@lMq;){P*6o1AlR?&EOZ-d|n;9AT@0Dq0@aJ#2W`WSHwHt=us~b#K4NP&+k!$q&y};N3&r+-O;KqtX-Wz+zGbgPyZk$T~HIToAI_4PKf7g=1|A%@EyT41#%!pl7 zXklnCXnPnPYLTo*h)*z3Z$E=Q5mCWB*}@I9ut0Wc@~)$SMM71=Mbt7@CU+C7bQke! Fzz0;!#=!sp literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/RoleServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/RoleServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..b0059a4d424e13f5d731105d12182a9ae3daf5ae GIT binary patch literal 645 zcmbtSO-lnY5Pj)~YiqSytKh+d7pWf1#oLyG2!c>Ow9yLFV&^04ip?O}&urK_}ZJ%)1UXv9!CHxtRw z>?@(DcYN~}xEv08%x!d@%N&Cr(;v+#;5I*?`|b6)Oyff14YF|Bp#A?EfxP=nV%b(Wjud zrys&-kuI$n;JaZP@P{j-<1>~Jz+xCHwh0XJ>gUwjgpwlCnt5RjGj-N$<@ph?+Y_u z^HM~Sv|ffHwNq{~&+=MX#?J(cny1Dq9h2BVo~u-qy+x#S!sB}}77V-B3DpZ_SH+4n zXlrd8&1N*I*6@uT@Hnzc5ALi8<)g6=Ja*Db<0g^hvmw1IidbUce-xR)`-iLy2fynr znil)W(N59o(1I~K)GXN&AwI=G@#q!og&a97lTE`w9c8lB>AQ#uRtV(@r>s@1P461k J=}!3@z!&j{)l>ig literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/UserInfoServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/UserInfoServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..5aafcecb64fcb52a0fdf5d38a69b3f8f91bb52d7 GIT binary patch literal 1163 zcmbtTZBG+H5Pr54D(wk^SV0giini6bUraP9Awi8vld1_Q-?w+$vfA6d?Cll%Tl^E6 znE3L+AK;HN&b9OfiqXUmHEP}N4^Op4}{@wPWfvLYx{|IDwKyRR?Uvw)7m)Ul+iK6 zJ=qZwcQS+v8%C!1oeoj+K=G!Ora{t=uldOu2H%kbO!G zFf2BdmM@dADeY@P)fko=#uuGKVO9D*F=pM7qVo4AdZ)I#%9mV)QD-#7!N6E28!rnzHF=5N&C#1TBY$;bOrAS-R5=eWLsLoDA;ib!`9zn80HUD zTML(1n&v};s_~{Up$bgG!(Nl9jH6BxbNSv$9TTto)F=}p>`YWUXH^qkNgH#$5e>E7 z+JtimKiu?51sX1YU=r)g=PD(B^^89y@j*%nL;2jbr^HF)dXeNqNDm$^dboi39JW1N z#+@AQdMKm9P#xdhu%kcij-mD+v@w*XOPv{xVPhOK%`Ltg=CuigupVS7pk9;x%Uk-8GJ?dBUv&SqpbH)ii5}#6w1LB6bWYrSNrj+ MSnKO+qh{BE-$;E&x&QzG literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/service/impl/UserRecordServiceImpl.class b/hoj/DataBackup/target/classes/top/hcode/service/impl/UserRecordServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..abf38bf2edf23dfebc5e34c73cdb715b10ebbb63 GIT binary patch literal 687 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 TLJ>66+aTXUI8v&u=YW3!Zd^%g literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/shiro/JwtFilter.class b/hoj/DataBackup/target/classes/top/hcode/shiro/JwtFilter.class new file mode 100644 index 0000000000000000000000000000000000000000..2aa29070e22cb64052da1ed6045ac59fea66abe5 GIT binary patch literal 4595 zcmbtXS$h-L8Ggr>JhD72F{=_v2&)Y;11U+U4LHUaFgBKJ2~#I&!&n}y!SakUGr~As z(BXE`&iT&w zz3;c3dGp^dzY1U%{uISF45~;+FjR*sm{FX>u!>9+HLz;26{n&YLADN~u*H+3A{W6U zQE0HDoOV@sQTWJ5aT;T_ID_#hhexCMAU;%wrTB0ZAHhded@PE`@NqGGB7#pw@F_9* zcmz*G@MHu}Meu2%|1-6C8qY*Id^U>D;q$fl0=^jK@FlVQ%fi~TD$c3+ih{_gG5?rv zWjzJAcl%CG&!n9pQ_qV}`jKF+MM11DZ~NA$*>8E)VAgE2ZO1o!%dsiAyW4SxbuZ^y z_V7v97&XTncSIjF4cpUC8fo8g$91D9ptt3HXUuZVA#Pi<$FePdpMvU!#(o8%b}Cn} zq}#I1p8V*b>81>7Q&8XSq>XI9;acK7_!#mt7S-QTX1ABITu0b_(8~IzOAU2t*ED=H z<&2oNf{}*qQ^slIjP9B4>8$DN$-=$Qd?asreoLiUFGr+iOQS?;#d$(=?6!2;^t=P6 zZJ9#~?*BiTeLz7toi(gc1*^L)M?d8`_Lw>73%}{@V#1?wVfn7&tI~pQXV|h28df&% zGDe-_nV7lbP-orba{gtCII64l&VG3& z;!O>|!|yfx0e{r+kl;18fX53>N5Q@Ge9B6upOh_0pWiU-;TgfDlF_nyJVUblR3ur! z%7rWBtmVbR!c-eJ{Q^`5L?KsaRsF`YdQ@x#J6U-2LBkofhMc@UIzGt2_j1|1r>7m) z)P2Xvj#%uVvT+1w2-WgBMsxl+-BqrpJ!7~@(WUG(n<$Init^b&qc{MR<*-?4le-7$M?wQ7rA5Mi%{*hK z^S&uNkb>>=96sO6j$P)zhyY{cJ(jRlGiFF17oA31qFi*8E!G(3vgNau6`i!P6o!@i z1no_x+ET}o4|nwSCHe@e%-@~1Zw||&(jwD!9k*1}k1oLP0)maV+N)NjZ9T)opOcl{ zT|bgc^oY0-z0o~V7{!;JfxaT^x0u|zO`M)H)dN_4TKFKEo1wNxEGZDjM*&3}*10*yTS%56do zosIpti@#>u_=l(PVgu)WJD+NJ*Le@~&I1I;yZNT`F4l#&PC~iNhbp|AqgV{A2lLDTL1>tX#T^nt@no66z%` ztCm}@lp>orZpIR9!74N$MvH~2U4`ueRoocwL9-LZF4vlejUr@dw3dA z1rw+{k40CZ4b(51#NyYsZi`P~$wh8gK(!tbK5wUeIxX8lR6B`k7d8@0Gl@IEQ6St$ z6E|I?J8pJDq`&_Vm(;Ix(7#!SeK)^i1i(;Q_=NL)XoCkjiZDwT=WluujRcp z7P^k5&0$)7+Z#~h7kKfpxh7UKf%+?0HihNQYD}HNisnd+m{;+hU-T-Q{8S81+k8tWAvCpS!B z;{-OHM|~`G1)C?ZWf~1tsJ_Tpm_%bK7B)-9d#E+Rxa`Fm0^UNfy9wzCK^;dw255dM w;!hL_I3d9*!d|W_MErwzzl``g%6@=yWf4ChBYvRF`BiwB!c`QXNqPhL59dZ04FCWD literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/shiro/JwtToken.class b/hoj/DataBackup/target/classes/top/hcode/shiro/JwtToken.class new file mode 100644 index 0000000000000000000000000000000000000000..dba81dced0d329c41c87c7875814e2d2ceb6218e GIT binary patch literal 602 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 literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/utils/RedisUtils.class b/hoj/DataBackup/target/classes/top/hcode/utils/RedisUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..e19df7c755eed9263e6e3d93ea3d9372d1854cda GIT binary patch literal 10483 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 F{U7+b2+jZi literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/classes/top/hcode/utils/ShiroUtils.class b/hoj/DataBackup/target/classes/top/hcode/utils/ShiroUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..ddcba01000c658b760db4f98569009f5e663ec5e GIT binary patch literal 607 zcmah`O;5r=5Pi#6rBpz~FGNJc0X(=DZx|C};)$pU%6(ZYEU7Iit%?6iPktPXXMdD& zw#8u3#68UHd-LXHX7}Us^$oxQ>LxNMnOH_ShZU?ESTnG0V1prZs9Y5sF(jL<9z*KH zyS5n$9p&0*;cegcFGb%WrquDIaC*X58c)eoFjNzUYA5i z!!|>0Hp5@843(K+en^I*cIJ+72mHK0vSmPqojfKNdCgb_x+SoywzEqzCn0^q7SwfsLqnzG*0(*?g xCdEudTFBAeiUpJx31yK-ff(J~h$^IbM&boYhIgbMh^JL4#vXY>MM4QIeF3HCm52ZU literal 0 HcmV?d00001 diff --git a/hoj/DataBackup/target/test-classes/top/hcode/DataBackupApplicationTests.class b/hoj/DataBackup/target/test-classes/top/hcode/DataBackupApplicationTests.class new file mode 100644 index 0000000000000000000000000000000000000000..968dcadc913753cdf6650f746e7daa9b75526e10 GIT binary patch literal 1345 zcmah}*-{fh6g?f531M7_f(!0~Ca82mfJDWGMKl@_!BFL6Gijh9Gd<4qxK#O5T2|bu z`~W}7@^(;zrIruVrR4{(kNM+Ok>L8bU(_d^x-P5WpEuc4sJNO$*@0(WmF9|^g|JbGGaJYGdkp3 zo^D9q5SrJ2Tffe5Y$XYd^5vR})p}FT27xxhC>_KMm70z=c^pP6*xZPOFJI_rhp$T! z#C$_|Mn|u>__cx0CPu$dk!(=f-We4rLyEd``89^_c@n^Ipr!)3l=$m1dLoF8AzRa) zXs(G!+3}CbZnLF`{=y#Z3&Myw;q4^hY#26`*OvH1#wI4R9@{Ariy>rSRfZF7>Dvj3 z;M+;4jEuMl6}OSJBeSZL$dil8YB>Gx?#(EE*5RKw@6`A(=P7X(Y}d7u~H}%DurTUYSP6$%sZ&MxQ_=8YAzmP z$-yHR%XrK%(vkFU2S|zafHy_3$set6OOG5r?ge~{Zd*6$=#k`!QB7WL)CtJjSovX7 z*6Y;;hQqmht+RjC*is_@omiTBq8emv?$7o7o{RsxS(GA8Dem~fGWJtN2%9Kc#JSbNL5Dd z2^w)i8`m@T9_&qf`6RVA7#P4QYTexcoW>a%F-kv7N$lp=^suA|D`W4F`i!op@6r7M zJuUQRofgvBz7{gs{ubQqz83ap543RbBL-5Kd5i3D3x_& f|IjYS5B>t^rNepB@$*n46qCYeyS?yh_9E~dl5R~C literal 0 HcmV?d00001 diff --git a/hoj/api/pom.xml b/hoj/api/pom.xml new file mode 100644 index 00000000..0aafa8d7 --- /dev/null +++ b/hoj/api/pom.xml @@ -0,0 +1,42 @@ + + + + hoj + top.hcode + 1.0-SNAPSHOT + + 4.0.0 + + api + + + + io.springfox + springfox-swagger2 + 2.9.2 + + + io.springfox + springfox-swagger-ui + 2.9.2 + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + com.baomidou + mybatis-plus-boot-starter + 3.2.0 + + + org.projectlombok + lombok + true + + + + + \ No newline at end of file diff --git a/hoj/api/src/main/java/top/hcode/entity/Auth.java b/hoj/api/src/main/java/top/hcode/entity/Auth.java new file mode 100644 index 00000000..326f2aed --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/Auth.java @@ -0,0 +1,51 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="Auth对象", description="") +public class Auth implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "权限名称") + private String name; + + @ApiModelProperty(value = "权限字符串") + private String permission; + + @ApiModelProperty(value = "0可用,1不可用") + private Integer status; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/Comment.java b/hoj/api/src/main/java/top/hcode/entity/Comment.java new file mode 100644 index 00000000..e0aa7226 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/Comment.java @@ -0,0 +1,59 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="Comment对象", description="") +public class Comment implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String uid; + + @ApiModelProperty(value = "讨论标题") + private String title; + + @ApiModelProperty(value = "讨论详情") + private String content; + + @ApiModelProperty(value = "标签id,0表示无") + private Long tid; + + @ApiModelProperty(value = "0表示无引用题目") + private Long pid; + + @ApiModelProperty(value = "0表示无引用比赛") + private Long cid; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/CommentTag.java b/hoj/api/src/main/java/top/hcode/entity/CommentTag.java new file mode 100644 index 00000000..9ffc265e --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/CommentTag.java @@ -0,0 +1,48 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="CommentTag对象", description="") +public class CommentTag implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "标签名字") + private String name; + + @ApiModelProperty(value = "标签颜色") + private String color; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/Contest.java b/hoj/api/src/main/java/top/hcode/entity/Contest.java new file mode 100644 index 00000000..77658a87 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/Contest.java @@ -0,0 +1,72 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="Contest对象", description="") +public class Contest implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "比赛创建者id") + private String uid; + + @ApiModelProperty(value = "比赛标题") + private String title; + + @ApiModelProperty(value = "0为acm赛制,1为比分赛制") + private Integer type; + + @ApiModelProperty(value = "比赛说明") + private String explain; + + @ApiModelProperty(value = "比赛来源,原创为0,克隆赛为比赛id") + private Integer source; + + @ApiModelProperty(value = "0为公开赛,1为私有赛(有密码),2为报名赛") + private Integer auth; + + @ApiModelProperty(value = "比赛密码") + private String pwd; + + @ApiModelProperty(value = "开始时间") + private Date startTime; + + @ApiModelProperty(value = "结束时间") + private Date endTime; + + @ApiModelProperty(value = "比赛时长(分)") + private Integer duration; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/ContestAnnouncement.java b/hoj/api/src/main/java/top/hcode/entity/ContestAnnouncement.java new file mode 100644 index 00000000..69e1d641 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/ContestAnnouncement.java @@ -0,0 +1,53 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ContestAnnouncement对象", description="") +public class ContestAnnouncement implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long cid; + + @ApiModelProperty(value = "通知标题") + private String title; + + @ApiModelProperty(value = "通知内容") + private String content; + + @ApiModelProperty(value = "发布者(必须为比赛创建者或者超级管理员才能)") + private String uid; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/ContestExplanation.java b/hoj/api/src/main/java/top/hcode/entity/ContestExplanation.java new file mode 100644 index 00000000..e328be88 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/ContestExplanation.java @@ -0,0 +1,50 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ContestExplanation对象", description="") +public class ContestExplanation implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long cid; + + @ApiModelProperty(value = "发布者(必须为比赛创建者或者超级管理员才能)") + private String uid; + + @ApiModelProperty(value = "内容(支持markdown)") + private String content; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/ContestProblem.java b/hoj/api/src/main/java/top/hcode/entity/ContestProblem.java new file mode 100644 index 00000000..f3e06d8d --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/ContestProblem.java @@ -0,0 +1,54 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ContestProblem对象", description="") +public class ContestProblem implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "比赛id") + private Long cid; + + @ApiModelProperty(value = "题目id") + private Long pid; + + @ApiModelProperty(value = "该题目在比赛中的标题,默认为原名字") + private String cpName; + + @ApiModelProperty(value = "该题目在比赛中的顺序id") + private String cpNum; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/ContestRecord.java b/hoj/api/src/main/java/top/hcode/entity/ContestRecord.java new file mode 100644 index 00000000..16e62a09 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/ContestRecord.java @@ -0,0 +1,60 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ContestRecord对象", description="") +public class ContestRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long cid; + + private String uid; + + private Long pid; + + @ApiModelProperty(value = "比赛中的题目顺序id") + private Long cpid; + + @ApiModelProperty(value = "提交id,用于可重判") + private Long submitId; + + @ApiModelProperty(value = "提交结果,0不加罚时,-1加罚时,1表示AC") + private Integer status; + + @ApiModelProperty(value = "提交时间") + private Date time; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/ContestRegister.java b/hoj/api/src/main/java/top/hcode/entity/ContestRegister.java new file mode 100644 index 00000000..25ad1b9a --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/ContestRegister.java @@ -0,0 +1,51 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ContestRegister对象", description="") +public class ContestRegister implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "比赛id") + private Long cid; + + @ApiModelProperty(value = "用户id") + private String uid; + + @ApiModelProperty(value = "默认为0表示正常,1为失效。") + private Integer status; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/ContestScore.java b/hoj/api/src/main/java/top/hcode/entity/ContestScore.java new file mode 100644 index 00000000..0289dc3e --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/ContestScore.java @@ -0,0 +1,53 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ContestScore对象", description="") +public class ContestScore implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long cid; + + @ApiModelProperty(value = "比赛前的score得分") + private Integer last; + + @ApiModelProperty(value = "Score比分变化") + private Integer change; + + @ApiModelProperty(value = "现在的score") + private Integer now; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/Judge.java b/hoj/api/src/main/java/top/hcode/entity/Judge.java new file mode 100644 index 00000000..212d9578 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/Judge.java @@ -0,0 +1,84 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="Judge对象", description="") +public class Judge implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "submit_id", type = IdType.AUTO) + private Long submitId; + + private Long pid; + + private String uid; + + private Date submitTime; + + @ApiModelProperty(value = "结果码具体参考文档") + private Integer status; + + @ApiModelProperty(value = "0为代码全部人可见,1为仅自己可见。") + private Integer auth; + + @ApiModelProperty(value = "错误提醒(编译错误,或者vj提醒)") + private String errorMessage; + + @ApiModelProperty(value = "运行时间") + private Integer time; + + @ApiModelProperty(value = "运行内存") + private Integer memory; + + @ApiModelProperty(value = "代码长度") + private Integer length; + + @ApiModelProperty(value = "代码") + private String code; + + @ApiModelProperty(value = "代码语言") + private String language; + + @ApiModelProperty(value = "比赛id,非比赛题目默认为0") + private Long cid; + + @ApiModelProperty(value = "比赛中题目排序id,非比赛题目默认为0") + private Long cpid; + + @ApiModelProperty(value = "判题机ip") + private String judger; + + @ApiModelProperty(value = "提交者所在ip") + private String ip; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/JudgeCase.java b/hoj/api/src/main/java/top/hcode/entity/JudgeCase.java new file mode 100644 index 00000000..1b90fd0e --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/JudgeCase.java @@ -0,0 +1,68 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.sql.Blob; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="JudgeCase对象", description="") +public class JudgeCase implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "submit_id", type = IdType.ID_WORKER) + private Long submitId; + + private String uid; + + private Long pid; + + @ApiModelProperty(value = "具体看结果码") + private Integer status; + + @ApiModelProperty(value = "运行时间") + private Integer time; + + @ApiModelProperty(value = "运行内存") + private Integer memory; + + @ApiModelProperty(value = "测试样例id") + private String caseId; + + @ApiModelProperty(value = "样例输入,比赛不可看") + private String inputData; + + @ApiModelProperty(value = "样例输出,比赛不可看") + private String outputData; + + @ApiModelProperty(value = "用户样例输出,比赛不可看") + private Blob userOutput; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/Problem.java b/hoj/api/src/main/java/top/hcode/entity/Problem.java new file mode 100644 index 00000000..a0428231 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/Problem.java @@ -0,0 +1,76 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="Problem对象", description="") +public class Problem implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private String title; + + private String author; + + @ApiModelProperty(value = "单位ms") + private Integer timeLimit; + + @ApiModelProperty(value = "单位kb") + private Integer memoryLimit; + + @ApiModelProperty(value = "描述") + private String description; + + @ApiModelProperty(value = "输入描述") + private String input; + + @ApiModelProperty(value = "输出描述") + private String output; + + @ApiModelProperty(value = "多样例用(#)隔开") + private String inputSample; + + @ApiModelProperty(value = "多样例用(#)隔开") + private String outputSample; + + @ApiModelProperty(value = "题目来源") + private String source; + + @ApiModelProperty(value = "备注") + private String comment; + + @ApiModelProperty(value = "默认为1公开,2为私有,3为比赛中") + private Integer auth; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/ProblemCount.java b/hoj/api/src/main/java/top/hcode/entity/ProblemCount.java new file mode 100644 index 00000000..1dd196e3 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/ProblemCount.java @@ -0,0 +1,70 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="ProblemCount对象", description="") +public class ProblemCount implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "pid", type = IdType.ID_WORKER) + private Long pid; + + private Integer total; + + private Integer ac; + + @ApiModelProperty(value = "空间超限") + private Integer mle; + + @ApiModelProperty(value = "时间超限") + private Integer tle; + + @ApiModelProperty(value = "运行错误") + private Integer re; + + @ApiModelProperty(value = "格式错误") + private Integer pe; + + @ApiModelProperty(value = "编译错误") + private Integer ce; + + @ApiModelProperty(value = "答案错误") + private Integer wa; + + @ApiModelProperty(value = "系统错误") + private Integer se; + + @ApiModelProperty(value = "题目分数,默认为100") + private Integer score; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/Role.java b/hoj/api/src/main/java/top/hcode/entity/Role.java new file mode 100644 index 00000000..b7f56839 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/Role.java @@ -0,0 +1,53 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="Role对象", description="") +public class Role implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.ID_WORKER) + private Long id; + + @ApiModelProperty(value = "角色") + private String role; + + @ApiModelProperty(value = "描述") + private String description; + + @ApiModelProperty(value = "默认0可用,1不可用") + private Integer status; + + @ApiModelProperty(value = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @ApiModelProperty(value = "修改时间") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/RoleAuth.java b/hoj/api/src/main/java/top/hcode/entity/RoleAuth.java new file mode 100644 index 00000000..0c6b8284 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/RoleAuth.java @@ -0,0 +1,40 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="RoleAuth对象", description="") +public class RoleAuth implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long authId; + + private Long roleId; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/UserAcproblem.java b/hoj/api/src/main/java/top/hcode/entity/UserAcproblem.java new file mode 100644 index 00000000..2a409923 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/UserAcproblem.java @@ -0,0 +1,48 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserAcproblem对象", description="") +public class UserAcproblem implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "用户id") + private String uid; + + @ApiModelProperty(value = "ac的题目id") + private Long pid; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/UserInfo.java b/hoj/api/src/main/java/top/hcode/entity/UserInfo.java new file mode 100644 index 00000000..8169d77e --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/UserInfo.java @@ -0,0 +1,80 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserInfo对象", description="") +public class UserInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "uuid",type =IdType.UUID) + private String uuid; + + @ApiModelProperty(value = "用户名") + private String username; + + @ApiModelProperty(value = "密码") + private String password; + + @ApiModelProperty(value = "昵称") + private String nickname; + + @ApiModelProperty(value = "学校") + private String school; + + @ApiModelProperty(value = "专业") + private String course; + + @ApiModelProperty(value = "学号") + private String number; + + @ApiModelProperty(value = "真实姓名") + private String realname; + + @ApiModelProperty(value = "cf的username") + private String cfUsername; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "头像地址") + private String avatar; + + @ApiModelProperty(value = "个性签名") + private String signature; + + @ApiModelProperty(value = "0可用,-1不可用") + private int status; + + @ApiModelProperty(value = "创建时间") + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @ApiModelProperty(value = "修改时间") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/UserRecord.java b/hoj/api/src/main/java/top/hcode/entity/UserRecord.java new file mode 100644 index 00000000..d84de0a0 --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/UserRecord.java @@ -0,0 +1,61 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserRecord对象", description="") +public class UserRecord implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "用户id") + private String uid; + + @ApiModelProperty(value = "总做题数") + private Integer total; + + @ApiModelProperty(value = "总提交数") + private Integer submissions; + + @ApiModelProperty(value = "总通过数") + private Integer ac; + + @ApiModelProperty(value = "cf得分") + @TableField("Rating") + private Integer Rating; + + @ApiModelProperty(value = "io制比赛得分") + private Integer score; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/src/main/java/top/hcode/entity/UserRole.java b/hoj/api/src/main/java/top/hcode/entity/UserRole.java new file mode 100644 index 00000000..dc44c77c --- /dev/null +++ b/hoj/api/src/main/java/top/hcode/entity/UserRole.java @@ -0,0 +1,40 @@ +package top.hcode.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * + *

+ * + * @author Himit_ZH + * @since 2020-10-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="UserRole对象", description="") +public class UserRole implements Serializable { + + private static final long serialVersionUID = 1L; + + private String uid; + + private Long roleId; + + @TableField(fill = FieldFill.INSERT) + private Date gmtCreate; + + @TableField(fill = FieldFill.INSERT_UPDATE) + private Date gmtModified; + + +} diff --git a/hoj/api/target/classes/top/hcode/entity/Auth.class b/hoj/api/target/classes/top/hcode/entity/Auth.class new file mode 100644 index 0000000000000000000000000000000000000000..4f62887b3d6a8b94559c1633319e1a16674aeb90 GIT binary patch literal 4529 zcmb7H?Q>jJ8ULNly?gI&?&h`IbW6n)qvVw>h$5R734MWJlEx;D1yQ)k-ezyv>@K@^ zi@`Uf;0sb)1S}w^9cNlU)G0U;P#H(R;EW&rC`^JR^s18~9EVCZ06$T{(X* zN#(Or`o4+hFDGE0dc=TYJa&@^X!thU>EC-PM76BArN!(Bu$;LPukg{U0Tjg zl}pRx0+}QAlIN~C3vSI_EIJdVQrWXTZdnr;n_4QbWEbu7ikmOjvn#8MwA3oadM#@= zaoKsByvaQG(of2d3TWPHh12Mk=#%+*qRG}Kj?N$ERI*n{?g_a%=T%+b*`X=7oUJ`> zFE2aQkPEf!M8%yh=bhqgwOnzk-YU1V{_*;$f4y?{%GuLbFTNp=q<+P%$zTa|2DV?G zyL#!u`|tcpAkLt9b)LC5^xesl=kQD1Y}=kIXD(lT@fZJo_qki&f9JGX2qczQy!}l9@Owc~EFD3IL}(U$%@UtVH$*{m^U zH&AL`!DWd0ro3_`TUa7B>#%sd)$BywE6@pj+3_a%)tLD6f<&7r}KUJh+~G=m)F{YaP->8ck^_ zKx5hA8$-RIa(5Hd(xsS+rAMdjieKTpZF#-&6iasLpbQGdf?X@9CSk`+ z^31bGCa2j*f^xj-)apf#&E%h0A5aHu9|)hs7-+bi90)mR$wkYN)b+?$8sWs)+gKmDGg`eQ377pT&lzzsfkM_&s(r_>C<3%&t z-#RswlTw)&?N^7V;(mONm-1+TGX~U6VOpTW*EK>x?TpllAqx-4J<^evjfE1vXyHLQ zlu_aJ+d6`(PhQ%-iZ8~T|5Un9$g7N5vnv&+#9|!_*L$;(Tl=gF1;e}!-{_Cf4YD4O z-F&!jguq8(Q0nJe;3huCF?@_aObFLEbKS#vkeZ9vYax z>kYTjz?@!h_!JGyb6`ku{tSQabdbY1P0W6jX&<_&X5nzWn=Z=FvzDL_zYXywg%~C{ z#(m`u+(X$?0PM#Bu7oTUj(1aTk$;WY8&rhJyCcc0s0eb~M)E);nUxno);5xFjwG{6 zBgpzj@^B=X^hVm2H&S&jFpr~A9_d@&NcDxl0=^KnQGClAsXh`o7QKYfr=Bh)cT2fP$-NS@P048~ zZ&z}kly^{GLngWmRL>r3_AGBxSjr|Gj8SOoEUxYQ5(bll5f#}TXgmmWO8C_!H@1f@+QW-rH4}rRK20`69 zGh;}Q8Gww883Og@5(M?;l9_}AB?C|*!*De}m(H~ll+Ib1b_ucq5Ty{PFP9>yFV~St zNl-@sN@W;qwUc&<=Wh$$a~Z$$URH5ww$3#?gfB5_Xe?`jzu*x{ z8lT9wU{liBC>%-&oa20)QW9&tNtY?L<6YjT1xgnF z#@EE9l)~R}15QxtAQOC0(}sBs9R`XYV7q}8{x`)3*rCM4|0U9IKC(fD-pN_sE4nNN z8Jh4du0o@36}=f6odJ=d5%Psr+r;i8FG2Q&uJOIvKEHf+b&VHTJZ9I(MHpji_{bwt z-7#A@STMi6~-=yQ!IUM)?W93cu?A64k}{e~mi+lJs?aqlRz(7Yh-c AmH+?% literal 0 HcmV?d00001 diff --git a/hoj/api/target/classes/top/hcode/entity/Comment.class b/hoj/api/target/classes/top/hcode/entity/Comment.class new file mode 100644 index 0000000000000000000000000000000000000000..4eb0ae9d72514ae440a4f33d652ccc7eda4fbf3b GIT binary patch literal 5765 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
j1!N44TW#9n} zOX=54SpOQPi24V?^y&R;yi9TZMT`ijj3XWqElCRaxPnrix}+m0Oq2~Sta zBDG(VTETsMRZ_Ydxw8zE@O1-UlY@&gFZJ3^RpSe^c`Ck^#=O_E^Q62W8K5;gYv*|_ z4b&f`>QzwlvnXS%&?0>0;MHADi}Cz0Sk0fnC!k{`)}o8@C;8%U!aDv~Jg$4WPI2y| zroTkxfQ>tl;fi(juq>^QYvKH9{)oGq0G9h!!)Iw=3*2hBhX%HVZ-{dqsiZt+<~nAsdO~V)F0M^qVE* z&OkC-E`Z#;l)N^O%>E1@hnAAp1(Mmy0c33{xhIg!&JQ4mmy-Jf$vh$f7>@*PEz+LSDXp zM9;CZ@|aIvM)cu}h^1QQVf4-;K95AIRmn*yFH>@gQ|dM)w@G=qlG~-cLdhKxpH}ip zDc??c9;}8G&Mq!W;m@$O!$4I<`7S7>2Mt=Wkv`}nR+@R zLAno$r1d&bn;9jj&5Wg^5)|`6(R8d1)NZyA)NUH-76~$Z5T!a$hZ!fR!%U>(5|r>k z@pPgNw9;%PXr-Az@`*N4i~V8QUpbu#}p+UCvgJPl%jYM&%mJ+ z!#wt3FQpb-A#)!k1ApW5bClxvJMO~_r3Cw}6M0IlB8=Nnpp?Wc_wW!pBKp6Oh~V*? zXy?=TUl%v2^~C7^D{@=>giu|@S0n!#=fgDFPBL>%w`5LTcUmQL%!S1m<88llr6?l7@81x9GAhl__Ovo{1glk@U1y zF}0at&lIkj*r$rsZbm#4ThwPoDy9xo_e^@##Ku*um1fj4v1ff&)HAILZk|1AbAAe% z@h{9ZvG+;FfGkki9)3Rl8WWfDu4cC!ga73a;eq_M;3!? z_yB`X(Ql#DSiv@*7!4xUxF2cu>9LQX*F5|;1f8&G2fcoO%KI2ivYg+ejvtwa@cj}F F{|DJk1C{^) literal 0 HcmV?d00001 diff --git a/hoj/api/target/classes/top/hcode/entity/ContestExplanation.class b/hoj/api/target/classes/top/hcode/entity/ContestExplanation.class new file mode 100644 index 0000000000000000000000000000000000000000..e5dfdba6080037fcb9a870fac43fe258132285fc GIT binary patch literal 4520 zcmb7H+jAS$8UL-ct6j+}--7KZq%EKX~9Ma;j{@T!AMo*Lw2s{7&&L!$d*inE{lJXgpidXY3zt`%t&U9+-!2p z&dm-;NE|5T9Bba3wu;tF)*Q^`Y{zi8Wl=)^SlXUX&KUN*m9b07`Gpx;iur7*m^3Q5 z#WXpq7llvru)56nmNsO&E{!Tar%k{W>%(9ck zkSo<95c(?l0JRv*0Xn&)v&s&Mkj(V)ezv&u^Yu{=?$GF5UR&C)Zc5 zo?pFoarxB6M5$JM39Th}k&`tZ`NvnQ9&U06B&+UkkleSY(_1T}5v95d%g zXkR|LxcuR#T`T9WuDtrvyiqusv5)7vB}8ZEouPthI6Sr=uV?XqwBA>LFVypsFrD;TY+o z<3`>sTi&I-Jn47Z$c>0FP@FT0b6(}M4Mus&{Rc+J*&Pz)NWmdq%m_J(Jw& zoo`^9}MVf+8O(%3|sH?o(ne!BY6C3bqo zET#)qUR>J}pko&v(Qyy%)zL48`;pY~bum1MhjgUy5S^*M1YU9ME?L=($Z-3{4|Q1? zZukx^>KMYXkltl{`nEA5)Q@1;T`@3R?ZIObVzhbrq~>v<(fhVl!bIID_*gZ%x^lFr z{hrWD-8!ZOWk(ⅈg4sfsSc090gO_Ts@apySz_a6(5ZW_sO)L6E_(>Hu8Bh$3pI} z?S)DUSNB;HA7)|=zT7)CH_BQ(w(|kM3lhExmC`n@CEU$NIfNbjVV1bQkLy;>UDR|J zsq8V)i$1QHKo`p#`nU$p5AcV$uMxn!ZZv#@2Ikr~#5sSHKM$Mu7IxCa3J5X{poMA{ z564IORk1Pa2};k$kUnzV_%_FgtK5w5P}V&F2C*-#y+C7M$EQ0;&ldv~)>cp6B;-3hxlLf&J-I{3n<+0L5nKjd&mOGwEH6*bpO8#{n&{8%-kuMj z$X9y*ge~tt318{`Besn9(X%_G@8G3(0Uc%NgqA8^i(v*rM z6oH9+hStl7CzM2_2Go*L32I4c2~~hJAEYL<8qlUxl%P$iSRyJwF&`97FkF?-wWS&e zYD?*f1_9E25TzPWM=DNGN2)Oq7obKT6i+bN-cIrrocZ&3U-2X*nR&j3A5l`+URUvBN)cpn7Ee)9QNSyBnv#Zde7g)v zQM?5cGn8Uj;!B#Q)PS4xAVW#V-}!i$l;ZdY?!;kAjhLmsV`x*g+h|lV_XXNjSp2U^ zUtqH*M*lC7e)CQBD|9Dkajz(%6hvrhZ*ea)-mRikLZdJsA~ceCkiBg}kCPWA`-A3z zUGgJt`D|?-m}Bv1&ApeQ_AlWpPYZohN*0EM>{~QZQl6&|G ziitJmvD#9qYhro%EVXRvNNKJ~tC(1HWNi&DfhWBa_~#7ceas`r^C`Fln^K5Ldlz}0 zJN+G8ZBWX9GDcpj@?nu0SQWWm>x0#`;3_`A;8U~>lqxIO<`bhq#47i{nn`DrkGWNN W-2I)Ynel&?I{q%Sfai+%$$tRaudNgS literal 0 HcmV?d00001 diff --git a/hoj/api/target/classes/top/hcode/entity/ContestProblem.class b/hoj/api/target/classes/top/hcode/entity/ContestProblem.class new file mode 100644 index 0000000000000000000000000000000000000000..a40da4da6906f7b639fd9de23d36332406af2e17 GIT binary patch literal 4960 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 literal 0 HcmV?d00001 diff --git a/hoj/api/target/classes/top/hcode/entity/ContestRegister.class b/hoj/api/target/classes/top/hcode/entity/ContestRegister.class new file mode 100644 index 0000000000000000000000000000000000000000..f26e14b3ed165ed895b4b0c1f931b9c7dfa797f9 GIT binary patch literal 4579 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 TID+!{bLjB9-sk9y9R1?I9#@5y literal 0 HcmV?d00001 diff --git a/hoj/api/target/classes/top/hcode/entity/ProblemCount.class b/hoj/api/target/classes/top/hcode/entity/ProblemCount.class new file mode 100644 index 0000000000000000000000000000000000000000..7187ecb13d8b1450ca90ad665bd29ad9269c8111 GIT binary patch literal 7635 zcmc&(dwg6)6+V-F-E4L@@5fC-Ny}36D%%2z-cqEb1p`TmNoXx9bh}xSh0Si*-B62f z5kvt2DU^Z=MWmvE@(j>cUJ59_6;MGDl(s28@csBH*6+;BKC-zq%U|}Fo%!aR@0>ex z=FFM9+o%7#>tP}~mj3CbW9ad63eh*X`6f3{aPuTLPjT}tZobXU)7*TAo9}Y-J#N0w z%?~{ELoZd*;|BeR`yYED{0XCH40@Ia&l&Vn?tf;`&$)lzpclCRg+agM{zZd+#r;bL zz0Ccu4f+lDuNbtK`+WxO=YGbZ1KhuA&~Lf_ok73n=lsD#ukrYgyq-UC^JfqJ#Y2A; zRF#gVV&VAOXeu2`CeG+xB}kkq$lsGpq%+|}W^Fh=8Fe8V{7(pSOvFZD)pu_Af^aAv zPK<{7l8Mpfg3Q6mL?$*KT^mcsHpZhX6NzLdoPp1@pe22gQ!uG?Xyrt#KRFVO52TV4(NtzL%zXQA z-*sT?eKXS+AJ}#k9AwymZ{ODG0%2K-WiyXlHM9Nl16#Ju?A(dR@nU@YZr-zZ&y_h@ zgk}5pTsO1x>YQv-m}Pft*|+`DoGdMQ_wL@m`=+eSm5wC&F)asfxqknRckaFPl6}|S z_1d1x5A42v=FVGRd2rXVrArZx(eX@ADjLp!srPL%6N`sdL4w6BEh)HiZ%&Ry8CpF!ET{r=LR4et#G=S1zY?E)#=xqT!>d6%K9-1OPC#Va zJJ#ZHJ&3=c%Dz}4x@K~GV>BgaBdDe?8A0lXk-*3tEp%qaVo15e`!dOi&{zbfp(qkF zvpIwv1Z})0iA3eej7Bp9oXj=t9R=B;)7gM_SmjRrEPXzET%fE(08^k5qB#F_c_FDU_v1yOCIVmjy}wYcm5^(U7BW;q zE;3rkPzkxpXdy!-6t0|CFWhwbBsm_t|GXGE}967H) zJRy%T?kZePm_;Oa}@;1*`D!AU|90P;xRAiK3*zqPnoC z9K~rOXyJTU3G%L{&~ER}hi2~Hj;c5kO-E9(3BEN2k&n)zvwdXIavz;UJw95+&1!Dm z#m%YQ^l`I>n*nYHxf$kWEv@s>`)Hk@#(egwygz9&79Zi!r9S!; zH(#Z%;daaiN*!~Q4JpE_!H|4Sie1Pz4Hh1rn208DcPuF^8@j3#-X^mGj(wlS&z6~j z@-mxG3-Qu+3<)_Y zjqH&+nqPtbWPHFs1w^FNTtzPwNU^z!)1W}w%~kY6fmEEUI2{V4=Um0Rp+L&cRSZFa zG@h$C0}7#yI#k#-3v1qil^)C~S<4V&i4D#waW{#^uGv$J!dB5ZM@e zi;a)7HAdmGF|H^!wrq`2ZM+;O zp$zB2)7f=Dm30=It8>+$DEeH1tjn07P4odfM~;#malPYnz1iN8vt&nHFxk_}B~K_9kvWR&bk-2j3`2{sf<9^QC{VH^bw3Jz zJ<>CJ4(E}t!l~UUxwy{oQ!XQaR*hufcO{7_l)M=R@bz04)$)sjYGEL-Pj?`_nfYfcZnk`If)ua{^ ziK$4=DWtih;9bq+`%DB?YGf}YagaVupF!f(i&yC~y!@3>P`p5wL*}4P@hn{d|r#lAiAu_5>_rz_e!(DQ4E zi;p?)dExuH+;dVdA+GG6V;3*OD*4LC7eVF5H3hpW)-{+NwOOT4Z^p%9~T6!YHetRUuU!~+yMbJ^UU=yqAUA#$c#ZA_^5CF8L-zq0*yx9FZ1`Y4 zfrBy)a`LI1|P_=7+`(LnuR;$VtpbTsV(3Wz>xq}@Q3d@LLnQS(6voH!Oj z;3(j~Ne*I4`EeNw>dBQQWI4{+B29A_(DKY;sU~}7lk=spUgU^ zEY78{we!l-oabl$CJgi=s!D!D{wZ(H1`k3p*dr_b*X8eFRVWh=Lx$hC9-&9m^w|FZ DKUoN+ literal 0 HcmV?d00001 diff --git a/hoj/api/target/classes/top/hcode/entity/Role.class b/hoj/api/target/classes/top/hcode/entity/Role.class new file mode 100644 index 0000000000000000000000000000000000000000..acfddb6f0a3db0db80c1f6df29ca2e9e4f2c43f2 GIT binary patch literal 4566 zcmb7H+jAS$8UL-U)vn}~uPBZ}N*(GJU!x?YrInME5IZ2Slhk%hptNBvZ|qHENl2?u z(<{&mP^c+QNy@FI?T|iX2z0;{!j$%f&h)WQo#|6&NH9{&@Gc|CPA@!9Wu z-|zSBcROe8zy0T(KLNNIzlq@nJRHR~JR+7y#qtBO{7@`E63dS@JQjnFhjlzIo=?Q6 z{E3jB)bW(q{8Yz^cs{M;XX5#cj-QL?SslL+&u4X<6ZrEQeku0PiI+YvmKQXs@7PP$tX;O}a@K)-zTlV+U6vJ$Ok@j7sX4Q-WX~5WsioyPTFS*-rJOQr zxYUeEUS^)Y)HC9x3c}8Ek&od`(KGWiM3WuOjGegq$kbiqQ}j?Oy$B&KolwoJlW*K`XoI)|Rm?br3aju-@)D%0( znA8Q!$uNkn{sCX9y&=?S6gUOfHJEEXZzEvL-@zyq(_Zfq4V-%S3}SAt_o((}f0u+~ zV(LXw%QDV^{^l?THq1>UM}|M-XL-?Y%xfdBF)J#nSq=MLRg>D-mqDs8*=qRpTsNkQ zFdAy0I|Ug#hr)WGV&>S{gg=}kbEmAVGdgfDFP%c;G4)Jrc)?k;N(wYF8GYjR(Or!z zMqQ;mkNjSlz9e5shgByXkR-dft!9mWxt>dT(mqe80;82Fm- zkqEqG3>5Ko1NVvL0Wi{zdJb|bdA+zQem|z&uc!TxxWd>evskq99MKW~l-JI0-A_X; zSlI@A^;GySjz&Co@LPTZ6nq*QrC#n8+{o{92%q5(JHq`<+;{QWPt8D?%0UZ580L=6 z^6agAruakqE*jXt^@cq(u&L_}U!Z}F_6%FN^IUxiU#2o`VHA6*cvLOK&$06<%F*{rv$!{R^S`&FkAeloJKyGO! z_XUzUivi?tGx?@KGUqmctTvMe1IZll0CJ?6yfcu@a}Yq*n#p?t$zR2kM;>K+LoBj3 zIP@k$gUxi=EHN2`c+C=$98d+*mn%H0BUos<(o-Xi55A#bI;ie&H@$TNGqc4m3M%6LLy#?#Jtt_=;o0yTVb z=r7pz9MqPJLx0A$$zeuzy}K159vCzg zBwGc@@IaJ&pq_M`pq_MFGA=-E9w?qkslX-aYY3)j=r3AAB}@lGJ2>DSPvA^$P9XejW%u6&HG zQjGpzBID*~*PBrB{ScRiDn>z+CbX_J@>Wr6rBPWBQ5r>jv!$ER9ppvHex+k{Z+M?O zKHED+7dbq7$Iu06Bdhq-{X*ZK4husv>{)a%Qqt6!R$UXP$tCGYwQA~4M_f~+X5x%V zRwAvrCXScK(yFGOwCw&dKa2+3D@F@B^N}UyK^N7(PVx7C8nRHh9+wK&8$Njac SgZ2L|b^NvId)QsZ_x}sW%&kBG literal 0 HcmV?d00001 diff --git a/hoj/api/target/classes/top/hcode/entity/RoleAuth.class b/hoj/api/target/classes/top/hcode/entity/RoleAuth.class new file mode 100644 index 0000000000000000000000000000000000000000..879535a5ffd5a54118dd7d31d3896bf67a5403a8 GIT binary patch literal 3275 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 sxm_DM8@(=kQd*8fa<^jV$Xyxj3=!q0up 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 literal 0 HcmV?d00001 diff --git a/hoj/api/target/classes/top/hcode/entity/UserRecord.class b/hoj/api/target/classes/top/hcode/entity/UserRecord.class new file mode 100644 index 0000000000000000000000000000000000000000..d57f770a576fd62b9e261ef42ffbdac951908908 GIT binary patch literal 5955 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 PF@Hea6%SWodRY7)g8PQb literal 0 HcmV?d00001 diff --git a/hoj/hoj.iml b/hoj/hoj.iml new file mode 100644 index 00000000..78b2cc53 --- /dev/null +++ b/hoj/hoj.iml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/hoj/pom.xml b/hoj/pom.xml new file mode 100644 index 00000000..ff6f9f47 --- /dev/null +++ b/hoj/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + + top.hcode + hoj + 1.0-SNAPSHOT + + DataBackup + api + + pom + + + + UTF-8 + 1.8 + 1.8 + 4.12 + 1.16.10 + 1.2.17 + 8.0.19 + 1.1.20 + 2.1.1 + + + + + + org.springframework.cloud + spring-cloud-dependencies + Hoxton.SR1 + pom + import + + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + 2.2.0.RELEASE + pom + import + + + + org.springframework.boot + spring-boot-dependencies + 2.2.6.RELEASE + pom + import + + + + mysql + mysql-connector-java + ${mysql.version} + + + com.alibaba + druid + ${druid.version} + + + + com.baomidou + mybatis-plus-boot-starter + 3.2.0 + + + org.crazycake + shiro-redis-spring-boot-starter + 3.2.1 + + + + log4j + log4j + ${log4j.version} + + + ch.qos.logback + logback-core + 1.2.3 + + + + junit + junit + ${junit.version} + + + + org.projectlombok + lombok + ${lombok.version} + + + + \ No newline at end of file diff --git a/hoj开发文档.md b/hoj开发文档.md new file mode 100644 index 00000000..bc493c16 --- /dev/null +++ b/hoj开发文档.md @@ -0,0 +1,496 @@ +[TOC] + +# 一、介绍 + +基于前后端分离,分布式架构的在线测评平台(hoj)....待续 + +> 开发记录 + +| 时间 | 更新内容 | 更新者 | +| ---------- | ------------------------------------------ | -------- | +| 2020-10-26 | 数据库设计,登录和注册接口,文档记录开始。 | Himit_ZH | + +# 二、系统架构 + +> 总概五大系统 + +1. 前端vue页面显示系统(电脑端,手机端) + +2. 数据交互后台系统 + +3. 判题后台系统 + +4. 判题机系统 + +5. 爬虫系统 + +> 概述 + +前端使用element UI + +后端主要逻辑: + +1. 前端提交数据。 +2. 后端数据交互后台微服务,将提交写入数据库,使用springcloud alibaba通过nacos注册中心调用判题后台系统微服务。 +3. 判题后台系统微服务,使用RabbitMQ告知判题机系统(传递submitId集合) 。 +4. 判题机系统启用多台判题机(多个进程,有限,防宕机)进行测评,最后将结果更新到数据库。 +5. 爬虫系统负责爬取用户相关的codeforces的积分,vjudge的做题数等。 + +# 三、数据库 + +## 用户资料模块 + +user_info表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | -------------------- | +| userId | String | 主键 | uuid | +| username | String | | 登录账号 | +| password | String | | 登录密码 | +| nickname | String | | 用户昵称 | +| school | String | | 学校 | +| course | String | | 专业 | +| number | String | | 学号 | +| classes | String | | 班级 | +| realname | String | | 真实名字 | +| email | Srting | | 邮箱 | +| avatar | String | | 头像图片地址 | +| signature | String | | 个性签名 | +| cf_name | String | | codeforces的username | +| Status | int | | 0可用,1不可用 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +role 角色表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | -------------------------- | +| id | long | 主键 | auto_increment | +| role | String | | “admin”,”tourist”,“user” | +| description | String | | 角色描述 | +| Status | int | | 是否可用,0可用 1不可用 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +user_role表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | -------------- | +| id | long | 主键 | auto_increment | +| userId | String | 外键 | 用户id | +| role_id | int | 外键 | 角色id | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + + auth权限表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | ------------------------------------------------------------ | +| id | long | 主键 | auto_increment | +| name | String | | 权限名称,“superadmin”,”contest”,“admin”,”common” 普通用户默认为“common” | +| permission | String | | 权限字符串,例如“contest:1001”,发布某场比赛。 “all”,”select”,”update”等等, | +| status | int | | 0可用,1不可用 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +role_auth表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | -------------- | +| id | long | 主键 | auto_increment | +| role_id | int | | 角色id | +| auth_id | int | | 权限id | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + + user_record表 个人做题记录表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ----------- | ---------------------------- | +| id | long | primary key | auto_increment | +| userId | String | 外键 | 用户id | +| total | int | | 总做题数 | +| submissions | int | | 总提交数 | +| accept | int | | 通过数 | +| Rating | int | | Cf得分,未参加过默认为1500 | +| score | int | | IO制比赛得分,比赛ac一题得100 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +user_acproblem表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------ | ------------ | ----------- | -------------- | +| id | long | primary key | auto_increment | +| userId | String | 外键 | 用户id | +| Pid | int | 外键 | Ac的题目id | + + + + + +## 题目详情模块 + + + +problem表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ----------- | ------------------------------------------- | +| id | long | primary key | auto_increment 1000开始 | +| title | String | | 题目 | +| author | String | | 默认可为无 | +| timeLimit | int | | 时间限制(ms),默认为c/c++限制,其它语言为2倍 | +| memoryLimit | int | | 空间限制(k),默认为c/c++限制,其它语言为2倍 | +| description | String | | 内容描述 | +| Input | String | | 输入描述 | +| Output | String | | 输出描述 | +| sampleInput | Srting | | 输入样例,多样例用(#)隔开 | +| sampleOutput | String | | 输出样例 | +| source | int | | 题目来源(比赛id),默认为hoj,可能为爬虫vj | +| comment | String | | 备注 | +| auth | int | | 默认为1公开,2为私有,3为比赛中。 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +problem_count表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | ------------------- | +| pid | int | | 题目id | +| total | int | | 总提交数 | +| Ac | int | | 通过数 | +| Mle | int | | 空间超限 | +| Tle | int | | 时间超限 | +| Re | int | | 运行错误 | +| pe | int | | 格式错误 | +| ce | int | | 编译错误 | +| wa | int | | 答案错误 | +| Se | int | | 系统错误 | +| score | int | | 题目分数,默认为100 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + + + + + +## 提交评测模块 + +> 判题结果status + +STATUS_ACCPET = 0 + +STATUS__WRONG_ANSWER = -1 + +STATUS__CPU_TIME_LIMIT_EXCEEDED = 1 + +STATUS__REAL_TIME_LIMIT_EXCEEDED = 2 + +STATUS__MEMORY_LIMIT_EXCEEDED = 3 + +STATUS__RUNTIME_ERROR = 4 + +STATUS__SYSTEM_ERROR = 5 + + + +judge表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ----------- | ---------------------------------- | +| submitId | long | primary key | auto_increment | +| problemId | long | 外键 | 题目id | +| userId | String | 外键 | 提交用户的id | +| submitTime | datetime | | 提交时间 | +| status | String | | 判题结果 | +| auth | int | | 0为代码全部人可见,1为仅自己可见。 | +| errorMessage | String | | 错误提醒(编译错误,或者vj提醒) | +| Time | int | | 运行时间 | +| memory | int | | 所耗内存 | +| length | int | | 代码长度 | +| code | String | | 代码 | +| language | String | | 代码语言 | +| cpid | int | | 比赛中的题目编号id | +| Judger | String | | 判题机ip | +| Ip | String | | 提交者ip | +| cid | int | | 题目来源的比赛id,默认为0 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +jugdeCase表 评测单个样例结果表 + + + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | ------------------------ | +| submitId | long | 外键 | 提交id | +| problemId | String | 外键 | 题目id | +| userId | String | 外键 | 提交用户的id | +| Status | String | | 单个样例评测结果 | +| Time | int | | 运行时间 | +| memory | int | | 运行内存 | +| Case_id | String | | 测试样例id | +| inputData | String | | 样例输入,比赛不可看 | +| OutputData | String | | 样例输出,比赛不可看 | +| Useroutput | Srting | | 用户样例输出,比赛不可看 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + + + + + +## 比赛模块 + + + +contest表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ----------- | ------------------------------------------- | +| id | long | primary key | auto_increment 1000起步 | +| userId | String | 外键 | 创建者id | +| title | String | | 比赛标题 | +| type | int | | Acm赛制或者Rating | +| Source | int | | 比赛来源,原创为0,克隆赛为比赛id | +| Auth | int | | 0为公开赛,1为私有赛(有密码),2为报名赛。 | +| pwd | string | | 比赛密码 | +| startTime | datetime | | 开始时间 | +| endTime | datetime | | 结束时间 | +| duration | int | | 比赛时长(分) | +| explain | Srting | | 比赛说明 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + + + +contest_problem表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ----------- | ---------------------- | +| id | long | primary key | auto_increment | +| ContestId | int | 外键 | 比赛id | +| Pid | int | 外键 | 题目id | +| CpName | String | | 用于当场比赛的题目标题 | +| cpNum | String | | 比赛题目的顺序id | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +contest_register表 比赛报名表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | -------------------------- | +| id | long | 主键 | auto_increment | +| ContestId | int | 外键 | 比赛id | +| Userid | int | 外键 | 用户id | +| Status | int | | 默认为0表示正常,1为失效。 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +contest_score表 rating赛制中获得的分数更改记录表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | ----------------- | +| id | long | 主键 | auto_increment | +| ContestId | int | 外键 | 比赛id | +| Last | int | | 比赛前的score得分 | +| Change | int | | Score比分变化 | +| Now | int | | 现在的score | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +contest_record表 比赛记录表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | -------------------------------------- | +| id | long | 主键 | auto_increment | +| ContestId | int | 外键 | 比赛id | +| userId | String | 外键 | 用户id | +| problemId | int | | 题目id | +| Cpid | int | 外键 | 比赛中的题目顺序id | +| submitId | int | 外键 | 提交id,用于可重判 | +| status | String | | 提交结果,0不加罚时,-1加罚时,1表示AC | +| time | datetime | | 提交时间 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +contest_announcement表 比赛时的通知表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | ---------------------------------------------- | +| id | long | 主键 | auto_increment | +| ContestId | int | 外键 | 比赛id | +| Title | String | 外键 | 通知标题 | +| content | String | | 内容 | +| uid | String | 外键 | 发布者id(必须为比赛创建者或者超级管理员才能) | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +contest_explanation表 赛后题解表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | -------------------------------------------- | +| id | long | 主键 | auto_increment | +| ContestId | int | 外键 | 比赛id | +| content | String | | 内容(支持markdown) | +| userid | int | | 发布者(必须为比赛创建者或者超级管理员才能) | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + + + +## 讨论模块 + +> 包括平时与比赛 + + + +comment表,只存储发布者相关题目内容,评论内容采用learncloud + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | ---------------- | +| id | long | 主键 | auto_increment | +| userid | int | 外键 | 发布讨论的用户id | +| title | String | 外键 | 讨论标题 | +| content | String | | 讨论详情 | +| tagid | String | 外键 | 讨论标签id | +| pid | int | 外键 | 引用的题目id | +| cid | int | 外键 | 引用的比赛id | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +comment_tag表 讨论标签表 + +| 列名 | 实体属性类型 | 键 | 备注 | +| ------------ | ------------ | ---- | -------------- | +| id | long | 主键 | auto_increment | +| Name | String | | 标签名字 | +| Color | String | | 标签颜色 | +| gmt_create | datetime | | 创建时间 | +| gmt_modified | datetime | | 修改时间 | + + + +# 四、后端数据接口 + +> 后端返回数据的状态码说明 + +``` +STATUS_SUCCESS = 200; // 成功 +STATUS_FAIL = 400; // 失败 +STATUS_ERROR = 500; // 系统出错 +STATUS_ACCESS_DENIED = 401;// 无权限 +``` + +##1. 注册接口 + +###1.1 请求地址 + +> /register + +###1.2 请求方式 + +> POST + +###1.3 请求参数 + +> 格式:json + +| 字段名 | 实体属性类型 | 说明 | 能否为空 | +| -------- | ------------ | ------ | -------- | +| username | String | 账号 | 不能 | +| password | String | 密码 | 不能 | +| nickname | String | 昵称 | 不能 | +| email | String | 邮箱 | 不能 | +| number | String | 学号 | 不能 | +| code | String | 验证码 | 不能 | + +###1.4 返回数据 + +> 格式:json + +| 字段名 | 实体属性类型 | 说明 | +| ------ | ------------ | ------------------------ | +| status | int | 状态码,详情见状态码说明 | +| data | json | 后台查询数据存储于这 | +| msg | String | 消息 | + +##2. 注册接口 + +###2.1 请求地址 + +> /login + +###2.2 请求方式 + +> POST + +###2.3 请求参数 + +> 格式:json + +| 字段名 | 实体属性类型 | 说明 | 能否为空 | +| -------- | ------------ | ---- | -------- | +| username | String | 账号 | 不能 | +| password | String | 密码 | 不能 | + +###2.4 返回数据 + +> 格式:json + +| 字段名 | 实体属性类型 | 说明 | +| ------ | ------------ | ------------------------ | +| status | int | 状态码,详情见状态码说明 | +| data | json | 后台查询数据存储于这 | +| msg | String | 消息 | + + + +data数据 + +| 字段名 | 实体属性类型 | 说明 | +| -------- | ------------ | -------- | +| uid | String | 用户id | +| username | String | 账号 | +| nickname | String | 昵称 | +| avatar | String | 头像地址 | +| email | String | 邮箱 | + +### \ No newline at end of file