From 9a63a4524a90278c8520a75a30b44e10ae9ec6ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=9C=E7=81=AC=E7=9E=AC?= <2431038086@qq.com> Date: Sat, 24 Jun 2023 15:25:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=9D=E8=AF=81=E6=B6=88=E6=81=AF=E8=83=BD?= =?UTF-8?q?=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- a-rabbitMQ/business/pom.xml | 7 + .../shun/business/config/RabbitMQConfig.java | 57 ++ .../business/listener/BusinessListener.java | 28 + .../src/main/resources/application.yml | 12 +- a-rabbitMQ/integral/pom.xml | 7 + .../shun/integral/config/RabbitMQConfig.java | 57 ++ .../integral/listener/IntegralListener.java | 28 + .../src/main/resources/application.yml | 12 +- .../config/RabbitTemplateConfig.java | 93 +++ .../contoller/PlaceOrderController.java | 27 +- .../com/shun/placeOrder/util/GlobalCache.java | 25 + .../src/main/resources/application.yml | 6 +- tianji-master/Dockerfile | 11 - tianji-master/pom.xml | 195 ----- tianji-master/startup.sh | 74 -- tianji-master/tj-api/pom.xml | 48 -- .../api/annotations/EnableCategoryCache.java | 4 - .../com/tianji/api/cache/CategoryCache.java | 92 --- .../java/com/tianji/api/cache/RoleCache.java | 36 - .../tianji/api/client/auth/AuthClient.java | 18 - .../api/client/course/CatalogueClient.java | 23 - .../api/client/course/CategoryClient.java | 18 - .../api/client/course/CourseClient.java | 68 -- .../api/client/course/SubjectClient.java | 15 - .../tianji/api/client/exam/ExamClient.java | 36 - .../api/client/learning/LearningClient.java | 36 - .../fallback/LearningClientFallback.java | 31 - .../api/client/remark/RemarkClient.java | 14 - .../remark/fallback/RemarkClientFallback.java | 24 - .../api/client/search/SearchClient.java | 15 - .../tianji/api/client/trade/TradeClient.java | 46 -- .../trade/fallback/TradeClientFallback.java | 41 - .../tianji/api/client/user/UserClient.java | 57 -- .../user/fallback/UserClientFallback.java | 45 -- .../api/config/CategoryCacheConfig.java | 33 - .../com/tianji/api/config/FallbackConfig.java | 31 - .../config/RequestIdRelayConfiguration.java | 22 - .../tianji/api/config/RoleCacheConfig.java | 31 - .../tianji/api/constants/CourseStatus.java | 34 - .../tianji/api/constants/SmsConstants.java | 5 - .../java/com/tianji/api/dto/IdAndNumDTO.java | 27 - .../java/com/tianji/api/dto/auth/RoleDTO.java | 44 -- .../api/dto/course/CataSimpleInfoDTO.java | 19 - .../tianji/api/dto/course/CatalogueDTO.java | 41 - .../api/dto/course/CategoryBasicDTO.java | 16 - .../tianji/api/dto/course/CategoryDTO.java | 40 - .../com/tianji/api/dto/course/CourseDTO.java | 56 -- .../api/dto/course/CourseFullInfoDTO.java | 49 -- .../api/dto/course/CoursePurchaseInfoDTO.java | 26 - .../api/dto/course/CourseSearchDTO.java | 49 -- .../api/dto/course/CourseSimpleInfoDTO.java | 45 -- .../tianji/api/dto/course/MediaQuoteDTO.java | 24 - .../tianji/api/dto/course/SectionInfoDTO.java | 22 - .../api/dto/course/SubNumAndCourseNumDTO.java | 28 - .../com/tianji/api/dto/course/SubjectDTO.java | 47 -- .../tianji/api/dto/exam/QuestionBizDTO.java | 23 - .../com/tianji/api/dto/exam/QuestionDTO.java | 40 - .../api/dto/leanring/LearningLessonDTO.java | 18 - .../api/dto/leanring/LearningRecordDTO.java | 16 - .../dto/leanring/LearningRecordFormDTO.java | 30 - .../api/dto/promotion/CouponDiscountDTO.java | 22 - .../api/dto/promotion/OrderCouponDTO.java | 17 - .../api/dto/promotion/OrderCourseDTO.java | 16 - .../tianji/api/dto/remark/LikedTimesDTO.java | 13 - .../com/tianji/api/dto/sms/SmsInfoDTO.java | 14 - .../tianji/api/dto/trade/OrderBasicDTO.java | 28 - .../com/tianji/api/dto/user/LoginFormDTO.java | 24 - .../java/com/tianji/api/dto/user/UserDTO.java | 53 -- .../main/resources/META-INF/spring.factories | 5 - tianji-master/tj-auth/pom.xml | 26 - tianji-master/tj-auth/tj-auth-common/pom.xml | 26 - .../auth/common/constants/AuthErrorInfo.java | 27 - .../auth/common/constants/JwtConstants.java | 29 - .../auth/common/domain/PrivilegeRoleDTO.java | 13 - .../tj-auth/tj-auth-gateway-sdk/pom.xml | 34 - .../gateway/config/AuthAutoConfiguration.java | 24 - .../tianji/authsdk/gateway/util/AuthUtil.java | 176 ----- .../authsdk/gateway/util/JwtSignerHolder.java | 110 --- .../spring-configuration-metadata.json | 19 - .../main/resources/META-INF/spring.factories | 2 - .../tj-auth/tj-auth-resource-sdk/pom.xml | 41 - .../FeignRelayUserAutoConfiguration.java | 17 - .../config/ResourceAuthProperties.java | 14 - .../ResourceInterceptorConfiguration.java | 52 -- .../FeignRelayUserInterceptor.java | 17 - .../interceptors/LoginAuthInterceptor.java | 27 - .../interceptors/UserInfoInterceptor.java | 38 - .../spring-configuration-metadata.json | 31 - .../main/resources/META-INF/spring.factories | 3 - tianji-master/tj-auth/tj-auth-service/pom.xml | 92 --- .../java/com/tianji/auth/AuthApplication.java | 41 - .../com/tianji/auth/config/AuthConfig.java | 41 - .../tianji/auth/constants/AuthConstants.java | 6 - .../auth/controller/AccountController.java | 47 -- .../tianji/auth/controller/JwkController.java | 30 - .../auth/controller/MenuController.java | 152 ---- .../auth/controller/PrivilegeController.java | 192 ----- .../auth/controller/RoleController.java | 99 --- .../com/tianji/auth/domain/dto/MenuDTO.java | 27 - .../tianji/auth/domain/dto/PrivilegeDTO.java | 32 - .../tianji/auth/domain/po/AccountRole.java | 41 - .../tianji/auth/domain/po/LoginRecord.java | 72 -- .../java/com/tianji/auth/domain/po/Menu.java | 119 --- .../com/tianji/auth/domain/po/Privilege.java | 116 --- .../java/com/tianji/auth/domain/po/Role.java | 111 --- .../com/tianji/auth/domain/po/RoleMenu.java | 47 -- .../tianji/auth/domain/po/RolePrivilege.java | 48 -- .../tianji/auth/domain/vo/LoginRecordVO.java | 39 - .../tianji/auth/domain/vo/MenuOptionVO.java | 45 -- .../auth/domain/vo/PrivilegeOptionVO.java | 30 - .../tianji/auth/mapper/AccountRoleMapper.java | 16 - .../tianji/auth/mapper/LoginRecordMapper.java | 16 - .../com/tianji/auth/mapper/MenuMapper.java | 20 - .../tianji/auth/mapper/PrivilegeMapper.java | 20 - .../com/tianji/auth/mapper/RoleMapper.java | 16 - .../tianji/auth/mapper/RoleMenuMapper.java | 16 - .../auth/mapper/RolePrivilegeMapper.java | 16 - .../auth/service/IAccountRoleService.java | 16 - .../tianji/auth/service/IAccountService.java | 20 - .../auth/service/ILoginRecordService.java | 19 - .../com/tianji/auth/service/IMenuService.java | 27 - .../auth/service/IPrivilegeService.java | 35 - .../tianji/auth/service/IRoleMenuService.java | 21 - .../auth/service/IRolePrivilegeService.java | 23 - .../com/tianji/auth/service/IRoleService.java | 22 - .../service/impl/AccountRoleServiceImpl.java | 20 - .../auth/service/impl/AccountServiceImpl.java | 90 --- .../service/impl/LoginRecordServiceImpl.java | 62 -- .../auth/service/impl/MenuServiceImpl.java | 137 ---- .../service/impl/PrivilegeServiceImpl.java | 159 ---- .../service/impl/RoleMenuServiceImpl.java | 37 - .../impl/RolePrivilegeServiceImpl.java | 42 - .../auth/service/impl/RoleServiceImpl.java | 55 -- .../tianji/auth/task/LoadPrivilegeRunner.java | 39 - .../java/com/tianji/auth/util/JwtTool.java | 138 ---- .../com/tianji/auth/util/PrivilegeCache.java | 96 --- .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../src/main/resources/bootstrap.yml | 47 -- .../resources/mapper/AccountRoleMapper.xml | 12 - .../mapper/IPointsBoardSeasonService.xml | 22 - .../resources/mapper/LoginRecordMapper.xml | 16 - .../src/main/resources/mapper/MenuMapper.xml | 23 - .../main/resources/mapper/RedisConstants.xml | 12 - .../resources/mapper/RolePrivilegeMapper.xml | 12 - .../main/resources/mapper/StatusEnumValid.xml | 15 - .../src/main/resources/tjxt.jks | Bin 2709 -> 0 bytes .../tj-auth/tj-auth-service/tjxt.jks | Bin 2709 -> 0 bytes tianji-master/tj-common/pom.xml | 92 --- .../mq/BasicIdMessageProcessor.java | 41 - .../mq/DelayedMessageProcessor.java | 46 -- .../common/autoconfigure/mq/MqConfig.java | 157 ---- .../autoconfigure/mq/RabbitMqHelper.java | 120 --- .../common/autoconfigure/mvc/JsonConfig.java | 31 - .../common/autoconfigure/mvc/MvcConfig.java | 46 -- .../autoconfigure/mvc/ParamCheckerConfig.java | 14 - .../mvc/advice/CommonExceptionAdvice.java | 94 --- .../mvc/advice/WrapperResponseBodyAdvice.java | 39 - .../mvc/aspects/CheckerAspect.java | 35 - .../WrapperResponseMessageConverter.java | 51 -- .../mybatis/BaseMetaObjectHandler.java | 43 -- .../mybatis/MyBatisAutoFillInterceptor.java | 51 -- .../autoconfigure/mybatis/MybatisConfig.java | 46 -- .../redisson/RedissonConfig.java | 87 --- .../redisson/annotations/Lock.java | 50 -- .../redisson/aspect/LockAspect.java | 51 -- .../BaseSwaggerResponseBuilderPlugin.java | 82 -- .../BaseSwaggerResponseModelPlugin.java | 38 - .../swagger/Knife4jConfiguration.java | 64 -- .../swagger/SwaggerConfigProperties.java | 34 - .../autoconfigure/xxljob/XxlJobConfig.java | 43 -- .../xxljob/XxlJobProperties.java | 29 - .../com/tianji/common/constants/Constant.java | 42 - .../tianji/common/constants/ErrorInfo.java | 31 - .../tianji/common/constants/MqConstants.java | 78 -- .../common/constants/RegexConstants.java | 31 - .../main/java/com/tianji/common/domain/R.java | 59 -- .../com/tianji/common/domain/dto/BaseDTO.java | 18 - .../tianji/common/domain/dto/IdNameDTO.java | 18 - .../common/domain/dto/LoginUserDTO.java | 10 - .../com/tianji/common/domain/dto/PageDTO.java | 74 -- .../tianji/common/domain/query/PageQuery.java | 73 -- .../com/tianji/common/enums/BaseEnum.java | 13 - .../com/tianji/common/enums/CommonStatus.java | 31 - .../com/tianji/common/enums/UserType.java | 31 - .../exceptions/BadRequestException.java | 20 - .../exceptions/BizIllegalException.java | 18 - .../common/exceptions/CommonException.java | 32 - .../tianji/common/exceptions/DbException.java | 18 - .../common/exceptions/ForbiddenException.java | 20 - .../exceptions/RequestTimeoutException.java | 23 - .../exceptions/UnauthorizedException.java | 20 - .../common/filters/RequestIdFilter.java | 32 - .../com/tianji/common/utils/ArrayUtils.java | 54 -- .../com/tianji/common/utils/AspectUtils.java | 41 - .../com/tianji/common/utils/AssertUtils.java | 64 -- .../com/tianji/common/utils/BeanUtils.java | 59 -- .../com/tianji/common/utils/BooleanUtils.java | 6 - .../com/tianji/common/utils/ByteUtils.java | 18 - .../com/tianji/common/utils/CollUtils.java | 142 ---- .../java/com/tianji/common/utils/Convert.java | 8 - .../tianji/common/utils/CookieBuilder.java | 66 -- .../com/tianji/common/utils/DateUtils.java | 152 ---- .../com/tianji/common/utils/EnumUtils.java | 6 - .../com/tianji/common/utils/HttpUtils.java | 6 - .../java/com/tianji/common/utils/IoUtils.java | 6 - .../com/tianji/common/utils/JsonUtils.java | 6 - .../tianji/common/utils/MarkedRunnable.java | 28 - .../com/tianji/common/utils/NumberUtils.java | 133 ---- .../com/tianji/common/utils/ObjectUtils.java | 84 -- .../com/tianji/common/utils/QrCodeUtils.java | 11 - .../com/tianji/common/utils/RandomUtils.java | 6 - .../com/tianji/common/utils/ReflectUtils.java | 20 - .../tianji/common/utils/RequestIdUtil.java | 29 - .../com/tianji/common/utils/RequestUtils.java | 41 - .../com/tianji/common/utils/SPELUtils.java | 71 -- .../com/tianji/common/utils/SignUtils.java | 181 ----- .../tianji/common/utils/SqlWrapperUtils.java | 129 ---- .../com/tianji/common/utils/StringUtils.java | 9 - .../com/tianji/common/utils/SwaggerUtils.java | 32 - .../tianji/common/utils/TreeDataUtils.java | 253 ------ .../com/tianji/common/utils/UserContext.java | 28 - .../tianji/common/utils/ViolationUtils.java | 25 - .../com/tianji/common/utils/WebUtils.java | 164 ---- .../com/tianji/common/validate/Checker.java | 18 - .../tianji/common/validate/EnumValidator.java | 42 - .../validate/annotations/EnumValid.java | 24 - .../validate/annotations/ParamChecker.java | 18 - .../spring-configuration-metadata.json | 269 ------- .../main/resources/META-INF/spring.factories | 9 - tianji-master/tj-course/pom.xml | 122 --- .../com/tianji/course/CourseApplication.java | 48 -- .../course/config/ThreadPoolConfig.java | 36 - .../course/constants/CourseConstants.java | 27 - .../course/constants/CourseErrorInfo.java | 98 --- .../tianji/course/constants/CourseStatus.java | 34 - .../course/constants/RedisConstants.java | 18 - .../course/constants/RedisContants.java | 19 - .../course/constants/SubjectConstants.java | 50 -- .../controller/CatalogueController.java | 39 - .../course/controller/CategoryController.java | 96 --- .../course/controller/CourseController.java | 229 ------ .../controller/CourseInfoController.java | 103 --- .../tianji/course/domain/dto/CataSaveDTO.java | 58 -- .../course/domain/dto/CataSubjectDTO.java | 29 - .../course/domain/dto/CateSimpleInfoDTO.java | 24 - .../course/domain/dto/CategoryAddDTO.java | 37 - .../dto/CategoryDisableOrEnableDTO.java | 27 - .../course/domain/dto/CategoryListDTO.java | 22 - .../course/domain/dto/CategoryUpdateDTO.java | 34 - .../domain/dto/CourseBaseInfoSaveDTO.java | 88 --- .../tianji/course/domain/dto/CourseIdDTO.java | 21 - .../course/domain/dto/CourseMediaDTO.java | 39 - .../course/domain/dto/CourseMediaSaveDTO.java | 22 - .../course/domain/dto/CoursePageQuery.java | 38 - .../domain/dto/CourseSimpleInfoListDTO.java | 21 - .../domain/dto/CourseTeacherSaveDTO.java | 43 -- .../domain/dto/SubjectPageParamDTO.java | 32 - .../course/domain/dto/SubjectSaveDTO.java | 82 -- .../course/domain/po/CataIdAndSubScore.java | 19 - .../com/tianji/course/domain/po/Category.java | 86 --- .../tianji/course/domain/po/Category3PO.java | 30 - .../com/tianji/course/domain/po/Course.java | 163 ---- .../course/domain/po/CourseCataSubject.java | 47 -- .../domain/po/CourseCataSubjectDraft.java | 47 -- .../course/domain/po/CourseCatalogue.java | 128 --- .../domain/po/CourseCatalogueDraft.java | 151 ---- .../course/domain/po/CourseContent.java | 78 -- .../course/domain/po/CourseContentDraft.java | 79 -- .../tianji/course/domain/po/CourseDraft.java | 160 ---- .../course/domain/po/CourseSubject.java | 43 -- .../course/domain/po/CourseTeacher.java | 83 -- .../course/domain/po/CourseTeacherDraft.java | 86 --- .../com/tianji/course/domain/po/Subject.java | 172 ----- .../course/domain/po/SubjectCategory.java | 55 -- .../course/domain/po/SubjectUseNum.java | 20 - .../course/domain/query/CoursePageQuery.java | 38 - .../course/domain/vo/CataSimpleInfoVO.java | 29 - .../course/domain/vo/CataSimpleSubjectVO.java | 31 - .../course/domain/vo/CataSubjectVO.java | 26 - .../com/tianji/course/domain/vo/CataVO.java | 46 -- .../course/domain/vo/CateSimpleInfoVO.java | 29 - .../course/domain/vo/CategoryInfoVO.java | 35 - .../tianji/course/domain/vo/CategoryVO.java | 42 - .../tianji/course/domain/vo/ChapterVO.java | 22 - .../course/domain/vo/CourseAndSectionVO.java | 29 - .../course/domain/vo/CourseBaseInfoVO.java | 79 -- .../course/domain/vo/CourseCataIdVO.java | 18 - .../tianji/course/domain/vo/CoursePageVO.java | 43 -- .../tianji/course/domain/vo/CourseSaveVO.java | 24 - .../course/domain/vo/CourseSimpleInfoVO.java | 39 - .../course/domain/vo/CourseStatisticsVO.java | 31 - .../course/domain/vo/CourseTeacherVO.java | 32 - .../tianji/course/domain/vo/NameExistVO.java | 25 - .../tianji/course/domain/vo/SectionVO.java | 36 - .../course/domain/vo/SimpleCategoryVO.java | 28 - .../course/domain/vo/SubjectInfoVO.java | 55 -- .../course/domain/vo/SubjectSimpleVO.java | 37 - .../tianji/course/domain/vo/SubjectVO.java | 53 -- .../course/handler/CourseJobHandler.java | 26 - .../tianji/course/mapper/CategoryMapper.java | 23 - .../mapper/CourseCataSubjectDraftMapper.java | 44 -- .../mapper/CourseCataSubjectMapper.java | 40 - .../mapper/CourseCatalogueDraftMapper.java | 39 - .../course/mapper/CourseCatalogueMapper.java | 16 - .../mapper/CourseContentDraftMapper.java | 24 - .../course/mapper/CourseContentMapper.java | 18 - .../course/mapper/CourseDraftMapper.java | 45 -- .../tianji/course/mapper/CourseMapper.java | 41 - .../course/mapper/CourseSubjectMapper.java | 23 - .../mapper/CourseTeacherDraftMapper.java | 33 - .../course/mapper/CourseTeacherMapper.java | 21 - .../course/mapper/SubjectCategoryMapper.java | 39 - .../course/properties/CourseProperties.java | 27 - .../course/service/ICategoryService.java | 108 --- .../ICourseCataSubjectDraftService.java | 20 - .../service/ICourseCatalogueDraftService.java | 104 --- .../service/ICourseCatalogueService.java | 60 -- .../course/service/ICourseDraftService.java | 106 --- .../tianji/course/service/ICourseService.java | 124 --- .../service/ICourseTeacherDraftService.java | 41 - .../course/service/ICourseTeacherService.java | 36 - .../service/impl/CategoryServiceImpl.java | 647 ---------------- .../CourseCataSubjectDraftServiceImpl.java | 52 -- .../impl/CourseCatalogueDraftServiceImpl.java | 727 ------------------ .../impl/CourseCatalogueServiceImpl.java | 308 -------- .../service/impl/CourseDraftServiceImpl.java | 676 ---------------- .../service/impl/CourseServiceImpl.java | 559 -------------- .../impl/CourseTeacherDraftServiceImpl.java | 159 ---- .../impl/CourseTeacherServiceImpl.java | 111 --- .../course/utils/CategoryDataWrapper.java | 41 - .../course/utils/CategoryDataWrapper2.java | 40 - .../course/utils/CourseSaveBaseGroup.java | 11 - .../com/tianji/course/utils/SubjectUtils.java | 53 -- .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../src/main/resources/bootstrap.yml | 40 - .../main/resources/mapper/AvailablePolicy.xml | 33 - .../main/resources/mapper/CouponCalculate.xml | 20 - .../mapper/CourseCataSubjectDraftMapper.xml | 19 - .../mapper/CourseCataSubjectMapper.xml | 18 - .../mapper/CourseCatalogueMapper.xml | 34 - .../mapper/CourseContentDraftMapper.xml | 19 - .../resources/mapper/CourseContentMapper.xml | 24 - .../resources/mapper/CourseDraftMapper.xml | 41 - .../main/resources/mapper/CourseMapper.xml | 55 -- .../resources/mapper/CourseSubjectMapper.xml | 12 - .../mapper/CourseTeacherDraftMapper.xml | 25 - .../resources/mapper/CourseTeacherMapper.xml | 25 - tianji-master/tj-data/pom.xml | 100 --- .../tianji/data/DataCenterApplication.java | 38 - .../tianji/data/constants/DataTypeEnum.java | 48 -- .../tianji/data/constants/RedisConstants.java | 16 - .../data/controller/BoardController.java | 41 - .../data/controller/TodayDataController.java | 38 - .../data/controller/Top10Controller.java | 38 - .../data/model/dto/BoardDataSetDTO.java | 28 - .../tianji/data/model/dto/TodayDataDTO.java | 22 - .../data/model/dto/Top10DataSetDTO.java | 35 - .../com/tianji/data/model/po/CourseInfo.java | 19 - .../tianji/data/model/po/TodayDataInfo.java | 21 - .../java/com/tianji/data/model/vo/AxisVO.java | 57 -- .../com/tianji/data/model/vo/EchartsVO.java | 19 - .../com/tianji/data/model/vo/SerierVO.java | 36 - .../com/tianji/data/model/vo/TodayDataVO.java | 22 - .../com/tianji/data/model/vo/Top10DataVO.java | 20 - .../com/tianji/data/service/BoardService.java | 31 - .../tianji/data/service/TodayDataService.java | 24 - .../com/tianji/data/service/Top10Service.java | 25 - .../data/service/impl/BoardServiceImpl.java | 91 --- .../service/impl/TodayDataServiceImpl.java | 49 -- .../data/service/impl/Top10ServiceImpl.java | 71 -- .../java/com/tianji/data/utils/DataUtils.java | 18 - .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../tj-data/src/main/resources/bootstrap.yml | 44 -- tianji-master/tj-exam/pom.xml | 117 --- .../java/com/tianji/exam/ExamApplication.java | 39 - .../tianji/exam/constants/ExamErrorInfo.java | 5 - .../tianji/exam/constants/QuestionType.java | 35 - .../controller/QuestionBizController.java | 54 -- .../exam/controller/QuestionController.java | 101 --- .../exam/domain/dto/QuestionFormDTO.java | 63 -- .../com/tianji/exam/domain/po/Question.java | 106 --- .../tianji/exam/domain/po/QuestionBiz.java | 49 -- .../tianji/exam/domain/po/QuestionDetail.java | 52 -- .../exam/domain/query/QuestionPageQuery.java | 25 - .../exam/domain/vo/QuestionDetailVO.java | 67 -- .../tianji/exam/domain/vo/QuestionPageVO.java | 47 -- .../tianji/exam/mapper/QuestionBizMapper.java | 23 - .../exam/mapper/QuestionDetailMapper.java | 16 - .../tianji/exam/mapper/QuestionMapper.java | 22 - .../exam/service/IQuestionBizService.java | 32 - .../exam/service/IQuestionDetailService.java | 16 - .../tianji/exam/service/IQuestionService.java | 44 -- .../service/impl/QuestionBizServiceImpl.java | 93 --- .../impl/QuestionDetailServiceImpl.java | 20 - .../service/impl/QuestionServiceImpl.java | 256 ------ .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../tj-exam/src/main/resources/bootstrap.yml | 40 - .../resources/mapper/QuestionBizMapper.xml | 24 - .../resources/mapper/QuestionDetailMapper.xml | 5 - .../main/resources/mapper/QuestionMapper.xml | 14 - tianji-master/tj-gateway/pom.xml | 67 -- .../tianji/gateway/GatewayApplication.java | 38 - .../tianji/gateway/config/AuthProperties.java | 26 - .../handler/GatewayExceptionHandler.java | 89 --- .../gateway/filter/AccountAuthFilter.java | 79 -- .../gateway/filter/RequestIdRelayFilter.java | 43 -- .../GatewaySwaggerResourceProvider.java | 62 -- .../swagger/SwaggerResourceController.java | 23 - .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../src/main/resources/bootstrap.yml | 97 --- tianji-master/tj-learning/pom.xml | 105 --- .../tianji/learning/LearningApplication.java | 40 - .../learning/config/MybatisConfiguration.java | 21 - .../learning/constants/LearningConstants.java | 5 - .../learning/constants/RedisConstants.java | 12 - .../InteractionQuestionAdminController.java | 49 -- .../InteractionQuestionController.java | 66 -- .../InteractionReplyAdminController.java | 50 -- .../InteractionReplyController.java | 40 - .../controller/LearningLessonController.java | 85 -- .../controller/LearningRecordController.java | 41 - .../controller/PointsBoardController.java | 59 -- .../controller/PointsRecordController.java | 34 - .../controller/SignRecordController.java | 32 - .../learning/domain/dto/LearningPlanDTO.java | 22 - .../domain/dto/LearningRecordFormDTO.java | 37 - .../learning/domain/dto/QuestionFormDTO.java | 31 - .../tianji/learning/domain/dto/ReplyDTO.java | 34 - .../domain/po/InteractionQuestion.java | 101 --- .../learning/domain/po/InteractionReply.java | 95 --- .../learning/domain/po/LearningLesson.java | 93 --- .../learning/domain/po/LearningRecord.java | 76 -- .../learning/domain/po/PointsBoard.java | 57 -- .../learning/domain/po/PointsBoardSeason.java | 50 -- .../learning/domain/po/PointsRecord.java | 56 -- .../domain/query/PointsBoardQuery.java | 15 - .../domain/query/QuestionAdminPageQuery.java | 27 - .../domain/query/QuestionPageQuery.java | 20 - .../learning/domain/query/ReplyPageQuery.java | 17 - .../learning/domain/vo/LearningLessonVO.java | 56 -- .../domain/vo/LearningPlanPageVO.java | 39 - .../learning/domain/vo/LearningPlanVO.java | 36 - .../learning/domain/vo/PointsBoardItemVO.java | 16 - .../domain/vo/PointsBoardSeasonVO.java | 34 - .../learning/domain/vo/PointsBoardVO.java | 18 - .../domain/vo/PointsStatisticsVO.java | 16 - .../learning/domain/vo/QuestionAdminVO.java | 56 -- .../tianji/learning/domain/vo/QuestionVO.java | 34 - .../tianji/learning/domain/vo/ReplyVO.java | 40 - .../learning/domain/vo/SignResultVO.java | 22 - .../tianji/learning/enums/LessonStatus.java | 38 - .../com/tianji/learning/enums/PlanStatus.java | 37 - .../learning/enums/PointsRecordType.java | 41 - .../tianji/learning/enums/QuestionStatus.java | 36 - .../tianji/learning/enums/SectionType.java | 37 - .../handler/PointsBoardPersistentHandler.java | 93 --- .../mapper/InteractionQuestionMapper.java | 15 - .../mapper/InteractionReplyMapper.java | 15 - .../learning/mapper/LearningLessonMapper.java | 18 - .../learning/mapper/LearningRecordMapper.java | 25 - .../learning/mapper/PointsBoardMapper.java | 17 - .../mapper/PointsBoardSeasonMapper.java | 15 - .../learning/mapper/PointsRecordMapper.java | 26 - .../learning/mq/LearningPointsListener.java | 65 -- .../learning/mq/LessonChangeListener.java | 56 -- .../learning/mq/LikeTimesChangeListener.java | 45 -- .../learning/mq/message/SignInMessage.java | 13 - .../service/IInteractionQuestionService.java | 36 - .../service/IInteractionReplyService.java | 26 - .../service/ILearningLessonService.java | 41 - .../service/ILearningRecordService.java | 21 - .../service/IPointsBoardSeasonService.java | 18 - .../learning/service/IPointsBoardService.java | 23 - .../service/IPointsRecordService.java | 22 - .../learning/service/ISignRecordService.java | 10 - .../impl/InteractionQuestionServiceImpl.java | 353 --------- .../impl/InteractionReplyServiceImpl.java | 241 ------ .../impl/LearningLessonServiceImpl.java | 311 -------- .../impl/LearningRecordServiceImpl.java | 186 ----- .../impl/PointsBoardSeasonServiceImpl.java | 30 - .../service/impl/PointsBoardServiceImpl.java | 169 ---- .../service/impl/PointsRecordServiceImpl.java | 111 --- .../service/impl/SignRecordServiceImpl.java | 125 --- .../com/tianji/learning/utils/DelayTask.java | 35 - .../utils/LearningRecordDelayTaskHandler.java | 149 ---- .../learning/utils/TableInfoContext.java | 17 - .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../src/main/resources/bootstrap.yml | 44 -- .../mapper/InteractionQuestionMapper.xml | 5 - .../mapper/InteractionReplyMapper.xml | 5 - .../resources/mapper/LearningLessonMapper.xml | 11 - .../resources/mapper/LearningRecordMapper.xml | 13 - .../resources/mapper/PointsBoardMapper.xml | 19 - .../mapper/PointsBoardSeasonMapper.xml | 5 - .../resources/mapper/PointsRecordMapper.xml | 5 - .../tianji/learning/utils/DelayTaskTest.java | 26 - tianji-master/tj-media/pom.xml | 106 --- .../com/tianji/media/MediaApplication.java | 41 - .../com/tianji/media/config/AliConfig.java | 28 - .../tianji/media/config/AliProperties.java | 23 - .../media/config/PlatformProperties.java | 14 - .../tianji/media/config/TencentConfig.java | 99 --- .../media/config/TencentProperties.java | 40 - .../tianji/media/constants/FileConstants.java | 6 - .../tianji/media/constants/FileErrorInfo.java | 8 - .../media/controller/FileController.java | 49 -- .../media/controller/MediaController.java | 80 -- .../com/tianji/media/domain/dto/FileDTO.java | 24 - .../com/tianji/media/domain/dto/MediaDTO.java | 21 - .../domain/dto/MediaUploadResultDTO.java | 23 - .../java/com/tianji/media/domain/po/File.java | 88 --- .../com/tianji/media/domain/po/Media.java | 101 --- .../tianji/media/domain/query/MediaQuery.java | 15 - .../com/tianji/media/domain/vo/MediaVO.java | 30 - .../tianji/media/domain/vo/VideoPlayVO.java | 14 - .../com/tianji/media/enums/FileErrorInfo.java | 19 - .../com/tianji/media/enums/FilePlatform.java | 19 - .../com/tianji/media/enums/FileStatus.java | 43 -- .../java/com/tianji/media/enums/Platform.java | 22 - .../com/tianji/media/mapper/FileMapper.java | 16 - .../com/tianji/media/mapper/MediaMapper.java | 16 - .../tianji/media/service/IFileService.java | 21 - .../tianji/media/service/IMediaService.java | 35 - .../media/service/impl/FileServiceImpl.java | 93 --- .../media/service/impl/MediaServiceImpl.java | 208 ----- .../tianji/media/storage/IFileStorage.java | 34 - .../tianji/media/storage/IMediaStorage.java | 51 -- .../media/storage/MediaUploadResult.java | 17 - .../media/storage/ali/AliFileStorage.java | 103 --- .../storage/tencent/TencentFileStorage.java | 117 --- .../storage/tencent/TencentMediaStorage.java | 260 ------- .../media/storage/tencent/UserAccessInfo.java | 9 - .../com/tianji/media/task/PullEventTask.java | 111 --- .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../tj-media/src/main/resources/bootstrap.yml | 62 -- tianji-master/tj-message/pom.xml | 25 - .../tj-message/tj-message-api/pom.xml | 33 - .../message/api/client/AsyncSmsClient.java | 21 - .../message/api/client/MessageClient.java | 18 - .../config/MessageClientConfiguration.java | 31 - .../main/resources/META-INF/spring.factories | 2 - .../tj-message/tj-message-domain/pom.xml | 26 - .../tianji/message/domain/dto/SmsInfoDTO.java | 18 - .../message/domain/enums/SmsTemplate.java | 14 - .../tj-message/tj-message-service/pom.xml | 103 --- .../tianji/message/MessageApplication.java | 46 -- .../tianji/message/config/MessageConfig.java | 72 -- .../message/config/MessageProperties.java | 17 - .../message/constants/MessageErrorInfo.java | 9 - .../controller/MessageTemplateController.java | 57 -- .../controller/NoticeTaskController.java | 57 -- .../controller/NoticeTemplateController.java | 57 -- .../message/controller/SmsController.java | 26 - .../SmsThirdPlatformController.java | 58 -- .../controller/UserInboxController.java | 41 - .../domain/dto/MessageTemplateDTO.java | 45 -- .../domain/dto/MessageTemplateFormDTO.java | 39 - .../message/domain/dto/NoticeTaskDTO.java | 42 - .../message/domain/dto/NoticeTaskFormDTO.java | 37 - .../message/domain/dto/NoticeTemplateDTO.java | 29 - .../domain/dto/NoticeTemplateFormDTO.java | 32 - .../domain/dto/SmsThirdPlatformDTO.java | 32 - .../domain/dto/SmsThirdPlatformFormDTO.java | 29 - .../message/domain/dto/UserInboxDTO.java | 41 - .../message/domain/dto/UserInboxFormDTO.java | 24 - .../message/domain/po/MessageTemplate.java | 91 --- .../tianji/message/domain/po/NoticeTask.java | 96 --- .../message/domain/po/NoticeTemplate.java | 91 --- .../message/domain/po/PublicNotice.java | 65 -- .../message/domain/po/SmsThirdPlatform.java | 77 -- .../tianji/message/domain/po/UserInbox.java | 76 -- .../query/MessageTemplatePageQuery.java | 15 - .../domain/query/NoticeTaskPageQuery.java | 18 - .../domain/query/NoticeTemplatePageQuery.java | 14 - .../query/SmsThirdPlatformPageQuery.java | 14 - .../message/domain/query/UserInboxQuery.java | 14 - .../com/tianji/message/enums/NoticeType.java | 18 - .../tianji/message/enums/TemplateStatus.java | 16 - .../message/handler/NoticeJobHandler.java | 38 - .../message/handler/SmsMessageHandler.java | 27 - .../message/mapper/MessageTemplateMapper.java | 16 - .../message/mapper/NoticeTaskMapper.java | 21 - .../message/mapper/NoticeTemplateMapper.java | 16 - .../message/mapper/PublicNoticeMapper.java | 16 - .../mapper/SmsThirdPlatformMapper.java | 16 - .../message/mapper/UserInboxMapper.java | 17 - .../properties/ThreadPoolProperties.java | 24 - .../service/IMessageTemplateService.java | 31 - .../message/service/INoticeTaskService.java | 31 - .../service/INoticeTemplateService.java | 29 - .../message/service/IPublicNoticeService.java | 18 - .../tianji/message/service/ISmsService.java | 15 - .../service/ISmsThirdPlatformService.java | 31 - .../message/service/IUserInboxService.java | 29 - .../impl/MessageTemplateServiceImpl.java | 71 -- .../service/impl/NoticeTaskServiceImpl.java | 150 ---- .../impl/NoticeTemplateServiceImpl.java | 156 ---- .../service/impl/PublicNoticeServiceImpl.java | 38 - .../message/service/impl/SmsServiceImpl.java | 106 --- .../impl/SmsThirdPlatformServiceImpl.java | 68 -- .../service/impl/UserInboxServiceImpl.java | 133 ---- .../message/thirdparty/ISmsHandler.java | 17 - .../message/thirdparty/ali/AliProperties.java | 11 - .../message/thirdparty/ali/AliSmsConfig.java | 31 - .../message/thirdparty/ali/AliSmsHandler.java | 54 -- .../thirdparty/tencent/TencentSmsHandler.java | 18 - .../message/thirdparty/uc/UcSmsHandler.java | 21 - .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../src/main/resources/bootstrap.yml | 53 -- .../main/resources/mapper/IExamService.xml | 5 - .../src/main/resources/mapper/ISmsHandler.xml | 12 - .../resources/mapper/NoticeTaskMapper.xml | 5 - .../resources/mapper/NoticeTemplateMapper.xml | 5 - .../resources/mapper/PublicNoticeMapper.xml | 5 - .../mapper/SmsThirdPlatformMapper.xml | 5 - .../main/resources/mapper/TemplateMapper.xml | 5 - .../message/thirdparty/ISmsHandlerTest.java | 29 - tianji-master/tj-pay/pom.xml | 25 - tianji-master/tj-pay/tj-pay-api/pom.xml | 35 - .../com/tianji/pay/sdk/client/PayClient.java | 55 -- .../sdk/config/PayApiImportConfiguration.java | 11 - .../main/resources/META-INF/spring.factories | 2 - tianji-master/tj-pay/tj-pay-domain/pom.xml | 36 - .../tianji/pay/sdk/constants/PayChannel.java | 24 - .../pay/sdk/constants/PayConstants.java | 22 - .../pay/sdk/constants/PayErrorInfo.java | 25 - .../com/tianji/pay/sdk/constants/PayType.java | 20 - .../pay/sdk/constants/RefundChannelEnum.java | 37 - .../com/tianji/pay/sdk/dto/PayApplyDTO.java | 33 - .../com/tianji/pay/sdk/dto/PayChannelDTO.java | 42 - .../com/tianji/pay/sdk/dto/PayResultDTO.java | 34 - .../tianji/pay/sdk/dto/RefundApplyDTO.java | 23 - .../tianji/pay/sdk/dto/RefundResultDTO.java | 48 -- tianji-master/tj-pay/tj-pay-service/pom.xml | 112 --- .../java/com/tianji/pay/PayApplication.java | 39 - .../tianji/pay/constants/NotifyStatus.java | 20 - .../pay/controller/NotifyController.java | 92 --- .../pay/controller/PayChannelController.java | 52 -- .../pay/controller/PayOrderController.java | 48 -- .../pay/controller/RefundOrderController.java | 48 -- .../com/tianji/pay/domain/po/PayChannel.java | 80 -- .../com/tianji/pay/domain/po/PayOrder.java | 156 ---- .../com/tianji/pay/domain/po/RefundOrder.java | 148 ---- .../tianji/pay/mapper/PayChannelMapper.java | 16 - .../com/tianji/pay/mapper/PayOrderMapper.java | 16 - .../tianji/pay/mapper/RefundOrderMapper.java | 16 - .../tianji/pay/service/INotifyService.java | 13 - .../pay/service/IPayChannelService.java | 20 - .../tianji/pay/service/IPayOrderService.java | 34 - .../pay/service/IRefundOrderService.java | 30 - .../pay/service/impl/NotifyServiceImpl.java | 294 ------- .../service/impl/PayChannelServiceImpl.java | 38 - .../pay/service/impl/PayOrderServiceImpl.java | 279 ------- .../service/impl/RefundOrderServiceImpl.java | 292 ------- .../tianji/pay/tasks/PayOrderCheckTask.java | 40 - .../pay/tasks/RefundOrderCheckTask.java | 40 - .../tianji/pay/third/CommonPayProperties.java | 12 - .../com/tianji/pay/third/IPayService.java | 19 - .../tianji/pay/third/ali/AliPayService.java | 161 ---- .../third/ali/config/AliPayConfiguration.java | 25 - .../third/ali/config/AliPayProperties.java | 16 - .../com/tianji/pay/third/model/PayStatus.java | 21 - .../pay/third/model/PayStatusResponse.java | 41 - .../pay/third/model/PrepayResponse.java | 36 - .../pay/third/model/RefundResponse.java | 41 - .../tianji/pay/third/model/RefundStatus.java | 20 - .../com/tianji/pay/third/wx/WxPayClient.java | 109 --- .../com/tianji/pay/third/wx/WxPayService.java | 170 ---- .../pay/third/wx/config/WxConfiguration.java | 60 -- .../pay/third/wx/config/WxPayProperties.java | 29 - .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../src/main/resources/bootstrap.yml | 48 -- .../resources/mapper/PayChannelMapper.xml | 5 - .../main/resources/mapper/PayOrderMapper.xml | 5 - .../resources/mapper/RefundOrderMapper.xml | 5 - .../test/java/com/tianji/pay/AliPayTest.java | 94 --- .../test/java/com/tianji/pay/WxPayTest.java | 46 -- tianji-master/tj-promotion/pom.xml | 102 --- .../promotion/PromotionApplication.java | 39 - .../promotion/config/ExchangeCodeConfig.java | 25 - .../promotion/constants/CouponStatus.java | 34 - .../promotion/constants/DiscountType.java | 55 -- .../constants/ExchangeCodeStatus.java | 33 - .../promotion/constants/ObtainType.java | 34 - .../constants/PromotionErrorInfo.java | 11 - .../tianji/promotion/constants/ScopeType.java | 63 -- .../promotion/constants/UserCouponStatus.java | 33 - .../controller/CouponController.java | 86 --- .../controller/ExchangeCodeController.java | 41 - .../controller/UserCouponController.java | 68 -- .../promotion/domain/dto/CouponFormDTO.java | 50 -- .../domain/dto/CouponIssueFormDTO.java | 37 - .../promotion/domain/dto/CouponScopeDTO.java | 23 - .../tianji/promotion/domain/po/Coupon.java | 151 ---- .../promotion/domain/po/CouponScope.java | 52 -- .../promotion/domain/po/ExchangeCode.java | 76 -- .../tianji/promotion/domain/po/Promotion.java | 82 -- .../promotion/domain/po/UserCoupon.java | 81 -- .../promotion/domain/query/CodeQuery.java | 21 - .../promotion/domain/query/CouponQuery.java | 24 - .../domain/query/UserCouponQuery.java | 15 - .../promotion/domain/vo/CouponDetailVO.java | 50 -- .../promotion/domain/vo/CouponPageVO.java | 48 -- .../promotion/domain/vo/UserCouponVO.java | 35 - .../promotion/handler/CouponJobHandler.java | 28 - .../promotion/handler/PromotionMqHandler.java | 38 - .../tianji/promotion/mapper/CouponMapper.java | 25 - .../promotion/mapper/CouponScopeMapper.java | 21 - .../promotion/mapper/ExchangeCodeMapper.java | 16 - .../promotion/mapper/PromotionMapper.java | 16 - .../promotion/mapper/UserCouponMapper.java | 29 - .../service/ICouponScopeService.java | 22 - .../promotion/service/ICouponService.java | 42 - .../service/IExchangeCodeService.java | 24 - .../promotion/service/IPromotionService.java | 16 - .../promotion/service/IUserCouponService.java | 42 - .../service/impl/CouponScopeServiceImpl.java | 59 -- .../service/impl/CouponServiceImpl.java | 458 ----------- .../service/impl/ExchangeCodeServiceImpl.java | 163 ---- .../service/impl/PromotionServiceImpl.java | 20 - .../service/impl/UserCouponServiceImpl.java | 237 ------ .../promotion/strategy/discount/Discount.java | 26 - .../discount/NoThresholdDiscount.java | 29 - .../strategy/discount/PerPriceDiscount.java | 44 -- .../strategy/discount/PriceDiscount.java | 36 - .../strategy/discount/RateDiscount.java | 41 - .../strategy/scope/CategoryScope.java | 25 - .../scope/CategoryScopeNameHandler.java | 26 - .../promotion/strategy/scope/CourseScope.java | 25 - .../scope/CourseScopeNameHandler.java | 28 - .../promotion/strategy/scope/NoScope.java | 25 - .../promotion/strategy/scope/Scope.java | 15 - .../strategy/scope/ScopeNameHandler.java | 7 - .../com/tianji/promotion/utils/AESUtil.java | 61 -- .../com/tianji/promotion/utils/Base32.java | 92 --- .../tianji/promotion/utils/BitConverter.java | 379 --------- .../com/tianji/promotion/utils/CodeUtil.java | 77 -- .../tianji/promotion/utils/PromotionUtil.java | 6 - .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap.yml | 42 - .../main/resources/mapper/CouponBizMapper.xml | 5 - .../main/resources/mapper/CouponMapper.xml | 16 - .../resources/mapper/ExchangeCodeMapper.xml | 5 - .../main/resources/mapper/PromotionMapper.xml | 5 - .../resources/mapper/UserCouponMapper.xml | 19 - .../com/tianji/promotion/EncryptTest.java | 83 -- tianji-master/tj-remark/pom.xml | 90 --- .../com/tianji/remark/RemarkApplication.java | 40 - .../remark/constants/RedisConstants.java | 6 - .../controller/LikedRecordController.java | 40 - .../remark/domain/dto/LikeRecordFormDTO.java | 23 - .../tianji/remark/domain/po/LikedRecord.java | 60 -- .../remark/mapper/LikedRecordMapper.java | 15 - .../remark/service/ILikedRecordService.java | 24 - .../service/impl/LikedRecordServiceImpl.java | 97 --- .../impl/LikedRecordServiceRedisImpl.java | 130 ---- .../remark/task/LikedTimesCheckTask.java | 25 - .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../src/main/resources/bootstrap.yml | 42 - .../resources/mapper/LikedRecordMapper.xml | 5 - tianji-master/tj-search/pom.xml | 105 --- .../com/tianji/search/SearchApplication.java | 42 - .../search/config/InterestsProperties.java | 12 - .../search/constants/SearchErrorInfo.java | 9 - .../search/controller/CourseController.java | 55 -- .../controller/InterestsController.java | 50 -- .../controller/RecommendController.java | 40 - .../com/tianji/search/domain/po/Course.java | 44 -- .../tianji/search/domain/po/Interests.java | 51 -- .../search/domain/query/CoursePageQuery.java | 38 - .../com/tianji/search/domain/vo/CourseVO.java | 32 - .../search/domain/vo/InterestCategoryVO.java | 14 - .../com/tianji/search/enums/CourseStatus.java | 19 - .../tianji/search/mapper/InterestsMapper.java | 16 - .../tianji/search/mq/CourseEventListener.java | 51 -- .../tianji/search/mq/OrderEventListener.java | 53 -- .../search/repository/CourseRepository.java | 50 -- .../repository/impl/CourseRepositoryImpl.java | 176 ----- .../tianji/search/service/ICourseService.java | 14 - .../search/service/IInterestsService.java | 24 - .../tianji/search/service/ISearchService.java | 22 - .../service/impl/CourseServiceImpl.java | 53 -- .../service/impl/InterestsServiceImpl.java | 81 -- .../service/impl/SearchServiceImpl.java | 324 -------- .../src/main/resources/bootstrap-dev.yml | 13 - .../src/main/resources/bootstrap-local.yml | 13 - .../src/main/resources/bootstrap.yml | 46 -- .../main/resources/mapper/InterestsMapper.xml | 5 - .../search/impl/CourseServiceImplTest.java | 108 --- .../repository/CourseRepositoryTest.java | 58 -- tianji-master/tj-trade/pom.xml | 113 --- .../com/tianji/trade/TradeApplication.java | 39 - .../tianji/trade/config/ThreadPoolConfig.java | 28 - .../tianji/trade/config/TradeProperties.java | 19 - .../tianji/trade/constants/OrderStatus.java | 54 -- .../tianji/trade/constants/RefundStatus.java | 57 -- .../trade/constants/TradeErrorInfo.java | 24 - .../trade/controller/CartController.java | 55 -- .../trade/controller/OrderController.java | 84 -- .../controller/OrderDetailController.java | 70 -- .../trade/controller/PayController.java | 33 - .../controller/RefundApplyController.java | 77 -- .../trade/domain/dto/ApproveFormDTO.java | 24 - .../tianji/trade/domain/dto/CartsAddDTO.java | 15 - .../trade/domain/dto/OrderDelayQueryDTO.java | 38 - .../trade/domain/dto/PayApplyFormDTO.java | 14 - .../trade/domain/dto/PlaceOrderDTO.java | 26 - .../trade/domain/dto/RefundCancelDTO.java | 14 - .../trade/domain/dto/RefundFormDTO.java | 21 - .../java/com/tianji/trade/domain/po/Cart.java | 71 -- .../com/tianji/trade/domain/po/Order.java | 125 --- .../tianji/trade/domain/po/OrderDetail.java | 124 --- .../tianji/trade/domain/po/RefundApply.java | 127 --- .../domain/query/OrderDetailPageQuery.java | 33 - .../trade/domain/query/OrderPageQuery.java | 15 - .../domain/query/RefundApplyPageQuery.java | 34 - .../com/tianji/trade/domain/vo/CartVO.java | 30 - .../trade/domain/vo/OrderConfirmVO.java | 16 - .../trade/domain/vo/OrderDetailAdminVO.java | 71 -- .../trade/domain/vo/OrderDetailPageVO.java | 36 - .../tianji/trade/domain/vo/OrderDetailVO.java | 30 - .../tianji/trade/domain/vo/OrderPageVO.java | 28 - .../trade/domain/vo/OrderProgressNodeVO.java | 18 - .../com/tianji/trade/domain/vo/OrderVO.java | 36 - .../tianji/trade/domain/vo/PayChannelVO.java | 29 - .../trade/domain/vo/PlaceOrderResultVO.java | 23 - .../trade/domain/vo/RefundApplyPageVO.java | 38 - .../tianji/trade/domain/vo/RefundApplyVO.java | 71 -- .../trade/handler/PayMessageHandler.java | 57 -- .../trade/handler/RefundJobHandler.java | 36 - .../com/tianji/trade/mapper/CartMapper.java | 16 - .../trade/mapper/OrderDetailMapper.java | 31 - .../com/tianji/trade/mapper/OrderMapper.java | 17 - .../trade/mapper/RefundApplyMapper.java | 23 - .../tianji/trade/service/ICartService.java | 28 - .../trade/service/IOrderDetailService.java | 53 -- .../tianji/trade/service/IOrderService.java | 49 -- .../com/tianji/trade/service/IPayService.java | 15 - .../trade/service/IRefundApplyService.java | 49 -- .../trade/service/impl/CartServiceImpl.java | 169 ---- .../service/impl/OrderDetailServiceImpl.java | 342 -------- .../trade/service/impl/OrderServiceImpl.java | 407 ---------- .../trade/service/impl/PayServiceImpl.java | 134 ---- .../service/impl/RefundApplyServiceImpl.java | 509 ------------ .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../tj-trade/src/main/resources/bootstrap.yml | 39 - .../src/main/resources/mapper/CartMapper.xml | 5 - .../resources/mapper/OrderDetailMapper.xml | 17 - .../src/main/resources/mapper/OrderMapper.xml | 12 - .../resources/mapper/RefundApplyMapper.xml | 13 - .../tianji/trade/mapper/OrderMapperTest.java | 19 - tianji-master/tj-user/pom.xml | 83 -- .../java/com/tianji/user/UserApplication.java | 39 - .../tianji/user/config/SecurityConfig.java | 16 - .../tianji/user/constants/UserConstants.java | 18 - .../tianji/user/constants/UserErrorInfo.java | 16 - .../user/controller/StaffController.java | 38 - .../user/controller/StudentController.java | 47 -- .../user/controller/TeacherController.java | 36 - .../user/controller/UserController.java | 156 ---- .../user/domain/dto/StudentFormDTO.java | 19 - .../tianji/user/domain/dto/UserFormDTO.java | 21 - .../java/com/tianji/user/domain/po/User.java | 82 -- .../com/tianji/user/domain/po/UserDetail.java | 139 ---- .../user/domain/query/UserPageQuery.java | 19 - .../com/tianji/user/domain/vo/StaffVO.java | 28 - .../tianji/user/domain/vo/StudentPageVo.java | 28 - .../tianji/user/domain/vo/TeacherPageVO.java | 34 - .../tianji/user/domain/vo/UserBasicVO.java | 22 - .../tianji/user/domain/vo/UserDetailVO.java | 40 - .../com/tianji/user/enums/UserStatus.java | 31 - .../tianji/user/mapper/UserDetailMapper.java | 26 - .../com/tianji/user/mapper/UserMapper.java | 15 - .../com/tianji/user/service/ICodeService.java | 6 - .../tianji/user/service/IStaffService.java | 17 - .../tianji/user/service/IStudentService.java | 23 - .../tianji/user/service/ITeacherService.java | 18 - .../user/service/IUserDetailService.java | 26 - .../com/tianji/user/service/IUserService.java | 35 - .../user/service/impl/CodeServiceImpl.java | 65 -- .../user/service/impl/StaffServiceImpl.java | 41 - .../user/service/impl/StudentServiceImpl.java | 91 --- .../user/service/impl/TeacherServiceImpl.java | 59 -- .../service/impl/UserDetailServiceImpl.java | 56 -- .../user/service/impl/UserServiceImpl.java | 301 -------- .../src/main/resources/bootstrap-dev.yml | 11 - .../src/main/resources/bootstrap-local.yml | 11 - .../tj-user/src/main/resources/bootstrap.yml | 48 -- .../resources/mapper/UserDetailMapper.xml | 32 - .../src/main/resources/mapper/UserMapper.xml | 16 - .../service/impl/StudentServiceImplTest.java | 24 - 902 files changed, 353 insertions(+), 45954 deletions(-) create mode 100644 a-rabbitMQ/business/src/main/java/com/shun/business/config/RabbitMQConfig.java create mode 100644 a-rabbitMQ/business/src/main/java/com/shun/business/listener/BusinessListener.java create mode 100644 a-rabbitMQ/integral/src/main/java/com/shun/integral/config/RabbitMQConfig.java create mode 100644 a-rabbitMQ/integral/src/main/java/com/shun/integral/listener/IntegralListener.java create mode 100644 a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/config/RabbitTemplateConfig.java create mode 100644 a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/util/GlobalCache.java delete mode 100644 tianji-master/Dockerfile delete mode 100644 tianji-master/pom.xml delete mode 100644 tianji-master/startup.sh delete mode 100644 tianji-master/tj-api/pom.xml delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/annotations/EnableCategoryCache.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/cache/CategoryCache.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/cache/RoleCache.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/auth/AuthClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CatalogueClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CategoryClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CourseClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/course/SubjectClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/exam/ExamClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/learning/LearningClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/learning/fallback/LearningClientFallback.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/remark/RemarkClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/remark/fallback/RemarkClientFallback.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/search/SearchClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/trade/TradeClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/trade/fallback/TradeClientFallback.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/user/UserClient.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/client/user/fallback/UserClientFallback.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/config/CategoryCacheConfig.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/config/FallbackConfig.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/config/RequestIdRelayConfiguration.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/config/RoleCacheConfig.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/constants/CourseStatus.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/constants/SmsConstants.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/IdAndNumDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/auth/RoleDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CataSimpleInfoDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CatalogueDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CategoryBasicDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CategoryDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseFullInfoDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CoursePurchaseInfoDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseSearchDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseSimpleInfoDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/MediaQuoteDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SectionInfoDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SubNumAndCourseNumDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SubjectDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/exam/QuestionBizDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/exam/QuestionDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningLessonDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningRecordDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningRecordFormDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/CouponDiscountDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/OrderCouponDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/OrderCourseDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/remark/LikedTimesDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/sms/SmsInfoDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/trade/OrderBasicDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/user/LoginFormDTO.java delete mode 100644 tianji-master/tj-api/src/main/java/com/tianji/api/dto/user/UserDTO.java delete mode 100644 tianji-master/tj-api/src/main/resources/META-INF/spring.factories delete mode 100644 tianji-master/tj-auth/pom.xml delete mode 100644 tianji-master/tj-auth/tj-auth-common/pom.xml delete mode 100644 tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/constants/AuthErrorInfo.java delete mode 100644 tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/constants/JwtConstants.java delete mode 100644 tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/domain/PrivilegeRoleDTO.java delete mode 100644 tianji-master/tj-auth/tj-auth-gateway-sdk/pom.xml delete mode 100644 tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/config/AuthAutoConfiguration.java delete mode 100644 tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/util/AuthUtil.java delete mode 100644 tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/util/JwtSignerHolder.java delete mode 100644 tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/resources/META-INF/spring-configuration-metadata.json delete mode 100644 tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/resources/META-INF/spring.factories delete mode 100644 tianji-master/tj-auth/tj-auth-resource-sdk/pom.xml delete mode 100644 tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/FeignRelayUserAutoConfiguration.java delete mode 100644 tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/ResourceAuthProperties.java delete mode 100644 tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/ResourceInterceptorConfiguration.java delete mode 100644 tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/FeignRelayUserInterceptor.java delete mode 100644 tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/LoginAuthInterceptor.java delete mode 100644 tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/UserInfoInterceptor.java delete mode 100644 tianji-master/tj-auth/tj-auth-resource-sdk/src/main/resources/META-INF/spring-configuration-metadata.json delete mode 100644 tianji-master/tj-auth/tj-auth-resource-sdk/src/main/resources/META-INF/spring.factories delete mode 100644 tianji-master/tj-auth/tj-auth-service/pom.xml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/AuthApplication.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/config/AuthConfig.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/constants/AuthConstants.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/AccountController.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/JwkController.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/MenuController.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/PrivilegeController.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/RoleController.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/dto/MenuDTO.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/dto/PrivilegeDTO.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/AccountRole.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/LoginRecord.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Menu.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Privilege.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Role.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/RoleMenu.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/RolePrivilege.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/LoginRecordVO.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/MenuOptionVO.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/PrivilegeOptionVO.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/AccountRoleMapper.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/LoginRecordMapper.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/MenuMapper.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/PrivilegeMapper.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RoleMapper.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RoleMenuMapper.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RolePrivilegeMapper.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IAccountRoleService.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IAccountService.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/ILoginRecordService.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IMenuService.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IPrivilegeService.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRoleMenuService.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRolePrivilegeService.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRoleService.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/AccountRoleServiceImpl.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/AccountServiceImpl.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/LoginRecordServiceImpl.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/MenuServiceImpl.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/PrivilegeServiceImpl.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RoleMenuServiceImpl.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RolePrivilegeServiceImpl.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RoleServiceImpl.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/task/LoadPrivilegeRunner.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/util/JwtTool.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/util/PrivilegeCache.java delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/AccountRoleMapper.xml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/IPointsBoardSeasonService.xml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/LoginRecordMapper.xml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/MenuMapper.xml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/RedisConstants.xml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/RolePrivilegeMapper.xml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/StatusEnumValid.xml delete mode 100644 tianji-master/tj-auth/tj-auth-service/src/main/resources/tjxt.jks delete mode 100644 tianji-master/tj-auth/tj-auth-service/tjxt.jks delete mode 100644 tianji-master/tj-common/pom.xml delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/BasicIdMessageProcessor.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/DelayedMessageProcessor.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/MqConfig.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/RabbitMqHelper.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/JsonConfig.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/MvcConfig.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/ParamCheckerConfig.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/advice/CommonExceptionAdvice.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/advice/WrapperResponseBodyAdvice.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/aspects/CheckerAspect.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/converter/WrapperResponseMessageConverter.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/BaseMetaObjectHandler.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/MyBatisAutoFillInterceptor.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/MybatisConfig.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/RedissonConfig.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/annotations/Lock.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/aspect/LockAspect.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/BaseSwaggerResponseBuilderPlugin.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/BaseSwaggerResponseModelPlugin.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/Knife4jConfiguration.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/SwaggerConfigProperties.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/xxljob/XxlJobConfig.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/xxljob/XxlJobProperties.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/constants/Constant.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/constants/ErrorInfo.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/constants/MqConstants.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/constants/RegexConstants.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/domain/R.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/BaseDTO.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/IdNameDTO.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/LoginUserDTO.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/PageDTO.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/domain/query/PageQuery.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/enums/BaseEnum.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/enums/CommonStatus.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/enums/UserType.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/BadRequestException.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/BizIllegalException.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/CommonException.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/DbException.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/ForbiddenException.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/RequestTimeoutException.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/UnauthorizedException.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/filters/RequestIdFilter.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/ArrayUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/AspectUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/AssertUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/BeanUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/BooleanUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/ByteUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/CollUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/Convert.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/CookieBuilder.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/DateUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/EnumUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/HttpUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/IoUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/JsonUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/MarkedRunnable.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/NumberUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/ObjectUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/QrCodeUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/RandomUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/ReflectUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/RequestIdUtil.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/RequestUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/SPELUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/SignUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/SqlWrapperUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/StringUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/SwaggerUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/TreeDataUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/UserContext.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/ViolationUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/utils/WebUtils.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/validate/Checker.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/validate/EnumValidator.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/validate/annotations/EnumValid.java delete mode 100644 tianji-master/tj-common/src/main/java/com/tianji/common/validate/annotations/ParamChecker.java delete mode 100644 tianji-master/tj-common/src/main/resources/META-INF/spring-configuration-metadata.json delete mode 100644 tianji-master/tj-common/src/main/resources/META-INF/spring.factories delete mode 100644 tianji-master/tj-course/pom.xml delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/CourseApplication.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/config/ThreadPoolConfig.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseConstants.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseErrorInfo.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseStatus.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/constants/RedisConstants.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/constants/RedisContants.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/constants/SubjectConstants.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/controller/CatalogueController.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/controller/CategoryController.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/controller/CourseController.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/controller/CourseInfoController.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CataSaveDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CataSubjectDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CateSimpleInfoDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryAddDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryDisableOrEnableDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryListDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryUpdateDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseBaseInfoSaveDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseIdDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseMediaDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseMediaSaveDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CoursePageQuery.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseSimpleInfoListDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseTeacherSaveDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/SubjectPageParamDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/SubjectSaveDTO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CataIdAndSubScore.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Category.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Category3PO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Course.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCataSubject.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCataSubjectDraft.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCatalogue.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCatalogueDraft.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseContent.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseContentDraft.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseDraft.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseSubject.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseTeacher.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseTeacherDraft.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Subject.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/SubjectCategory.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/SubjectUseNum.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/query/CoursePageQuery.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSimpleInfoVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSimpleSubjectVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSubjectVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CateSimpleInfoVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CategoryInfoVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CategoryVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/ChapterVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseAndSectionVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseBaseInfoVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseCataIdVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CoursePageVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseSaveVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseSimpleInfoVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseStatisticsVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseTeacherVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/NameExistVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SectionVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SimpleCategoryVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectInfoVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectSimpleVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectVO.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/handler/CourseJobHandler.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CategoryMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCataSubjectDraftMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCataSubjectMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCatalogueDraftMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCatalogueMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseContentDraftMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseContentMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseDraftMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseSubjectMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseTeacherDraftMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseTeacherMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/mapper/SubjectCategoryMapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/properties/CourseProperties.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/ICategoryService.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCataSubjectDraftService.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCatalogueDraftService.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCatalogueService.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseDraftService.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseService.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseTeacherDraftService.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseTeacherService.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CategoryServiceImpl.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCataSubjectDraftServiceImpl.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCatalogueDraftServiceImpl.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCatalogueServiceImpl.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseDraftServiceImpl.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseServiceImpl.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseTeacherDraftServiceImpl.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseTeacherServiceImpl.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/utils/CategoryDataWrapper.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/utils/CategoryDataWrapper2.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/utils/CourseSaveBaseGroup.java delete mode 100644 tianji-master/tj-course/src/main/java/com/tianji/course/utils/SubjectUtils.java delete mode 100644 tianji-master/tj-course/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-course/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-course/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/AvailablePolicy.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CouponCalculate.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CourseCataSubjectDraftMapper.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CourseCataSubjectMapper.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CourseCatalogueMapper.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CourseContentDraftMapper.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CourseContentMapper.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CourseDraftMapper.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CourseMapper.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CourseSubjectMapper.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CourseTeacherDraftMapper.xml delete mode 100644 tianji-master/tj-course/src/main/resources/mapper/CourseTeacherMapper.xml delete mode 100644 tianji-master/tj-data/pom.xml delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/DataCenterApplication.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/constants/DataTypeEnum.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/constants/RedisConstants.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/controller/BoardController.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/controller/TodayDataController.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/controller/Top10Controller.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/BoardDataSetDTO.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/TodayDataDTO.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/Top10DataSetDTO.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/model/po/CourseInfo.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/model/po/TodayDataInfo.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/AxisVO.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/EchartsVO.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/SerierVO.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/TodayDataVO.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/Top10DataVO.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/service/BoardService.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/service/TodayDataService.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/service/Top10Service.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/BoardServiceImpl.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/TodayDataServiceImpl.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/Top10ServiceImpl.java delete mode 100644 tianji-master/tj-data/src/main/java/com/tianji/data/utils/DataUtils.java delete mode 100644 tianji-master/tj-data/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-data/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-data/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-exam/pom.xml delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/ExamApplication.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/constants/ExamErrorInfo.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/constants/QuestionType.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/controller/QuestionBizController.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/controller/QuestionController.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/dto/QuestionFormDTO.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/Question.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/QuestionBiz.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/QuestionDetail.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/query/QuestionPageQuery.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/vo/QuestionDetailVO.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/vo/QuestionPageVO.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionBizMapper.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionDetailMapper.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionMapper.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionBizService.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionDetailService.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionService.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionBizServiceImpl.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionDetailServiceImpl.java delete mode 100644 tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionServiceImpl.java delete mode 100644 tianji-master/tj-exam/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-exam/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-exam/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-exam/src/main/resources/mapper/QuestionBizMapper.xml delete mode 100644 tianji-master/tj-exam/src/main/resources/mapper/QuestionDetailMapper.xml delete mode 100644 tianji-master/tj-exam/src/main/resources/mapper/QuestionMapper.xml delete mode 100644 tianji-master/tj-gateway/pom.xml delete mode 100644 tianji-master/tj-gateway/src/main/java/com/tianji/gateway/GatewayApplication.java delete mode 100644 tianji-master/tj-gateway/src/main/java/com/tianji/gateway/config/AuthProperties.java delete mode 100644 tianji-master/tj-gateway/src/main/java/com/tianji/gateway/exception/handler/GatewayExceptionHandler.java delete mode 100644 tianji-master/tj-gateway/src/main/java/com/tianji/gateway/filter/AccountAuthFilter.java delete mode 100644 tianji-master/tj-gateway/src/main/java/com/tianji/gateway/filter/RequestIdRelayFilter.java delete mode 100644 tianji-master/tj-gateway/src/main/java/com/tianji/gateway/swagger/GatewaySwaggerResourceProvider.java delete mode 100644 tianji-master/tj-gateway/src/main/java/com/tianji/gateway/swagger/SwaggerResourceController.java delete mode 100644 tianji-master/tj-gateway/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-gateway/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-gateway/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-learning/pom.xml delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/LearningApplication.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/config/MybatisConfiguration.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/constants/LearningConstants.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/constants/RedisConstants.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionQuestionAdminController.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionQuestionController.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionReplyAdminController.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionReplyController.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/LearningLessonController.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/LearningRecordController.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/PointsBoardController.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/PointsRecordController.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/SignRecordController.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/LearningPlanDTO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/LearningRecordFormDTO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/QuestionFormDTO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/ReplyDTO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/InteractionQuestion.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/InteractionReply.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/LearningLesson.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/LearningRecord.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsBoard.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsBoardSeason.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsRecord.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/PointsBoardQuery.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/QuestionAdminPageQuery.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/QuestionPageQuery.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/ReplyPageQuery.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningLessonVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningPlanPageVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningPlanVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardItemVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardSeasonVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsStatisticsVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/QuestionAdminVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/QuestionVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/ReplyVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/SignResultVO.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/LessonStatus.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/PlanStatus.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/PointsRecordType.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/QuestionStatus.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/SectionType.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/handler/PointsBoardPersistentHandler.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/InteractionQuestionMapper.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/InteractionReplyMapper.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/LearningLessonMapper.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/LearningRecordMapper.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsBoardMapper.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsBoardSeasonMapper.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsRecordMapper.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LearningPointsListener.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LessonChangeListener.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LikeTimesChangeListener.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/message/SignInMessage.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IInteractionQuestionService.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IInteractionReplyService.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ILearningLessonService.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ILearningRecordService.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsBoardSeasonService.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsBoardService.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsRecordService.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ISignRecordService.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/InteractionQuestionServiceImpl.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/InteractionReplyServiceImpl.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/LearningLessonServiceImpl.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/LearningRecordServiceImpl.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsBoardSeasonServiceImpl.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsBoardServiceImpl.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsRecordServiceImpl.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/SignRecordServiceImpl.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/DelayTask.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/LearningRecordDelayTaskHandler.java delete mode 100644 tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/TableInfoContext.java delete mode 100644 tianji-master/tj-learning/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-learning/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-learning/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-learning/src/main/resources/mapper/InteractionQuestionMapper.xml delete mode 100644 tianji-master/tj-learning/src/main/resources/mapper/InteractionReplyMapper.xml delete mode 100644 tianji-master/tj-learning/src/main/resources/mapper/LearningLessonMapper.xml delete mode 100644 tianji-master/tj-learning/src/main/resources/mapper/LearningRecordMapper.xml delete mode 100644 tianji-master/tj-learning/src/main/resources/mapper/PointsBoardMapper.xml delete mode 100644 tianji-master/tj-learning/src/main/resources/mapper/PointsBoardSeasonMapper.xml delete mode 100644 tianji-master/tj-learning/src/main/resources/mapper/PointsRecordMapper.xml delete mode 100644 tianji-master/tj-learning/src/test/java/com/tianji/learning/utils/DelayTaskTest.java delete mode 100644 tianji-master/tj-media/pom.xml delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/MediaApplication.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/config/AliConfig.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/config/AliProperties.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/config/PlatformProperties.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/config/TencentConfig.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/config/TencentProperties.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/constants/FileConstants.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/constants/FileErrorInfo.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/controller/FileController.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/controller/MediaController.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/FileDTO.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/MediaDTO.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/MediaUploadResultDTO.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/domain/po/File.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/domain/po/Media.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/domain/query/MediaQuery.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/domain/vo/MediaVO.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/domain/vo/VideoPlayVO.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/enums/FileErrorInfo.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/enums/FilePlatform.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/enums/FileStatus.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/enums/Platform.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/mapper/FileMapper.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/mapper/MediaMapper.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/service/IFileService.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/service/IMediaService.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/service/impl/FileServiceImpl.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/service/impl/MediaServiceImpl.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/storage/IFileStorage.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/storage/IMediaStorage.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/storage/MediaUploadResult.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/storage/ali/AliFileStorage.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/TencentFileStorage.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/TencentMediaStorage.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/UserAccessInfo.java delete mode 100644 tianji-master/tj-media/src/main/java/com/tianji/media/task/PullEventTask.java delete mode 100644 tianji-master/tj-media/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-media/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-media/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-message/pom.xml delete mode 100644 tianji-master/tj-message/tj-message-api/pom.xml delete mode 100644 tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/client/AsyncSmsClient.java delete mode 100644 tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/client/MessageClient.java delete mode 100644 tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/config/MessageClientConfiguration.java delete mode 100644 tianji-master/tj-message/tj-message-api/src/main/resources/META-INF/spring.factories delete mode 100644 tianji-master/tj-message/tj-message-domain/pom.xml delete mode 100644 tianji-master/tj-message/tj-message-domain/src/main/java/com/tianji/message/domain/dto/SmsInfoDTO.java delete mode 100644 tianji-master/tj-message/tj-message-domain/src/main/java/com/tianji/message/domain/enums/SmsTemplate.java delete mode 100644 tianji-master/tj-message/tj-message-service/pom.xml delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/MessageApplication.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/config/MessageConfig.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/config/MessageProperties.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/constants/MessageErrorInfo.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/MessageTemplateController.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/NoticeTaskController.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/NoticeTemplateController.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/SmsController.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/SmsThirdPlatformController.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/UserInboxController.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/MessageTemplateDTO.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/MessageTemplateFormDTO.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTaskDTO.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTaskFormDTO.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTemplateDTO.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTemplateFormDTO.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/SmsThirdPlatformDTO.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/SmsThirdPlatformFormDTO.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/UserInboxDTO.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/UserInboxFormDTO.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/MessageTemplate.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/NoticeTask.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/NoticeTemplate.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/PublicNotice.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/SmsThirdPlatform.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/UserInbox.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/MessageTemplatePageQuery.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/NoticeTaskPageQuery.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/NoticeTemplatePageQuery.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/SmsThirdPlatformPageQuery.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/UserInboxQuery.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/enums/NoticeType.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/enums/TemplateStatus.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/handler/NoticeJobHandler.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/handler/SmsMessageHandler.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/MessageTemplateMapper.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/NoticeTaskMapper.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/NoticeTemplateMapper.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/PublicNoticeMapper.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/SmsThirdPlatformMapper.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/UserInboxMapper.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/properties/ThreadPoolProperties.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IMessageTemplateService.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/INoticeTaskService.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/INoticeTemplateService.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IPublicNoticeService.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/ISmsService.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/ISmsThirdPlatformService.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IUserInboxService.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/MessageTemplateServiceImpl.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/NoticeTaskServiceImpl.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/NoticeTemplateServiceImpl.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/PublicNoticeServiceImpl.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/SmsServiceImpl.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/SmsThirdPlatformServiceImpl.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/UserInboxServiceImpl.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ISmsHandler.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliProperties.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliSmsConfig.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliSmsHandler.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/tencent/TencentSmsHandler.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/uc/UcSmsHandler.java delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/resources/mapper/IExamService.xml delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/resources/mapper/ISmsHandler.xml delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/resources/mapper/NoticeTaskMapper.xml delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/resources/mapper/NoticeTemplateMapper.xml delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/resources/mapper/PublicNoticeMapper.xml delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/resources/mapper/SmsThirdPlatformMapper.xml delete mode 100644 tianji-master/tj-message/tj-message-service/src/main/resources/mapper/TemplateMapper.xml delete mode 100644 tianji-master/tj-message/tj-message-service/src/test/java/com/tianji/message/thirdparty/ISmsHandlerTest.java delete mode 100644 tianji-master/tj-pay/pom.xml delete mode 100644 tianji-master/tj-pay/tj-pay-api/pom.xml delete mode 100644 tianji-master/tj-pay/tj-pay-api/src/main/java/com/tianji/pay/sdk/client/PayClient.java delete mode 100644 tianji-master/tj-pay/tj-pay-api/src/main/java/com/tianji/pay/sdk/config/PayApiImportConfiguration.java delete mode 100644 tianji-master/tj-pay/tj-pay-api/src/main/resources/META-INF/spring.factories delete mode 100644 tianji-master/tj-pay/tj-pay-domain/pom.xml delete mode 100644 tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayChannel.java delete mode 100644 tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayConstants.java delete mode 100644 tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayErrorInfo.java delete mode 100644 tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayType.java delete mode 100644 tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/RefundChannelEnum.java delete mode 100644 tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayApplyDTO.java delete mode 100644 tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayChannelDTO.java delete mode 100644 tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayResultDTO.java delete mode 100644 tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/RefundApplyDTO.java delete mode 100644 tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/RefundResultDTO.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/pom.xml delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/PayApplication.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/constants/NotifyStatus.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/NotifyController.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/PayChannelController.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/PayOrderController.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/RefundOrderController.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/PayChannel.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/PayOrder.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/RefundOrder.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/PayChannelMapper.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/PayOrderMapper.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/RefundOrderMapper.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/INotifyService.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IPayChannelService.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IPayOrderService.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IRefundOrderService.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/NotifyServiceImpl.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/PayChannelServiceImpl.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/PayOrderServiceImpl.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/RefundOrderServiceImpl.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/tasks/PayOrderCheckTask.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/tasks/RefundOrderCheckTask.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/CommonPayProperties.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/IPayService.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/AliPayService.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/config/AliPayConfiguration.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/config/AliPayProperties.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PayStatus.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PayStatusResponse.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PrepayResponse.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/RefundResponse.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/RefundStatus.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/WxPayClient.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/WxPayService.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/config/WxConfiguration.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/config/WxPayProperties.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/PayChannelMapper.xml delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/PayOrderMapper.xml delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/RefundOrderMapper.xml delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/test/java/com/tianji/pay/AliPayTest.java delete mode 100644 tianji-master/tj-pay/tj-pay-service/src/test/java/com/tianji/pay/WxPayTest.java delete mode 100644 tianji-master/tj-promotion/pom.xml delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/PromotionApplication.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/config/ExchangeCodeConfig.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/CouponStatus.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/DiscountType.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ExchangeCodeStatus.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ObtainType.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/PromotionErrorInfo.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ScopeType.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/UserCouponStatus.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/CouponController.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/ExchangeCodeController.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/UserCouponController.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponFormDTO.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponIssueFormDTO.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponScopeDTO.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/Coupon.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/CouponScope.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/ExchangeCode.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/Promotion.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/UserCoupon.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/CodeQuery.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/CouponQuery.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/UserCouponQuery.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/CouponDetailVO.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/CouponPageVO.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/UserCouponVO.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/handler/CouponJobHandler.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/handler/PromotionMqHandler.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/CouponMapper.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/CouponScopeMapper.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/ExchangeCodeMapper.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/PromotionMapper.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/UserCouponMapper.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/ICouponScopeService.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/ICouponService.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IExchangeCodeService.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IPromotionService.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IUserCouponService.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/CouponScopeServiceImpl.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/CouponServiceImpl.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/ExchangeCodeServiceImpl.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/PromotionServiceImpl.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/UserCouponServiceImpl.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/Discount.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/NoThresholdDiscount.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/PerPriceDiscount.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/PriceDiscount.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/RateDiscount.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CategoryScope.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CategoryScopeNameHandler.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CourseScope.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CourseScopeNameHandler.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/NoScope.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/Scope.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/ScopeNameHandler.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/AESUtil.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/Base32.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/BitConverter.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/CodeUtil.java delete mode 100644 tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/PromotionUtil.java delete mode 100644 tianji-master/tj-promotion/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-promotion/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-promotion/src/main/resources/mapper/CouponBizMapper.xml delete mode 100644 tianji-master/tj-promotion/src/main/resources/mapper/CouponMapper.xml delete mode 100644 tianji-master/tj-promotion/src/main/resources/mapper/ExchangeCodeMapper.xml delete mode 100644 tianji-master/tj-promotion/src/main/resources/mapper/PromotionMapper.xml delete mode 100644 tianji-master/tj-promotion/src/main/resources/mapper/UserCouponMapper.xml delete mode 100644 tianji-master/tj-promotion/src/test/java/com/tianji/promotion/EncryptTest.java delete mode 100644 tianji-master/tj-remark/pom.xml delete mode 100644 tianji-master/tj-remark/src/main/java/com/tianji/remark/RemarkApplication.java delete mode 100644 tianji-master/tj-remark/src/main/java/com/tianji/remark/constants/RedisConstants.java delete mode 100644 tianji-master/tj-remark/src/main/java/com/tianji/remark/controller/LikedRecordController.java delete mode 100644 tianji-master/tj-remark/src/main/java/com/tianji/remark/domain/dto/LikeRecordFormDTO.java delete mode 100644 tianji-master/tj-remark/src/main/java/com/tianji/remark/domain/po/LikedRecord.java delete mode 100644 tianji-master/tj-remark/src/main/java/com/tianji/remark/mapper/LikedRecordMapper.java delete mode 100644 tianji-master/tj-remark/src/main/java/com/tianji/remark/service/ILikedRecordService.java delete mode 100644 tianji-master/tj-remark/src/main/java/com/tianji/remark/service/impl/LikedRecordServiceImpl.java delete mode 100644 tianji-master/tj-remark/src/main/java/com/tianji/remark/service/impl/LikedRecordServiceRedisImpl.java delete mode 100644 tianji-master/tj-remark/src/main/java/com/tianji/remark/task/LikedTimesCheckTask.java delete mode 100644 tianji-master/tj-remark/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-remark/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-remark/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-remark/src/main/resources/mapper/LikedRecordMapper.xml delete mode 100644 tianji-master/tj-search/pom.xml delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/SearchApplication.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/config/InterestsProperties.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/constants/SearchErrorInfo.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/controller/CourseController.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/controller/InterestsController.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/controller/RecommendController.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/domain/po/Course.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/domain/po/Interests.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/domain/query/CoursePageQuery.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/domain/vo/CourseVO.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/domain/vo/InterestCategoryVO.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/enums/CourseStatus.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/mapper/InterestsMapper.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/mq/CourseEventListener.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/mq/OrderEventListener.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/repository/CourseRepository.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/repository/impl/CourseRepositoryImpl.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/service/ICourseService.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/service/IInterestsService.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/service/ISearchService.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/CourseServiceImpl.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/InterestsServiceImpl.java delete mode 100644 tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/SearchServiceImpl.java delete mode 100644 tianji-master/tj-search/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-search/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-search/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-search/src/main/resources/mapper/InterestsMapper.xml delete mode 100644 tianji-master/tj-search/src/test/java/com/tianji/search/impl/CourseServiceImplTest.java delete mode 100644 tianji-master/tj-search/src/test/java/com/tianji/search/repository/CourseRepositoryTest.java delete mode 100644 tianji-master/tj-trade/pom.xml delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/TradeApplication.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/config/ThreadPoolConfig.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/config/TradeProperties.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/OrderStatus.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/RefundStatus.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/TradeErrorInfo.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/CartController.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/OrderController.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/OrderDetailController.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/PayController.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/RefundApplyController.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/ApproveFormDTO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/CartsAddDTO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/OrderDelayQueryDTO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/PayApplyFormDTO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/PlaceOrderDTO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/RefundCancelDTO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/RefundFormDTO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/Cart.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/Order.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/OrderDetail.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/RefundApply.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/OrderDetailPageQuery.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/OrderPageQuery.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/RefundApplyPageQuery.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/CartVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderConfirmVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailAdminVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailPageVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderPageVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderProgressNodeVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/PayChannelVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/PlaceOrderResultVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/RefundApplyPageVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/RefundApplyVO.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/handler/PayMessageHandler.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/handler/RefundJobHandler.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/CartMapper.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/OrderDetailMapper.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/OrderMapper.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/RefundApplyMapper.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/service/ICartService.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IOrderDetailService.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IOrderService.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IPayService.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IRefundApplyService.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/CartServiceImpl.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/OrderDetailServiceImpl.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/OrderServiceImpl.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/PayServiceImpl.java delete mode 100644 tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/RefundApplyServiceImpl.java delete mode 100644 tianji-master/tj-trade/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-trade/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-trade/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-trade/src/main/resources/mapper/CartMapper.xml delete mode 100644 tianji-master/tj-trade/src/main/resources/mapper/OrderDetailMapper.xml delete mode 100644 tianji-master/tj-trade/src/main/resources/mapper/OrderMapper.xml delete mode 100644 tianji-master/tj-trade/src/main/resources/mapper/RefundApplyMapper.xml delete mode 100644 tianji-master/tj-trade/src/test/java/com/tianji/trade/mapper/OrderMapperTest.java delete mode 100644 tianji-master/tj-user/pom.xml delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/UserApplication.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/config/SecurityConfig.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/constants/UserConstants.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/constants/UserErrorInfo.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/controller/StaffController.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/controller/StudentController.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/controller/TeacherController.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/controller/UserController.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/domain/dto/StudentFormDTO.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/domain/dto/UserFormDTO.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/domain/po/User.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/domain/po/UserDetail.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/domain/query/UserPageQuery.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/StaffVO.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/StudentPageVo.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/TeacherPageVO.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/UserBasicVO.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/UserDetailVO.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/enums/UserStatus.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/mapper/UserDetailMapper.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/mapper/UserMapper.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/ICodeService.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/IStaffService.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/IStudentService.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/ITeacherService.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/IUserDetailService.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/IUserService.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/CodeServiceImpl.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/StaffServiceImpl.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/StudentServiceImpl.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/TeacherServiceImpl.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/UserDetailServiceImpl.java delete mode 100644 tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/UserServiceImpl.java delete mode 100644 tianji-master/tj-user/src/main/resources/bootstrap-dev.yml delete mode 100644 tianji-master/tj-user/src/main/resources/bootstrap-local.yml delete mode 100644 tianji-master/tj-user/src/main/resources/bootstrap.yml delete mode 100644 tianji-master/tj-user/src/main/resources/mapper/UserDetailMapper.xml delete mode 100644 tianji-master/tj-user/src/main/resources/mapper/UserMapper.xml delete mode 100644 tianji-master/tj-user/src/test/java/com/tianji/user/service/impl/StudentServiceImplTest.java diff --git a/a-rabbitMQ/business/pom.xml b/a-rabbitMQ/business/pom.xml index 8bd22d3..bf2f738 100644 --- a/a-rabbitMQ/business/pom.xml +++ b/a-rabbitMQ/business/pom.xml @@ -17,4 +17,11 @@ UTF-8 + + + org.springframework.boot + spring-boot-starter-amqp + + + \ No newline at end of file diff --git a/a-rabbitMQ/business/src/main/java/com/shun/business/config/RabbitMQConfig.java b/a-rabbitMQ/business/src/main/java/com/shun/business/config/RabbitMQConfig.java new file mode 100644 index 0000000..bdf50b1 --- /dev/null +++ b/a-rabbitMQ/business/src/main/java/com/shun/business/config/RabbitMQConfig.java @@ -0,0 +1,57 @@ +package com.shun.business.config; + +import org.springframework.amqp.core.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +/** + * @author 夜灬瞬 + * @since 2023/6/21 21:08 + */ +@Configuration +public class RabbitMQConfig { + + /** + * 下单服务的交换机 + */ + public static final String PLACE_ORDER_EXCHANGE = "place_order_exchange"; + + /** + * 三个服务的Queue + */ + public static final String COUPON_QUEUE = "coupon_queue"; + public static final String USER_POINTS_QUEUE = "user_points_queue"; + public static final String BUSINESS_QUEUE = "business_queue"; + + @Bean + public Exchange placeOrderExchange(){ + return ExchangeBuilder.fanoutExchange(PLACE_ORDER_EXCHANGE).build(); + } + + @Bean + public Queue couponQueue(){ + return QueueBuilder.durable(COUPON_QUEUE).build(); + } + @Bean + public Queue userPointsQueue(){ + return QueueBuilder.durable(USER_POINTS_QUEUE).build(); + } + @Bean + public Queue businessQueue(){ + return QueueBuilder.durable(BUSINESS_QUEUE).build(); + } + + @Bean + public Binding couponBinding(Exchange placeOrderExchange, Queue couponQueue){ + return BindingBuilder.bind(couponQueue).to(placeOrderExchange).with("").noargs(); + } + @Bean + public Binding userPointsBinding(Exchange placeOrderExchange,Queue userPointsQueue){ + return BindingBuilder.bind(userPointsQueue).to(placeOrderExchange).with("").noargs(); + } + @Bean + public Binding businessBinding(Exchange placeOrderExchange,Queue businessQueue){ + return BindingBuilder.bind(businessQueue).to(placeOrderExchange).with("").noargs(); + } +} diff --git a/a-rabbitMQ/business/src/main/java/com/shun/business/listener/BusinessListener.java b/a-rabbitMQ/business/src/main/java/com/shun/business/listener/BusinessListener.java new file mode 100644 index 0000000..4b10d9e --- /dev/null +++ b/a-rabbitMQ/business/src/main/java/com/shun/business/listener/BusinessListener.java @@ -0,0 +1,28 @@ +package com.shun.business.listener; + +import com.rabbitmq.client.Channel; +import com.shun.business.config.RabbitMQConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +/** + * 优惠券消费者 + * + * @author 夜灬瞬 + * @since 2023/6/21 21:43 + */ +@Component +@Slf4j +public class BusinessListener { + + @RabbitListener(queues = {RabbitMQConfig.BUSINESS_QUEUE}) + public void consume(String msg, Channel channel, Message message) throws Exception { + // 预扣除优惠券 + Thread.sleep(400); + log.info("优惠券预扣除成功! msg:{}",msg); + // 手动ACK + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } +} diff --git a/a-rabbitMQ/business/src/main/resources/application.yml b/a-rabbitMQ/business/src/main/resources/application.yml index 60d7668..f6da354 100644 --- a/a-rabbitMQ/business/src/main/resources/application.yml +++ b/a-rabbitMQ/business/src/main/resources/application.yml @@ -6,4 +6,14 @@ spring: cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 \ No newline at end of file + server-addr: 127.0.0.1:8848 + rabbitmq: + host: 192.168.48.128 + port: 5672 + username: admin + password: admin + virtual-host: / + listener: + simple: + # 手动 ack + acknowledge-mode: manual \ No newline at end of file diff --git a/a-rabbitMQ/integral/pom.xml b/a-rabbitMQ/integral/pom.xml index 402c0a9..12539e6 100644 --- a/a-rabbitMQ/integral/pom.xml +++ b/a-rabbitMQ/integral/pom.xml @@ -18,4 +18,11 @@ UTF-8 + + + org.springframework.boot + spring-boot-starter-amqp + + + \ No newline at end of file diff --git a/a-rabbitMQ/integral/src/main/java/com/shun/integral/config/RabbitMQConfig.java b/a-rabbitMQ/integral/src/main/java/com/shun/integral/config/RabbitMQConfig.java new file mode 100644 index 0000000..a1facb7 --- /dev/null +++ b/a-rabbitMQ/integral/src/main/java/com/shun/integral/config/RabbitMQConfig.java @@ -0,0 +1,57 @@ +package com.shun.integral.config; + +import org.springframework.amqp.core.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +/** + * @author 夜灬瞬 + * @since 2023/6/21 21:08 + */ +@Configuration +public class RabbitMQConfig { + + /** + * 下单服务的交换机 + */ + public static final String PLACE_ORDER_EXCHANGE = "place_order_exchange"; + + /** + * 三个服务的Queue + */ + public static final String COUPON_QUEUE = "coupon_queue"; + public static final String USER_POINTS_QUEUE = "user_points_queue"; + public static final String BUSINESS_QUEUE = "business_queue"; + + @Bean + public Exchange placeOrderExchange(){ + return ExchangeBuilder.fanoutExchange(PLACE_ORDER_EXCHANGE).build(); + } + + @Bean + public Queue couponQueue(){ + return QueueBuilder.durable(COUPON_QUEUE).build(); + } + @Bean + public Queue userPointsQueue(){ + return QueueBuilder.durable(USER_POINTS_QUEUE).build(); + } + @Bean + public Queue businessQueue(){ + return QueueBuilder.durable(BUSINESS_QUEUE).build(); + } + + @Bean + public Binding couponBinding(Exchange placeOrderExchange, Queue couponQueue){ + return BindingBuilder.bind(couponQueue).to(placeOrderExchange).with("").noargs(); + } + @Bean + public Binding userPointsBinding(Exchange placeOrderExchange,Queue userPointsQueue){ + return BindingBuilder.bind(userPointsQueue).to(placeOrderExchange).with("").noargs(); + } + @Bean + public Binding businessBinding(Exchange placeOrderExchange,Queue businessQueue){ + return BindingBuilder.bind(businessQueue).to(placeOrderExchange).with("").noargs(); + } +} diff --git a/a-rabbitMQ/integral/src/main/java/com/shun/integral/listener/IntegralListener.java b/a-rabbitMQ/integral/src/main/java/com/shun/integral/listener/IntegralListener.java new file mode 100644 index 0000000..525ac2f --- /dev/null +++ b/a-rabbitMQ/integral/src/main/java/com/shun/integral/listener/IntegralListener.java @@ -0,0 +1,28 @@ +package com.shun.integral.listener; + +import com.rabbitmq.client.Channel; +import com.shun.integral.config.RabbitMQConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +/** + * 优惠券消费者 + * + * @author 夜灬瞬 + * @since 2023/6/21 21:43 + */ +@Component +@Slf4j +public class IntegralListener { + + @RabbitListener(queues = {RabbitMQConfig.USER_POINTS_QUEUE}) + public void consume(String msg, Channel channel, Message message) throws Exception { + // 预扣除优惠券 + Thread.sleep(400); + log.info("优惠券预扣除成功! msg:{}",msg); + // 手动ACK + channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); + } +} diff --git a/a-rabbitMQ/integral/src/main/resources/application.yml b/a-rabbitMQ/integral/src/main/resources/application.yml index c84e320..a42692d 100644 --- a/a-rabbitMQ/integral/src/main/resources/application.yml +++ b/a-rabbitMQ/integral/src/main/resources/application.yml @@ -6,4 +6,14 @@ spring: cloud: nacos: discovery: - server-addr: 127.0.0.1:8848 \ No newline at end of file + server-addr: 127.0.0.1:8848 + rabbitmq: + host: 192.168.48.128 + port: 5672 + username: admin + password: admin + virtual-host: / + listener: + simple: + # 手动 ack + acknowledge-mode: manual \ No newline at end of file diff --git a/a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/config/RabbitTemplateConfig.java b/a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/config/RabbitTemplateConfig.java new file mode 100644 index 0000000..fa930ca --- /dev/null +++ b/a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/config/RabbitTemplateConfig.java @@ -0,0 +1,93 @@ +package com.shun.placeOrder.config; + +import com.shun.placeOrder.util.GlobalCache; +import jakarta.annotation.Nullable; +import lombok.extern.slf4j.Slf4j; +import org.springframework.amqp.core.Message; +import org.springframework.amqp.core.ReturnedMessage; +import org.springframework.amqp.rabbit.connection.ConnectionFactory; +import org.springframework.amqp.rabbit.connection.CorrelationData; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +import java.util.Arrays; + +/** + * @author 夜灬瞬 + * @since 2023/6/24 14:35 + */ +@Component +@Slf4j +public class RabbitTemplateConfig { + + @Bean + public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){ + //1、new出RabbitTemplate对象 + RabbitTemplate rabbitTemplate = new RabbitTemplate(); + //2、将connectionFactory设置到RabbitTemplate对象中 + rabbitTemplate.setConnectionFactory(connectionFactory); + //3、设置confirm回调 + rabbitTemplate.setConfirmCallback(confirmCallback()); + //4、设置return回调 + /* + old + rabbitTemplate.setReturnCallback(returnCallback()); + */ + rabbitTemplate.setReturnsCallback(returnCallback()); + //5、设置mandatory为true + rabbitTemplate.setMandatory(true); + //6、返回RabbitTemplate对象即可 + return rabbitTemplate; + } + + public RabbitTemplate.ConfirmCallback confirmCallback(){ + return (correlationData, ack, cause) -> { + // 如果消息 ack 成功 + if (correlationData == null) { + return; + } + String msgId = correlationData.getId(); + if(ack){ + log.info("\n消息发送到Exchange成功!! msgId = " + msgId); + GlobalCache.remove(msgId); + }else{ + log.info("\n消息发送到Exchange失败!! msgId = " + msgId); + } + }; + } + + public RabbitTemplate.ReturnsCallback returnCallback(){ + return new RabbitTemplate.ReturnsCallback(){ + /** + * Returned message callback. + * + * @param returned the returned message and metadata. + */ + @Override + public void returnedMessage(@Nullable ReturnedMessage returned) { + log.info("\n消息未路由到队列"); + assert returned != null; + log.info("\nreturn:消息为:" + Arrays.toString(returned.getMessage().getBody())); + log.info("\nreturn:交换机为:" + returned.getExchange()); + log.info("\nreturn:路由为:" + returned.getRoutingKey()); + } + }; + } + + /** + * old + * @return + */ + // public RabbitTemplate.ReturnCallback returnCallback(){ + // return new RabbitTemplate.ReturnCallback(){ + // @Override + // public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) { + // System.out.println("消息未路由到队列"); + // System.out.println("return:消息为:" + new String(message.getBody())); + // System.out.println("return:交换机为:" + exchange); + // System.out.println("return:路由为:" + routingKey); + // } + // }; + // } +} diff --git a/a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/contoller/PlaceOrderController.java b/a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/contoller/PlaceOrderController.java index ad623c6..2e16c00 100644 --- a/a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/contoller/PlaceOrderController.java +++ b/a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/contoller/PlaceOrderController.java @@ -2,11 +2,14 @@ package com.shun.placeOrder.contoller; import com.shun.placeOrder.client.*; import com.shun.placeOrder.config.RabbitMQConfig; +import com.shun.placeOrder.util.GlobalCache; import jakarta.annotation.Resource; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.*; + /** * @author 夜灬瞬 * @since 2023/6/19 15:46 @@ -35,10 +38,9 @@ public class PlaceOrderController { stockClient.delStock(); // 调用订单服务 创建订单 orderClient.create(); - //feginToBu(); - - mqToBo(); + //mqToBo(); + mqToBuMessageBz(); long end = System.currentTimeMillis(); System.out.println("耗时:" + (end - start)); @@ -46,6 +48,25 @@ public class PlaceOrderController { } + /** + * MQ 发送消息 保证消息送达 + */ + private void mqToBuMessageBz() { + String userAndOrderInfo = "用户信息&订单信息&优惠券信息等等…………"; + // 生成当前消息的唯一标识 + String id = UUID.randomUUID().toString(); + // 封装消息信息 + Map map = new HashMap<>(); + map.put("message",userAndOrderInfo); + map.put("exchange",RabbitMQConfig.PLACE_ORDER_EXCHANGE); + map.put("routingKey",""); + map.put("sendTime",new Date()); + // 将id标识和消息存储到全局缓存中 + GlobalCache.set(id,map); + // 将同步方式修改为基于RabbitMQ的异步方式 + rabbitTemplate.convertAndSend(RabbitMQConfig.PLACE_ORDER_EXCHANGE,"",userAndOrderInfo); + } + private void mqToBo() { String userAndOrderInfo = "用户信息&订单信息&优惠券信息等等…………"; // 将同步方式修改为基于RabbitMQ的异步方式 diff --git a/a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/util/GlobalCache.java b/a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/util/GlobalCache.java new file mode 100644 index 0000000..7e5b44a --- /dev/null +++ b/a-rabbitMQ/placeOrder/src/main/java/com/shun/placeOrder/util/GlobalCache.java @@ -0,0 +1,25 @@ +package com.shun.placeOrder.util; + +import java.util.HashMap; +import java.util.Map; + +/** + * 全局 cache + * @author 夜灬瞬 + * @since 2023/6/24 15:07 + */ +public class GlobalCache { + private static final Map MAP = new HashMap<>(); + + public static void set(String key,Object value){ + MAP.put(key,value); + } + + public static Object get(String key){ + return MAP.get(key); + } + + public static void remove(String key){ + MAP.remove(key); + } +} diff --git a/a-rabbitMQ/placeOrder/src/main/resources/application.yml b/a-rabbitMQ/placeOrder/src/main/resources/application.yml index cfde772..643b924 100644 --- a/a-rabbitMQ/placeOrder/src/main/resources/application.yml +++ b/a-rabbitMQ/placeOrder/src/main/resources/application.yml @@ -12,4 +12,8 @@ spring: port: 5672 username: admin password: admin - virtual-host: / \ No newline at end of file + virtual-host: / + # 设置发布者确认类型 使用 with CorrelationData 将确认与发送的消息相关联 也就是指定发送模式 + publisher-confirm-type: correlated + # 开启回调处理 + publisher-returns: true \ No newline at end of file diff --git a/tianji-master/Dockerfile b/tianji-master/Dockerfile deleted file mode 100644 index 30f4dab..0000000 --- a/tianji-master/Dockerfile +++ /dev/null @@ -1,11 +0,0 @@ -FROM openjdk:11.0-jre-buster -LABEL maintainer="研究院研发组 " -ENV JAVA_OPTS="" -# 设定时区 -ENV TZ=Asia/Shanghai -RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone - -WORKDIR /app -ADD app.jar /app/app.jar - -ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /app/app.jar"] \ No newline at end of file diff --git a/tianji-master/pom.xml b/tianji-master/pom.xml deleted file mode 100644 index 16e1402..0000000 --- a/tianji-master/pom.xml +++ /dev/null @@ -1,195 +0,0 @@ - - - 4.0.0 - - com.tianji - tjxt - 1.0.0 - - tj-common - tj-auth - tj-api - tj-gateway - tj-user - tj-message - tj-media - tj-course - tj-search - tj-learning - tj-pay - tj-trade - tj-exam - tj-promotion - tj-data - tj-remark - - pom - - - - org.springframework.boot - spring-boot-starter-parent - 2.7.2 - - - - - 11 - 11 - UTF-8 - UTF-8 - 1.0 - 1.18.20 - 2021.0.3 - 2021.0.1.0 - 3.4.3 - 5.7.17 - 3.0.3 - 8.0.23 - 4.6.0 - 2.10.1 - 3.10.2 - 4.33.12.ALL - 3.1.515 - 3.13.6 - 7.12.1 - 5.6.89 - 2.1.5 - 2.3.1 - 1.5.1 - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - ${spring-cloud-alibaba.version} - pom - import - - - - mysql - mysql-connector-java - ${mysql.version} - - - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus.version} - - - - com.github.xiaoymin - knife4j-spring-boot-starter - ${swagger.version} - - - - com.tencentcloudapi - tencentcloud-sdk-java - ${tencent.cloud.version} - - - - com.aliyun - aliyun-java-sdk-core - ${ali.sdk.core.version} - - - com.aliyun - aliyun-java-sdk-kms - ${ali.sdk.kms.version} - - - com.alipay.sdk - alipay-sdk-java - ${ali.sdk.pay.version} - - - - com.aliyun.oss - aliyun-sdk-oss - ${ali.sdk.oss.version} - - - - org.redisson - redisson - ${redisson.version} - - - org.aspectj - aspectjweaver - ${aspectj.version} - - - - com.qcloud - cos_api - ${tencent.sdk.cos.version} - - - - com.qcloud - vod_api - ${tencent.sdk.vod.version} - - - - com.xuxueli - xxl-job-core - ${xxl-job-version} - - - - - - - - org.projectlombok - lombok - ${org.projectlombok.version} - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.1 - - 11 - 11 - - - - - - \ No newline at end of file diff --git a/tianji-master/startup.sh b/tianji-master/startup.sh deleted file mode 100644 index 7f44a1a..0000000 --- a/tianji-master/startup.sh +++ /dev/null @@ -1,74 +0,0 @@ -#! /bin/sh -cd /usr/local/src/script || exit 1 -BASE_PATH='/usr/local/src/jenkins/workspace/tjxt-dev-build' -PROJECT_NAME="" -PROJECT_PATH='' -CONTAINER_NAME="" -JAVA_OPTS="-Xms300m -Xmx300m" -PORT=8080 -DEBUG_PORT=0 -while getopts "c:n:d:p:o:a:" opt; do - case $opt in - c) - CONTAINER_NAME=$OPTARG - ;; - n) - PROJECT_NAME=$OPTARG - ;; - d) - PROJECT_PATH=$OPTARG - ;; - p) - PORT=$OPTARG - ;; - o) - [ -n "$OPTARG" ] && JAVA_OPTS=$OPTARG - ;; - a) - [ -n "$OPTARG" ] && DEBUG_PORT=$OPTARG - ;; - ?) - echo "unkonw argument" - exit 1 - ;; - esac -done -if [ "$DEBUG_PORT" = "0" ]; then - JAVA_OPTS=$JAVA_OPTS -else - JAVA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" -fi -IMAGE_NAME="${CONTAINER_NAME}:latest" -echo "copy xx.jar from ${BASE_PATH}/${PROJECT_PATH}" -rm -f app.jar -cp ${BASE_PATH}/${PROJECT_PATH}/target/${PROJECT_NAME}.jar ./app.jar || exit 1 - -echo "begin to build ${PROJECT_NAME} image !!" - -[ -n "`docker ps -a | grep ${CONTAINER_NAME}`" ] && docker rm -f ${CONTAINER_NAME} -[ -n "`docker images | grep ${CONTAINER_NAME}`" ] && docker rmi ${IMAGE_NAME} - -docker build -t ${IMAGE_NAME} . || exit 1 -echo "${PROJECT_NAME} image build success,java_opts = $JAVA_OPTS !!^_^" - -echo "begin to create container ${CONTAINER_NAME},port: ${PORT} !!" - -if [ "$DEBUG_PORT" = "0" ]; then - echo "run in normal mode" - docker run -d --name ${CONTAINER_NAME} \ - -p "${PORT}:${PORT}" \ - -e JAVA_OPTS="${JAVA_OPTS}" \ - --memory 300m --memory-swap -1 \ - --network heima-net ${IMAGE_NAME} \ - || exit 1 -else - echo "run in debug mode" - docker run -d --name ${CONTAINER_NAME} \ - -p "${PORT}:${PORT}" \ - -p ${DEBUG_PORT}:5005 \ - -e JAVA_OPTS="${JAVA_OPTS}" \ - --network heima-net ${IMAGE_NAME} \ - || exit 1 -fi -echo "container is running now !! ^_^" -exit 0 \ No newline at end of file diff --git a/tianji-master/tj-api/pom.xml b/tianji-master/tj-api/pom.xml deleted file mode 100644 index 5e153ea..0000000 --- a/tianji-master/tj-api/pom.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-api - - - 11 - 11 - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - io.github.openfeign - feign-httpclient - - - - com.tianji - tj-common - 1.0.0 - - - org.hibernate.validator - hibernate-validator - - - com.github.ben-manes.caffeine - caffeine - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-sentinel - - - \ No newline at end of file diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/annotations/EnableCategoryCache.java b/tianji-master/tj-api/src/main/java/com/tianji/api/annotations/EnableCategoryCache.java deleted file mode 100644 index 08fff45..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/annotations/EnableCategoryCache.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.tianji.api.annotations; - -public @interface EnableCategoryCache { -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/cache/CategoryCache.java b/tianji-master/tj-api/src/main/java/com/tianji/api/cache/CategoryCache.java deleted file mode 100644 index d9db804..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/cache/CategoryCache.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.tianji.api.cache; - -import com.github.benmanes.caffeine.cache.Cache; -import com.tianji.api.client.course.CategoryClient; -import com.tianji.api.dto.course.CategoryBasicDTO; -import com.tianji.common.utils.CollUtils; -import lombok.RequiredArgsConstructor; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@RequiredArgsConstructor -public class CategoryCache { - - private final Cache> categoryCaches; - - private final CategoryClient categoryClient; - - public Map getCategoryMap() { - return categoryCaches.get("CATEGORY", key -> { - // 1.从CategoryClient查询 - List list = categoryClient.getAllOfOneLevel(); - if(list == null || list.isEmpty()){ - return CollUtils.emptyMap(); - } - // 2.转换数据 - return list.stream().collect(Collectors.toMap(CategoryBasicDTO::getId, c -> c)); - }); - } - - public String getCategoryNames(List ids) { - if (ids == null || ids.size() == 0) { - return ""; - } - // 1.读取分类缓存 - Map map = getCategoryMap(); - // 2.根据id查询分类名称并组装 - StringBuilder sb = new StringBuilder(); - for (Long id : ids) { - sb.append(map.get(id).getName()).append("/"); - } - // 3.返回结果 - return sb.deleteCharAt(sb.length() - 1).toString(); - } - - public List getCategoryNameList(List ids) { - if (ids == null || ids.size() == 0) { - return CollUtils.emptyList(); - } - // 1.读取分类缓存 - Map map = getCategoryMap(); - // 2.根据id查询分类名称并组装 - List list = new ArrayList<>(ids.size()); - for (Long id : ids) { - list.add(map.get(id).getName()); - } - // 3.返回结果 - return list; - } - - public List queryCategoryByIds(List ids) { - if (ids == null || ids.size() == 0) { - return CollUtils.emptyList(); - } - Map map = getCategoryMap(); - return ids.stream() - .map(map::get) - .collect(Collectors.toList()); - } - - public List getNameByLv3Ids(List lv3Ids) { - Map map = getCategoryMap(); - List list = new ArrayList<>(lv3Ids.size()); - for (Long lv3Id : lv3Ids) { - CategoryBasicDTO lv3 = map.get(lv3Id); - CategoryBasicDTO lv2 = map.get(lv3.getParentId()); - CategoryBasicDTO lv1 = map.get(lv2.getParentId()); - list.add(lv1.getName() + lv2.getName() + lv3.getName()); - } - return list; - } - - public String getNameByLv3Id(Long lv3Id) { - Map map = getCategoryMap(); - CategoryBasicDTO lv3 = map.get(lv3Id); - CategoryBasicDTO lv2 = map.get(lv3.getParentId()); - CategoryBasicDTO lv1 = map.get(lv2.getParentId()); - return lv1.getName() + lv2.getName() + lv3.getName(); - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/cache/RoleCache.java b/tianji-master/tj-api/src/main/java/com/tianji/api/cache/RoleCache.java deleted file mode 100644 index d392bfa..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/cache/RoleCache.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.api.cache; - -import com.github.benmanes.caffeine.cache.Cache; -import com.tianji.api.client.auth.AuthClient; -import com.tianji.api.dto.auth.RoleDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.enums.UserType; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class RoleCache { - - private final Cache roleCaches; - private final AuthClient authClient; - - public String getRoleName(Long roleId) { - RoleDTO roleDTO = roleCaches.get(roleId, authClient::queryRoleById); - if (roleDTO == null) { - return null; - } - return roleDTO.getName(); - } - - public String exchangeRoleName(UserDTO u) { - if (u == null) { - return "--"; - } - if (UserType.STUDENT.equalsValue(u.getType())) { - // 学生,直接返回角色名称 - return u.getName(); - } else { - // 管理员需要拼接角色名称 - return getRoleName(u.getRoleId()) + "-" + u.getName(); - } - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/auth/AuthClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/auth/AuthClient.java deleted file mode 100644 index b1ca232..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/auth/AuthClient.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.api.client.auth; - -import com.tianji.api.dto.auth.RoleDTO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; - -import java.util.List; - -@FeignClient("auth-service") -public interface AuthClient { - - @GetMapping("/roles/{id}") - RoleDTO queryRoleById(@PathVariable("id") Long id); - - @GetMapping("/roles/list") - List listAllRoles(); -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CatalogueClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CatalogueClient.java deleted file mode 100644 index 8cb828e..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CatalogueClient.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.api.client.course; - -import com.tianji.api.dto.course.CataSimpleInfoDTO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; - -@FeignClient(contextId = "catalogue", value = "course-service",path = "catalogues") -public interface CatalogueClient { - - /** - * 根据目录id列表查询目录信息 - * - * @param ids 目录id列表 - * @return id列表中对应的目录基础信息 - */ - @GetMapping("/batchQuery") - List batchQueryCatalogue(@RequestParam("ids") Iterable ids); - - -} \ No newline at end of file diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CategoryClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CategoryClient.java deleted file mode 100644 index f786c4e..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CategoryClient.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.api.client.course; - -import com.tianji.api.dto.course.CategoryBasicDTO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; - -import java.util.List; - -@FeignClient(contextId = "category",value = "course-service",path = "categorys") -public interface CategoryClient { - - /** - * 获取所有课程及课程分类 - * @return 所有课程及课程分类 - */ - @GetMapping("getAllOfOneLevel") - List getAllOfOneLevel(); -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CourseClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CourseClient.java deleted file mode 100644 index be6540d..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/CourseClient.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.tianji.api.client.course; - -import com.tianji.api.dto.course.*; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; - -@FeignClient(contextId = "course", value = "course-service") -public interface CourseClient { - - /** - * 根据老师id列表获取老师出题数据和讲课数据 - * @param teacherIds 老师id列表 - * @return 老师id和老师对应的出题数和教课数 - */ - @GetMapping("/course/infoByTeacherIds") - List infoByTeacherIds(@RequestParam("teacherIds") Iterable teacherIds); - - /** - * 根据小节id获取小节对应的mediaId和课程id - * - * @param sectionId 小节id - * @return 小节对应的mediaId和课程id - */ - @GetMapping("/course/section/{id}") - SectionInfoDTO sectionInfo(@PathVariable("id") Long sectionId); - - /** - * 根据媒资Id列表查询媒资被引用的次数 - * - * @param mediaIds 媒资id列表 - * @return 媒资id和媒资被引用的次数的列表 - */ - @GetMapping("/course/media/useInfo") - List mediaUserInfo(@RequestParam("mediaIds") Iterable mediaIds); - - /** - * 根据课程id查询索引库需要的数据 - * - * @param id 课程id - * @return 索引库需要的数据 - */ - @GetMapping("/course/{id}/searchInfo") - CourseSearchDTO getSearchInfo(@PathVariable("id") Long id); - - /** - * 根据课程id集合查询课程简单信息 - * @param ids id集合 - * @return 课程简单信息的列表 - */ - @GetMapping("/courses/simpleInfo/list") - List getSimpleInfoList(@RequestParam("ids") Iterable ids); - - /** - * 根据课程id,获取课程、目录、教师信息 - * @param id 课程id - * @return 课程信息、目录信息、教师信息 - */ - @GetMapping("/course/{id}") - CourseFullInfoDTO getCourseInfoById( - @PathVariable("id") Long id, - @RequestParam(value = "withCatalogue", required = false) boolean withCatalogue, - @RequestParam(value = "withTeachers", required = false) boolean withTeachers - ); -} \ No newline at end of file diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/SubjectClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/SubjectClient.java deleted file mode 100644 index 70da3d2..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/course/SubjectClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.api.client.course; - -import com.tianji.api.dto.course.SubjectDTO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; - -@FeignClient(value = "course-service", path = "subjects") -public interface SubjectClient { - - @GetMapping("list") - List queryByIds(@RequestParam("ids") Iterable ids); -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/exam/ExamClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/exam/ExamClient.java deleted file mode 100644 index e0abcc3..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/exam/ExamClient.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.api.client.exam; - -import com.tianji.api.dto.exam.QuestionBizDTO; -import com.tianji.api.dto.exam.QuestionDTO; -import io.swagger.annotations.ApiParam; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; -import java.util.Map; - -@FeignClient("exam-service") -public interface ExamClient { - - @PostMapping("/question-biz/list") - void saveQuestionBizInfoBatch(@RequestBody Iterable qbs); - - @GetMapping("/question-biz/biz/list") - List queryQuestionIdsByBizIds(@RequestParam("ids") Iterable bizIds); - - @GetMapping("/question-biz/scores") - Map queryQuestionScoresByBizIds(@RequestParam("ids") Iterable bizIds); - - @GetMapping("/questions/list") - List queryQuestionByIds(@ApiParam("要查询的题目的id集合") @RequestParam("ids") Iterable ids); - - @GetMapping("/questions/numOfTeacher") - Map countSubjectNumOfTeacher(@RequestParam("ids") Iterable createrIds); - - @GetMapping("/questions//scores") - Map queryQuestionScores( - @ApiParam("要查询的题目的id集合") @RequestParam("ids") Iterable ids); -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/learning/LearningClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/learning/LearningClient.java deleted file mode 100644 index e965ecb..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/learning/LearningClient.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.api.client.learning; - -import com.tianji.api.client.learning.fallback.LearningClientFallback; -import com.tianji.api.dto.leanring.LearningLessonDTO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; - -@FeignClient(value = "learning-service", fallbackFactory = LearningClientFallback.class) -public interface LearningClient { - - /** - * 统计课程学习人数 - * @param courseId 课程id - * @return 学习人数 - */ - @GetMapping("/lessons/{courseId}/count") - Integer countLearningLessonByCourse(@PathVariable("courseId") Long courseId); - - /** - * 校验当前用户是否可以学习当前课程 - * @param courseId 课程id - * @return true:课程有效,false:课程无效,不能学习 - */ - @GetMapping("/lessons/{courseId}/valid") - Long isLessonValid(@PathVariable("courseId") Long courseId); - - /** - * 查询当前用户指定课程的学习进度 - * @param courseId 课程id - * @return 课表信息、学习记录及进度信息 - */ - @GetMapping("/learning-records/course/{courseId}") - LearningLessonDTO queryLearningRecordByCourse(@PathVariable("courseId") Long courseId); - -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/learning/fallback/LearningClientFallback.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/learning/fallback/LearningClientFallback.java deleted file mode 100644 index 6d21d9a..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/learning/fallback/LearningClientFallback.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.api.client.learning.fallback; - -import com.tianji.api.client.learning.LearningClient; -import com.tianji.api.dto.leanring.LearningLessonDTO; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.openfeign.FallbackFactory; - -@Slf4j -public class LearningClientFallback implements FallbackFactory { - - @Override - public LearningClient create(Throwable cause) { - log.error("查询学习服务异常", cause); - return new LearningClient() { - @Override - public Integer countLearningLessonByCourse(Long courseId) { - return 0; - } - - @Override - public Long isLessonValid(Long courseId) { - return null; - } - - @Override - public LearningLessonDTO queryLearningRecordByCourse(Long courseId) { - return null; - } - }; - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/remark/RemarkClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/remark/RemarkClient.java deleted file mode 100644 index 1c86888..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/remark/RemarkClient.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.api.client.remark; - -import com.tianji.api.client.remark.fallback.RemarkClientFallback; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.Set; - -@FeignClient(value = "remark-service", fallbackFactory = RemarkClientFallback.class) -public interface RemarkClient { - @GetMapping("/likes/list") - Set isBizLiked(@RequestParam("bizIds") Iterable bizIds); -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/remark/fallback/RemarkClientFallback.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/remark/fallback/RemarkClientFallback.java deleted file mode 100644 index f376e5a..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/remark/fallback/RemarkClientFallback.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.api.client.remark.fallback; - -import com.tianji.api.client.remark.RemarkClient; -import com.tianji.common.utils.CollUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.openfeign.FallbackFactory; - -import java.util.Set; - -@Slf4j -public class RemarkClientFallback implements FallbackFactory { - - @Override - public RemarkClient create(Throwable cause) { - log.error("查询remark-service服务异常", cause); - return new RemarkClient() { - - @Override - public Set isBizLiked(Iterable bizIds) { - return CollUtils.emptySet(); - } - }; - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/search/SearchClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/search/SearchClient.java deleted file mode 100644 index ff22b60..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/search/SearchClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.api.client.search; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; - -@FeignClient("search-service") -public interface SearchClient { - - @GetMapping("/courses/name") - List queryCoursesIdByName( - @RequestParam(value = "keyword", required = false) String keyword); -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/trade/TradeClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/trade/TradeClient.java deleted file mode 100644 index 123ef93..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/trade/TradeClient.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.tianji.api.client.trade; - -import com.tianji.api.client.trade.fallback.TradeClientFallback; -import com.tianji.api.dto.course.CoursePurchaseInfoDTO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; -import java.util.Map; - -@FeignClient(value = "trade-service", fallbackFactory = TradeClientFallback.class) -public interface TradeClient { - /** - * 统计指定课程的报名人数 - * @param courseIdList 课程id集合 - * @return 统计结果 - */ - @GetMapping("/order-details/enrollNum") - Map countEnrollNumOfCourse(@RequestParam("courseIdList") List courseIdList); - - /** - * 统计指定学生的报名课程数量 - * @param studentIds 学生id集合 - * @return 统计结果 - */ - @GetMapping("/order-details/enrollCourse") - Map countEnrollCourseOfStudent(@RequestParam("studentIds") List studentIds); - - /** - * 检查当前用户是否报名指定课程 - * @param id 课程id - * @return 是否报名 - */ - @GetMapping("/order-details/course/{id}") - Boolean checkMyLesson(@PathVariable("id") Long id); - - /** - * 统计课程购买、退款状态 - * @param courseId 课程id - * @return 统计结果 - */ - @GetMapping("/order-details/purchaseInfo") - CoursePurchaseInfoDTO getPurchaseInfoOfCourse(@RequestParam("courseId") Long courseId); -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/trade/fallback/TradeClientFallback.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/trade/fallback/TradeClientFallback.java deleted file mode 100644 index 1a46c4a..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/trade/fallback/TradeClientFallback.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.api.client.trade.fallback; - -import com.tianji.api.client.trade.TradeClient; -import com.tianji.api.dto.course.CoursePurchaseInfoDTO; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.openfeign.FallbackFactory; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Slf4j -public class TradeClientFallback implements FallbackFactory { - - @Override - public TradeClient create(Throwable cause) { - log.error("查询交易服务异常", cause); - return new TradeClient() { - - @Override - public Map countEnrollNumOfCourse(List courseIdList) { - return new HashMap<>(); - } - - @Override - public Map countEnrollCourseOfStudent(List studentIds) { - return new HashMap<>(); - } - - @Override - public Boolean checkMyLesson(Long id) { - return false; - } - - @Override - public CoursePurchaseInfoDTO getPurchaseInfoOfCourse(Long courseId) { - return new CoursePurchaseInfoDTO(); - } - }; - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/user/UserClient.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/user/UserClient.java deleted file mode 100644 index 5356376..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/user/UserClient.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.tianji.api.client.user; - - -import com.tianji.api.client.user.fallback.UserClientFallback; -import com.tianji.api.dto.user.LoginFormDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.domain.dto.LoginUserDTO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@FeignClient(value = "user-service", fallbackFactory = UserClientFallback.class) -public interface UserClient { - - /** - * 根据手机号查询用户id - * @param phone 手机号 - * @return 用户id - */ - @GetMapping("/users/ids") - Long exchangeUserIdWithPhone(@RequestParam("phone") String phone); - - /** - * 登录接口 - * @param loginDTO 登录信息 - * @param isStaff 是否是员工 - * @return 用户详情 - */ - @PostMapping("/users/detail/{isStaff}") - LoginUserDTO queryUserDetail(@RequestBody LoginFormDTO loginDTO, @PathVariable("isStaff") boolean isStaff); - - /** - * 查询用户类型 - * @param id 用户id - * @return 用户类型,0-普通学员,1-老师,2-其他员工 - */ - @GetMapping("/users/{id}/type") - Integer queryUserType(@PathVariable("id") Long id); - - /** - *

根据id批量查询用户信息

- * @param ids 用户id集合 - * @return 用户集合 - */ - @GetMapping("/users/list") - List queryUserByIds(@RequestParam("ids") Iterable ids); - - - /** - * 根据id查询单个学生信息 - * @param id 用户id - * @return 学生 - */ - @GetMapping("/users/{id}") - UserDTO queryUserById(@PathVariable("id") Long id); -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/client/user/fallback/UserClientFallback.java b/tianji-master/tj-api/src/main/java/com/tianji/api/client/user/fallback/UserClientFallback.java deleted file mode 100644 index d880ed8..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/client/user/fallback/UserClientFallback.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.tianji.api.client.user.fallback; - -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.user.LoginFormDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.domain.dto.LoginUserDTO; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.openfeign.FallbackFactory; - -import java.util.Collections; -import java.util.List; - -@Slf4j -public class UserClientFallback implements FallbackFactory { - @Override - public UserClient create(Throwable cause) { - log.error("查询用户服务出现异常", cause); - return new UserClient() { - @Override - public Long exchangeUserIdWithPhone(String phone) { - return null; - } - - @Override - public LoginUserDTO queryUserDetail(LoginFormDTO loginDTO, boolean isStaff) { - return null; - } - - @Override - public Integer queryUserType(Long id) { - return null; - } - - @Override - public List queryUserByIds(Iterable ids) { - return Collections.emptyList(); - } - - @Override - public UserDTO queryUserById(Long id) { - return null; - } - }; - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/config/CategoryCacheConfig.java b/tianji-master/tj-api/src/main/java/com/tianji/api/config/CategoryCacheConfig.java deleted file mode 100644 index 10234cf..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/config/CategoryCacheConfig.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.tianji.api.config; - -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.tianji.api.cache.CategoryCache; -import com.tianji.api.client.course.CategoryClient; -import com.tianji.api.dto.course.CategoryBasicDTO; -import org.springframework.context.annotation.Bean; - -import java.time.Duration; -import java.util.Map; - -public class CategoryCacheConfig { - /** - * 课程分类的caffeine缓存 - */ - @Bean - public Cache> categoryCaches(){ - return Caffeine.newBuilder() - .initialCapacity(1) // 容量限制 - .maximumSize(10_000) // 最大内存限制 - .expireAfterWrite(Duration.ofMinutes(30)) // 有效期 - .build(); - } - /** - * 课程分类的缓存工具类 - */ - @Bean - public CategoryCache categoryCache( - Cache> categoryCaches, CategoryClient categoryClient){ - return new CategoryCache(categoryCaches, categoryClient); - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/config/FallbackConfig.java b/tianji-master/tj-api/src/main/java/com/tianji/api/config/FallbackConfig.java deleted file mode 100644 index 6fbe4db..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/config/FallbackConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.api.config; - -import com.tianji.api.client.learning.fallback.LearningClientFallback; -import com.tianji.api.client.remark.fallback.RemarkClientFallback; -import com.tianji.api.client.trade.fallback.TradeClientFallback; -import com.tianji.api.client.user.fallback.UserClientFallback; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class FallbackConfig { - @Bean - public LearningClientFallback learningClientFallback(){ - return new LearningClientFallback(); - } - - @Bean - public TradeClientFallback tradeClientFallback(){ - return new TradeClientFallback(); - } - - @Bean - public UserClientFallback userClientFallback(){ - return new UserClientFallback(); - } - - @Bean - public RemarkClientFallback remarkClientFallback(){ - return new RemarkClientFallback(); - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/config/RequestIdRelayConfiguration.java b/tianji-master/tj-api/src/main/java/com/tianji/api/config/RequestIdRelayConfiguration.java deleted file mode 100644 index e4755a2..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/config/RequestIdRelayConfiguration.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.api.config; - - -import feign.RequestInterceptor; -import org.slf4j.MDC; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import static com.tianji.common.constants.Constant.*; - -@Configuration -@EnableFeignClients(basePackages = "com.tianji.api.client") -public class RequestIdRelayConfiguration { - - @Bean - public RequestInterceptor requestIdInterceptor(){ - return template -> template - .header(REQUEST_ID_HEADER, MDC.get(REQUEST_ID_HEADER)) - .header(REQUEST_FROM_HEADER, FEIGN_ORIGIN_NAME); - } -} \ No newline at end of file diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/config/RoleCacheConfig.java b/tianji-master/tj-api/src/main/java/com/tianji/api/config/RoleCacheConfig.java deleted file mode 100644 index 4396b78..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/config/RoleCacheConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.api.config; - -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.tianji.api.cache.RoleCache; -import com.tianji.api.client.auth.AuthClient; -import com.tianji.api.dto.auth.RoleDTO; -import org.springframework.context.annotation.Bean; - -import java.time.Duration; - -public class RoleCacheConfig { - /** - * 角色的caffeine缓存 - */ - @Bean - public Cache roleCaches(){ - return Caffeine.newBuilder() - .initialCapacity(1) - .maximumSize(10_000) - .expireAfterWrite(Duration.ofMinutes(30)) - .build(); - } - /** - * 角色的缓存工具 - */ - @Bean - public RoleCache roleCache(Cache roleCaches, AuthClient authClient){ - return new RoleCache(roleCaches, authClient); - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/constants/CourseStatus.java b/tianji-master/tj-api/src/main/java/com/tianji/api/constants/CourseStatus.java deleted file mode 100644 index 8e5f9dd..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/constants/CourseStatus.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.api.constants; - -import com.tianji.common.enums.BaseEnum; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author wusongsong - * @since 2022/7/18 16:07 - * @version 1.0.0 - **/ -@Getter -@AllArgsConstructor -public enum CourseStatus implements BaseEnum { - NO_UP_SHELF(1, "待上架"), - SHELF(2, "已上架"), - DOWN_SHELF(3, "下架"), - FINISHED(4, "已完结"); - - private final int value; - private final String desc; - - public static String desc(Integer status) { - if (status == null) { - return ""; - } - for (CourseStatus courseStatus : values()) { - if (courseStatus.getValue() == status) { - return courseStatus.getDesc(); - } - } - return null; - } -} \ No newline at end of file diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/constants/SmsConstants.java b/tianji-master/tj-api/src/main/java/com/tianji/api/constants/SmsConstants.java deleted file mode 100644 index 472edea..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/constants/SmsConstants.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.tianji.api.constants; - -public interface SmsConstants { - String VERIFY_CODE_PARAM_NAME = "code"; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/IdAndNumDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/IdAndNumDTO.java deleted file mode 100644 index 25a47c4..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/IdAndNumDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tianji.api.dto; - -import com.tianji.common.utils.CollUtils; -import lombok.Data; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * id和nun模型,一个id对应的数量可以用与查询id和num的关系 - * @author wusongsong - * @since 2022/8/3 9:27 - * @version 1.0.0 - **/ -@Data -public class IdAndNumDTO { - private Long id; - private Integer num; - - public static Map toMap(List list){ - if (CollUtils.isEmpty(list)) { - return CollUtils.emptyMap(); - } - return list.stream().collect(Collectors.toMap(IdAndNumDTO::getId, IdAndNumDTO::getNum)); - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/auth/RoleDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/auth/RoleDTO.java deleted file mode 100644 index 7f08810..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/auth/RoleDTO.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.tianji.api.dto.auth; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - *

- * 角色表 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@ApiModel(description = "角色实体") -public class RoleDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @ApiModelProperty(value = "主键", example = "1") - private Long id; - - /** - * 角色代号,例如:admin - */ - @ApiModelProperty(value = "角色代号", example = "admin") - private String code; - - /** - * 角色描述 - */ - @ApiModelProperty(value = "角色名称", example = "教师") - private String name; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CataSimpleInfoDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CataSimpleInfoDTO.java deleted file mode 100644 index a69325e..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CataSimpleInfoDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @author wusongsong - * @since 2022/7/27 14:22 - * @version 1.0.0 - **/ -@Data -public class CataSimpleInfoDTO { - @ApiModelProperty("目录id") - private Long id; - @ApiModelProperty("目录名称") - private String name; - @ApiModelProperty("数字序号,不包含章序号") - private Integer cIndex; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CatalogueDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CatalogueDTO.java deleted file mode 100644 index 5ab2464..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CatalogueDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -/** - * @author wusongsong - * @since 2022/7/11 16:42 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "课程目录") -public class CatalogueDTO { - @ApiModelProperty("章、节、练习id") - private Long id; - @ApiModelProperty("序号") - private Integer index; - @ApiModelProperty("章节练习名称") - private String name; - @ApiModelProperty("课程总时长,单位秒") - private Integer mediaDuration; - @ApiModelProperty("是否支持免费试看") - private Boolean trailer; - @ApiModelProperty("媒资名称") - private String mediaName; - @ApiModelProperty("媒资id") - private Long mediaId; - @ApiModelProperty("目录类型1:章,2:节,3:测试") - private Integer type; - @ApiModelProperty("题目数量") - private Integer subjectNum; - @ApiModelProperty("题目总分") - private Integer totalScore; - @ApiModelProperty("是否可以修改,默认不能修改") - private Boolean canUpdate = false; - @ApiModelProperty("该章的所有小节和练习") - private List sections; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CategoryBasicDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CategoryBasicDTO.java deleted file mode 100644 index a7501aa..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CategoryBasicDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "分类id和名称信息") -public class CategoryBasicDTO { - @ApiModelProperty(value = "分类id", example = "1") - private Long id; - @ApiModelProperty(value = "分类名称", example = "Java") - private String name; - @ApiModelProperty(value = "父分类id", example = "0") - private Long parentId; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CategoryDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CategoryDTO.java deleted file mode 100644 index 7c163dd..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CategoryDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * @ClassName CategoryDTO - * @author wusongsong - * @since 2022/7/21 14:51 - * @version 1.0.0 - **/ -@Data -@ApiModel("课程分类") -public class CategoryDTO { - @ApiModelProperty("课程分类id") - private Long id; - @ApiModelProperty("课程分类名称") - private String name; - @ApiModelProperty("三级分类数量") - private Integer thirdCategoryNum; - @ApiModelProperty("课程数量") - private Integer courseNum; - @ApiModelProperty("状态:1:正常,2:禁用") - private Integer status; - @ApiModelProperty("状态描述") - private String statusDesc; - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - @ApiModelProperty("排序") - private Integer index; - @ApiModelProperty("父id") - private Long parentId; - @ApiModelProperty("级别") - private Integer level; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseDTO.java deleted file mode 100644 index 298f75f..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseDTO.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@ApiModel("课程信息") -@Data -public class CourseDTO { - @ApiModelProperty("课程id") - private Long id; - @ApiModelProperty("课程名称") - private String name; - @ApiModelProperty("一级课程分类id") - private Long categoryIdLv1; - @ApiModelProperty("二级课程分类id") - private Long categoryIdLv2; - @ApiModelProperty("三级课程分类id") - private Long categoryIdLv3; - @ApiModelProperty("课程封面") - private String coverUrl; - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - @ApiModelProperty("价格") - private Integer price; - @ApiModelProperty("视频播放时长") - private Integer duration; - @ApiModelProperty("课程有效期天数") - private Integer validDuration; - @ApiModelProperty("是否免费") - private Boolean free; - @ApiModelProperty("发布时间") - private LocalDateTime publishTime; - @ApiModelProperty("章节数") - private Integer sections; - @ApiModelProperty("课程状态") - private Byte status; - @ApiModelProperty("老师id") - private Long teacher; - @ApiModelProperty("课程类型,1:直播课程,2:录播课程") - private Integer courseType; - @ApiModelProperty("更新时间") - private Long updater; - @ApiModelProperty("课程进行到的步骤,1:基本信息,2:目录,3:课程视频,4:课程题目,5:课程老师") - private Integer step; - @ApiModelProperty(value = "课程报名人数(销量)", example = "3920") - private Integer sold = 0; - @ApiModelProperty(value = "课程评价得分,45代表4.5星", example = "35") - private Integer score = 0; - @ApiModelProperty("课程是否禁用,0:禁用,1:启用") - private Integer enable; -} \ No newline at end of file diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseFullInfoDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseFullInfoDTO.java deleted file mode 100644 index 512c3c4..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseFullInfoDTO.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.tianji.api.dto.course; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 课程信息 - * - * @author wusongsong - * @since 2022/8/5 16:54 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "课程详细信息,包含课程、目录、教师") -public class CourseFullInfoDTO { - @ApiModelProperty("课程id") - private Long id; - @ApiModelProperty("课程名称") - private String name; - @ApiModelProperty("封面链接") - private String coverUrl; - @ApiModelProperty("价格") - private Integer price; - @ApiModelProperty("一级课程分类id") - private Long firstCateId; - @ApiModelProperty("二级课程分类id") - private Long secondCateId; - @ApiModelProperty("三级课程分类id") - private Long thirdCateId; - @ApiModelProperty("课程总节数") - private Integer sectionNum; - @ApiModelProperty("课程购买有效期结束时间") - private LocalDateTime purchaseEndTime; - @ApiModelProperty("课程学习有效期") - private Integer validDuration; - @ApiModelProperty("课程章信息") - private List chapters; - @ApiModelProperty("老师列表") - private List teacherIds; - @JsonIgnore - public List getCategoryIds(){ - return List.of(firstCateId, secondCateId, thirdCateId); - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CoursePurchaseInfoDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CoursePurchaseInfoDTO.java deleted file mode 100644 index 3e596ec..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CoursePurchaseInfoDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 课程支付相关信息 课程状态 - * @author wusongsong - * @since 2022/7/26 20:41 - * @version 1.0.0 - **/ -@Data -@ApiModel("课程购买信息") -@NoArgsConstructor -@AllArgsConstructor -public class CoursePurchaseInfoDTO { - @ApiModelProperty("报名人数") - private Integer enrollNum; - @ApiModelProperty("退款人数") - private Integer refundNum; - @ApiModelProperty("实付总金额") - private Integer realPayAmount; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseSearchDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseSearchDTO.java deleted file mode 100644 index 470d009..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseSearchDTO.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 课程信息 - * @ClassName CourseDTO - * @author wusongsong - * @since 2022/7/18 13:12 - * @version 1.0.0 - **/ -@ApiModel(description = "课程信息") -@Data -public class CourseSearchDTO { - @ApiModelProperty("课程id") - private Long id; - @ApiModelProperty("课程名称") - private String name; - @ApiModelProperty("一级课程分类id") - private Long categoryIdLv1; - @ApiModelProperty("二级课程分类id") - private Long categoryIdLv2; - @ApiModelProperty("三级课程分类id") - private Long categoryIdLv3; - @ApiModelProperty("课程封面") - private String coverUrl; - @ApiModelProperty("价格") - private Integer price; - @ApiModelProperty("是否免费") - private Boolean free; - @ApiModelProperty("发布时间") - private LocalDateTime publishTime; - @ApiModelProperty("章节数") - private Integer sections; - @ApiModelProperty("课程时长") - private Integer duration; - @ApiModelProperty("老师id") - private Long teacher; - @ApiModelProperty("课程类型,1:直播课程,2:录播课程") - private Integer courseType; - @ApiModelProperty(value = "课程报名人数(销量)", example = "3920") - private Integer sold = 0; - @ApiModelProperty(value = "课程评价得分,45代表4.5星", example = "35") - private Integer score = 0; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseSimpleInfoDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseSimpleInfoDTO.java deleted file mode 100644 index 40c7c12..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/CourseSimpleInfoDTO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.tianji.api.dto.course; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * @author wusongsong - * @since 2022/7/27 14:32 - * @version 1.0.0 - **/ -@Data -public class CourseSimpleInfoDTO { - @ApiModelProperty("课程id") - private Long id; - @ApiModelProperty("课程名称") - private String name; - @ApiModelProperty("封面url") - private String coverUrl; - @ApiModelProperty("价格") - private Integer price; - @ApiModelProperty("课程状态") - private Integer status; - @ApiModelProperty("是否是免费课程") - private Boolean free; - @ApiModelProperty("一级分类id") - private Long firstCateId; - @ApiModelProperty("二级分类id") - private Long secondCateId; - @ApiModelProperty("三级分类id") - private Long thirdCateId; - @ApiModelProperty("小节数量") - private Integer sectionNum; - @ApiModelProperty("课程购买有效期结束时间") - private LocalDateTime purchaseEndTime; - @ApiModelProperty("课程学习有效期,单位:月") - private Integer validDuration; - @JsonIgnore - public List getCategoryIds(){ - return List.of(firstCateId, secondCateId, thirdCateId); - } -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/MediaQuoteDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/MediaQuoteDTO.java deleted file mode 100644 index 55273cc..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/MediaQuoteDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @ClassName MediaQuoteDTO - * @author wusongsong - * @since 2022/7/18 17:43 - * @version 1.0.0 - **/ -@ApiModel("媒资被引用情况") -@Data -@AllArgsConstructor -@NoArgsConstructor -public class MediaQuoteDTO { - @ApiModelProperty("媒资id") - private Long mediaId; - @ApiModelProperty("引用数") - private Integer quoteNum; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SectionInfoDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SectionInfoDTO.java deleted file mode 100644 index 299e397..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SectionInfoDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@ApiModel("小节信息,包含课程id和媒资id") -@AllArgsConstructor -@NoArgsConstructor -public class SectionInfoDTO { - @ApiModelProperty("课程id") - private Long courseId; - @ApiModelProperty("媒资id") - private Long mediaId; - @ApiModelProperty("是否支持免费试看") - private Boolean trailer; - @ApiModelProperty("免费时长,不免费为0,单位分钟") - private Integer freeDuration; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SubNumAndCourseNumDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SubNumAndCourseNumDTO.java deleted file mode 100644 index 53a0741..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SubNumAndCourseNumDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 老师负责的课程数和出题数目的集合 - * @ClassName SubNumAndCourseNumDTO - * @author wusongsong - * @since 2022/7/18 15:12 - * @version 1.0.0 - **/ -@Data -@AllArgsConstructor -@NotNull -@ApiModel("老师id和老师对应的课程数,出题数") -public class SubNumAndCourseNumDTO { - @ApiModelProperty("老师id") - private Long teacherId; - @ApiModelProperty("老师负责的课程数") - private Integer courseNum; - @ApiModelProperty("老师出题数") - private Integer subjectNum; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SubjectDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SubjectDTO.java deleted file mode 100644 index 386a8ac..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/course/SubjectDTO.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.tianji.api.dto.course; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; -import java.util.List; - -/** - *

- * 考试记录表 - *

- * - * @author 虎哥 - * @since 2022-07-18 - */ -@Data -@ApiModel(description = "考试问题详情") -public class SubjectDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("问题id") - private Long id; - - @ApiModelProperty("题干") - private String name; - - @ApiModelProperty("选择题的选项") - private List options; - - @ApiModelProperty("分值") - private Integer score; - - @ApiModelProperty("问题类型,1:单选题,2:多选题,3:不定向选择题,4:判断题,5:主观题") - private Integer subjectType; - - @ApiModelProperty("难易度,1:简单,2:中等,3:困难") - private Integer difficulty; - - @ApiModelProperty("解析") - private String analysis; - - @ApiModelProperty("选择题答案,0对应A,1对应B,可填多个") - private List answers; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/exam/QuestionBizDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/exam/QuestionBizDTO.java deleted file mode 100644 index a4a2623..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/exam/QuestionBizDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.api.dto.exam; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -@Data -@ApiModel(description = "题目与业务关联信息") -@Accessors(chain = true) -@AllArgsConstructor(staticName = "of") -@NoArgsConstructor -public class QuestionBizDTO{ - - @ApiModelProperty("业务id,要关联问题的某业务id,例如小节id") - private Long bizId; - - @ApiModelProperty("题目id") - private Long questionId; - -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/exam/QuestionDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/exam/QuestionDTO.java deleted file mode 100644 index a6d442d..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/exam/QuestionDTO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.api.dto.exam; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.util.List; - -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@ApiModel(description = "题目数据") -public class QuestionDTO { - - @ApiModelProperty("题目id") - private Long id; - - @ApiModelProperty("题目名称,题干") - private String name; - - @ApiModelProperty("题目类型,1:单选题,2:多选题,3:不定向选择题,4:判断题,5:主观题") - private String type; - - @ApiModelProperty("难易度,1:简单,2:中等,3:困难") - private Integer difficulty; - - @ApiModelProperty("分值") - private Integer score; - - @ApiModelProperty("选择题选项,json数组格式") - private List options; - - @ApiModelProperty("选择题正确答案1到10,如果有多个答案,中间使用逗号隔开,如果是判断题,1:代表正确,其他代表错误") - private String answer; - - @ApiModelProperty("答案解析") - private String analysis; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningLessonDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningLessonDTO.java deleted file mode 100644 index c447839..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningLessonDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.api.dto.leanring; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@Data -@ApiModel(description = "学习课表进度信息") -public class LearningLessonDTO { - @ApiModelProperty("课表id") - private Long id; - @ApiModelProperty("最近学习的小节id") - private Long latestSectionId; - @ApiModelProperty("学习过的小节的记录") - private List records; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningRecordDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningRecordDTO.java deleted file mode 100644 index 97cfae8..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningRecordDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.api.dto.leanring; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "小节信息及学习进度") -public class LearningRecordDTO { - @ApiModelProperty("对应节的id") - private Long sectionId; - @ApiModelProperty("视频的当前观看时长,单位秒") - private Integer moment; - @ApiModelProperty("是否完成学习,默认false") - private Boolean finished; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningRecordFormDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningRecordFormDTO.java deleted file mode 100644 index e7bbd2a..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/leanring/LearningRecordFormDTO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tianji.api.dto.leanring; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "学习记录表单数据") -public class LearningRecordFormDTO { - - @ApiModelProperty("小节类型:1-视频,2-考试") - private Integer sectionType; - - @ApiModelProperty("课表id") - private Long lessonId; - - @ApiModelProperty("对应节的id") - private Long sectionId; - - @ApiModelProperty("视频总时长,单位秒") - private Integer duration; - - @ApiModelProperty("视频的当前观看时长,单位秒,第一次提交填0") - private Integer moment; - - @ApiModelProperty("提交时间") - private LocalDateTime commitTime; -} \ No newline at end of file diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/CouponDiscountDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/CouponDiscountDTO.java deleted file mode 100644 index fae6fef..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/CouponDiscountDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.api.dto.promotion; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@ApiModel(description = "订单的可用优惠券及折扣信息") -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class CouponDiscountDTO { - @ApiModelProperty("优惠券id") - private Long id; - @ApiModelProperty("优惠券规则") - private String rule; - @ApiModelProperty("本订单最大优惠金额") - private Integer discountAmount; -} \ No newline at end of file diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/OrderCouponDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/OrderCouponDTO.java deleted file mode 100644 index 440dd14..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/OrderCouponDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.api.dto.promotion; - - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@Data -@ApiModel(description = "订单中课程及优惠券信息") -public class OrderCouponDTO { - @ApiModelProperty("用户优惠券id") - private Long userCouponId; - @ApiModelProperty("订单中的课程列表") - private List courseList; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/OrderCourseDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/OrderCourseDTO.java deleted file mode 100644 index 36c0aa2..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/promotion/OrderCourseDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.api.dto.promotion; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "订单中的课程信息") -public class OrderCourseDTO { - @ApiModelProperty("课id") - private Long id; - @ApiModelProperty("课程的三级分类id") - private Long cateId; - @ApiModelProperty("课程价格") - private Integer price; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/remark/LikedTimesDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/remark/LikedTimesDTO.java deleted file mode 100644 index 7ef5182..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/remark/LikedTimesDTO.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tianji.api.dto.remark; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor(staticName = "of") -public class LikedTimesDTO { - private Long bizId; - private Integer likedTimes; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/sms/SmsInfoDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/sms/SmsInfoDTO.java deleted file mode 100644 index 21584f9..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/sms/SmsInfoDTO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.api.dto.sms; - -import io.swagger.annotations.ApiModel; -import lombok.Data; - -import java.util.Map; - -@Data -@ApiModel(description = "短信发送参数") -public class SmsInfoDTO { - private String templateCode; - private Iterable phones; - private Map templateParams; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/trade/OrderBasicDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/trade/OrderBasicDTO.java deleted file mode 100644 index 0eab8f7..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/trade/OrderBasicDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.api.dto.trade; - -import lombok.Builder; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Data -@Builder -public class OrderBasicDTO { - /** - * 订单id - */ - private Long orderId; - /** - * 下单用户id - */ - private Long userId; - /** - * 下单的课程id集合 - */ - private List courseIds; - /** - * 订单完成时间 - */ - private LocalDateTime finishTime; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/user/LoginFormDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/user/LoginFormDTO.java deleted file mode 100644 index 9e75b89..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/user/LoginFormDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.api.dto.user; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Data -@ApiModel(description = "登录表单实体") -public class LoginFormDTO { - @ApiModelProperty(value = "登录方式:1-密码登录; 2-验证码登录", example = "1", required = true) - @NotNull - private Integer type; - @ApiModelProperty(value = "用户名", example = "jack") - private String username; - @ApiModelProperty(value = "手机号", example = "13800010001") - private String cellPhone; - @ApiModelProperty(value = "密码", example = "123", required = true) - @NotNull - private String password; - @ApiModelProperty(value = "7天免密登录", example = "true") - private Boolean rememberMe = false; -} diff --git a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/user/UserDTO.java b/tianji-master/tj-api/src/main/java/com/tianji/api/dto/user/UserDTO.java deleted file mode 100644 index f9dff0e..0000000 --- a/tianji-master/tj-api/src/main/java/com/tianji/api/dto/user/UserDTO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.tianji.api.dto.user; - -import com.tianji.common.constants.RegexConstants; -import com.tianji.common.validate.annotations.EnumValid; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.Email; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; - -@Data -@ApiModel(description = "用户详情") -public class UserDTO { - @ApiModelProperty(value = "用户id", example = "1") - private Long id; - @ApiModelProperty(value = "手机", example = "13890011009") - @Pattern(regexp = RegexConstants.PHONE_PATTERN, message = "手机号格式错误") - private String cellPhone; - @ApiModelProperty(value = "用户名称/昵称", example = "李四") - private String name; - @ApiModelProperty(value = "用户类型,1-其他员工,2-普通学员,3-老师", example = "2") - @EnumValid(enumeration = {1,2,3}, message = "用户类型错误") - @NotNull - private Integer type; - @ApiModelProperty(value = "角色id,老师和学生不用填", example = "5") - private Long roleId; - @ApiModelProperty(value = "头像", example = "default-user-icon.jpg") - private String icon; - @ApiModelProperty(value = "岗位", example = "讲师") - private String job; - @ApiModelProperty(value = "个人介绍", example = "黑马高级Java讲师") - private String intro; - @ApiModelProperty(value = "形象照地址", example = "default-teacher-photo.jpg") - private String photo; - @ApiModelProperty(value = "用户名", example = "13800010004") - private String username; - @ApiModelProperty(value = "邮箱") - @Email - private String email; - @ApiModelProperty(value = "QQ号码") - private String qq; - @ApiModelProperty(value = "省") - private String province; - @ApiModelProperty(value = "市") - private String city; - @ApiModelProperty(value = "区") - private String district; - @ApiModelProperty(value = "性别:0-男性,1-女性", example = "0") - @EnumValid(enumeration = {0, 1}, message = "性别格式不正确") - private Integer gender; -} diff --git a/tianji-master/tj-api/src/main/resources/META-INF/spring.factories b/tianji-master/tj-api/src/main/resources/META-INF/spring.factories deleted file mode 100644 index c29e03e..0000000 --- a/tianji-master/tj-api/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,5 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.tianji.api.config.RequestIdRelayConfiguration, \ - com.tianji.api.config.RoleCacheConfig, \ - com.tianji.api.config.FallbackConfig, \ - com.tianji.api.config.CategoryCacheConfig \ No newline at end of file diff --git a/tianji-master/tj-auth/pom.xml b/tianji-master/tj-auth/pom.xml deleted file mode 100644 index 99b9307..0000000 --- a/tianji-master/tj-auth/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-auth - pom - - tj-auth-common - tj-auth-service - tj-auth-resource-sdk - tj-auth-gateway-sdk - - - - 11 - 11 - - - \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-common/pom.xml b/tianji-master/tj-auth/tj-auth-common/pom.xml deleted file mode 100644 index 9d53e7f..0000000 --- a/tianji-master/tj-auth/tj-auth-common/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - tj-auth - com.tianji - 1.0.0 - - 4.0.0 - - tj-auth-common - - - 11 - 11 - - - - - com.tianji - tj-common - 1.0.0 - - - \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/constants/AuthErrorInfo.java b/tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/constants/AuthErrorInfo.java deleted file mode 100644 index 609ad68..0000000 --- a/tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/constants/AuthErrorInfo.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tianji.auth.common.constants; - -public interface AuthErrorInfo { - - interface Msg { - String INVALID_STAFF_TYPE = "无效的账户类型"; - - - String INVALID_ROLE_ID = "绑定的角色不存在"; - String PRIVILEGE_EXISTS = "权限信息已存在"; - String PRIVILEGE_NOT_FOUND = "权限数据不存在"; - String ROLE_NOT_FOUND = "角色数据不存在"; - String MENU_NOT_FOUND = "菜单数据不存在"; - String UNAUTHORIZED = "未登录"; - String FORBIDDEN = "无访问权限"; - String INVALID_TOKEN = "无效的token"; - String EXPIRED_TOKEN = "token已过期"; - String INVALID_TOKEN_PAYLOAD = "token参数格式错误"; - } - - interface Code { - // 过期token - int EXPIRED_TOKEN_CODE = 40101; - // 无效token - int INVALID_TOKEN_CODE = 40102; - } -} \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/constants/JwtConstants.java b/tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/constants/JwtConstants.java deleted file mode 100644 index 30c603d..0000000 --- a/tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/constants/JwtConstants.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.auth.common.constants; - -import java.time.Duration; - -public class JwtConstants { - public static final String PAYLOAD_USER_KEY = "user"; - public static final String PAYLOAD_JTI_KEY = "jti"; - - public static final String JWT_REDIS_KEY_PREFIX = "jwt:uid:"; - // token过期时间,测试期间改为 1天,正常是5分钟 - public static final Duration JWT_TOKEN_TTL = Duration.ofMinutes(5); - // public static final Duration JWT_TOKEN_TTL = Duration.ofMinutes(60 * 24); - public static final Duration JWT_REFRESH_TTL = Duration.ofMinutes(30); - - public static final Duration JWT_REMEMBER_ME_TTL = Duration.ofDays(7); - - public static final String JWT_ALGORITHM = "rs256"; - public static final String AUTHORIZATION_HEADER = "authorization"; - public static final String REFRESH_HEADER = "refresh"; - - public static final String USER_HEADER = "user-info"; - - /* 权限缓存 KEY begin */ - public static final String AUTH_PRIVILEGE_KEY = "auth:privileges"; - public static final String AUTH_PRIVILEGE_VERSION_KEY = "version"; - public static final String LOCK_AUTH_PRIVILEGE_KEY = "lock:auth:privileges"; - /* 权限缓存 KEY end */ - -} diff --git a/tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/domain/PrivilegeRoleDTO.java b/tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/domain/PrivilegeRoleDTO.java deleted file mode 100644 index 500a0eb..0000000 --- a/tianji-master/tj-auth/tj-auth-common/src/main/java/com/tianji/auth/common/domain/PrivilegeRoleDTO.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tianji.auth.common.domain; - -import lombok.Data; - -import java.util.Set; - -@Data -public class PrivilegeRoleDTO { - private Long id; - private String antPath; - private Boolean internal; - private Set roles; -} diff --git a/tianji-master/tj-auth/tj-auth-gateway-sdk/pom.xml b/tianji-master/tj-auth/tj-auth-gateway-sdk/pom.xml deleted file mode 100644 index 7ec7e92..0000000 --- a/tianji-master/tj-auth/tj-auth-gateway-sdk/pom.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - tj-auth - com.tianji - 1.0.0 - - 4.0.0 - - tj-auth-gateway-sdk - - - 11 - 11 - - - - org.springframework.boot - spring-boot-starter-data-redis - - - com.tianji - tj-auth-common - 1.0.0 - - - org.springframework.cloud - spring-cloud-commons - - - - \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/config/AuthAutoConfiguration.java b/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/config/AuthAutoConfiguration.java deleted file mode 100644 index da6f3cb..0000000 --- a/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/config/AuthAutoConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.authsdk.gateway.config; - -import com.tianji.authsdk.gateway.util.AuthUtil; -import com.tianji.authsdk.gateway.util.JwtSignerHolder; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.redis.core.StringRedisTemplate; - -@Configuration -public class AuthAutoConfiguration { - - @Bean - @ConditionalOnClass(DiscoveryClient.class) - public JwtSignerHolder jwtSignerHolder(DiscoveryClient discoveryClient){ - return new JwtSignerHolder(discoveryClient); - } - - @Bean - public AuthUtil authUtil(JwtSignerHolder jwtSignerHolder, StringRedisTemplate stringRedisTemplate){ - return new AuthUtil(jwtSignerHolder, stringRedisTemplate); - } -} diff --git a/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/util/AuthUtil.java b/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/util/AuthUtil.java deleted file mode 100644 index fb8c2c0..0000000 --- a/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/util/AuthUtil.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.tianji.authsdk.gateway.util; - - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.exceptions.ValidateException; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import cn.hutool.jwt.JWT; -import cn.hutool.jwt.JWTValidator; -import com.tianji.auth.common.domain.PrivilegeRoleDTO; -import com.tianji.common.domain.R; -import com.tianji.common.domain.dto.LoginUserDTO; -import com.tianji.common.exceptions.ForbiddenException; -import com.tianji.common.exceptions.UnauthorizedException; -import com.tianji.common.utils.StringUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.BoundHashOperations; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.util.AntPathMatcher; - -import java.util.*; -import java.util.stream.Collectors; - -import static com.tianji.auth.common.constants.AuthErrorInfo.Code.EXPIRED_TOKEN_CODE; -import static com.tianji.auth.common.constants.AuthErrorInfo.Code.INVALID_TOKEN_CODE; -import static com.tianji.auth.common.constants.AuthErrorInfo.Msg.*; -import static com.tianji.auth.common.constants.JwtConstants.*; - -@Slf4j -public class AuthUtil { - // 缓存权限信息 - private Map privileges = new HashMap<>(); - // 要拦截的路径匹配符的集合 - private Set paths = new HashSet<>(); - // 权限版本信息,减少不必要的缓存处理 - private int privilegeVersion; - - private final AntPathMatcher antPathMatcher = new AntPathMatcher(); - private final JwtSignerHolder jwtSignerHolder; - private final StringRedisTemplate stringRedisTemplate; - private final BoundHashOperations hashOps; - - public AuthUtil(JwtSignerHolder jwtSignerHolder, StringRedisTemplate stringRedisTemplate) { - this.jwtSignerHolder = jwtSignerHolder; - this.stringRedisTemplate = stringRedisTemplate; - this.hashOps = stringRedisTemplate.boundHashOps(AUTH_PRIVILEGE_KEY); - } - - public R parseToken(String token) { - // 1.校验token是否为空 - if(StringUtils.isBlank(token)){ - return R.error(INVALID_TOKEN_CODE, INVALID_TOKEN); - } - JWT jwt = null; - try { - jwt = JWT.of(token).setSigner(jwtSignerHolder.getJwtSigner()); - } catch (Exception e) { - return R.error(INVALID_TOKEN_CODE, INVALID_TOKEN); - } - // 2.校验jwt是否有效 - if (!jwt.verify()) { - // 验证失败,返回空 - return R.error(INVALID_TOKEN_CODE, INVALID_TOKEN); - } - // 3.校验是否过期 - try { - JWTValidator.of(jwt).validateDate(); - } catch (ValidateException e) { - return R.error(EXPIRED_TOKEN_CODE, EXPIRED_TOKEN); - } - // 4.数据格式校验 - Object userPayload = jwt.getPayload(PAYLOAD_USER_KEY); - if (userPayload == null) { - // 数据为空 - return R.error(INVALID_TOKEN_CODE, INVALID_TOKEN_PAYLOAD); - } - - // 5.数据解析 - LoginUserDTO userDTO; - try { - userDTO = ((JSONObject)userPayload).toBean(LoginUserDTO.class); - } catch (RuntimeException e) { - // token格式有误 - return R.error(INVALID_TOKEN_CODE, INVALID_TOKEN_PAYLOAD); - } - - // 6.返回 - return R.ok(userDTO); - } - - public void checkAuth(String antPath, R r){ - // 1.判断是否是需要权限的路径 - String matchPath = findMatchPath(antPath); - if(matchPath == null){ - // 没有权限限制,直接放行 - return; - } - // 2.判断是否登录成功 - if(!r.success()){ - // 未登录,直接报错 - throw new UnauthorizedException(r.getCode(), r.getMsg()); - } - // 3.获取当前路径所需权限 - PrivilegeRoleDTO pathPrivilege = findPathPrivilege(matchPath); - - // 4.权限判断 - Set requiredRoles = pathPrivilege.getRoles(); - if (!CollectionUtil.contains(requiredRoles, r.getData().getRoleId())) { - // 没有访问权限 - throw new ForbiddenException(FORBIDDEN); - } - } - - private String findMatchPath(String antPath){ - String matchPath = null; - for (String pathPattern : paths) { - if(antPathMatcher.match(pathPattern, antPath)){ - matchPath = pathPattern; - break; - } - } - return matchPath; - } - - private PrivilegeRoleDTO findPathPrivilege(String path){ - return privileges.get(path); - } - - private List loadPrivileges(){ - List values = hashOps.values(); - if(CollUtil.isEmpty(values)){ - return Collections.emptyList(); - } - return values.stream() - .map(json -> JSONUtil.toBean(json, PrivilegeRoleDTO.class)) - .collect(Collectors.toList()); - } - - private int currentVersion() { - String version = stringRedisTemplate.opsForValue().get(AUTH_PRIVILEGE_VERSION_KEY); - if(StrUtil.isEmpty(version)){ - return 0; - } - return Integer.parseInt(version); - } - - - @Scheduled(fixedDelay = 20000) - public void refreshTask(){ - // 1.获取版本号 - int currentVersion = currentVersion(); - if (currentVersion == this.privilegeVersion) { - // 版本一致,说明数据没有更新,直接结束任务 - return; - } - // 2.获取最新权限信息 - List privilegeRoleDTOS = loadPrivileges(); - if(CollUtil.isEmpty(privilegeRoleDTOS)){ - // 更新版本 - this.privilegeVersion = currentVersion; - return; - } - // 3.数据处理 - Map map = new HashMap<>(); - for (PrivilegeRoleDTO p : privilegeRoleDTOS) { - map.put(p.getAntPath(), p); - this.privileges = map; - } - this.paths = map.keySet(); - // 4.更新版本 - this.privilegeVersion = currentVersion; - } -} diff --git a/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/util/JwtSignerHolder.java b/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/util/JwtSignerHolder.java deleted file mode 100644 index 9d328e5..0000000 --- a/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/java/com/tianji/authsdk/gateway/util/JwtSignerHolder.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.tianji.authsdk.gateway.util; - -import cn.hutool.crypto.KeyUtil; -import cn.hutool.crypto.SecureUtil; -import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm; -import cn.hutool.http.HttpUtil; -import cn.hutool.jwt.signers.JWTSigner; -import cn.hutool.jwt.signers.JWTSignerUtil; -import com.tianji.auth.common.constants.JwtConstants; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.MarkedRunnable; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.DiscoveryClient; - -import javax.annotation.PostConstruct; -import java.nio.charset.StandardCharsets; -import java.security.PublicKey; -import java.util.List; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -@Data -@Slf4j -public class JwtSignerHolder { - - private volatile JWTSigner jwtSigner; - - private DiscoveryClient discoveryClient; - - public JwtSignerHolder(DiscoveryClient discoveryClient) { - this.discoveryClient = discoveryClient; - } - - private final ExecutorService ses = new ThreadPoolExecutor( - 1, - 1, - 10, - TimeUnit.SECONDS, - new ArrayBlockingQueue<>(1), - r -> new Thread(r, "AuthFetchJwkThread") - ); - - @PostConstruct - public void init(){ - // 尝试获取jwk秘钥 - ses.submit(new MarkedRunnable(new JwkTask(discoveryClient))); - } - - public void shutdown(){ - ses.shutdown(); - log.debug("销毁加载秘钥线程 AuthFetchJwkThread"); - } - public static void sleep(long time){ - try { - Thread.sleep(time); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - class JwkTask implements Runnable{ - private final DiscoveryClient discoveryClient; - - public JwkTask(DiscoveryClient discoveryClient) { - this.discoveryClient = discoveryClient; - } - - @Override - public void run() { - while (jwtSigner == null) { - try { - log.info("尝试加载auth服务地址"); - List instances = discoveryClient.getInstances("auth-service"); - if(CollUtils.isEmpty(instances)){ - log.error("加载auth服务地址失败,原因:数据为空"); - sleep(10000); - continue; - } - ServiceInstance instance = instances.get(0); - String jwkUri = String.format("http://%s:%d/jwks", instance.getHost(), instance.getPort()); - log.info("加载auth服务地址成功,{}", jwkUri); - - log.info("尝试加载jwk秘钥"); - // 请求获取jwk - String result = HttpUtil.get(jwkUri, StandardCharsets.UTF_8); - if(result == null){ - log.error("加载jwk秘钥失败,原因:数据为空"); - sleep(10000); - continue; - } - // 解析 - PublicKey publicKey = KeyUtil.generatePublicKey( - AsymmetricAlgorithm.RSA_ECB_PKCS1.getValue(), - SecureUtil.decode(result) - ); - jwtSigner = JWTSignerUtil.createSigner(JwtConstants.JWT_ALGORITHM, publicKey); - log.info("加载jwk秘钥成功!"); - } catch (Exception e) { - log.error("加载jwk秘钥失败,原因:{}", e.getMessage()); - sleep(10000); - } - } - // 关闭线程池 - shutdown(); - } - } -} diff --git a/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/resources/META-INF/spring-configuration-metadata.json b/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/resources/META-INF/spring-configuration-metadata.json deleted file mode 100644 index 5076aad..0000000 --- a/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/resources/META-INF/spring-configuration-metadata.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "groups": [ - { - "name": "tj.auth.gateway", - "type": "com.tianji.authsdk.gateway.config.AuthAutoConfiguration", - "sourceType": "com.tianji.authsdk.gateway.config.AuthProperties" - } - ], - "properties": [ - { - "name": "tj.auth.excludePath", - "type": "java.util.Set", - "description": "不用登录就能访问的路径,ant风格通配符", - "sourceType": "com.tianji.authsdk.gateway.config.AuthProperties", - "defaultValue": "" - } - ], - "hints": [] -} \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/resources/META-INF/spring.factories b/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/resources/META-INF/spring.factories deleted file mode 100644 index a3731ac..0000000 --- a/tianji-master/tj-auth/tj-auth-gateway-sdk/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.tianji.authsdk.gateway.config.AuthAutoConfiguration \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-resource-sdk/pom.xml b/tianji-master/tj-auth/tj-auth-resource-sdk/pom.xml deleted file mode 100644 index a0440bd..0000000 --- a/tianji-master/tj-auth/tj-auth-resource-sdk/pom.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - tj-auth - com.tianji - 1.0.0 - - 4.0.0 - - tj-auth-resource-sdk - - - 11 - 11 - - - - org.springframework - spring-webmvc - provided - - - javax.servlet - servlet-api - 2.5 - provided - - - com.tianji - tj-auth-common - 1.0.0 - - - io.github.openfeign - feign-core - provided - - - \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/FeignRelayUserAutoConfiguration.java b/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/FeignRelayUserAutoConfiguration.java deleted file mode 100644 index 44a4b50..0000000 --- a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/FeignRelayUserAutoConfiguration.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.authsdk.resource.config; - -import feign.Feign; -import com.tianji.authsdk.resource.interceptors.FeignRelayUserInterceptor; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ConditionalOnClass(Feign.class) -public class FeignRelayUserAutoConfiguration { - - @Bean - public FeignRelayUserInterceptor feignRelayUserInterceptor(){ - return new FeignRelayUserInterceptor(); - } -} diff --git a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/ResourceAuthProperties.java b/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/ResourceAuthProperties.java deleted file mode 100644 index 11e2e27..0000000 --- a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/ResourceAuthProperties.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.authsdk.resource.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -import java.util.List; - -@Data -@ConfigurationProperties(prefix = "tj.auth.resource") -public class ResourceAuthProperties { - private Boolean enable = false; - private List includeLoginPaths; - private List excludeLoginPaths; -} diff --git a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/ResourceInterceptorConfiguration.java b/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/ResourceInterceptorConfiguration.java deleted file mode 100644 index f7ba25b..0000000 --- a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/config/ResourceInterceptorConfiguration.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.tianji.authsdk.resource.config; - -import cn.hutool.core.collection.CollUtil; -import com.tianji.authsdk.resource.interceptors.LoginAuthInterceptor; -import com.tianji.authsdk.resource.interceptors.UserInfoInterceptor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -@EnableConfigurationProperties(ResourceAuthProperties.class) -public class ResourceInterceptorConfiguration implements WebMvcConfigurer { - - private final ResourceAuthProperties authProperties; - - @Autowired - public ResourceInterceptorConfiguration(ResourceAuthProperties resourceAuthProperties) { - this.authProperties = resourceAuthProperties; - } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - // 1.添加用户信息拦截器 - registry.addInterceptor(new UserInfoInterceptor()).order(0); - // 2.是否需要做登录拦截 - if(!authProperties.getEnable()){ - // 无需登录拦截 - return; - } - // 2.添加登录拦截器 - InterceptorRegistration registration = registry.addInterceptor(new LoginAuthInterceptor()).order(1); - // 2.1.添加拦截器路径 - if(CollUtil.isNotEmpty(authProperties.getIncludeLoginPaths())){ - registration.addPathPatterns(authProperties.getIncludeLoginPaths()); - } - // 2.2.添加排除路径 - if(CollUtil.isNotEmpty(authProperties.getExcludeLoginPaths())){ - registration.excludePathPatterns(authProperties.getExcludeLoginPaths()); - } - // 2.3.排除swagger路径 - registration.excludePathPatterns( - "/v2/**", - "/v3/**", - "/swagger-resources/**", - "/webjars/**", - "/doc.html" - ); - } -} diff --git a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/FeignRelayUserInterceptor.java b/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/FeignRelayUserInterceptor.java deleted file mode 100644 index c350665..0000000 --- a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/FeignRelayUserInterceptor.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.authsdk.resource.interceptors; - -import com.tianji.auth.common.constants.JwtConstants; -import com.tianji.common.utils.UserContext; -import feign.RequestInterceptor; -import feign.RequestTemplate; - -public class FeignRelayUserInterceptor implements RequestInterceptor { - @Override - public void apply(RequestTemplate template) { - Long userId = UserContext.getUser(); - if (userId == null) { - return; - } - template.header(JwtConstants.USER_HEADER, userId.toString()); - } -} diff --git a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/LoginAuthInterceptor.java b/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/LoginAuthInterceptor.java deleted file mode 100644 index 0e3077f..0000000 --- a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/LoginAuthInterceptor.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tianji.authsdk.resource.interceptors; - -import com.tianji.common.utils.UserContext; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -@Slf4j -public class LoginAuthInterceptor implements HandlerInterceptor { - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - // 1.尝试获取用户信息 - Long userId = UserContext.getUser(); - // 2.判断是否登录 - if (userId == null) { - response.setStatus(401); - response.sendError(401, "未登录用户无法访问!"); - // 2.3.未登录,直接拦截 - return false; - } - // 3.登录则放行 - return true; - } -} diff --git a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/UserInfoInterceptor.java b/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/UserInfoInterceptor.java deleted file mode 100644 index 0d2540a..0000000 --- a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/java/com/tianji/authsdk/resource/interceptors/UserInfoInterceptor.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.authsdk.resource.interceptors; - -import com.tianji.auth.common.constants.JwtConstants; -import com.tianji.common.utils.UserContext; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -@Slf4j -public class UserInfoInterceptor implements HandlerInterceptor { - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - // 1.尝试获取头信息中的用户信息 - String authorization = request.getHeader(JwtConstants.USER_HEADER); - // 2.判断是否为空 - if (authorization == null) { - return true; - } - // 3.转为用户id并保存 - try { - Long userId = Long.valueOf(authorization); - UserContext.setUser(userId); - return true; - } catch (NumberFormatException e) { - log.error("用户身份信息格式不正确,{}, 原因:{}", authorization, e.getMessage()); - return true; - } - } - - @Override - public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { - // 清理用户信息 - UserContext.removeUser(); - } -} diff --git a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/resources/META-INF/spring-configuration-metadata.json b/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/resources/META-INF/spring-configuration-metadata.json deleted file mode 100644 index 6ddea84..0000000 --- a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/resources/META-INF/spring-configuration-metadata.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "groups": [ - { - "name": "tj.auth.resource", - "type": "com.tianji.authsdk.resource.config.ResourceInterceptorConfiguration", - "sourceType": "com.tianji.authsdk.resource.config.ResourceAuthProperties" - } - ], - "properties": [ - { - "name": "tj.auth.resource.enable", - "type": "java.lang.Boolean", - "description": "是否开启登录拦截功能,如果开启则需要指定拦截路径,默认拦截所有", - "sourceType": "com.tianji.authsdk.resource.config.ResourceAuthProperties", - "defaultValue": false - }, - { - "name": "tj.auth.resource.includeLoginPaths", - "type": "java.util.List", - "description": "要拦截的路径,例如:/user/**", - "sourceType": "com.tianji.authsdk.resource.config.ResourceAuthProperties" - }, - { - "name": "tj.auth.resource.excludeLoginPaths", - "type": "java.util.List", - "description": "不拦截的路径,例如:/user/**", - "sourceType": "com.tianji.authsdk.resource.config.ResourceAuthProperties" - } - ], - "hints": [] -} \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/resources/META-INF/spring.factories b/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 528d814..0000000 --- a/tianji-master/tj-auth/tj-auth-resource-sdk/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,3 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.tianji.authsdk.resource.config.ResourceInterceptorConfiguration, \ - com.tianji.authsdk.resource.config.FeignRelayUserAutoConfiguration \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-service/pom.xml b/tianji-master/tj-auth/tj-auth-service/pom.xml deleted file mode 100644 index 7ec0b02..0000000 --- a/tianji-master/tj-auth/tj-auth-service/pom.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - tj-auth - com.tianji - 1.0.0 - - 4.0.0 - - tj-auth-service - - - 11 - 11 - - - - com.tianji - tj-api - 1.0.0 - - - org.springframework.boot - spring-boot-starter-web - - - com.baomidou - mybatis-plus-boot-starter - - - mysql - mysql-connector-java - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.redisson - redisson - - - - org.apache.commons - commons-pool2 - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - com.tianji.auth.AuthApplication - - - - - \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/AuthApplication.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/AuthApplication.java deleted file mode 100644 index ac04111..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/AuthApplication.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.auth; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.annotation.EnableScheduling; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@MapperScan("com.tianji.auth.mapper") -@SpringBootApplication -@EnableScheduling -@Slf4j -public class AuthApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(AuthApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - log.info("--/\n------------------------------------------------------------------------------\n\t" ); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/config/AuthConfig.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/config/AuthConfig.java deleted file mode 100644 index ca960e6..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/config/AuthConfig.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.auth.config; - -import org.apache.tomcat.util.http.LegacyCookieProcessor; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer; -import org.springframework.cloud.bootstrap.encrypt.KeyProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.rsa.crypto.KeyStoreKeyFactory; - -import java.security.KeyPair; - -@Configuration -@EnableConfigurationProperties(KeyProperties.class) -public class AuthConfig { - - @Bean - @ConfigurationProperties(prefix = "encrypt") - public KeyProperties keyProperties(){ - return new KeyProperties(); - } - - @Bean - public KeyPair keyPair(KeyProperties keyProperties){ - // 获取秘钥工厂 - KeyStoreKeyFactory keyStoreKeyFactory = - new KeyStoreKeyFactory( - keyProperties.getKeyStore().getLocation(), - keyProperties.getKeyStore().getPassword().toCharArray()); - //读取钥匙对 - return keyStoreKeyFactory.getKeyPair( - keyProperties.getKeyStore().getAlias(), - keyProperties.getKeyStore().getSecret().toCharArray()); - } - - @Bean - public TomcatContextCustomizer cookieTomcatContextCustomizer(){ - return context -> context.setCookieProcessor(new LegacyCookieProcessor()); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/constants/AuthConstants.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/constants/AuthConstants.java deleted file mode 100644 index 97d19b9..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/constants/AuthConstants.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.auth.constants; - -public abstract class AuthConstants { - /*管理员的角色ID*/ - public static final Long ADMIN_ROLE_ID = 1L; -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/AccountController.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/AccountController.java deleted file mode 100644 index 44b70a5..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/AccountController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.tianji.auth.controller; - - -import com.tianji.api.dto.user.LoginFormDTO; -import com.tianji.auth.common.constants.JwtConstants; -import com.tianji.auth.service.IAccountService; -import com.tianji.common.utils.WebUtils; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - * 账户登录相关接口 - */ -@RestController -@RequestMapping("/accounts") -@Api(tags = "账户管理") -@RequiredArgsConstructor -public class AccountController { - - private final IAccountService accountService; - - @ApiOperation("登录并获取token") - @PostMapping(value = "/login") - public String loginByPw(@RequestBody LoginFormDTO loginFormDTO){ - return accountService.login(loginFormDTO, false); - } - - @ApiOperation("管理端登录并获取token") - @PostMapping(value = "/admin/login") - public String adminLoginByPw(@RequestBody LoginFormDTO loginFormDTO){ - return accountService.login(loginFormDTO, true); - } - - @ApiOperation("退出登录") - @PostMapping(value = "/logout") - public void logout(){ - accountService.logout(); - } - - @ApiOperation("刷新token") - @GetMapping(value = "/refresh") - public String refreshToken(@CookieValue(JwtConstants.REFRESH_HEADER) String token){ - return accountService.refreshToken(WebUtils.cookieBuilder().decode(token)); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/JwkController.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/JwkController.java deleted file mode 100644 index 08e56bc..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/JwkController.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tianji.auth.controller; - -import cn.hutool.core.codec.Base64; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import springfox.documentation.annotations.ApiIgnore; - -import java.security.KeyPair; - -@RestController -@RequestMapping("jwks") -@ApiIgnore -public class JwkController { - - private final KeyPair keyPair; - - @Autowired - public JwkController(KeyPair keyPair) { - this.keyPair = keyPair; - } - - @GetMapping - public String getJwk(){ - // TODO 可以加入clientId和clientSecret校验 - // 获取公钥并转码 - return Base64.encode(keyPair.getPublic().getEncoded()); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/MenuController.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/MenuController.java deleted file mode 100644 index ec03bad..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/MenuController.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.tianji.auth.controller; - - -import cn.hutool.core.collection.CollectionUtil; -import com.tianji.auth.domain.dto.MenuDTO; -import com.tianji.auth.domain.po.Menu; -import com.tianji.auth.domain.vo.MenuOptionVO; -import com.tianji.auth.service.IMenuService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - *

- * 权限表,包括菜单权限和访问路径权限 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@RestController -@RequestMapping("/menus") -@Api(tags = "菜单管理") -@RequiredArgsConstructor -public class MenuController { - - private final IMenuService menuService; - - /** - * 根据父菜单id查询子菜单 - * @param pid 父菜单id,如果给 0 就是查询1级菜单 - * @return 菜单集合 - */ - @GetMapping("/parent/{pid}") - @ApiOperation("根据父菜单id查询子菜单") - public List listMenusByParent( - @ApiParam(value = "父菜单id", example = "0") @PathVariable("pid") Long pid){ - // 1.根据父id查询 - List list = menuService.lambdaQuery().eq(Menu::getParentId, pid).list(); - // 2.非空判断 - if (CollectionUtil.isEmpty(list)) { - return Collections.emptyList(); - } - // 3.数据转换 - return list.stream().map(MenuOptionVO::new).collect(Collectors.toList()); - } - - @GetMapping("{id}") - @ApiOperation("根据id查询菜单") - public MenuOptionVO getMenuById(@ApiParam(value = "菜单id", example = "1") @PathVariable("id") Long id) { - Menu menu = menuService.getById(id); - if (menu == null) { - return null; - } - return new MenuOptionVO(menu); - } - - /** - * 查询菜单,按照多级菜单组成树结构 - * @return 菜单列表,组成树结构 - */ - @GetMapping - @ApiOperation("查询菜单,按照多级菜单组成树结构") - public List listMenuTree(){ - // 1.查询所有菜单 - List menus = menuService.list(); - return convert2MenuDTOs(menus); - } - - private List convert2MenuDTOs(List menus) { - if (CollectionUtil.isEmpty(menus)) { - return Collections.emptyList(); - } - // 2.按照父菜单id分组 - Map> menuMap = menus.stream() - .map(MenuOptionVO::new) - .collect(Collectors.groupingBy(MenuOptionVO::getParentId)); - // 3.组合 - // 3.1.获取1级菜单 - List parents = menuMap.get(0L); - // 3.2.获取2级菜单 - for (MenuOptionVO parent : parents) { - List subMenus = menuMap.get(parent.getId()); - subMenus.sort(Comparator.comparingInt(MenuOptionVO::getPriority)); - parent.setSubMenus(subMenus); - } - // 3.3.排序 - parents.sort(Comparator.comparingInt(MenuOptionVO::getPriority)); - return parents; - } - - /** - * 根据当前登录用户的权限查询菜单选项,按照多级菜单组成树结构 - * @return 菜单列表,组成树结构 - */ - @GetMapping("me") - @ApiOperation("查询我的菜单,按照多级菜单组成树结构") - public List listMenuTreeByUser(){ - // 1.查询所有菜单 - List menus = menuService.listMenuByUser(); - return convert2MenuDTOs(menus); - } - - @PostMapping - @ApiOperation("新增菜单") - public void saveMenu(@RequestBody MenuDTO menuDTO){ - // 1.数据转换 - Menu menu = new Menu(menuDTO); - // 2.保存 - menuService.saveMenu(menu); - } - - @PutMapping("{id}") - @ApiOperation("更新菜单") - public void updateMenu( - @RequestBody MenuDTO menuDTO, - @ApiParam(value = "菜单id", example = "1")@PathVariable("id") Long id) { - menuDTO.setId(id); - menuService.updateById(new Menu(menuDTO)); - } - - @DeleteMapping("{id}") - @ApiOperation("根据id删除菜单") - public void deleteMenu( - @ApiParam(value = "菜单id", example = "1") @PathVariable("id") Long id) { - menuService.deleteMenu(id); - } - - @PostMapping("/role/{roleId}") - @ApiOperation("绑定角色与菜单权限") - public void bindRoleMenus( - @ApiParam(value = "角色id", example = "1") @PathVariable("roleId") Long roleId, - @ApiParam(value = "菜单id集合") List menuIds){ - menuService.bindRoleMenus(roleId, menuIds); - } - - @DeleteMapping("/role/{roleId}") - @ApiOperation("解除角色的菜单权限") - public void deleteRoleMenus( - @ApiParam(value = "角色id", example = "1") @PathVariable("roleId") Long roleId, - @ApiParam(value = "菜单id集合") List menuIds){ - menuService.deleteRoleMenus(roleId, menuIds); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/PrivilegeController.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/PrivilegeController.java deleted file mode 100644 index 36998a2..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/PrivilegeController.java +++ /dev/null @@ -1,192 +0,0 @@ -package com.tianji.auth.controller; - - -import cn.hutool.core.collection.CollectionUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.tianji.auth.domain.dto.PrivilegeDTO; -import com.tianji.auth.domain.po.Privilege; -import com.tianji.auth.domain.vo.PrivilegeOptionVO; -import com.tianji.auth.service.IPrivilegeService; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Collections; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -/** - *

- * 权限表,包括菜单权限和访问路径权限 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-06-15 - */ -@RestController -@RequestMapping("/privileges") -@Api(tags = "权限管理接口") -@RequiredArgsConstructor -public class PrivilegeController { - - private final IPrivilegeService privilegesService; - - /** - * 分页查询所有权限 - * - * @param pageQuery 分页查询条件 - * @return 分页结果 - */ - @ApiOperation("分页查询所有权限") - @GetMapping - public PageDTO listAllPrivileges(PageQuery pageQuery) { - // 1.分页查询 - Page page = privilegesService.listPrivilegesByPage(pageQuery); - // 2.非空判断 - List list = page.getRecords(); - if (CollectionUtil.isEmpty(list)) { - // 结果为空,返回空结果 添加总页码数 - return new PageDTO<>(page.getTotal(), page.getPages(), Collections.emptyList()); - } - // 3.数据转换 - List dtoList = list.stream().map(Privilege::toDTO).collect(Collectors.toList()); - // 4.封装返回 - return new PageDTO<>(page.getTotal(), page.getPages(), dtoList); - } - - /** - * 查询所有权限,作为下拉选框菜单 - * - * @return 分页结果 - */ - @ApiOperation("查询菜单下的所有权限,作为下拉选框菜单") - @GetMapping("options/{menuId}") - public List listAllPrivilegesOptionsByMenuId( - @ApiParam(value = "菜单id", example = "1") @PathVariable("menuId") Long menuId - ) { - // 1.查询菜单下的权限 - List list = privilegesService.lambdaQuery() - .eq(Privilege::getMenuId, menuId) - .eq(Privilege::getInternal, false) - .list(); - // 2.非空判断 - if (CollectionUtil.isEmpty(list)) { - // 结果为空,返回空结果 - return Collections.emptyList(); - } - // 3.数据转换 - return list.stream() - .map(PrivilegeOptionVO::new).collect(Collectors.toList()); - } - - /** - * 查询某个角色的权限 - * - * @return 某个角色的权限列表 - */ - @ApiOperation("查询菜单下的权限列表,某个角色的权限") - @GetMapping("/roles/{roleId}/{menuId}") - public List listPrivilegeByRoleId( - @ApiParam(value = "角色id", required = true, example = "1") @PathVariable("roleId") Long roleId, - @ApiParam(value = "菜单id", required = true, example = "1") @PathVariable("menuId") Long menuId - ) { - // 1.查询角色对应的权限id - Set privilegeIds = privilegesService.listPrivilegeByRoleId(roleId); - if (CollectionUtil.isEmpty(privilegeIds)) { - return Collections.emptyList(); - } - // 2.查询菜单下所有权限 - List vos = listAllPrivilegesOptionsByMenuId(menuId); - // 3.标记 - for (PrivilegeOptionVO vo : vos) { - vo.setChecked(privilegeIds.contains(vo.getId())); - } - return vos; - } - - /** - * 新增权限 - * - * @param privilegeDTO 权限数据 - * @return 新增成功的权限数据 - */ - @ApiOperation("新增权限") - @PostMapping - public PrivilegeDTO savePrivilege(@Validated @RequestBody PrivilegeDTO privilegeDTO) { - // 域对象转换 - Privilege privilege = new Privilege(privilegeDTO); - // 新增 - privilegesService.savePrivilege(privilege); - // 返回 - return privilege.toDTO(); - } - - /** - * 修改权限 - * - * @param privilegeDTO 权限数据 - * @param id 要修改的权限的id - * @return 修改后的权限结果 - */ - @ApiOperation("修改权限") - @PutMapping("{id}") - public PrivilegeDTO updatePrivilege( - @RequestBody PrivilegeDTO privilegeDTO, - @ApiParam(value = "要修改的权限id", required = true, example = "1") @PathVariable("id") Long id) { - // 域对象转换 - Privilege privilege = new Privilege(privilegeDTO); - privilege.setId(id); - // 修改 - privilegesService.updateById(privilege); - // 返回 - return privilege.toDTO(); - } - - /** - * 删除权限 - * - * @param id 权限id - */ - @ApiOperation("删除权限") - @DeleteMapping("{id}") - public void removePrivilegeById( - @ApiParam(value = "要删除的权限id", required = true, example = "1") @PathVariable("id") Long id) { - privilegesService.removePrivilegeById(id); - } - - /** - * 绑定角色与API权限 - * - * @param roleId 角色id - * @param privilegeIds 权限id集合 - */ - @PostMapping("/role/{roleId}") - @ApiOperation("绑定角色与API权限") - public void bindRolePrivileges( - @ApiParam(value = "角色id", example = "1") @PathVariable("roleId") Long roleId, - @ApiParam(value = "API权限的id集合") List privilegeIds) { - privilegesService.bindRolePrivileges(roleId, privilegeIds); - } - - /** - * 解除角色的API权限 - * - * @param roleId 角色id - * @param privilegeIds 权限id集合 - */ - @DeleteMapping("/role/{roleId}") - @ApiOperation("解除角色的API权限") - public void deleteRolePrivileges( - @ApiParam(value = "角色id", example = "1") @PathVariable("roleId") Long roleId, - @ApiParam(value = "API权限的id集合") List privilegeIds) { - privilegesService.deleteRolePrivileges(roleId, privilegeIds); - } - - -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/RoleController.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/RoleController.java deleted file mode 100644 index dbc4f45..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/controller/RoleController.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.tianji.auth.controller; - - -import cn.hutool.core.collection.CollectionUtil; -import com.tianji.api.dto.auth.RoleDTO; -import com.tianji.auth.domain.po.Role; -import com.tianji.auth.service.IRoleService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - - -/** - * @author 虎哥 - * @since 2022-06-16 - */ -@Api(tags = "角色管理") -@RestController -@RequestMapping("/roles") -@RequiredArgsConstructor -public class RoleController { - - private final IRoleService roleService; - - @ApiOperation("查询员工角色列表") - @GetMapping("/list") - public List listAllRoles(){ - // 1.查询 - List list = roleService.list(); - if (CollectionUtil.isEmpty(list)) { - return Collections.emptyList(); - } - // 3.数据转换 - return list.stream().map(Role::toDTO).collect(Collectors.toList()); - } - - @ApiOperation("查询员工角色列表") - @GetMapping - public List listStaffRoles(){ - // 1.查询 - List list = roleService.lambdaQuery().eq(Role::getType, Role.RoleType.CUSTOM).list(); - if (CollectionUtil.isEmpty(list)) { - return Collections.emptyList(); - } - // 3.数据转换 - return list.stream().map(Role::toDTO).collect(Collectors.toList()); - } - - @ApiOperation("根据id查询角色") - @GetMapping("/{id}") - public RoleDTO queryRoleById(@PathVariable("id") Long id){ - // 1.查询 - Role role = roleService.getById(id); - if (role == null) { - return null; - } - // 2.数据转换 - return role.toDTO(); - } - - - - @ApiOperation("新增角色") - @PostMapping - public RoleDTO saveRole(@RequestBody RoleDTO roleDTO) { - Role role = new Role(roleDTO); - role.setType(Role.RoleType.CUSTOM); - // 1.新增 - roleService.save(role); - // 2.返回 - roleDTO.setId(role.getId()); - return roleDTO; - } - - @ApiOperation("修改角色信息") - @PutMapping("{id}") - public void updateRole( - @RequestBody RoleDTO roleDTO, - @ApiParam(value = "角色id", example = "1") @PathVariable("id") Long id - ) { - // 1.数据转换 - Role role = new Role(roleDTO); - role.setId(id); - // 2.修改 - roleService.updateById(role); - } - - @ApiOperation("删除角色信息") - @DeleteMapping("{id}") - public void deleteRole(@ApiParam(value = "角色id", example = "1") @PathVariable("id") Long id) { - roleService.deleteRole(id); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/dto/MenuDTO.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/dto/MenuDTO.java deleted file mode 100644 index b80ae19..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/dto/MenuDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tianji.auth.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "菜单表单实体") -public class MenuDTO { - @ApiModelProperty(value = "菜单id", example = "1") - private Long id; - - @ApiModelProperty(value = "父菜单id", example = "0") - private Long parentId; - - @ApiModelProperty(value = "菜单文本", example = "系统管理") - private String label; - - @ApiModelProperty(value = "菜单路径", example = "/sys/index") - private String path; - - @ApiModelProperty(value = "菜单图标", example = "el-icon-sys") - private String icon; - - @ApiModelProperty(value = "菜单顺序", example = "1") - private Integer priority; -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/dto/PrivilegeDTO.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/dto/PrivilegeDTO.java deleted file mode 100644 index bbb039a..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/dto/PrivilegeDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.auth.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; -import java.io.Serializable; - -@Data -@ApiModel(description = "API权限") -public class PrivilegeDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty(value = "权限id", example = "1") - private Long id; - @ApiModelProperty(value = "权限所属菜单id", example = "1") - private Long menuId; - @ApiModelProperty(value = "权限说明", example = "新增员工") - @NotNull(message = "权限说明不能为空") - private String intro; - @ApiModelProperty(value = "API请求方式", example = "GET") - @Pattern(regexp = "^GET|POST|PUT|DELETE$", message = "请求方式必须是大写") - private String method; - @ApiModelProperty(value = "API请求路径", example = "/account/staff") - @NotNull(message = "uri不能为空") - private String uri; - @ApiModelProperty("是否是内部权限") - private Boolean internal; -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/AccountRole.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/AccountRole.java deleted file mode 100644 index 98a33cb..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/AccountRole.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.auth.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - *

- * 账户、角色关联表 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("account_role") -public class AccountRole implements Serializable { - - private static final long serialVersionUID = 1L; - - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 账户id - */ - private Long accountId; - - /** - * 角色id - */ - private Long roleId; - -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/LoginRecord.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/LoginRecord.java deleted file mode 100644 index 6e5ff06..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/LoginRecord.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.tianji.auth.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDate; -import java.time.LocalDateTime; - -/** - *

- * 登录信息记录表 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("login_record") -public class LoginRecord implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 用户id - */ - private Long userId; - - /** - * 用户id - */ - private String cellPhone; - - /** - * 登录时间 - */ - private LocalDateTime loginTime; - - /** - * 登出时间 - */ - private LocalDateTime logoutTime; - - /** - * 登录日期 - */ - private LocalDate loginDate; - - /** - * 登录时长,单位是秒 - */ - private Long duration; - - /** - * ip地址 - */ - private String ipv4; - - -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Menu.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Menu.java deleted file mode 100644 index 859027b..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Menu.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.tianji.auth.domain.po; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.auth.domain.dto.MenuDTO; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 权限表,包括菜单权限和访问路径权限 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("menu") -@NoArgsConstructor -public class Menu implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId - private Long id; - - /** - * 父菜单id,默认0代表没有父菜单 - */ - private Long parentId; - - /** - * 是否有子菜单,默认false - */ - private Boolean hasChildren; - - /** - * 菜单文本 - */ - private String label; - - /** - * 菜单路径 - */ - private String path; - - /** - * 菜单图标 - */ - private String icon; - - /** - * 顺序优先级,默认127 - */ - private Integer priority; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建者id - */ - - private Long creater; - - /** - * 更新者id - */ - - private Long updater; - - /** - * 部门id - */ - private Long depId; - - /** - * 逻辑删除,默认0 - */ - private Integer deleted; - - - public Menu(MenuDTO dto) { - this.id = dto.getId(); - this.parentId = dto.getParentId(); - this.label = dto.getLabel(); - this.path = dto.getPath(); - this.icon = dto.getIcon(); - this.priority = dto.getPriority(); - } - - public MenuDTO toDTO(){ - MenuDTO dto = new MenuDTO(); - dto.setId(id); - dto.setPath(path); - dto.setParentId(parentId); - dto.setLabel(label); - dto.setIcon(icon); - dto.setPriority(priority); - return dto; - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Privilege.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Privilege.java deleted file mode 100644 index 622661b..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Privilege.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.tianji.auth.domain.po; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.auth.domain.dto.PrivilegeDTO; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 权限表,包括菜单权限和访问路径权限 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("`privilege`") -public class Privilege implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId - private Long id; - - /** - * 菜单id - */ - private Long menuId; - - /** - * 说明 - */ - private String intro; - - /** - * API权限的请求方式 - */ - private String method; - - /** - * API权限的请求路径 - */ - private String uri; - - /** - * 是否是内部接口 - */ - private Boolean internal; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建者id - */ - - private Long creater; - - /** - * 更新者id - */ - - private Long updater; - - /** - * 部门id - */ - private Long depId; - - /** - * 逻辑删除,默认0 - */ - private Integer deleted; - - public Privilege() { - } - - public Privilege(PrivilegeDTO dto) { - this.id = dto.getId(); - this.menuId = dto.getMenuId(); - this.intro = dto.getIntro(); - this.method = dto.getMethod(); - this.uri = dto.getUri(); - this.internal = dto.getInternal(); - } - - public PrivilegeDTO toDTO(){ - PrivilegeDTO dto = new PrivilegeDTO(); - dto.setId(id); - dto.setMenuId(menuId); - dto.setIntro(intro); - dto.setMethod(method); - dto.setUri(uri); - dto.setInternal(internal); - return dto; - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Role.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Role.java deleted file mode 100644 index fab9d85..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/Role.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.tianji.auth.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import com.tianji.api.dto.auth.RoleDTO; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 角色表 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("role") -@NoArgsConstructor -public class Role implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId - private Long id; - - /** - * 角色代号,例如:admin - */ - private String code; - - /** - * 角色名称 - */ - private String name; - - /** - * 角色类型:0-固定角色(不可选)1-自定义角色 - */ - private RoleType type; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建者id - */ - - private Long creater; - - /** - * 更新者id - */ - - private Long updater; - /** - * 部门id - */ - private Long depId; - - /** - * 逻辑删除,默认0 - */ - private Integer deleted; - - public Role(RoleDTO dto) { - this.id = dto.getId(); - this.code = dto.getCode(); - this.name = dto.getName(); - } - - public RoleDTO toDTO(){ - RoleDTO dto = new RoleDTO(); - dto.setId(id); - dto.setCode(code); - dto.setName(name); - return dto; - } - - @Getter - public enum RoleType{ - CONSTANT(0, "固定角色"), - CUSTOM(1, "自定义角色"), - ; - @EnumValue - int value; - String desc; - - RoleType(int value, String desc) { - this.value = value; - this.desc = desc; - } - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/RoleMenu.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/RoleMenu.java deleted file mode 100644 index 656c161..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/RoleMenu.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.tianji.auth.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - *

- * 账户、角色关联表 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("role_menu") -@NoArgsConstructor -public class RoleMenu implements Serializable { - - private static final long serialVersionUID = 1L; - - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 角色id - */ - private Long roleId; - - /** - * 菜单id - */ - private Long menuId; - - public RoleMenu(Long roleId, Long menuId) { - this.roleId = roleId; - this.menuId = menuId; - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/RolePrivilege.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/RolePrivilege.java deleted file mode 100644 index dd5dfbc..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/po/RolePrivilege.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.tianji.auth.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - *

- * 账户、角色关联表 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("role_privilege") -@NoArgsConstructor -public class RolePrivilege implements Serializable { - - private static final long serialVersionUID = 1L; - - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 角色id - */ - private Long roleId; - - /** - * 权限id - */ - private Long privilegeId; - - - public RolePrivilege(Long roleId, Long privilegeId) { - this.roleId = roleId; - this.privilegeId = privilegeId; - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/LoginRecordVO.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/LoginRecordVO.java deleted file mode 100644 index 443a95a..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/LoginRecordVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.auth.domain.vo; - -import lombok.Data; - -import java.time.LocalDate; -import java.time.LocalDateTime; - -@Data -public class LoginRecordVO { - /** - * 用户id - */ - private Long userId; - - /** - * 登录时间 - */ - private LocalDateTime loginTime; - - /** - * 登出时间 - */ - private LocalDateTime logoutTime; - - /** - * 登录日期 - */ - private LocalDate loginDate; - - /** - * 登录时长,单位是秒 - */ - private Long duration; - - /** - * ip地址 - */ - private String ipv4; -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/MenuOptionVO.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/MenuOptionVO.java deleted file mode 100644 index a3e4698..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/MenuOptionVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.tianji.auth.domain.vo; - -import com.tianji.auth.domain.po.Menu; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@Data -@ApiModel(description = "菜单选项实体") -public class MenuOptionVO { - @ApiModelProperty(value = "菜单id", example = "1") - private Long id; - - @ApiModelProperty(value = "父菜单id", example = "0") - private Long parentId; - - @ApiModelProperty(value = "菜单文本", example = "系统管理") - private String label; - - @ApiModelProperty(value = "菜单图标", example = "el-icon-sys") - private String icon; - - @ApiModelProperty(value = "是否有子菜单", example = "false") - private Boolean hasChildren; - - @ApiModelProperty(value = "菜单顺序", example = "1") - private Integer priority; - - @ApiModelProperty(value = "子菜单集合") - private List subMenus; - - public MenuOptionVO() { - } - - public MenuOptionVO(Menu menu) { - this.id = menu.getId(); - this.parentId = menu.getParentId(); - this.label = menu.getLabel(); - this.icon = menu.getIcon(); - this.hasChildren = menu.getHasChildren(); - this.priority = menu.getPriority(); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/PrivilegeOptionVO.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/PrivilegeOptionVO.java deleted file mode 100644 index 4cfea9a..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/domain/vo/PrivilegeOptionVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tianji.auth.domain.vo; - -import com.tianji.auth.domain.po.Privilege; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.io.Serializable; - -@Data -@ApiModel(description = "API权限选项实体") -public class PrivilegeOptionVO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty(value = "权限id", example = "1") - private Long id; - @ApiModelProperty(value = "权限说明", example = "新增员工") - private String intro; - @ApiModelProperty(value = "是否选中", example = "true") - private Boolean checked; - - public PrivilegeOptionVO() { - } - - public PrivilegeOptionVO(Privilege privilege) { - this.id = privilege.getId(); - this.intro = privilege.getIntro(); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/AccountRoleMapper.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/AccountRoleMapper.java deleted file mode 100644 index 0116401..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/AccountRoleMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.auth.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.auth.domain.po.AccountRole; - -/** - *

- * 账户、角色关联表 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface AccountRoleMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/LoginRecordMapper.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/LoginRecordMapper.java deleted file mode 100644 index ef996d5..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/LoginRecordMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.auth.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.auth.domain.po.LoginRecord; - -/** - *

- * 登录信息记录表 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -public interface LoginRecordMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/MenuMapper.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/MenuMapper.java deleted file mode 100644 index a4652cc..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/MenuMapper.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.auth.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.auth.domain.po.Menu; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - *

- * 权限表,包括菜单权限和访问路径权限 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface MenuMapper extends BaseMapper { - - List listByRoles(@Param("roleIds") List roleIds); -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/PrivilegeMapper.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/PrivilegeMapper.java deleted file mode 100644 index 840e002..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/PrivilegeMapper.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.auth.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.auth.domain.po.Privilege; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - *

- * 权限表,包括菜单权限和访问路径权限 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-06-15 - */ -public interface PrivilegeMapper extends BaseMapper { - - List listRolePrivileges(@Param("roleId") Long roleId); -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RoleMapper.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RoleMapper.java deleted file mode 100644 index 7d7a0a3..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RoleMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.auth.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.auth.domain.po.Role; - -/** - *

- * 角色表 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface RoleMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RoleMenuMapper.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RoleMenuMapper.java deleted file mode 100644 index bb27969..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RoleMenuMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.auth.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.auth.domain.po.RoleMenu; - -/** - *

- * 账户、角色关联表 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface RoleMenuMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RolePrivilegeMapper.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RolePrivilegeMapper.java deleted file mode 100644 index b9620e9..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/mapper/RolePrivilegeMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.auth.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.auth.domain.po.RolePrivilege; - -/** - *

- * 账户、角色关联表 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface RolePrivilegeMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IAccountRoleService.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IAccountRoleService.java deleted file mode 100644 index 1be7204..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IAccountRoleService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.auth.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.auth.domain.po.AccountRole; - -/** - *

- * 账户、角色关联表 服务类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface IAccountRoleService extends IService { - -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IAccountService.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IAccountService.java deleted file mode 100644 index 63f9793..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IAccountService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.auth.service; - -import com.tianji.api.dto.user.LoginFormDTO; - -/** - *

- * 账号表,平台内所有用户的账号、密码信息 服务类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface IAccountService{ - - String login(LoginFormDTO loginFormDTO, boolean isStaff); - - void logout(); - - String refreshToken(String refreshToken); -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/ILoginRecordService.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/ILoginRecordService.java deleted file mode 100644 index cdcda65..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/ILoginRecordService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.auth.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.auth.domain.po.LoginRecord; - -/** - *

- * 登录信息记录表 服务类 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -public interface ILoginRecordService extends IService { - - void saveAsync(LoginRecord record); - - void loginSuccess(String cellphone, Long userId); -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IMenuService.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IMenuService.java deleted file mode 100644 index 9685411..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IMenuService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tianji.auth.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.auth.domain.po.Menu; - -import java.util.List; - -/** - *

- * 权限表,包括菜单权限和访问路径权限 服务类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface IMenuService extends IService { - - List listMenuByUser(); - - void saveMenu(Menu menu); - - void deleteMenu(Long id); - - void bindRoleMenus(Long roleId, List menuIds); - - void deleteRoleMenus(Long roleId, List menuIds); -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IPrivilegeService.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IPrivilegeService.java deleted file mode 100644 index 07f9347..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IPrivilegeService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tianji.auth.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.auth.common.domain.PrivilegeRoleDTO; -import com.tianji.auth.domain.po.Privilege; -import com.tianji.common.domain.query.PageQuery; - -import java.util.List; -import java.util.Set; - -/** - *

- * 权限表,包括菜单权限和访问路径权限 服务类 - *

- * - * @author 虎哥 - * @since 2022-06-15 - */ -public interface IPrivilegeService extends IService { - - Page listPrivilegesByPage(PageQuery pageQuery); - - void savePrivilege(Privilege privilege); - - void removePrivilegeById(Long id); - - List listPrivilegeRoles(); - - Set listPrivilegeByRoleId(Long roleId); - - void bindRolePrivileges(Long roleId, List privilegeIds); - - void deleteRolePrivileges(Long roleId, List privilegeIds); -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRoleMenuService.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRoleMenuService.java deleted file mode 100644 index 65836e6..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRoleMenuService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.auth.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.auth.domain.po.RoleMenu; - -import java.util.List; - -/** - *

- * 账户、角色关联表 服务类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface IRoleMenuService extends IService { - - void removeByRoleId(Long id); - - void deleteRoleMenus(Long roleId, List menuIds); -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRolePrivilegeService.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRolePrivilegeService.java deleted file mode 100644 index c1fba4b..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRolePrivilegeService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.auth.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.auth.domain.po.RolePrivilege; - -import java.util.List; - -/** - *

- * 账户、角色关联表 服务类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface IRolePrivilegeService extends IService { - - void removeByPrivilegeId(Long id); - - void removeByRoleId(Long id); - - void deleteRolePrivileges(Long roleId, List privilegeIds); -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRoleService.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRoleService.java deleted file mode 100644 index e45755b..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/IRoleService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.auth.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.auth.domain.po.Role; - -import java.util.List; - -/** - *

- * 角色表 服务类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -public interface IRoleService extends IService { - - boolean exists(Long roleId); - boolean exists(List roleIds); - - void deleteRole(Long id); -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/AccountRoleServiceImpl.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/AccountRoleServiceImpl.java deleted file mode 100644 index 5b13beb..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/AccountRoleServiceImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.auth.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.auth.domain.po.AccountRole; -import com.tianji.auth.mapper.AccountRoleMapper; -import com.tianji.auth.service.IAccountRoleService; -import org.springframework.stereotype.Service; - -/** - *

- * 账户、角色关联表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@Service -public class AccountRoleServiceImpl extends ServiceImpl implements IAccountRoleService { - -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/AccountServiceImpl.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/AccountServiceImpl.java deleted file mode 100644 index c61e85d..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/AccountServiceImpl.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.tianji.auth.service.impl; - -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.user.LoginFormDTO; -import com.tianji.auth.common.constants.JwtConstants; -import com.tianji.auth.service.IAccountService; -import com.tianji.auth.service.ILoginRecordService; -import com.tianji.auth.util.JwtTool; -import com.tianji.common.domain.dto.LoginUserDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.BooleanUtils; -import com.tianji.common.utils.WebUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - *

- * 账号表,平台内所有用户的账号、密码信息 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class AccountServiceImpl implements IAccountService{ - private final JwtTool jwtTool; - private final UserClient userClient; - private final ILoginRecordService loginRecordService; - - @Override - public String login(LoginFormDTO loginDTO, boolean isStaff) { - // 1.查询并校验用户信息 - LoginUserDTO detail = userClient.queryUserDetail(loginDTO, isStaff); - if (detail == null) { - throw new BadRequestException("登录信息有误"); - } - - // 2.基于JWT生成登录token - // 2.1.设置记住我标记 - detail.setRememberMe(loginDTO.getRememberMe()); - // 2.2.生成token - String token = generateToken(detail); - - // 3.计入登录信息表 - loginRecordService.loginSuccess(loginDTO.getCellPhone(), detail.getUserId()); - // 4.返回结果 - return token; - } - - private String generateToken(LoginUserDTO detail) { - // 2.2.生成access-token - String token = jwtTool.createToken(detail); - // 2.3.生成refresh-token,将refresh-token的JTI 保存到Redis - String refreshToken = jwtTool.createRefreshToken(detail); - // 2.4.将refresh-token写入用户cookie,并设置HttpOnly为true - int maxAge = BooleanUtils.isTrue(detail.getRememberMe()) ? - (int) JwtConstants.JWT_REMEMBER_ME_TTL.toSeconds() : -1; - WebUtils.cookieBuilder() - .name(JwtConstants.REFRESH_HEADER) - .value(refreshToken) - .maxAge(maxAge) - .httpOnly(true) - .build(); - return token; - } - - @Override - public void logout() { - // 删除jti - jwtTool.cleanJtiCache(); - // 删除cookie - WebUtils.cookieBuilder() - .name(JwtConstants.REFRESH_HEADER) - .value("") - .maxAge(0) - .httpOnly(true) - .build(); - } - - @Override - public String refreshToken(String refreshToken) { - // 1.校验refresh-token,校验JTI - LoginUserDTO userDTO = jwtTool.parseRefreshToken(refreshToken); - // 2.生成新的access-token、refresh-token - return generateToken(userDTO); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/LoginRecordServiceImpl.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/LoginRecordServiceImpl.java deleted file mode 100644 index 3607836..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/LoginRecordServiceImpl.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.tianji.auth.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.auth.domain.po.LoginRecord; -import com.tianji.auth.mapper.LoginRecordMapper; -import com.tianji.auth.service.ILoginRecordService; -import com.tianji.common.utils.MarkedRunnable; -import com.tianji.common.utils.WebUtils; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -/** - *

- * 登录信息记录表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@Service -public class LoginRecordServiceImpl extends ServiceImpl implements ILoginRecordService { - - private static final Executor WRITE_RECORD_EXECUTOR; - - static { - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - //配置核心线程数 - executor.setCorePoolSize(20); - //配置最大线程数 - executor.setMaxPoolSize(40); - //配置队列大小 - executor.setQueueCapacity(99999); - //配置线程池中的线程的名称前缀 - executor.setThreadNamePrefix("login-record-write-worker-"); - // 设置拒绝策略:放弃任务 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy()); - //执行初始化 - executor.initialize(); - WRITE_RECORD_EXECUTOR = executor; - } - - @Override - public void saveAsync(LoginRecord record) { - WRITE_RECORD_EXECUTOR.execute(new MarkedRunnable(() -> save(record))); - } - - @Override - public void loginSuccess(String cellphone, Long userId) { - LoginRecord record = new LoginRecord(); - LocalDateTime now = LocalDateTime.now(); - record.setLoginTime(now); - record.setLoginDate(now.toLocalDate()); - record.setUserId(userId); - record.setCellPhone(cellphone); - record.setIpv4(WebUtils.getRemoteAddr()); - saveAsync(record); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/MenuServiceImpl.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/MenuServiceImpl.java deleted file mode 100644 index a4d4632..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/MenuServiceImpl.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.tianji.auth.service.impl; - -import cn.hutool.core.collection.CollUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.auth.constants.AuthConstants; -import com.tianji.auth.domain.po.AccountRole; -import com.tianji.auth.domain.po.Menu; -import com.tianji.auth.domain.po.RoleMenu; -import com.tianji.auth.mapper.MenuMapper; -import com.tianji.auth.service.IAccountRoleService; -import com.tianji.auth.service.IMenuService; -import com.tianji.auth.service.IRoleMenuService; -import com.tianji.auth.service.IRoleService; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.utils.UserContext; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -import static com.tianji.auth.common.constants.AuthErrorInfo.Msg.MENU_NOT_FOUND; -import static com.tianji.auth.common.constants.AuthErrorInfo.Msg.ROLE_NOT_FOUND; - -/** - *

- * 权限表,包括菜单权限和访问路径权限 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@Service -@RequiredArgsConstructor -public class MenuServiceImpl extends ServiceImpl implements IMenuService { - - private final IRoleMenuService roleMenuService; - private final IRoleService roleService; - private final IAccountRoleService accountRoleService; - - @Override - public List listMenuByUser() { - // 1.获取用户信息 - Long userId = UserContext.getUser(); - // 2.查询角色 - List accountRoles = accountRoleService.lambdaQuery().eq(AccountRole::getAccountId, userId).list(); - if (CollUtil.isEmpty(accountRoles)) { - return Collections.emptyList(); - } - List roleIds = accountRoles.stream().map(AccountRole::getRoleId).collect(Collectors.toList()); - // 3.查询菜单 - return getBaseMapper().listByRoles(roleIds); - } - - @Override - @Transactional - public void saveMenu(Menu menu) { - // 1.新增菜单 - save(menu); - // 2.判断当前菜单是否有父菜单 - if(menu.getParentId() != 0) { - // 有父菜单,需要判断父菜单hashChildren属性 - Menu parent = getById(menu.getParentId()); - if(!parent.getHasChildren()){ - // 更新父菜单的hasChildren属性 - parent.setHasChildren(true); - parent.setUpdateTime(null); - updateById(parent); - } - } - // 3.与管理员关联 - RoleMenu roleMenu = new RoleMenu(); - roleMenu.setMenuId(menu.getId()); - roleMenu.setRoleId(AuthConstants.ADMIN_ROLE_ID); - roleMenuService.save(roleMenu); - } - - @Override - @Transactional - public void deleteMenu(Long id) { - // 1.查询当前菜单 - Menu menu = getById(id); - if (menu == null) { - return; - } - // 2.判断当前菜单是否有子菜单 - List delIds; - if (menu.getHasChildren()) { - // 2.1.添加子菜单及父菜单 - delIds = lambdaQuery() - .eq(Menu::getParentId, id) - .list() - .stream() - .map(Menu::getId) - .collect(Collectors.toList()); - // 添加父菜单id - delIds.add(id); - }else { - // 2.2.添加父菜单id - delIds = Collections.singletonList(id); - } - // 3.删除菜单 - removeByIds(delIds); - // 4.删除菜单与角色的关联数据 - roleMenuService.remove(new LambdaQueryWrapper().in(RoleMenu::getMenuId, delIds)); - } - - @Override - public void bindRoleMenus(Long roleId, List menuIds) { - // 1.判断角色是否存在 - boolean exists = roleService.exists(roleId); - if (!exists) { - throw new CommonException(ROLE_NOT_FOUND); - } - // 2.判断菜单是否存在 - Integer menuCount = lambdaQuery().in(Menu::getId, menuIds).count(); - if (menuCount != menuIds.size()) { - throw new CommonException(MENU_NOT_FOUND); - } - // 3.绑定关系 - List roleMenus = new ArrayList<>(menuCount); - for (Long menuId : menuIds) { - roleMenus.add(new RoleMenu(roleId, menuId)); - } - // 4.写入数据库 - roleMenuService.saveBatch(roleMenus); - } - - @Override - public void deleteRoleMenus(Long roleId, List menuIds) { - roleMenuService.deleteRoleMenus(roleId, menuIds); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/PrivilegeServiceImpl.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/PrivilegeServiceImpl.java deleted file mode 100644 index aa045f7..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/PrivilegeServiceImpl.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.tianji.auth.service.impl; - -import cn.hutool.core.collection.CollectionUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.auth.common.domain.PrivilegeRoleDTO; -import com.tianji.auth.domain.po.Privilege; -import com.tianji.auth.domain.po.RolePrivilege; -import com.tianji.auth.mapper.PrivilegeMapper; -import com.tianji.auth.service.IPrivilegeService; -import com.tianji.auth.service.IRolePrivilegeService; -import com.tianji.auth.service.IRoleService; -import com.tianji.auth.util.PrivilegeCache; -import com.tianji.common.domain.query.PageQuery; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.utils.CollUtils; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.stream.Collectors; - -import static com.tianji.auth.common.constants.AuthErrorInfo.Msg.*; -import static com.tianji.auth.constants.AuthConstants.ADMIN_ROLE_ID; - -/** - *

- * 权限表,包括菜单权限和访问路径权限 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-06-15 - */ -@Service -@RequiredArgsConstructor -public class PrivilegeServiceImpl extends ServiceImpl implements IPrivilegeService { - - private final IRolePrivilegeService rolePrivilegeService; - private final IRoleService roleService; - private final PrivilegeCache privilegeCache; - - @Override - public Page listPrivilegesByPage(PageQuery pageQuery) { - // 1.分页查询 - return query() - .orderBy(pageQuery.getSortBy() != null, pageQuery.getIsAsc(), pageQuery.getSortBy()) - .page(new Page<>(pageQuery.getPageNo(), pageQuery.getPageSize())); - } - - @Override - @Transactional - public void savePrivilege(Privilege p) { - p.setMethod(p.getMethod().toUpperCase()); - // 1.判断是否存在 - Integer count = lambdaQuery() - .eq(Privilege::getMethod, p.getMethod()) - .eq(Privilege::getUri, p.getUri()) - .count(); - if(count > 0){ - // 已经存在,结束 - throw new CommonException(PRIVILEGE_EXISTS); - } - // 2.新增权限数据 - save(p); - // 3.给超级管理员加权限 - RolePrivilege rolePrivilege = new RolePrivilege(); - rolePrivilege.setPrivilegeId(p.getId()); - rolePrivilege.setRoleId(ADMIN_ROLE_ID); - rolePrivilegeService.save(rolePrivilege); - - // 4.添加缓存 - privilegeCache.cacheSinglePrivilege(p, CollUtils.singletonSet(ADMIN_ROLE_ID)); - } - - @Override - @Transactional - public void removePrivilegeById(Long id) { - // 删除权限 - removeById(id); - // 删除角色权限关联 - rolePrivilegeService.removeByPrivilegeId(id); - // 删除缓存 - privilegeCache.removePrivilegeCacheById(id); - } - - @Override - public List listPrivilegeRoles() { - // 1.查询所有权限 - List privileges = list(); - // 2.查询所有角色 - List rpList = rolePrivilegeService.list(); - // 3.按照权限将角色分组 - Map> rpMap = rpList.stream() - .collect(Collectors.groupingBy(RolePrivilege::getPrivilegeId)); - // 4.组装权限对应角色 - List list = new ArrayList<>(privileges.size()); - for (Privilege p : privileges) { - // 4.1.根据权限查询角色 - Set roles = rpMap.get(p.getId()) - .stream() - .map(RolePrivilege::getRoleId) - .collect(Collectors.toSet()); - // 4.2.组装 - PrivilegeRoleDTO prDTO = new PrivilegeRoleDTO(); - prDTO.setId(p.getId()); - prDTO.setRoles(roles); - prDTO.setAntPath(p.getMethod() + ":" + p.getUri()); - prDTO.setInternal(p.getInternal()); - // 4.3.存入map - list.add(prDTO); - } - return list; - } - - @Override - public Set listPrivilegeByRoleId(Long roleId) { - List rolePrivileges = rolePrivilegeService.lambdaQuery() - .eq(RolePrivilege::getRoleId, roleId) - .list(); - if (CollectionUtil.isEmpty(rolePrivileges)) { - return Collections.emptySet(); - } - return rolePrivileges.stream().map(RolePrivilege::getPrivilegeId).collect(Collectors.toSet()); - } - - @Override - @Transactional - public void bindRolePrivileges(Long roleId, List privilegeIds) { - // 1.判断角色是否存在 - boolean roleExists = roleService.exists(roleId); - if (!roleExists) { - throw new CommonException(ROLE_NOT_FOUND); - } - // 2.判断权限是否存在 - Integer privilegeCount = lambdaQuery().in(Privilege::getId, privilegeIds).count(); - if (privilegeCount != privilegeIds.size()) { - throw new CommonException(PRIVILEGE_NOT_FOUND); - } - // 3.绑定关系 - List rolePrivileges = new ArrayList<>(privilegeCount); - for (Long privilegeId : privilegeIds) { - rolePrivileges.add(new RolePrivilege(roleId, privilegeId)); - } - // 4.写入数据库 - rolePrivilegeService.saveBatch(rolePrivileges); - // 5.重置缓存 - privilegeCache.initPrivilegesCache(listPrivilegeRoles()); - } - - @Override - @Transactional - public void deleteRolePrivileges(Long roleId, List privilegeIds) { - // 1.删除 - rolePrivilegeService.deleteRolePrivileges(roleId, privilegeIds); - // 2.移除对应角色权限缓存 - privilegeCache.initPrivilegesCache(listPrivilegeRoles()); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RoleMenuServiceImpl.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RoleMenuServiceImpl.java deleted file mode 100644 index d9984c5..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RoleMenuServiceImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tianji.auth.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.auth.domain.po.RoleMenu; -import com.tianji.auth.mapper.RoleMenuMapper; -import com.tianji.auth.service.IRoleMenuService; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - *

- * 账户、角色关联表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@Service -public class RoleMenuServiceImpl extends ServiceImpl implements IRoleMenuService { - - @Override - public void removeByRoleId(Long id) { - remove(new LambdaQueryWrapper().eq(RoleMenu::getRoleId, id)); - } - - @Override - public void deleteRoleMenus(Long roleId, List menuIds) { - // delete from role_menus where role_id = ? and menu_id in (?,?); - remove( - new LambdaQueryWrapper() - .eq(RoleMenu::getRoleId, roleId) - .in(RoleMenu::getMenuId, menuIds) - ); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RolePrivilegeServiceImpl.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RolePrivilegeServiceImpl.java deleted file mode 100644 index fbe48f2..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RolePrivilegeServiceImpl.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tianji.auth.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.auth.domain.po.RolePrivilege; -import com.tianji.auth.mapper.RolePrivilegeMapper; -import com.tianji.auth.service.IRolePrivilegeService; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - *

- * 账户、角色关联表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@Service -public class RolePrivilegeServiceImpl extends ServiceImpl implements IRolePrivilegeService { - - @Override - public void removeByPrivilegeId(Long id) { - remove(new QueryWrapper().lambda().eq(RolePrivilege::getPrivilegeId, id)); - } - - @Override - public void removeByRoleId(Long id) { - remove(new QueryWrapper().lambda().eq(RolePrivilege::getRoleId, id)); - } - - @Override - public void deleteRolePrivileges(Long roleId, List privilegeIds) { - remove( - new LambdaQueryWrapper() - .eq(RolePrivilege::getRoleId, roleId) - .in(RolePrivilege::getPrivilegeId, privilegeIds) - ); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RoleServiceImpl.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RoleServiceImpl.java deleted file mode 100644 index b49814b..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/service/impl/RoleServiceImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.tianji.auth.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.auth.domain.po.Role; -import com.tianji.auth.mapper.RoleMapper; -import com.tianji.auth.service.IRoleMenuService; -import com.tianji.auth.service.IRolePrivilegeService; -import com.tianji.auth.service.IRoleService; -import com.tianji.auth.util.PrivilegeCache; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - *

- * 角色表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-06-16 - */ -@Service -@RequiredArgsConstructor -public class RoleServiceImpl extends ServiceImpl implements IRoleService { - - private final IRoleMenuService roleMenuService; - private final IRolePrivilegeService rolePrivilegeService; - private final PrivilegeCache privilegeCache; - - @Override - public boolean exists(Long roleId) { - Integer count = lambdaQuery().eq(Role::getId, roleId).count(); - return count > 0; - } - - @Override - public boolean exists(List roleIds) { - Integer count = lambdaQuery().in(Role::getId, roleIds).count(); - return count != roleIds.size(); - } - - @Override - @Transactional - public void deleteRole(Long id) { - // 1.删除角色 - removeById(id); - // 2.删除角色与权限的关联信息 - roleMenuService.removeByRoleId(id); - rolePrivilegeService.removeByRoleId(id); - // 3.清理缓存 - privilegeCache.removeCacheByRoleId(id); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/task/LoadPrivilegeRunner.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/task/LoadPrivilegeRunner.java deleted file mode 100644 index 330a59f..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/task/LoadPrivilegeRunner.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.auth.task; - -import cn.hutool.core.collection.CollectionUtil; -import com.tianji.auth.common.domain.PrivilegeRoleDTO; -import com.tianji.auth.service.IPrivilegeService; -import com.tianji.auth.util.PrivilegeCache; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.util.List; - - -@Slf4j -@Component -@RequiredArgsConstructor -public class LoadPrivilegeRunner{ - - private final IPrivilegeService privilegeService; - private final PrivilegeCache privilegeCache; - - @PostConstruct - public void loadPrivilegeCache(){ - try { - log.trace("开始更新权限缓存数据"); - // 1.查询数据 - List privilegeRoleDTOS = privilegeService.listPrivilegeRoles(); - if (CollectionUtil.isEmpty(privilegeRoleDTOS)) { - return; - } - // 2.缓存 - privilegeCache.initPrivilegesCache(privilegeRoleDTOS); - log.trace("更新权限缓存数据成功!"); - }catch (Exception e){ - log.error("更新权限缓存数据失败!原因:{}", e.getMessage()); - } - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/util/JwtTool.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/util/JwtTool.java deleted file mode 100644 index 30eacfa..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/util/JwtTool.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.tianji.auth.util; - -import cn.hutool.core.exceptions.ValidateException; -import cn.hutool.core.lang.UUID; -import cn.hutool.json.JSONObject; -import cn.hutool.jwt.JWT; -import cn.hutool.jwt.JWTValidator; -import cn.hutool.jwt.signers.JWTSigner; -import cn.hutool.jwt.signers.JWTSignerUtil; -import com.tianji.auth.common.constants.AuthErrorInfo; -import com.tianji.auth.common.constants.JwtConstants; -import com.tianji.common.domain.dto.LoginUserDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.AssertUtils; -import com.tianji.common.utils.BooleanUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.common.utils.UserContext; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import java.security.KeyPair; -import java.time.Duration; -import java.util.Date; - -import static com.tianji.auth.common.constants.JwtConstants.JWT_REFRESH_TTL; -import static com.tianji.auth.common.constants.JwtConstants.JWT_TOKEN_TTL; - -@Component -public class JwtTool { - private final StringRedisTemplate stringRedisTemplate; - private final JWTSigner jwtSigner; - - public JwtTool(StringRedisTemplate stringRedisTemplate, KeyPair keyPair) { - this.stringRedisTemplate = stringRedisTemplate; - this.jwtSigner = JWTSignerUtil.createSigner("rs256", keyPair); - } - - /** - * 创建 access-token - * - * @param userDTO 用户信息 - * @return access-token - */ - public String createToken(LoginUserDTO userDTO) { - // 1.生成jws - return JWT.create() - .setPayload(JwtConstants.PAYLOAD_USER_KEY, userDTO) - .setExpiresAt(new Date(System.currentTimeMillis() + JWT_TOKEN_TTL.toMillis())) - .setSigner(jwtSigner) - .sign(); - } - - /** - * 创建刷新token,并将token的JTI记录到Redis中 - * - * @param userDetail 用户信息 - * @return 刷新token - */ - public String createRefreshToken(LoginUserDTO userDetail) { - // 1.生成 JTI - String jti = UUID.randomUUID().toString(true); - // 2.生成jwt - // 2.1.如果是记住我,则有效期7天,否则30分钟 - Duration ttl = BooleanUtils.isTrue(userDetail.getRememberMe()) ? - JwtConstants.JWT_REMEMBER_ME_TTL : JWT_REFRESH_TTL; - // 2.2.生成token - String token = JWT.create() - .setJWTId(jti) - .setPayload(JwtConstants.PAYLOAD_USER_KEY, userDetail) - .setExpiresAt(new Date(System.currentTimeMillis() + ttl.toMillis())) - .setSigner(jwtSigner) - .sign(); - // 3.缓存jti,有效期与token一致,过期或删除JTI后,对应的refresh-token失效 - stringRedisTemplate.opsForValue() - .set(JwtConstants.JWT_REDIS_KEY_PREFIX + userDetail.getUserId(), jti, ttl); - return token; - } - - /** - * 解析刷新token - * - * @param refreshToken 刷新token - * @return 解析刷新token得到的用户信息 - */ - public LoginUserDTO parseRefreshToken(String refreshToken) { - // 1.校验token是否为空 - AssertUtils.isNotNull(refreshToken, AuthErrorInfo.Msg.INVALID_TOKEN); - // 2.校验并解析jwt - JWT jwt; - try { - jwt = JWT.of(refreshToken).setSigner(jwtSigner); - } catch (Exception e) { - throw new BadRequestException(400, AuthErrorInfo.Msg.INVALID_TOKEN, e); - } - // 2.校验jwt是否有效 - if (!jwt.verify()) { - // 验证失败 - throw new BadRequestException(400, AuthErrorInfo.Msg.INVALID_TOKEN); - } - // 3.校验是否过期 - try { - JWTValidator.of(jwt).validateDate(); - } catch (ValidateException e) { - throw new BadRequestException(400, AuthErrorInfo.Msg.EXPIRED_TOKEN); - } - // 4.数据格式校验 - Object userPayload = jwt.getPayload(JwtConstants.PAYLOAD_USER_KEY); - Object jtiPayload = jwt.getPayload(JwtConstants.PAYLOAD_JTI_KEY); - if (jtiPayload == null || userPayload == null) { - // 数据为空 - throw new BadRequestException(400, AuthErrorInfo.Msg.INVALID_TOKEN); - } - - // 5.数据解析 - LoginUserDTO userDTO; - try { - userDTO = ((JSONObject) userPayload).toBean(LoginUserDTO.class); - } catch (RuntimeException e) { - // 数据格式有误 - throw new BadRequestException(400, AuthErrorInfo.Msg.INVALID_TOKEN); - } - - // 6.JTI校验 - String jti = stringRedisTemplate.opsForValue().get(JwtConstants.JWT_REDIS_KEY_PREFIX + userDTO.getUserId()); - if (!StringUtils.equals(jti, jtiPayload.toString())) { - // jti不一致 - throw new BadRequestException(400, AuthErrorInfo.Msg.INVALID_TOKEN); - } - return userDTO; - } - - /** - * 清理刷新refresh-token的jti,本质是refresh-token作废 - */ - public void cleanJtiCache() { - stringRedisTemplate.delete(JwtConstants.JWT_REDIS_KEY_PREFIX + UserContext.getUser()); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/util/PrivilegeCache.java b/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/util/PrivilegeCache.java deleted file mode 100644 index 4b8df90..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/java/com/tianji/auth/util/PrivilegeCache.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.tianji.auth.util; - -import cn.hutool.json.JSONUtil; -import com.tianji.auth.common.domain.PrivilegeRoleDTO; -import com.tianji.auth.domain.po.Privilege; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.JsonUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.BoundHashOperations; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import static com.tianji.auth.common.constants.JwtConstants.AUTH_PRIVILEGE_KEY; -import static com.tianji.auth.common.constants.JwtConstants.AUTH_PRIVILEGE_VERSION_KEY; - -@Slf4j -@Component -public class PrivilegeCache { - private final BoundHashOperations hashOps; - private final StringRedisTemplate stringRedisTemplate; - - public PrivilegeCache(StringRedisTemplate stringRedisTemplate) { - this.stringRedisTemplate = stringRedisTemplate; - this.hashOps = stringRedisTemplate.boundHashOps(AUTH_PRIVILEGE_KEY); - } - - public void initPrivilegesCache(List list) { - // 1.组装权限对应角色 - Map map = new HashMap<>(); - for (PrivilegeRoleDTO prDTO : list) { - map.put(prDTO.getId().toString(), JSONUtil.toJsonStr(prDTO)); - } - // 2.写入 redis - hashOps.putAll(map); - // 3.版本递增 - incrementVersion(); - } - - public void cacheSinglePrivilege(Privilege p, Set roleIds) { - try { - PrivilegeRoleDTO privilegeRoleDTO = new PrivilegeRoleDTO(); - privilegeRoleDTO.setId(p.getId()); - privilegeRoleDTO.setAntPath(p.getMethod() + ":" + p.getUri()); - privilegeRoleDTO.setRoles(roleIds); - privilegeRoleDTO.setInternal(p.getInternal()); - hashOps.put(p.getId().toString(), JSONUtil.toJsonStr(privilegeRoleDTO)); - incrementVersion(); - } catch (Exception e) { - log.error("缓存权限信息失败。 ->", e); - throw new RuntimeException(e); - } - } - - public void removePrivilegeCacheById(Long id) { - hashOps.delete(id); - incrementVersion(); - } - - public void removePrivilegeCacheByIds(List ids) { - hashOps.delete(ids.toArray()); - incrementVersion(); - } - - - private void incrementVersion() { - stringRedisTemplate.opsForValue().increment(AUTH_PRIVILEGE_VERSION_KEY, 1); - } - - public void removeCacheByRoleId(Long id) { - // 查询出所有权限信息 - Map cacheMap = hashOps.entries(); - if(CollUtils.isEmpty(cacheMap)){ - return; - } - // 记录修改的数据 - Map modified = new HashMap<>(); - for (Map.Entry en : cacheMap.entrySet()) { - // 获取权限数据 - String value = en.getValue(); - PrivilegeRoleDTO prDTO = JsonUtils.toBean(value, PrivilegeRoleDTO.class); - // 尝试移除角色id - boolean remove = prDTO.getRoles().remove(id); - if(remove){ - modified.put(en.getKey(), JsonUtils.toJsonStr(prDTO)); - } - } - // 写回缓存 - hashOps.putAll(modified); - incrementVersion(); - } -} diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap-local.yml b/tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap.yml b/tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap.yml deleted file mode 100644 index d249fe0..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,47 +0,0 @@ -server: - port: 8081 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: auth-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - data-id: shared-spring.yaml # 共享spring配置 - refresh: false - - data-id: shared-redis.yaml # 共享redis配置 - refresh: false - - data-id: shared-mybatis.yaml # 共享mybatis配置 - refresh: false - - data-id: shared-logs.yaml # 共享日志配置 - refresh: false -encrypt: - key-store: - alias: tjxt #别名 - location: classpath:tjxt.jks #KeyStore 证书库名称 - password: tj123321 #证书库密码 - secret: tj123321 #秘钥 -tj: - swagger: - enable: true - enableResponseWrap: true - package-path: com.tianji.auth.controller - title: 智汇云课堂 - 权限微服务接口文档 - description: 该服务用于管理权限相关信息 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - auth: - resource: - enable: true - includeLoginPaths: - - /menus/me - - /accounts/logout - jdbc: - database: tj_auth \ No newline at end of file diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/AccountRoleMapper.xml b/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/AccountRoleMapper.xml deleted file mode 100644 index 1431043..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/AccountRoleMapper.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/IPointsBoardSeasonService.xml b/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/IPointsBoardSeasonService.xml deleted file mode 100644 index 723c77e..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/IPointsBoardSeasonService.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/LoginRecordMapper.xml b/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/LoginRecordMapper.xml deleted file mode 100644 index 2489268..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/LoginRecordMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/MenuMapper.xml b/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/MenuMapper.xml deleted file mode 100644 index 8932a5b..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/MenuMapper.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/RedisConstants.xml b/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/RedisConstants.xml deleted file mode 100644 index 0295c18..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/RedisConstants.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/RolePrivilegeMapper.xml b/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/RolePrivilegeMapper.xml deleted file mode 100644 index 4375ee3..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/RolePrivilegeMapper.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/StatusEnumValid.xml b/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/StatusEnumValid.xml deleted file mode 100644 index 98788a9..0000000 --- a/tianji-master/tj-auth/tj-auth-service/src/main/resources/mapper/StatusEnumValid.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/tianji-master/tj-auth/tj-auth-service/src/main/resources/tjxt.jks b/tianji-master/tj-auth/tj-auth-service/src/main/resources/tjxt.jks deleted file mode 100644 index dc3aebe59ddcda191e60cae89dea6e875eae515f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2709 zcma)+c{mh`8pdbEFt#u>vaeZZ#K^v9E0h>}i=7x{>?y|Xpe$u)BHPI}l;Kde!8uID z*t1X8Gh|DV==MDKKAq?Ob?+bF^F811{oeP_7e!#r1OdS)0;>fROfJzZ@hdx!8Av3s zYC#CB>Ob)X6ao7Ce@W0n2mzY=6KDUNM@(%0alu)EAR+;({}XDXynZ>L>?lXn#eYsX zN*=LS7d=VGo&{%uY8AHCaR}bghS5=~~cQ*ai zs3PKLJh#0de9{j)uv>8tw*wmFF71zN@z?oBD)4xw!N7pa4w{6~J_>VE_*2P=?dI--rBx_oDw80t`b^917?-xFz1d3I`?o(L7DH;+ z{>a@6>Pj#(yi;5p=50}*!yR*9GQwY#d|D5XUU_rv6%S@%c^Jcg2AP{Wa2&2;zczn# zS*xt95@`b;4_{Akh4*ytPKvtdMK=*gI{}RebqT>*k)!h7Z|(77K{|IYF{r(2dOa7) zaKe1aC$m!%Zi5;|HjCyYq0NGrvK*FROG9H#VQ1X|YtGvya@GwzymD%l3hDy0&l{4R zrKY0`!Z1FJ`AMkuCw~7TVapL7P17%HF@!JyXY2mot!7h$6h`eamNzo>owMd z{W=O@*0eIjU!9}k_04c<^W5ffavV}q=Zonv@bq^;8OaO;K%0i8+I3DLyk;JMa6YcJ zqHhOL?lR$lL`|;?9w!4!w+ww^BZMMZN>m zT*qLk0C{cjj&G=|P`aB?UAbvP=r<_?r<%!bO>6i@b|V)uQN-i6fC$TPCK>jmDL$IZ zey&7!9g6nESKg_(_FteBC6?ushLjp zmxkIV%ktSi4F#o7Q_0V|k3g5e9$QS{7y>D67d|1RiqUH?@`sc9Q09 zpPqc8`6>XzK2f;6QJ>sqIhs@=5*C^7E~N#{_W;sXug=cHJ#v(bPSk`RovM zL0eQ6x3N?Z9&Fn2sak8XBW#mgvN)b(;aC>y;hKMNm}+dxQ=nXG*wB=6Dbv9&oHeq=^O7f{bmF>hrqhpRK?R*!9MaGh6iz4M;A{`#!>nQPv^ep zzt?8ONDlEkuB$eWRRq{=^}Xfz;6t7{o8B^2m2`!Zq6e2oMz>m+K|+^WO>8r#!*-$+ zEI!IfaK*fw=~~0FclVzVDUI8MA6hJ?G7F3NIJllM^F-fcey6iggL&G~KD-{8Hnbeh z;Rd^Q84}L1yGjwbcPYerAZ!AXys+Bx`TN_do_4djZ^(rAvrX={S<0Er`bH(t$Mu}5Rzs_+q0uM; zB=*-6GZT>jx%U$Vf`EXZ%ljV%_`fPz36d2?jrUb|KbL*%ui5Wm*j{ANq4r_!*Ob!ZUPEk$2ZPml$;dbM>mBs_f$+dt~_X(eo}d5Bt5K=7F4_} z+{+Nm!5=1G>Pb!-QfN|giJ-_`DXV#m>7Kr#J{Cb%`iicQ#iMLi@{{py-!qSDxn7)n;ghrmEvOF+9 zPWbW$w?*r6&&yCpZX|UA`s9ms=*>rO0}M>q!AriK0;J!E3gzBzgfqLf{>j`h>^5ar z^cex%0F2iVSI|O&{prqUogM{lT$N?t@7zOW%7~be@!q$LPV1yMSCE>;ZokNeq(f^T37HIKU5dd4hx%w<#e1rn`=Pvu6b4=SA+hVq9Tyt zfL%`?jXjW1zxzXiTYz~mWBSy7LOeFI4Cnepde$gj@_DVn!VO9B)uDYBeo;SG9tHwo3n<(dvJDSW9g0(o!@?L6I7edrm@^ITtBeClRwYDkl@bKJ2f^v=!x*+MdH zS6(*bsc%*YTOPhEs5_<#YaZ{XQ@&+%NAI(7FWe` z^PmeSq}l!&sVgJ0GZ*04YOt!w!dI(YfBrSb$zvoyvG%sl$6NeIzOX)|ub^IhRcY}fS#TyX;QC%s z2x4~!^@eha6QzzUKshh26+~o`D0|k63`A0~?V!Lu(Mx!u`ZKOS_%W&E&1;dKUERlB zfgI8@gGbTu5~R`?5I;a_6cdcXNY$|iJa+ZE$;&>7(nX1(U`$YX4loD_1weQ?nPzY} u+ub^-2n((=xW=j}?c@}~%hF$>#M97xKDgHU=ny0nn&ESe2m%8WiT?sef!8Ad diff --git a/tianji-master/tj-auth/tj-auth-service/tjxt.jks b/tianji-master/tj-auth/tj-auth-service/tjxt.jks deleted file mode 100644 index dc3aebe59ddcda191e60cae89dea6e875eae515f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2709 zcma)+c{mh`8pdbEFt#u>vaeZZ#K^v9E0h>}i=7x{>?y|Xpe$u)BHPI}l;Kde!8uID z*t1X8Gh|DV==MDKKAq?Ob?+bF^F811{oeP_7e!#r1OdS)0;>fROfJzZ@hdx!8Av3s zYC#CB>Ob)X6ao7Ce@W0n2mzY=6KDUNM@(%0alu)EAR+;({}XDXynZ>L>?lXn#eYsX zN*=LS7d=VGo&{%uY8AHCaR}bghS5=~~cQ*ai zs3PKLJh#0de9{j)uv>8tw*wmFF71zN@z?oBD)4xw!N7pa4w{6~J_>VE_*2P=?dI--rBx_oDw80t`b^917?-xFz1d3I`?o(L7DH;+ z{>a@6>Pj#(yi;5p=50}*!yR*9GQwY#d|D5XUU_rv6%S@%c^Jcg2AP{Wa2&2;zczn# zS*xt95@`b;4_{Akh4*ytPKvtdMK=*gI{}RebqT>*k)!h7Z|(77K{|IYF{r(2dOa7) zaKe1aC$m!%Zi5;|HjCyYq0NGrvK*FROG9H#VQ1X|YtGvya@GwzymD%l3hDy0&l{4R zrKY0`!Z1FJ`AMkuCw~7TVapL7P17%HF@!JyXY2mot!7h$6h`eamNzo>owMd z{W=O@*0eIjU!9}k_04c<^W5ffavV}q=Zonv@bq^;8OaO;K%0i8+I3DLyk;JMa6YcJ zqHhOL?lR$lL`|;?9w!4!w+ww^BZMMZN>m zT*qLk0C{cjj&G=|P`aB?UAbvP=r<_?r<%!bO>6i@b|V)uQN-i6fC$TPCK>jmDL$IZ zey&7!9g6nESKg_(_FteBC6?ushLjp zmxkIV%ktSi4F#o7Q_0V|k3g5e9$QS{7y>D67d|1RiqUH?@`sc9Q09 zpPqc8`6>XzK2f;6QJ>sqIhs@=5*C^7E~N#{_W;sXug=cHJ#v(bPSk`RovM zL0eQ6x3N?Z9&Fn2sak8XBW#mgvN)b(;aC>y;hKMNm}+dxQ=nXG*wB=6Dbv9&oHeq=^O7f{bmF>hrqhpRK?R*!9MaGh6iz4M;A{`#!>nQPv^ep zzt?8ONDlEkuB$eWRRq{=^}Xfz;6t7{o8B^2m2`!Zq6e2oMz>m+K|+^WO>8r#!*-$+ zEI!IfaK*fw=~~0FclVzVDUI8MA6hJ?G7F3NIJllM^F-fcey6iggL&G~KD-{8Hnbeh z;Rd^Q84}L1yGjwbcPYerAZ!AXys+Bx`TN_do_4djZ^(rAvrX={S<0Er`bH(t$Mu}5Rzs_+q0uM; zB=*-6GZT>jx%U$Vf`EXZ%ljV%_`fPz36d2?jrUb|KbL*%ui5Wm*j{ANq4r_!*Ob!ZUPEk$2ZPml$;dbM>mBs_f$+dt~_X(eo}d5Bt5K=7F4_} z+{+Nm!5=1G>Pb!-QfN|giJ-_`DXV#m>7Kr#J{Cb%`iicQ#iMLi@{{py-!qSDxn7)n;ghrmEvOF+9 zPWbW$w?*r6&&yCpZX|UA`s9ms=*>rO0}M>q!AriK0;J!E3gzBzgfqLf{>j`h>^5ar z^cex%0F2iVSI|O&{prqUogM{lT$N?t@7zOW%7~be@!q$LPV1yMSCE>;ZokNeq(f^T37HIKU5dd4hx%w<#e1rn`=Pvu6b4=SA+hVq9Tyt zfL%`?jXjW1zxzXiTYz~mWBSy7LOeFI4Cnepde$gj@_DVn!VO9B)uDYBeo;SG9tHwo3n<(dvJDSW9g0(o!@?L6I7edrm@^ITtBeClRwYDkl@bKJ2f^v=!x*+MdH zS6(*bsc%*YTOPhEs5_<#YaZ{XQ@&+%NAI(7FWe` z^PmeSq}l!&sVgJ0GZ*04YOt!w!dI(YfBrSb$zvoyvG%sl$6NeIzOX)|ub^IhRcY}fS#TyX;QC%s z2x4~!^@eha6QzzUKshh26+~o`D0|k63`A0~?V!Lu(Mx!u`ZKOS_%W&E&1;dKUERlB zfgI8@gGbTu5~R`?5I;a_6cdcXNY$|iJa+ZE$;&>7(nX1(U`$YX4loD_1weQ?nPzY} u+ub^-2n((=xW=j}?c@}~%hF$>#M97xKDgHU=ny0nn&ESe2m%8WiT?sef!8Ad diff --git a/tianji-master/tj-common/pom.xml b/tianji-master/tj-common/pom.xml deleted file mode 100644 index f5ddcc0..0000000 --- a/tianji-master/tj-common/pom.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-common - - - 11 - 11 - - - - org.hibernate.validator - hibernate-validator - - - com.github.xiaoymin - knife4j-spring-boot-starter - - - org.springframework.boot - spring-boot-starter-json - - - - cn.hutool - hutool-all - ${hutool.version} - - - com.baomidou - mybatis-plus-core - ${mybatis-plus.version} - provided - - - com.baomidou - mybatis-plus-extension - ${mybatis-plus.version} - provided - - - org.apache.tomcat.embed - tomcat-embed-core - 9.0.38 - provided - - - org.aspectj - aspectjweaver - - - org.redisson - redisson - provided - - - org.springframework - spring-webmvc - provided - - - - org.springframework.amqp - spring-amqp - provided - - - org.springframework.amqp - spring-rabbit - provided - - - io.github.openfeign - feign-core - - - - - com.xuxueli - xxl-job-core - provided - - - \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/BasicIdMessageProcessor.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/BasicIdMessageProcessor.java deleted file mode 100644 index 21859a2..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/BasicIdMessageProcessor.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.common.autoconfigure.mq; - -import cn.hutool.core.lang.UUID; -import org.slf4j.MDC; -import org.springframework.amqp.AmqpException; -import org.springframework.amqp.core.Message; -import org.springframework.amqp.core.MessagePostProcessor; - -import static com.tianji.common.constants.Constant.REQUEST_ID_HEADER; - -/** - * 这段代码是一个Java类, - * 实现了MessagePostProcessor接口, - * 用于在消息发送到消息代理之前修改消息。 - * 这个特定的实现的目的是为每个消息添加一个唯一的请求ID。 - * @author 夜灬瞬 - */ -public class BasicIdMessageProcessor implements MessagePostProcessor { - @Override - public Message postProcessMessage(Message message) throws AmqpException { - /* - 该方法首先尝试使用常量REQUEST_ID_HEADER(requestId) - 作为键从MDC(Mapped Diagnostic Context)中检索请求ID。 - */ - String requestId = MDC.get(REQUEST_ID_HEADER); - if (requestId == null) { - /* - 如果未找到请求ID, - 则使用UUID类生成一个新的请求ID, - 并将结果存储在requestId变量中。 - */ - requestId = UUID.randomUUID().toString(true); - } - // 写入RequestID标示 - /* - 接着使用setHeader方法将请求ID添加到消息的属性中,使用常量REQUEST_ID_HEADER作为键 - */ - message.getMessageProperties().setHeader(REQUEST_ID_HEADER, requestId); - return message; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/DelayedMessageProcessor.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/DelayedMessageProcessor.java deleted file mode 100644 index 0a7a32c..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/DelayedMessageProcessor.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.tianji.common.autoconfigure.mq; - -import org.springframework.amqp.AmqpException; -import org.springframework.amqp.core.Message; - -import java.time.Duration; - -/** - * 在发送消息时添加延迟时间 - * @author yhs - */ -public class DelayedMessageProcessor extends BasicIdMessageProcessor { - - private final long delay; - - /** - * 构造函数中的参数是一个Duration类型的对象,表示延迟的时间。 - * 在构造函数中,这个时间会被转换为毫秒,并存储在类的私有变量delay中。 - * @param delay 变量 - */ - public DelayedMessageProcessor(Duration delay) { - this.delay = delay.toMillis(); - } - - /** - * postProcessMessage方法是在发送消息之前调用的方法,它会对消息进行一些处理。 - * 首先 - * 它调用了BasicIdMessageProcessor类的postProcessMessage方法, - * 添加了一个消息ID。 - * 然后 - * 它将延迟时间添加到消息属性中 - * 使用了一个名为"x-delay"的头部信息。 - * 这样,在发送消息时,就可以通过这个头部信息指定消息的延迟时间,从而实现延迟发送的功能。 - * @param message 消息 - * @return 返回 - * @throws AmqpException 异常 - */ - @Override - public Message postProcessMessage(Message message) throws AmqpException { - // 1.添加消息id - super.postProcessMessage(message); - // 2.添加延迟时间 - message.getMessageProperties().setHeader("x-delay", delay); - return message; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/MqConfig.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/MqConfig.java deleted file mode 100644 index 57cecca..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/MqConfig.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.tianji.common.autoconfigure.mq; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.tianji.common.utils.StringUtils; -import org.slf4j.MDC; -import org.springframework.amqp.core.*; -import org.springframework.amqp.rabbit.config.ContainerCustomizer; -import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; -import org.springframework.amqp.rabbit.connection.ConnectionFactory; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; -import org.springframework.amqp.rabbit.retry.MessageRecoverer; -import org.springframework.amqp.rabbit.retry.RepublishMessageRecoverer; -import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter; -import org.springframework.amqp.support.converter.MessageConverter; -import org.springframework.beans.factory.ObjectProvider; -import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.EnvironmentAware; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.env.Environment; - -import static com.tianji.common.constants.Constant.REQUEST_ID_HEADER; -import static com.tianji.common.constants.MqConstants.Exchange.ERROR_EXCHANGE; -import static com.tianji.common.constants.MqConstants.Key.ERROR_KEY_PREFIX; -import static com.tianji.common.constants.MqConstants.Queue.ERROR_QUEUE_TEMPLATE; - - -/** - * MqConfig 用于配置RabbitMQ的相关参数和组件 - * 实现了Spring的EnvironmentAware接口, - * 用于在应用程序启动时获取应用程序的名称, - * 并根据该名称设置默认的错误路由键和错误队列。 - *
- * {@code @ConditionalOnClass} - * 这个注解表示只有当 MessageConverter和 AmqpTemplate 这两个类在类路径中存在时 - * 才会创建这个配置类 - * @author 夜灬瞬 - */ -@Configuration -@ConditionalOnClass(value = {MessageConverter.class, AmqpTemplate.class}) -public class MqConfig implements EnvironmentAware{ - - private String defaultErrorRoutingKey; - private String defaultErrorQueue; - - /** - * 用于创建一个名为"rabbitListenerContainerFactory"的bean对象。 - * 这个bean对象是一个RabbitMQ的监听容器工厂,用于处理消息的消费者。 - * @param configurer - * @param connectionFactory - * @param simpleContainerCustomizer - * @return - */ - @Bean(name = "rabbitListenerContainerFactory") - @ConditionalOnProperty(prefix = "spring.rabbitmq.listener", name = "type", havingValue = "simple", - matchIfMissing = true) - SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory( - SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory, - ObjectProvider> simpleContainerCustomizer) { - // 创建 SimpleRabbitListenerContainerFactory 对象 - SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); - // 使用 configurer对象对 factory对象进行配置 - configurer.configure(factory, connectionFactory); - // 设置一个容器自定义器,用于对容器进行进一步的定制。 - simpleContainerCustomizer.ifUnique(factory::setContainerCustomizer); - /* - 这段代码设置了一个消息后处理器。 - 这个后处理器会在消息被消费者接收后执行,用于对消息进行后续处理。 - 具体来说, - 这个后处理器会从消息的消息属性中获取一个名为"REQUEST_ID_HEADER"的头部信息,并将其放入MDC中。 - 这样,在后续的日志输出中,就可以方便地获取到这个请求的ID信息了。 - */ - factory.setAfterReceivePostProcessors(message -> { - Object header = message.getMessageProperties().getHeader(REQUEST_ID_HEADER); - if(header != null) { - MDC.put(REQUEST_ID_HEADER, header.toString()); - } - return message; - }); - return factory; - } - - /** - * 这段代码的作用是创建一个RabbitMQ消息转换器,用于将JSON格式的消息转换为Java对象。 - * @param mapper JSON - * @return 返回 - */ - @Bean - public MessageConverter messageConverter(ObjectMapper mapper){ - return new Jackson2JsonMessageConverter(mapper); - } - - /** - *

消息处理失败的重试策略

- * 本地重试失败后,消息投递到专门的失败交换机和失败消息队列:error.queue - */ - @Bean - @ConditionalOnClass(MessageRecoverer.class) - @ConditionalOnMissingBean - public MessageRecoverer republishMessageRecoverer(RabbitTemplate rabbitTemplate){ - // 消息处理失败后,发送到错误交换机:error.direct,RoutingKey默认是error.微服务名称 - return new RepublishMessageRecoverer( - rabbitTemplate, ERROR_EXCHANGE, defaultErrorRoutingKey); - } - - /** - * rabbitmq发送工具 - * - */ - @Bean - @ConditionalOnMissingBean - @ConditionalOnClass(RabbitTemplate.class) - public RabbitMqHelper rabbitMqHelper(RabbitTemplate rabbitTemplate){ - return new RabbitMqHelper(rabbitTemplate); - } - - /** - * 专门接收处理失败的消息 - */ - @Bean - public DirectExchange errorMessageExchange(){ - return new DirectExchange(ERROR_EXCHANGE); - } - - /** - * 默认队列 - * @return 队列 - */ - @Bean - public Queue errorQueue(){ - return new Queue(defaultErrorQueue, true); - } - - /** - * 异常队列 交换机 绑定 - * @param errorQueue 异常队列 - * @param errorMessageExchange 异常交换机 - * @return 返回绑定对象 - */ - @Bean - public Binding errorBinding(Queue errorQueue, DirectExchange errorMessageExchange){ - return BindingBuilder.bind(errorQueue).to(errorMessageExchange).with(defaultErrorRoutingKey); - } - - @Override - public void setEnvironment(Environment environment) { - String appName = environment.getProperty("spring.application.name"); - // 设置错误队列的路由键 error. applicationName - this.defaultErrorRoutingKey = ERROR_KEY_PREFIX + appName; - // 设置错误队列的队列名 error. applicationName .queue - this.defaultErrorQueue = StringUtils.format(ERROR_QUEUE_TEMPLATE, appName); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/RabbitMqHelper.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/RabbitMqHelper.java deleted file mode 100644 index b8c180e..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mq/RabbitMqHelper.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.tianji.common.autoconfigure.mq; - -import cn.hutool.core.lang.UUID; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.amqp.core.MessagePostProcessor; -import org.springframework.amqp.rabbit.connection.CorrelationData; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.time.Duration; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ThreadPoolExecutor; - -import static com.tianji.common.constants.Constant.REQUEST_ID_HEADER; - -/** - * @author 夜灬瞬 - */ -@Slf4j -public class RabbitMqHelper { - - private final RabbitTemplate rabbitTemplate; - private final MessagePostProcessor processor = new BasicIdMessageProcessor(); - private final ThreadPoolTaskExecutor executor; - - /** - * 用于创建一个RabbitMQ帮助类对象 - * 在构造函数中 - * 创建了一个ThreadPoolTaskExecutor对象 - * 并配置了该对象的一些属性 - * 用于异步发送RabbitMQ消息。 - * @param rabbitTemplate rabbitTemplate - */ - public RabbitMqHelper(RabbitTemplate rabbitTemplate) { - this.rabbitTemplate = rabbitTemplate; - executor = new ThreadPoolTaskExecutor(); - //配置核心线程数 - executor.setCorePoolSize(10); - //配置最大线程数 - executor.setMaxPoolSize(15); - //配置队列大小 - executor.setQueueCapacity(99999); - //配置线程池中的线程的名称前缀 - executor.setThreadNamePrefix("mq-async-send-handler"); - - // 设置拒绝策略:当pool已经达到max size的时候,如何处理新任务 - // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - //执行初始化 - executor.initialize(); - } - - /** - * 根据exchange和routingKey发送消息 - */ - public void send(String exchange, String routingKey, T t) { - log.debug("准备发送消息,exchange:{}, RoutingKey:{}, message:{}", exchange, routingKey,t); - // 1.设置消息标示,用于消息确认,消息发送失败直接抛出异常,交给调用者处理 - String id = UUID.randomUUID().toString(true); - // 使用UUID生成一个唯一的消息标识符,并将其设置为CorrelationData对象 - CorrelationData correlationData = new CorrelationData(id); - // 2.设置发送超时时间为500毫秒 - rabbitTemplate.setReplyTimeout(500); - // 3.发送消息,同时设置消息id - rabbitTemplate.convertAndSend(exchange, routingKey, t, processor, correlationData); - } - - /** - * 根据exchange和routingKey发送消息,并且可以设置延迟时间 - */ - public void sendDelayMessage(String exchange, String routingKey, T t, Duration delay) { - // 1.设置消息标示,用于消息确认,消息发送失败直接抛出异常,交给调用者处理 - String id = UUID.randomUUID().toString(true); - // 使用UUID生成一个唯一的消息标识符,并将其设置为CorrelationData对象 - CorrelationData correlationData = new CorrelationData(id); - // 2.设置发送超时时间为500毫秒 - rabbitTemplate.setReplyTimeout(500); - // 3.发送消息,同时设置消息id - rabbitTemplate.convertAndSend(exchange, routingKey, t, new DelayedMessageProcessor(delay), correlationData); - } - - - /** - * 根据exchange和routingKey 异步发送消息,并指定一个延迟时间 - * - * @param exchange 交换机 - * @param routingKey 路由KEY - * @param t 数据 - * @param 数据类型 - */ - public void sendAsyn(String exchange, String routingKey, T t, Long time) { - String requestId = MDC.get(REQUEST_ID_HEADER); - CompletableFuture.runAsync(()->{ - try { - MDC.put(REQUEST_ID_HEADER, requestId); - if(time != null && time > 0){ - Thread.sleep( time); - } - send(exchange, routingKey, t); - }catch (Exception e){ - log.error("推送消息异常,t:{},",t,e); - } - }, executor); - } - - - /** - * 根据exchange和routingKey 异步发送消息 - * - * @param exchange 交换机 - * @param routingKey 路由KEY - * @param t 数据 - * @param 数据类型 - */ - public void sendAsyn(String exchange, String routingKey, T t){ - sendAsyn(exchange, routingKey, t, null); - } - -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/JsonConfig.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/JsonConfig.java deleted file mode 100644 index d1e9607..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/JsonConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.common.autoconfigure.mvc; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; -import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; -import com.tianji.common.utils.DateUtils; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.math.BigInteger; -import java.time.format.DateTimeFormatter; - -@Configuration -@ConditionalOnClass(ObjectMapper.class) -public class JsonConfig { - @Bean - public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { - return jacksonObjectMapperBuilder -> { - DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DateUtils.DEFAULT_DATE_TIME_FORMAT); - jacksonObjectMapperBuilder.timeZone(DateUtils.TIME_ZONE_8); - jacksonObjectMapperBuilder.serializers(new LocalDateTimeSerializer(dateTimeFormatter)); - jacksonObjectMapperBuilder.deserializers(new LocalDateTimeDeserializer(dateTimeFormatter)); - // long -> string - jacksonObjectMapperBuilder.serializerByType(Long.class, ToStringSerializer.instance); - jacksonObjectMapperBuilder.serializerByType(BigInteger.class, ToStringSerializer.instance); - }; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/MvcConfig.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/MvcConfig.java deleted file mode 100644 index b202721..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/MvcConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.tianji.common.autoconfigure.mvc; - - -import com.tianji.common.autoconfigure.mvc.advice.CommonExceptionAdvice; -import com.tianji.common.autoconfigure.mvc.advice.WrapperResponseBodyAdvice; -import com.tianji.common.autoconfigure.mvc.converter.WrapperResponseMessageConverter; -import com.tianji.common.filters.RequestIdFilter; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import javax.servlet.Filter; - -@ConditionalOnClass({CommonExceptionAdvice.class, Filter.class}) -@Configuration -public class MvcConfig implements WebMvcConfigurer { - - /** - *

通用的ControllerAdvice异常处理器

- */ - @Bean - public CommonExceptionAdvice commonExceptionAdvice(){ - return new CommonExceptionAdvice(); - } - - @Bean - public RequestIdFilter requestIdFilter(){ - return new RequestIdFilter(); - } - - @Bean - @ConditionalOnMissingClass("org.springframework.cloud.gateway.filter.GlobalFilter") - public WrapperResponseMessageConverter wrapperResponseMessageConverter( - MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter - ){ - return new WrapperResponseMessageConverter(mappingJackson2HttpMessageConverter); - } - - @Bean - public WrapperResponseBodyAdvice wrapperResponseBodyAdvice(){ - return new WrapperResponseBodyAdvice(); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/ParamCheckerConfig.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/ParamCheckerConfig.java deleted file mode 100644 index 028fcd7..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/ParamCheckerConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.common.autoconfigure.mvc; - -import com.tianji.common.autoconfigure.mvc.aspects.CheckerAspect; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class ParamCheckerConfig { - - @Bean - public CheckerAspect checkerAspect(){ - return new CheckerAspect(); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/advice/CommonExceptionAdvice.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/advice/CommonExceptionAdvice.java deleted file mode 100644 index 12e9786..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/advice/CommonExceptionAdvice.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.tianji.common.autoconfigure.mvc.advice; - -import com.tianji.common.constants.Constant; -import com.tianji.common.domain.R; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.WebUtils; -import feign.FeignException; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindException; -import org.springframework.validation.ObjectError; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.util.NestedServletException; - -import javax.validation.ConstraintViolation; -import javax.validation.ConstraintViolationException; -import java.util.stream.Collectors; - -@RestControllerAdvice -@Slf4j -public class CommonExceptionAdvice { - - @ExceptionHandler(DbException.class) - public Object handleDbException(DbException e) { - log.error("mysql数据库操作异常 -> ", e); - return processResponse(e.getStatus(), e.getCode(), e.getMessage()); - } - - @ExceptionHandler(CommonException.class) - public Object handleBadRequestException(CommonException e) { - log.error("自定义异常 -> {} , 状态码:{}, 异常原因:{} ",e.getClass().getName(), e.getStatus(), e.getMessage()); - log.debug("", e); - return processResponse(e.getStatus(), e.getCode(), e.getMessage()); - } - - @ExceptionHandler(FeignException.class) - public Object handleFeignException(FeignException e) { - log.error("feign远程调用异常 -> ", e); - return processResponse(e.status(), e.status(), e.contentUTF8()); - } - - @ExceptionHandler(MethodArgumentNotValidException.class) - public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - String msg = e.getBindingResult().getAllErrors() - .stream().map(ObjectError::getDefaultMessage) - .collect(Collectors.joining("|")); - log.error("请求参数校验异常 -> {}", msg); - log.debug("", e); - return processResponse(400, 400, msg); - } - @ExceptionHandler(BindException.class) - public Object handleBindException(BindException e) { - log.error("请求参数绑定异常 ->BindException, {}", e.getMessage()); - log.debug("", e); - return processResponse(400, 400, "请求参数格式错误"); - } - - @ExceptionHandler(NestedServletException.class) - public Object handleNestedServletException(NestedServletException e) { - log.error("参数异常 -> NestedServletException,{}", e.getMessage()); - log.debug("", e); - return processResponse(400, 400, "请求参数异常"); - } - - @ExceptionHandler(ConstraintViolationException.class) - public Object handViolationException(ConstraintViolationException e) { - log.error("请求参数异常 -> ConstraintViolationException, {}", e.getMessage()); - - return processResponse( HttpStatus.OK.value(), HttpStatus.BAD_REQUEST.value(), - e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).distinct().collect(Collectors.joining("|")) - ); - } - - @ExceptionHandler(Exception.class) - public Object handleRuntimeException(Exception e) { - log.error("其他异常 uri : {} -> ", WebUtils.getRequest().getRequestURI(), e); - return processResponse(500, 500, "服务器内部异常"); - } - - private Object processResponse(int status, int code, String msg){ - // 1.标记响应异常已处理(避免重复处理) - WebUtils.setResponseHeader(Constant.BODY_PROCESSED_MARK_HEADER, "true"); - // 2.如果是网关请求,http状态码修改为200返回,前端基于业务状态码code来判断状态 - // 如果是微服务请求,http状态码基于异常原样返回,微服务自己做fallback处理 - return WebUtils.isGatewayRequest() ? - R.error(code, msg).requestId(MDC.get(Constant.REQUEST_ID_HEADER)) - : ResponseEntity.status(status).body(msg); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/advice/WrapperResponseBodyAdvice.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/advice/WrapperResponseBodyAdvice.java deleted file mode 100644 index 42aa58a..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/advice/WrapperResponseBodyAdvice.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.common.autoconfigure.mvc.advice; - -import com.tianji.common.constants.Constant; -import com.tianji.common.domain.R; -import com.tianji.common.utils.WebUtils; -import org.slf4j.MDC; -import org.springframework.core.MethodParameter; -import org.springframework.http.MediaType; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.server.ServerHttpRequest; -import org.springframework.http.server.ServerHttpResponse; -import org.springframework.lang.NonNull; -import org.springframework.web.bind.annotation.RestControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; - -@RestControllerAdvice -public class WrapperResponseBodyAdvice implements ResponseBodyAdvice { - @Override - public boolean supports(MethodParameter returnType, @NonNull Class> converterType) { - return returnType.getParameterType() != R.class && WebUtils.isGatewayRequest(); - } - - @Override - public Object beforeBodyWrite( - Object body, @NonNull MethodParameter returnType, @NonNull MediaType selectedContentType, - @NonNull Class> selectedConverterType, - @NonNull ServerHttpRequest request, @NonNull ServerHttpResponse response) { - if (request.getURI().getPath().equals("/v2/api-docs")){ - return body; - } - if (body == null) { - return R.ok().requestId(MDC.get(Constant.REQUEST_ID_HEADER)); - } - if(body instanceof R){ - return body; - } - return R.ok(body).requestId(MDC.get(Constant.REQUEST_ID_HEADER)); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/aspects/CheckerAspect.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/aspects/CheckerAspect.java deleted file mode 100644 index 6734e05..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/aspects/CheckerAspect.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tianji.common.autoconfigure.mvc.aspects; - -import com.tianji.common.utils.ArrayUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.validate.Checker; -import com.tianji.common.validate.annotations.ParamChecker; -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.JoinPoint; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; - -import java.util.List; - -@Aspect -@Slf4j -@SuppressWarnings("all") -public class CheckerAspect { - - @Before("@annotation(paramChecker)") - public void before(JoinPoint joinPoint, ParamChecker paramChecker) { - Object[] args = joinPoint.getArgs(); - if(ArrayUtils.isNotEmpty(args)){ - //遍历方法参数,参数是否实现了Checker接口 - for (Object arg : args){ - if(arg instanceof Checker) { - //调用check方法,校验业务逻辑 - ((Checker)arg).check(); - }else if(arg instanceof List){ - //如果参数是一个集合也要校验 - CollUtils.check((List) arg); - } - } - } - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/converter/WrapperResponseMessageConverter.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/converter/WrapperResponseMessageConverter.java deleted file mode 100644 index 21462cf..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mvc/converter/WrapperResponseMessageConverter.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.tianji.common.autoconfigure.mvc.converter; - -import com.tianji.common.utils.WebUtils; -import org.springframework.http.HttpInputMessage; -import org.springframework.http.HttpOutputMessage; -import org.springframework.http.MediaType; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.HttpMessageNotReadableException; -import org.springframework.http.converter.HttpMessageNotWritableException; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; -import org.springframework.lang.NonNull; - -import java.io.IOException; -import java.util.List; - -public class WrapperResponseMessageConverter implements HttpMessageConverter { - - private final MappingJackson2HttpMessageConverter delegate; - - public WrapperResponseMessageConverter( - MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter) { - this.delegate = mappingJackson2HttpMessageConverter; - } - - @Override - public boolean canRead(@NonNull Class clazz, MediaType mediaType) { - return false; - } - - @Override - public boolean canWrite(@NonNull Class clazz, MediaType mediaType) { - return WebUtils.isGatewayRequest() && delegate.canWrite(clazz, mediaType); - } - - @Override - @NonNull - public List getSupportedMediaTypes() { - return delegate.getSupportedMediaTypes(); - } - - @Override - @NonNull - public Object read(@NonNull Class clazz,@NonNull HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { - return delegate.read(clazz, inputMessage); - } - - @Override - public void write(@NonNull Object o, MediaType contentType,@NonNull HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { - delegate.write(o, contentType, outputMessage); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/BaseMetaObjectHandler.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/BaseMetaObjectHandler.java deleted file mode 100644 index 03a975d..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/BaseMetaObjectHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.tianji.common.autoconfigure.mybatis; - -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import com.tianji.common.utils.NumberUtils; -import com.tianji.common.utils.UserContext; -import org.apache.ibatis.reflection.MetaObject; - -import static com.tianji.common.constants.Constant.DATA_FIELD_NAME_CREATER; -import static com.tianji.common.constants.Constant.DATA_FIELD_NAME_UPDATER; - - -/** - * 操作数据库前自动填充需要更新的内容,只支持单个对象,不支持批量插入更新时的填充 - * - **/ -public class BaseMetaObjectHandler implements MetaObjectHandler { - @Override - public void insertFill(MetaObject metaObject) { - //创建人 - setCreater(metaObject); - - //更新人 - setUpdater(metaObject); - } - - @Override - public void updateFill(MetaObject metaObject) { - //更新数据时,修改更新人 - setUpdater(metaObject); - } - - private void setCreater(MetaObject metaObject) { - Long userId = UserContext.getUser(); - //未找到用户id默认0 - this.strictInsertFill(metaObject, DATA_FIELD_NAME_CREATER, Long.class, NumberUtils.null2Zero(userId)); // 起始版本 3.3.0(推荐使用) - } - - private void setUpdater(MetaObject metaObject) { - Long userId = UserContext.getUser(); - //未找到用户id默认0 - this.strictUpdateFill(metaObject, DATA_FIELD_NAME_UPDATER, Long.class, NumberUtils.null2Zero(userId)); // 起始版本 3.3.0(推荐) - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/MyBatisAutoFillInterceptor.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/MyBatisAutoFillInterceptor.java deleted file mode 100644 index 5187cb5..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/MyBatisAutoFillInterceptor.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.tianji.common.autoconfigure.mybatis; - -import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; -import com.tianji.common.utils.ReflectUtils; -import com.tianji.common.utils.UserContext; -import org.apache.ibatis.executor.Executor; -import org.apache.ibatis.mapping.MappedStatement; -import org.apache.ibatis.mapping.SqlCommandType; - -import java.sql.SQLException; - -import static com.tianji.common.constants.Constant.DATA_FIELD_NAME_CREATER; -import static com.tianji.common.constants.Constant.DATA_FIELD_NAME_UPDATER; - -public class MyBatisAutoFillInterceptor implements InnerInterceptor { - - @Override - public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException { - //1.更新操作 - updateExe(parameter); - //2.插入操作 - insertExe(ms, parameter); - } - - private void insertExe(MappedStatement ms, Object parameter){ - //1.判断当前操作是否是插入操作 - if(ms.getSqlCommandType().compareTo(SqlCommandType.INSERT) == 0) { - //2.判断是否有updater字段,如果 - if(ReflectUtils.containField(DATA_FIELD_NAME_CREATER, parameter.getClass())){ - Long userId = UserContext.getUser(); - //3.有userId也存在并设置updater - if(userId != null){ - //4.当前操作人设置到创建人字段 - ReflectUtils.setFieldValue(parameter, DATA_FIELD_NAME_CREATER, userId); - } - } - } - } - - private void updateExe(Object parameter){ - //1.判断是否有updater字段 - if(ReflectUtils.containField(DATA_FIELD_NAME_UPDATER, parameter.getClass())){ - Long userId = UserContext.getUser(); - //2.如果有userId也存在并设置updater - if(userId != null){ - //3.当前用户设置到更新人字段 - ReflectUtils.setFieldValue(parameter, DATA_FIELD_NAME_UPDATER, userId); - } - } - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/MybatisConfig.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/MybatisConfig.java deleted file mode 100644 index 7e8e6fc..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/mybatis/MybatisConfig.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.tianji.common.autoconfigure.mybatis; - - -import com.baomidou.mybatisplus.annotation.DbType; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ConditionalOnClass({MybatisPlusInterceptor.class, BaseMapper.class}) -public class MybatisConfig { - - /** - * @see MyBatisAutoFillInterceptor 通过自定义拦截器来实现自动注入creater和updater - * @deprecated 存在任务更新数据导致updater写入0或null的问题,暂时废弃 - */ - // @Bean - // @ConditionalOnMissingBean - public BaseMetaObjectHandler baseMetaObjectHandler() { - return new BaseMetaObjectHandler(); - } - - @Bean - @ConditionalOnMissingBean - public MybatisPlusInterceptor mybatisPlusInterceptor(@Autowired(required = false) DynamicTableNameInnerInterceptor innerInterceptor) { - // 1.定义插件主体,注意顺序:表名 > 多租户 > 分页 > 乐观锁 > 字段填充 - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - // 2.表名插件 - if (innerInterceptor != null) { - interceptor.addInnerInterceptor(innerInterceptor); - } - // 3.分页插件 - PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); - paginationInnerInterceptor.setMaxLimit(200L); - interceptor.addInnerInterceptor(paginationInnerInterceptor); - // 4.字段填充插件 - interceptor.addInnerInterceptor(new MyBatisAutoFillInterceptor()); - return interceptor; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/RedissonConfig.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/RedissonConfig.java deleted file mode 100644 index 3e1dbae..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/RedissonConfig.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.tianji.common.autoconfigure.redisson; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.StrUtil; -import com.tianji.common.autoconfigure.redisson.aspect.LockAspect; -import lombok.extern.slf4j.Slf4j; -import org.redisson.Redisson; -import org.redisson.api.RedissonClient; -import org.redisson.config.Config; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.data.redis.RedisProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.time.Duration; -import java.util.ArrayList; -import java.util.List; - -@Slf4j -@ConditionalOnClass({RedissonClient.class, Redisson.class}) -@Configuration -@EnableConfigurationProperties(RedisProperties.class) -public class RedissonConfig { - private static final String REDIS_PROTOCOL_PREFIX = "redis://"; - private static final String REDISS_PROTOCOL_PREFIX = "rediss://"; - - @Bean - @ConditionalOnMissingBean - public LockAspect lockAspect(RedissonClient redissonClient){ - return new LockAspect(redissonClient); - } - - @Bean - @ConditionalOnMissingBean - public RedissonClient redissonClient(RedisProperties properties){ - log.debug("尝试初始化RedissonClient"); - // 1.读取Redis配置 - RedisProperties.Cluster cluster = properties.getCluster(); - RedisProperties.Sentinel sentinel = properties.getSentinel(); - String password = properties.getPassword(); - int timeout = 3000; - Duration d = properties.getTimeout(); - if(d != null){ - timeout = Long.valueOf(d.toMillis()).intValue(); - } - // 2.设置Redisson配置 - Config config = new Config(); - if(cluster != null && !CollectionUtil.isEmpty(cluster.getNodes())){ - // 集群模式 - config.useClusterServers() - .addNodeAddress(convert(cluster.getNodes())) - .setConnectTimeout(timeout) - .setPassword(password); - }else if(sentinel != null && !StrUtil.isEmpty(sentinel.getMaster())){ - // 哨兵模式 - config.useSentinelServers() - .setMasterName(sentinel.getMaster()) - .addSentinelAddress(convert(sentinel.getNodes())) - .setConnectTimeout(timeout) - .setDatabase(0) - .setPassword(password); - }else{ - // 单机模式 - config.useSingleServer() - .setAddress(String.format("redis://%s:%d", properties.getHost(), properties.getPort())) - .setConnectTimeout(timeout) - .setDatabase(0) - .setPassword(password); - } - // 3.创建Redisson客户端 - return Redisson.create(config); - } - - private String[] convert(List nodesObject) { - List nodes = new ArrayList<>(nodesObject.size()); - for (String node : nodesObject) { - if (!node.startsWith(REDIS_PROTOCOL_PREFIX) && !node.startsWith(REDISS_PROTOCOL_PREFIX)) { - nodes.add(REDIS_PROTOCOL_PREFIX + node); - } else { - nodes.add(node); - } - } - return nodes.toArray(new String[0]); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/annotations/Lock.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/annotations/Lock.java deleted file mode 100644 index 1295c0f..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/annotations/Lock.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.tianji.common.autoconfigure.redisson.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.util.concurrent.TimeUnit; - -/** - * 分布式锁 - * Lock - * @author wusongsong - *

- * 加锁操作, - * 抢夺执行权。 - * unlock默认为true 方法执行结束会主动释放锁。 - * 未检测到主动释放锁,则会在1分钟(默认)后自动释放锁. - * key: 锁的KEY。必须填写。不可于其他锁的KEY重复。 - * time: 锁时间。默认为1 - * unit: 锁时间单位。默认为分钟. - * unlock: 是否主动解锁。默认为是 - **/ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface Lock { - - - //加锁key的表达式,支持表达式 - String formatter(); - - //加锁时长 - long time() default 5; - - //阻塞超时时间,默认2分钟,当block为true的时候生效 - long waitTime() default 120; - - //阻塞超时时间单位,默认s - TimeUnit wtUnit() default TimeUnit.SECONDS; - - //加锁时间单位 - TimeUnit unit() default TimeUnit.SECONDS; - - //方法访问完后要不要解锁,默认不解锁 - boolean unlock() default false; - - //如果设定了true,将等待处理后进行处理 - boolean block() default false; - - -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/aspect/LockAspect.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/aspect/LockAspect.java deleted file mode 100644 index 5ba2c50..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/redisson/aspect/LockAspect.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.tianji.common.autoconfigure.redisson.aspect; - -import com.tianji.common.autoconfigure.redisson.annotations.Lock; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.RequestTimeoutException; -import com.tianji.common.utils.AspectUtils; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; - -@Aspect -public class LockAspect { - - private final RedissonClient redissonClient; - - public LockAspect(RedissonClient redissonClient) { - this.redissonClient = redissonClient; - } - - //通过环绕加锁,方法执行前加锁,方法执行后根据注解使用解锁 - @Around("@annotation(lock)") - public Object handleLock(ProceedingJoinPoint pjp, Lock lock) throws Throwable { - String redisKey = AspectUtils.parse(lock.formatter(), AspectUtils.getMethod(pjp), pjp.getArgs()); - //得到锁 - RLock rLock = redissonClient.getLock(redisKey); - long waitTime = 0; - if (lock.block()) { //阻塞等待资源,最多等2分钟 - //根据时间单位转换成ms - waitTime = lock.wtUnit().toMillis(lock.waitTime()); - } - boolean success = rLock.tryLock(waitTime, lock.time(), lock.unit()); - if (!success && !lock.block()) { //未阻塞要求的情况下未得到锁 - throw new BadRequestException(ErrorInfo.Msg.REQUEST_OPERATE_FREQUENTLY); - } - if (!success) { //阻塞情况下未得到锁,请求超时 - throw new RequestTimeoutException(ErrorInfo.Msg.REQUEST_TIME_OUT); - } - - try { - return pjp.proceed(); - } finally { - if(lock.unlock() || lock.block()){ //如果是阻塞锁的话,不管任务执行成功还是失败,都要进行解锁 - rLock.unlock(); - } - } - - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/BaseSwaggerResponseBuilderPlugin.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/BaseSwaggerResponseBuilderPlugin.java deleted file mode 100644 index 5862ad7..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/BaseSwaggerResponseBuilderPlugin.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.tianji.common.autoconfigure.swagger; - -import com.fasterxml.classmate.ResolvedType; -import com.fasterxml.classmate.TypeResolver; -import com.tianji.common.domain.R; -import com.tianji.common.utils.CollUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.Ordered; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.ResponseStatus; -import springfox.documentation.schema.property.ModelSpecificationFactory; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.schema.contexts.ModelContext; -import springfox.documentation.spi.service.OperationBuilderPlugin; -import springfox.documentation.spi.service.contexts.OperationContext; -import springfox.documentation.spi.service.contexts.ResponseContext; -import springfox.documentation.spring.web.plugins.DocumentationPluginsManager; - -import java.util.Optional; - -import static com.github.xiaoymin.knife4j.spring.util.TypeUtils.isVoid; - -public class BaseSwaggerResponseBuilderPlugin implements OperationBuilderPlugin, Ordered { - - @Autowired - private TypeResolver typeResolver; - @Autowired - private DocumentationPluginsManager documentationPlugins; - @Autowired - private ModelSpecificationFactory modelSpecifications; - - @Override - public boolean supports(DocumentationType documentationType) { - return true; - } - - @Override - public int getOrder() { - return Ordered.HIGHEST_PRECEDENCE+13; - } - - @Override - public void apply(OperationContext context) { - // 1.处理返回值类型 - ResolvedType resolvedType = isVoid(context.getReturnType()) ? - typeResolver.resolve(R.class) : typeResolver.resolve(R.class, context.getReturnType()); - ResolvedType returnType = context.alternateFor(resolvedType); - // 2.处理状态码为ok - int httpStatusCode = HttpStatus.OK.value(); - // 3.处理message - String message = message(context); - // 4.处理响应类型 - ModelContext modelContext = context.operationModelsBuilder().addReturn(returnType); - // 5.响应结果 - ResponseContext responseContext = new ResponseContext(context.getDocumentationContext(), context); - responseContext.responseBuilder() - .representation(MediaType.APPLICATION_JSON) - .apply(r -> r.model(m -> { - m.copyOf(modelSpecifications.create(modelContext, returnType)); - m.name("R"); - m.build(); - })) - .description(message) - .code(String.valueOf(httpStatusCode)); - context.operationBuilder() - .responses(CollUtils.singletonList(documentationPlugins.response(responseContext))); - } - - public static String message(OperationContext context) { - Optional responseStatus = context.findAnnotation(ResponseStatus.class); - String reasonPhrase = HttpStatus.OK.getReasonPhrase(); - if (responseStatus.isPresent()) { - reasonPhrase = responseStatus.get().reason(); - if (reasonPhrase.isEmpty()) { - reasonPhrase = responseStatus.get().value().getReasonPhrase(); - } - } - return reasonPhrase; - } -} - diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/BaseSwaggerResponseModelPlugin.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/BaseSwaggerResponseModelPlugin.java deleted file mode 100644 index 6765096..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/BaseSwaggerResponseModelPlugin.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.common.autoconfigure.swagger; - -import com.fasterxml.classmate.ResolvedType; -import com.fasterxml.classmate.TypeResolver; -import com.tianji.common.domain.R; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.Ordered; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spi.service.OperationModelsProviderPlugin; -import springfox.documentation.spi.service.contexts.RequestMappingContext; - -import static com.github.xiaoymin.knife4j.spring.util.TypeUtils.isVoid; - -public class BaseSwaggerResponseModelPlugin implements OperationModelsProviderPlugin, Ordered { - - @Autowired - private TypeResolver typeResolver; - - @Override - public boolean supports(DocumentationType documentationType) { - return true; - } - - @Override - public int getOrder() { - return Ordered.HIGHEST_PRECEDENCE+12; - } - - - @Override - public void apply(RequestMappingContext context) { - ResolvedType resolvedType = isVoid(context.getReturnType()) ? - typeResolver.resolve(R.class) : typeResolver.resolve(R.class, context.getReturnType()); - ResolvedType returnType = context.alternateFor(resolvedType); - context.operationModelsBuilder().addReturn(returnType); - } -} - diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/Knife4jConfiguration.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/Knife4jConfiguration.java deleted file mode 100644 index 4372b94..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/Knife4jConfiguration.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.tianji.common.autoconfigure.swagger; - -import com.fasterxml.classmate.TypeResolver; -import com.tianji.common.domain.R; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.Contact; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; - -import javax.annotation.Resource; - -@Configuration -@ConditionalOnProperty(prefix = "tj.swagger", name = "enable",havingValue = "true") -@EnableConfigurationProperties(SwaggerConfigProperties.class) -public class Knife4jConfiguration { - - @Resource - private SwaggerConfigProperties swaggerConfigProperties; - - @Bean(value = "defaultApi2") - public Docket defaultApi2(TypeResolver typeResolver) { - // 1.初始化Docket - Docket docket = new Docket(DocumentationType.SWAGGER_2); - // 2.是否需要包装R - if(swaggerConfigProperties.getEnableResponseWrap()){ - docket.additionalModels(typeResolver.resolve(R.class)); - } - return docket.apiInfo(new ApiInfoBuilder() - .title(this.swaggerConfigProperties.getTitle()) - .description(this.swaggerConfigProperties.getDescription()) - .contact(new Contact( - this.swaggerConfigProperties.getContactName(), - this.swaggerConfigProperties.getContactUrl(), - this.swaggerConfigProperties.getContactEmail())) - .version(this.swaggerConfigProperties.getVersion()) - .build()) - .select() - //这里指定Controller扫描包路径 - .apis(RequestHandlerSelectors.basePackage(swaggerConfigProperties.getPackagePath())) - .paths(PathSelectors.any()) - .build(); - - } - @Bean - @Primary - @ConditionalOnProperty(prefix = "tj.swagger", name = "enableResponseWrap",havingValue = "true") - public BaseSwaggerResponseModelPlugin baseSwaggerResponseModelPlugin(){ - return new BaseSwaggerResponseModelPlugin(); - } - @Bean - @Primary - @ConditionalOnProperty(prefix = "tj.swagger", name = "enableResponseWrap",havingValue = "true") - public BaseSwaggerResponseBuilderPlugin baseSwaggerResponseBuilderPlugin(){ - return new BaseSwaggerResponseBuilderPlugin(); - } - -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/SwaggerConfigProperties.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/SwaggerConfigProperties.java deleted file mode 100644 index 817bba7..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/swagger/SwaggerConfigProperties.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.common.autoconfigure.swagger; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -import java.io.Serializable; - -/** - * @ClassName SwaggerConfigProperties - * @author wusongsong - * @since 2022/6/27 13:47 - * @version 1.0.0 - **/ -@Data -@ConfigurationProperties(prefix = "tj.swagger") -public class SwaggerConfigProperties implements Serializable { - - private Boolean enable = false; - private Boolean enableResponseWrap = false; - - public String packagePath; - - public String title; - - public String description; - - public String contactName; - - public String contactUrl; - - public String contactEmail; - - public String version; -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/xxljob/XxlJobConfig.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/xxljob/XxlJobConfig.java deleted file mode 100644 index f899171..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/xxljob/XxlJobConfig.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.tianji.common.autoconfigure.xxljob; - -import com.tianji.common.utils.StringUtils; -import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Slf4j -@Configuration -@ConditionalOnClass(XxlJobSpringExecutor.class) -@EnableConfigurationProperties(XxlJobProperties.class) -public class XxlJobConfig { - - @Bean - public XxlJobSpringExecutor xxlJobExecutor(XxlJobProperties prop) { - log.info(">>>>>>>>>>> xxl-job config init."); - XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); - XxlJobProperties.Admin admin = prop.getAdmin(); - if (admin != null && StringUtils.isNotEmpty(admin.getAddress())) { - xxlJobSpringExecutor.setAdminAddresses(admin.getAddress()); - } - XxlJobProperties.Executor executor = prop.getExecutor(); - if (executor != null) { - if (executor.getAppName() != null) - xxlJobSpringExecutor.setAppname(executor.getAppName()); - if (executor.getIp() != null) - xxlJobSpringExecutor.setIp(executor.getIp()); - if (executor.getPort() != null) - xxlJobSpringExecutor.setPort(executor.getPort()); - if (executor.getLogPath() != null) - xxlJobSpringExecutor.setLogPath(executor.getLogPath()); - if (executor.getLogRetentionDays() != null) - xxlJobSpringExecutor.setLogRetentionDays(executor.getLogRetentionDays()); - } - if (prop.getAccessToken() != null) - xxlJobSpringExecutor.setAccessToken(prop.getAccessToken()); - log.info(">>>>>>>>>>> xxl-job config end."); - return xxlJobSpringExecutor; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/xxljob/XxlJobProperties.java b/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/xxljob/XxlJobProperties.java deleted file mode 100644 index d997e04..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/autoconfigure/xxljob/XxlJobProperties.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.common.autoconfigure.xxljob; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@Data -@ConfigurationProperties(prefix = "tj.xxl-job") -public class XxlJobProperties { - - private String accessToken; - private Admin admin; - private Executor executor; - - @Data - public static class Admin { - private String address; - } - - @Data - public static class Executor { - private String appName; - private String address; - private String ip; - private Integer port; - private String logPath; - private Integer logRetentionDays; - - } -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/constants/Constant.java b/tianji-master/tj-common/src/main/java/com/tianji/common/constants/Constant.java deleted file mode 100644 index 7f39e48..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/constants/Constant.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tianji.common.constants; - -public interface Constant { - String REQUEST_ID_HEADER = "requestId"; - String REQUEST_FROM_HEADER = "x-request-from"; - - String GATEWAY_ORIGIN_NAME = "gateway"; - String FEIGN_ORIGIN_NAME = "feign"; - - // 数据字段 - id - String DATA_FIELD_NAME_ID = "id"; - - // 数据字段 - create_time - String DATA_FIELD_NAME_CREATE_TIME = "create_time"; - String DATA_FIELD_NAME_CREATE_TIME_CAMEL = "createTime"; - - // 数据字段 - update_time - String DATA_FIELD_NAME_UPDATE_TIME = "update_time"; - String DATA_FIELD_NAME_UPDATE_TIME_CAMEL = "updateTime"; - - // 数据字段 - liked_times - String DATA_FIELD_NAME_LIKED_TIME = "liked_times"; - String DATA_FIELD_NAME_LIKED_TIME_CAMEL = "likedTimes"; - - // 数据字段 - creater - String DATA_FIELD_NAME_CREATER = "creater"; - - // 数据字段 - updater - String DATA_FIELD_NAME_UPDATER = "updater"; - - // 数据已经删除标识值 - boolean DATA_DELETE = true; - // 数据未删除标识值 - boolean DATA_NOT_DELETE = false; - // 响应结果是否被R标记过 - String BODY_PROCESSED_MARK_HEADER = "IS_BODY_PROCESSED"; - - - - - -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/constants/ErrorInfo.java b/tianji-master/tj-common/src/main/java/com/tianji/common/constants/ErrorInfo.java deleted file mode 100644 index e2bf170..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/constants/ErrorInfo.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.common.constants; - -public interface ErrorInfo { - - interface Msg { - String OK = "OK"; - String INVALID_VERIFY_CODE = "验证码错误"; - - - String SERVER_INTER_ERROR = "服务器内部错误"; - - String DB_SAVE_EXCEPTION = "数据新增失败"; - String DB_DELETE_EXCEPTION = "数据删除失败"; - String DB_BATCH_DELETE_EXCEPTION = "数据批量删除失败"; - String DB_UPDATE_EXCEPTION = "数据更新失败"; - String DB_SORT_FIELD_NOT_FOUND = "排序字段不存在"; - String OPERATE_FAILED = "操作失败"; - - String REQUEST_PARAM_ILLEGAL = "请求参数不合法"; - String REQUEST_OPERATE_FREQUENTLY = "操作频繁,请稍后重试"; - String REQUEST_TIME_OUT = "请求超时"; - - String USER_NOT_EXISTS = "用户信息不存在"; - String INVALID_USER_TYPE = "无效的用户类型"; - } - - interface Code { - int SUCCESS = 200; - int FAILED = 0; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/constants/MqConstants.java b/tianji-master/tj-common/src/main/java/com/tianji/common/constants/MqConstants.java deleted file mode 100644 index b449a36..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/constants/MqConstants.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.tianji.common.constants; - -public interface MqConstants { - interface Exchange{ - /*课程有关的交换机*/ - String COURSE_EXCHANGE = "course.topic"; - - /*订单有关的交换机*/ - String ORDER_EXCHANGE = "order.topic"; - - /*学习有关的交换机*/ - String LEARNING_EXCHANGE = "learning.topic"; - - /*信息中心短信相关的交换机*/ - String SMS_EXCHANGE = "sms.direct"; - - /*异常信息的交换机*/ - String ERROR_EXCHANGE = "error.topic"; - - /*支付有关的交换机*/ - String PAY_EXCHANGE = "pay.topic"; - /*交易服务延迟任务交换机*/ - String TRADE_DELAY_EXCHANGE = "trade.delay.topic"; - // 优惠券有关交换机 - String PROMOTION_EXCHANGE = "promotion.topic"; - - /*点赞记录有关的交换机*/ - String LIKE_RECORD_EXCHANGE = "like.record.topic"; - } - interface Queue { - String ERROR_QUEUE_TEMPLATE = "error.{}.queue"; - } - interface Key{ - /*课程有关的 RoutingKey*/ - String COURSE_NEW_KEY = "course.new"; - String COURSE_UP_KEY = "course.up"; - String COURSE_DOWN_KEY = "course.down"; - String COURSE_EXPIRE_KEY = "course.expire"; - String COURSE_DELETE_KEY = "course.delete"; - - /*订单有关的RoutingKey*/ - String ORDER_PAY_KEY = "order.pay"; - String ORDER_REFUND_KEY = "order.refund"; - - /*积分相关RoutingKey*/ - /* 写回答 */ - String WRITE_REPLY = "reply.new"; - /* 签到 */ - String SIGN_IN = "sign.in"; - /* 学习视频 */ - String LEARN_SECTION = "section.learned"; - /* 写笔记 */ - String WRITE_NOTE = "note.new"; - /* 笔记被采集 */ - String NOTE_GATHERED = "note.gathered"; - - /*点赞的RoutingKey*/ - String LIKED_TIMES_KEY_TEMPLATE = "{}.times.changed"; - /*问答*/ - String QA_LIKED_TIMES_KEY = "QA.times.changed"; - /*笔记*/ - String NOTE_LIKED_TIMES_KEY = "NOTE.times.changed"; - - /*短信系统发送短信*/ - String SMS_MESSAGE = "sms.message"; - - /*异常RoutingKey的前缀*/ - String ERROR_KEY_PREFIX = "error."; - String DEFAULT_ERROR_KEY = "error.#"; - - /*支付有关的key*/ - String PAY_SUCCESS = "pay.success"; - String REFUND_CHANGE = "refund.status.change"; - - String ORDER_DELAY_KEY = "delay.order.query"; - String COUPON_RECEIVE = "coupon:receive"; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/constants/RegexConstants.java b/tianji-master/tj-common/src/main/java/com/tianji/common/constants/RegexConstants.java deleted file mode 100644 index 3b3a86d..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/constants/RegexConstants.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.common.constants; - -import cn.hutool.core.lang.RegexPool; - -public interface RegexConstants extends RegexPool { - /** - * 手机号正则 - */ - String PHONE_PATTERN = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$"; - /** - * 邮箱正则 - */ - String EMAIL_PATTERN = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"; - /** - * 密码正则。6~32位的字母、数字、下划线 - */ - String PASSWORD_PATTERN = "^\\w{4,24}$"; - /** - * 用户名正则。6~32位的字母、数字、下划线 - */ - String USERNAME_PATTERN = "^\\w{4,32}$"; - /** - * 验证码正则, 6位数字或字母 - */ - String VERIFY_CODE_PATTERN = "^[a-zA-Z\\d]{6}$"; - - /** - * 优惠券兑换码模板 - */ - String COUPON_CODE_PATTERN = "^[23456789ABCDEFGHJKLMNPQRSTUVWXYZ]{8}$"; -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/R.java b/tianji-master/tj-common/src/main/java/com/tianji/common/domain/R.java deleted file mode 100644 index 52769dc..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/R.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.tianji.common.domain; - -import com.tianji.common.constants.Constant; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.slf4j.MDC; - -import static com.tianji.common.constants.ErrorInfo.Code.FAILED; -import static com.tianji.common.constants.ErrorInfo.Code.SUCCESS; -import static com.tianji.common.constants.ErrorInfo.Msg.OK; - -@Data -@ApiModel(description = "通用响应结果") -public class R { - @ApiModelProperty(value = "业务状态码,200-成功,其它-失败") - private int code; - @ApiModelProperty(value = "响应消息", example = "OK") - private String msg; - @ApiModelProperty(value = "响应数据") - private T data; - @ApiModelProperty(value = "请求id", example = "1af123c11412e") - private String requestId; - - public static R ok() { - return new R(SUCCESS, OK, null); - } - - public static R ok(T data) { - return new R<>(SUCCESS, OK, data); - } - - public static R error(String msg) { - return new R<>(FAILED, msg, null); - } - - public static R error(int code, String msg) { - return new R<>(code, msg, null); - } - - public R() { - } - - public R(int code, String msg, T data) { - this.code = code; - this.msg = msg; - this.data = data; - this.requestId = MDC.get(Constant.REQUEST_ID_HEADER); - } - - public boolean success(){ - return code == SUCCESS; - } - - public R requestId(String requestId) { - this.requestId = requestId; - return this; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/BaseDTO.java b/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/BaseDTO.java deleted file mode 100644 index 26d31db..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/BaseDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.common.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; - -import java.time.LocalDateTime; - -@ApiModel(description = "DTO基础属性") -public class BaseDTO { - @ApiModelProperty("创建人id") - private Long creater; - @ApiModelProperty("更新人id") - private Long updater; - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/IdNameDTO.java b/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/IdNameDTO.java deleted file mode 100644 index f2ab03b..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/IdNameDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.common.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@ApiModel(description = "id和name键值对") -@NoArgsConstructor -@AllArgsConstructor -public class IdNameDTO { - @ApiModelProperty("id") - private Long id; - @ApiModelProperty("name") - private String name; -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/LoginUserDTO.java b/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/LoginUserDTO.java deleted file mode 100644 index 77c2bd3..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/LoginUserDTO.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.tianji.common.domain.dto; - -import lombok.Data; - -@Data -public class LoginUserDTO { - private Long userId; - private Long roleId; - private Boolean rememberMe; -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/PageDTO.java b/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/PageDTO.java deleted file mode 100644 index 9d65ffc..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/dto/PageDTO.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.tianji.common.domain.dto; - - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.Convert; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; -import java.util.function.Function; -import java.util.stream.Collectors; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@ApiModel(description = "分页结果") -public class PageDTO { - @ApiModelProperty("总条数") - protected Long total; - @ApiModelProperty("总页码数") - protected Long pages; - @ApiModelProperty("当前页数据") - protected List list; - - public static PageDTO empty(Long total, Long pages) { - return new PageDTO<>(total, pages, CollUtils.emptyList()); - } - public static PageDTO empty(Page page) { - return new PageDTO<>(page.getTotal(), page.getPages(), CollUtils.emptyList()); - } - - public static PageDTO of(Page page) { - if(page == null){ - return new PageDTO<>(); - } - if (CollUtils.isEmpty(page.getRecords())) { - return empty(page); - } - return new PageDTO<>(page.getTotal(), page.getPages(), page.getRecords()); - } - public static PageDTO of(Page page, Function mapper) { - if(page == null){ - return new PageDTO<>(); - } - if (CollUtils.isEmpty(page.getRecords())) { - return empty(page); - } - return new PageDTO<>(page.getTotal(), page.getPages(), - page.getRecords().stream().map(mapper).collect(Collectors.toList())); - } - public static PageDTO of(Page page, List list) { - return new PageDTO<>(page.getTotal(), page.getPages(), list); - } - - public static PageDTO of(Page page, Class clazz) { - return new PageDTO<>(page.getTotal(), page.getPages(), BeanUtils.copyList(page.getRecords(), clazz)); - } - - public static PageDTO of(Page page, Class clazz, Convert convert) { - return new PageDTO<>(page.getTotal(), page.getPages(), BeanUtils.copyList(page.getRecords(), clazz, convert)); - } - - @ApiModelProperty(hidden = true) - @JsonIgnore - public boolean isEmpty(){ - return list == null || list.size() == 0; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/query/PageQuery.java b/tianji-master/tj-common/src/main/java/com/tianji/common/domain/query/PageQuery.java deleted file mode 100644 index 14f0bef..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/domain/query/PageQuery.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.tianji.common.domain.query; - -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.tianji.common.constants.Constant; -import com.tianji.common.utils.StringUtils; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.experimental.Accessors; - -import javax.validation.constraints.Min; - -@Data -@ApiModel(description = "分页请求参数") -@Accessors(chain = true) -public class PageQuery { - public static final Integer DEFAULT_PAGE_SIZE = 20; - public static final Integer DEFAULT_PAGE_NUM = 1; - - @ApiModelProperty(value = "页码", example = "1") - @Min(value = 1, message = "页码不能小于1") - private Integer pageNo = DEFAULT_PAGE_NUM; - - @ApiModelProperty(value = "每页大小", example = "5") - @Min(value = 1, message = "每页查询数量不能小于1") - private Integer pageSize = DEFAULT_PAGE_SIZE; - - @ApiModelProperty(value = "是否升序", example = "true") - private Boolean isAsc = true; - - @ApiModelProperty(value = "排序字段", example = "id") - private String sortBy; - - public int from(){ - return (pageNo - 1) * pageSize; - } - - public Page toMpPage(OrderItem ... orderItems) { - Page page = new Page<>(pageNo, pageSize); - // 是否手动指定排序方式 - if (orderItems != null && orderItems.length > 0) { - for (OrderItem orderItem : orderItems) { - page.addOrder(orderItem); - } - return page; - } - // 前端是否有排序字段 - if (StringUtils.isNotEmpty(sortBy)){ - OrderItem orderItem = new OrderItem(); - orderItem.setAsc(isAsc); - orderItem.setColumn(sortBy); - page.addOrder(orderItem); - } - return page; - } - - public Page toMpPage(String defaultSortBy, boolean isAsc) { - if (StringUtils.isBlank(sortBy)){ - sortBy = defaultSortBy; - this.isAsc = isAsc; - } - Page page = new Page<>(pageNo, pageSize); - OrderItem orderItem = new OrderItem(); - orderItem.setAsc(this.isAsc); - orderItem.setColumn(sortBy); - page.addOrder(orderItem); - return page; - } - public Page toMpPageDefaultSortByCreateTimeDesc() { - return toMpPage(Constant.DATA_FIELD_NAME_CREATE_TIME, false); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/enums/BaseEnum.java b/tianji-master/tj-common/src/main/java/com/tianji/common/enums/BaseEnum.java deleted file mode 100644 index b66ff13..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/enums/BaseEnum.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tianji.common.enums; - -public interface BaseEnum { - int getValue(); - String getDesc(); - - default boolean equalsValue(Integer value){ - if (value == null) { - return false; - } - return getValue() == value; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/enums/CommonStatus.java b/tianji-master/tj-common/src/main/java/com/tianji/common/enums/CommonStatus.java deleted file mode 100644 index db08470..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/enums/CommonStatus.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.common.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum CommonStatus implements BaseEnum{ - DISABLE(0, "禁用"), - ENABLE(1, "启用"), - ; - private final int value; - private final String desc; - - public static CommonStatus of(Integer value) { - if (value == null) { - return null; - } - for (CommonStatus commonStatus : values()) { - if (commonStatus.getValue() == value) { - return commonStatus; - } - } - return null; - } - - public static String desc(Integer value) { - CommonStatus status = of(value); - return status.getDesc(); - } -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/enums/UserType.java b/tianji-master/tj-common/src/main/java/com/tianji/common/enums/UserType.java deleted file mode 100644 index 537992f..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/enums/UserType.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.common.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.exceptions.BadRequestException; -import lombok.Getter; - -@Getter -public enum UserType implements BaseEnum{ - STAFF(1, "其他员工"), - STUDENT(2, "学生"), - TEACHER(3, "老师"), - ; - @EnumValue - int value; - String desc; - - UserType(int value, String desc) { - this.value = value; - this.desc = desc; - } - - public static UserType of(int value) { - for (UserType type : UserType.values()) { - if (type.getValue() == value) { - return type; - } - } - throw new BadRequestException(ErrorInfo.Msg.INVALID_USER_TYPE); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/BadRequestException.java b/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/BadRequestException.java deleted file mode 100644 index bd66d5c..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/BadRequestException.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.common.exceptions; - -import lombok.Getter; - -@Getter -public class BadRequestException extends CommonException{ - private final int status = 400; - - public BadRequestException(String message) { - super(400, message); - } - - public BadRequestException(int code, String message) { - super(code, message); - } - - public BadRequestException(int code, String message, Throwable cause) { - super(code, message, cause); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/BizIllegalException.java b/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/BizIllegalException.java deleted file mode 100644 index 49e0b89..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/BizIllegalException.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.common.exceptions; - -/** - * 业务不合法异常 - **/ -public class BizIllegalException extends CommonException{ - public BizIllegalException(String message) { - super(message); - } - - public BizIllegalException(int code, String message) { - super(code, message); - } - - public BizIllegalException(int code, String message, Throwable cause) { - super(code, message, cause); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/CommonException.java b/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/CommonException.java deleted file mode 100644 index 7183688..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/CommonException.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.common.exceptions; - -import lombok.Getter; - -@Getter -public class CommonException extends RuntimeException{ - private final int code; - - public CommonException(String message) { - super(message); - this.code = 0; - } - - public CommonException(String message, Throwable cause) { - super(message, cause); - this.code = 0; - } - - public CommonException(int code, String message) { - super(message); - this.code = code; - } - - public CommonException(int code, String message, Throwable cause) { - super(message, cause); - this.code = code; - } - - public int getStatus(){ - return 500; - }; -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/DbException.java b/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/DbException.java deleted file mode 100644 index b611106..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/DbException.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.common.exceptions; - -/** - * 数据库异常 - **/ -public class DbException extends CommonException{ - public DbException(String message) { - super(message); - } - - public DbException(int code, String message) { - super(code, message); - } - - public DbException(int code, String message, Throwable cause) { - super(code, message, cause); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/ForbiddenException.java b/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/ForbiddenException.java deleted file mode 100644 index d8ce89c..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/ForbiddenException.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.common.exceptions; - -import lombok.Getter; - -@Getter -public class ForbiddenException extends CommonException{ - private final int status = 403; - - public ForbiddenException(String message) { - super(403, message); - } - - public ForbiddenException(int code, String message) { - super(code, message); - } - - public ForbiddenException(int code, String message, Throwable cause) { - super(code, message, cause); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/RequestTimeoutException.java b/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/RequestTimeoutException.java deleted file mode 100644 index 9ae0515..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/RequestTimeoutException.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.common.exceptions; - -/** - * 请求超时异常 - * - * @ClassName RequestTimeoutException - * @author wusongsong - * @since 2022/6/30 16:58 - * @version 1.0.0 - **/ -public class RequestTimeoutException extends CommonException{ - public RequestTimeoutException(String message) { - super(message); - } - - public RequestTimeoutException(int code, String message) { - super(code, message); - } - - public RequestTimeoutException(int code, String message, Throwable cause) { - super(code, message, cause); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/UnauthorizedException.java b/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/UnauthorizedException.java deleted file mode 100644 index 741775b..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/exceptions/UnauthorizedException.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.common.exceptions; - -import lombok.Getter; - -@Getter -public class UnauthorizedException extends CommonException{ - private final int status = 401; - - public UnauthorizedException(String message) { - super(401, message); - } - - public UnauthorizedException(int code, String message) { - super(code, message); - } - - public UnauthorizedException(int code, String message, Throwable cause) { - super(code, message, cause); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/filters/RequestIdFilter.java b/tianji-master/tj-common/src/main/java/com/tianji/common/filters/RequestIdFilter.java deleted file mode 100644 index 9d48584..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/filters/RequestIdFilter.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.common.filters; - - -import com.tianji.common.constants.Constant; -import org.slf4j.MDC; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; - -import javax.servlet.*; -import javax.servlet.annotation.WebFilter; -import javax.servlet.http.HttpServletRequest; -import java.io.IOException; - -@Order(Ordered.HIGHEST_PRECEDENCE) -@WebFilter(filterName = "requestIdFilter", urlPatterns = "/**") -public class RequestIdFilter implements Filter { - @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { - // 1.获取request - HttpServletRequest request = (HttpServletRequest) servletRequest; - // 2.获取请求头中的requestId - String requestId = request.getHeader(Constant.REQUEST_ID_HEADER); - try { - // 3.存入MDC - MDC.put(Constant.REQUEST_ID_HEADER, requestId); - filterChain.doFilter(request, servletResponse); - }finally { - // 4.移除 - MDC.clear(); - } - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ArrayUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ArrayUtils.java deleted file mode 100644 index 98d2b92..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ArrayUtils.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.util.ArrayUtil; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 数组工具类 - * @ClassName ArrayUtils - * @author wusongsong - * @since 2022/7/10 12:02 - * @version 1.0.0 - **/ -public class ArrayUtils extends ArrayUtil { - - - - /** - * 将源数组转换成指定类型的列表 - * - * @param originList 原始列表 - * @param targetClazz 转换后列表元素的类型 - * @param 原始列表元素的类型 - * @param 目标列表元素的类型 - * @return 目标类型的集合 - */ - public static List convert(R[] originList, Class targetClazz) { - return convert(originList, targetClazz, null); - - } - - /** - * 将源数组转换成指定类型的列表 - * - * @param originList 原始列表 - * @param targetClazz 转换后列表元素的类型 - * @param convert 转换特殊字段接口 - * @param 原始列表元素的类型 - * @param 目标列表元素的类型 - * @return 目标类型的集合 - */ - public static List convert(R[] originList, Class targetClazz, Convert convert) { - if (isEmpty(originList)) { - return null; - } - - return Arrays.stream(originList) - .map(origin -> BeanUtils.copyBean(origin, targetClazz, convert)) - .collect(Collectors.toList()); - - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/AspectUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/AspectUtils.java deleted file mode 100644 index 142111f..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/AspectUtils.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.common.utils; - -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.Signature; -import org.aspectj.lang.reflect.MethodSignature; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; - -import java.lang.reflect.Method; - -public class AspectUtils { - - /** - * 获取被拦截方法对象 - * MethodSignature.getMethod() 获取的是顶层接口或者父类的方法对象 - * 所以应该使用反射获取当前对象的方法对象 - */ - public static Method getMethod(ProceedingJoinPoint pjp) { - //获取参数的类型 - Signature sig = pjp.getSignature(); - if (sig instanceof MethodSignature) { - MethodSignature methodSignature = (MethodSignature) sig; - return methodSignature.getMethod(); - } else { - throw new IllegalArgumentException("It's not method"); - } - } - - /** - * 在aop切面中SPEL表达式对formatter进行格式化, - * 转换出指定的值 - * - * @param formatter - * @param method - * @param args - * @return - */ - public static String parse(String formatter, Method method, Object[] args) { - LocalVariableTableParameterNameDiscoverer nameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); - return SPELUtils.parse(formatter, nameDiscoverer.getParameterNames(method), args); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/AssertUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/AssertUtils.java deleted file mode 100644 index 1e47d88..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/AssertUtils.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.tianji.common.utils; - - -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.exceptions.BadRequestException; - -import java.util.Map; - -public class AssertUtils { - public static void equals(Object obj1, Object obj2, String ... message){ - if (obj1 == null || obj2 == null) { - handleException(message); - return; - } - if (obj1 == obj2) { - return; - } - if(!obj1.equals(obj2)){ - handleException(message); - } - } - public static void isNotNull(Object obj, String ... message){ - if (obj == null) { - handleException(message); - } - } - - public static void isNotBlank(String str, String ... message){ - if (StringUtils.isBlank(str)) { - handleException(message); - } - } - - public static void isTrue(Boolean boo, String... message) { - if (BooleanUtils.isFalse(boo)) { - handleException(message); - } - } - - public static void isFalse(Boolean boo, String... message) { - if (BooleanUtils.isTrue(boo)) { - handleException(message); - } - } - - private static void handleException(String ... message){ - String msg = ErrorInfo.Msg.REQUEST_PARAM_ILLEGAL; - if(message != null && message.length > 0){ - msg = message[0]; - } - throw new BadRequestException(msg); - } - - public static void isNotEmpty(Iterable coll, String ... message) { - if(CollUtils.isEmpty(coll)){ - handleException(message); - } - } - public static void isNotEmpty(Map map, String ... message) { - if(CollUtils.isEmpty(map)){ - handleException(message); - } - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/BeanUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/BeanUtils.java deleted file mode 100644 index f608a3c..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/BeanUtils.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.bean.BeanUtil; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * 继承自 hutool 的BeanUtil,增加了bean转换时自定义转换器的功能 - */ -public class BeanUtils extends BeanUtil { - - /** - * 将原对象转换成目标对象,对于字段不匹配的字段可以使用转换器处理 - * - * @param source 原对象 - * @param clazz 目标对象的class - * @param convert 转换器 - * @param 原对象类型 - * @param 目标对象类型 - * @return 目标对象 - */ - public static T copyBean(R source, Class clazz, Convert convert) { - T target = copyBean(source, clazz); - if (convert != null) { - convert.convert(source, target); - } - return target; - } - /** - * 将原对象转换成目标对象,对于字段不匹配的字段可以使用转换器处理 - * - * @param source 原对象 - * @param clazz 目标对象的class - * @param 原对象类型 - * @param 目标对象类型 - * @return 目标对象 - */ - public static T copyBean(R source, Class clazz){ - if (source == null) { - return null; - } - return toBean(source, clazz); - } - - public static List copyList(List list, Class clazz) { - if (list == null || list.size() == 0) { - return CollUtils.emptyList(); - } - return copyToList(list, clazz); - } - - public static List copyList(List list, Class clazz, Convert convert) { - if (list == null || list.size() == 0) { - return CollUtils.emptyList(); - } - return list.stream().map(r -> copyBean(r, clazz, convert)).collect(Collectors.toList()); - } -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/BooleanUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/BooleanUtils.java deleted file mode 100644 index fcc91b8..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/BooleanUtils.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.util.BooleanUtil; - -public class BooleanUtils extends BooleanUtil { -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ByteUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ByteUtils.java deleted file mode 100644 index fa36dd7..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ByteUtils.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.util.ByteUtil; - -public class ByteUtils extends ByteUtil { - - /** - * 将byte[] 数组转换成字符串,如果为空返回 "" - * @param content 字节内容 - * @return 字符串值 - */ - public static String parse(byte[] content){ - if(content == null || content.length <= 0) { - return StringUtils.EMPTY; - } - return new String(content); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/CollUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/CollUtils.java deleted file mode 100644 index cc803a4..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/CollUtils.java +++ /dev/null @@ -1,142 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.collection.IterUtil; -import com.tianji.common.validate.Checker; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** - * 继承自 hutool 的集合工具类 - */ -public class CollUtils extends CollectionUtil { - - public static List emptyList() { - return Collections.emptyList(); - } - - public static Set emptySet() { - return Collections.emptySet(); - } - - public static Map emptyMap() { - return Collections.emptyMap(); - } - - public static Set singletonSet(T t) { - return Collections.singleton(t); - } - - public static List singletonList(T t) { - return Collections.singletonList(t); - } - - public static List convertToInteger(List originList){ - return CollUtils.isNotEmpty(originList) ? originList.stream().map(NumberUtils::parseInt).collect(Collectors.toList()) : null; - } - - public static List convertToLong(List originLIst){ - return CollUtils.isNotEmpty(originLIst) ? originLIst.stream().map(NumberUtils::parseLong).collect(Collectors.toList()) : null; - } - - /** - * 以 conjunction 为分隔符将集合转换为字符串 如果集合元素为数组、Iterable或Iterator,则递归组合其为字符串 - * @param collection 集合 - * @param conjunction 分隔符 - * @param 集合元素类型 - * @return 连接后的字符串 - * See Also: IterUtil.join(Iterator, CharSequence) - */ - public static String join(Collection collection, CharSequence conjunction) { - if (null == collection || collection.isEmpty()) { - return null; - } - return IterUtil.join(collection.iterator(), conjunction); - } - - public static String joinIgnoreNull(Collection collection, CharSequence conjunction) { - if (null == collection || collection.isEmpty()) { - return null; - } - StringBuilder sb = new StringBuilder(); - for (T t : collection) { - if(t == null) continue; - sb.append(t).append(","); - } - if(sb.length() <= 0){ - return null; - } - return sb.deleteCharAt(sb.length() - 1).toString(); - } - - /** - * 集合校验逻辑 - * - * @param data 要校验的集合 - * @param checker 校验器 - * @param 集合元素类型 - */ - public static void check(List data, Checker checker){ - if(data == null){ - return; - } - for (T t : data){ - checker.check(t); - } - } - - /** - * 集合校验逻辑 - * - * @param data 要校验的集合 - * @param 集合元素类型 - */ - public static > void check(List data){ - if(data == null){ - return; - } - for (T t : data){ - t.check(); - } - } - - /** - * 将元素加入到集合中,为null的过滤掉 - * - * @param list 集合 - * @param data 要添加的数据 - * @param 元素类型 - */ - public static void add(Collection list, T... data) { - if (list == null || ArrayUtils.isEmpty(data)) { - return; - } - for (T t : data) { - if (ObjectUtils.isNotEmpty(t)) { - list.add(t); - } - } - } - //将两个集合出现次数相加 - public static Map union(Map map1, Map map2) { - if (CollUtils.isEmpty(map1)) { - return map2; - } else if (CollUtils.isEmpty(map2)) { - return map1; - } - for (Map.Entry entry : map1.entrySet()) { - Integer num = map2.get(entry.getKey()); - map2.put(entry.getKey(), NumberUtils.null2Zero(num) + entry.getValue()); - } - return map2; - } - - public static R getFiledOfFirst(List list, Function function) { - if (CollUtils.isEmpty(list)) { - return null; - } - return function.apply(list.get(0)); - } -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/Convert.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/Convert.java deleted file mode 100644 index 9dd62a8..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/Convert.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.tianji.common.utils; - -/** - * 对原对象进行计算,设置到目标对象中 - **/ -public interface Convert{ - void convert(R origin, T target); -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/CookieBuilder.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/CookieBuilder.java deleted file mode 100644 index e27443c..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/CookieBuilder.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.tianji.common.utils; - -import lombok.Data; -import lombok.experimental.Accessors; -import lombok.extern.slf4j.Slf4j; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.nio.charset.Charset; -import java.nio.charset.StandardCharsets; - -@Slf4j -@Data -@Accessors(chain = true, fluent = true) -public class CookieBuilder { - private Charset charset = StandardCharsets.UTF_8; - private int maxAge = -1; - private String path = "/"; - private boolean httpOnly; - private String name; - private String value; - private String domain; - private final HttpServletRequest request; - private final HttpServletResponse response; - - public CookieBuilder(HttpServletRequest request, HttpServletResponse response) { - this.request = request; - this.response = response; - } - - /** - * 构建cookie,会对cookie值用UTF-8做URL编码,避免中文乱码 - */ - public void build(){ - if (response == null) { - log.error("response为null,无法写入cookie"); - return; - } - Cookie cookie = new Cookie(name, URLEncoder.encode(value, charset)); - if(StringUtils.isNotBlank(domain)) { - cookie.setDomain(domain); - }else if (request != null) { - String serverName = request.getServerName(); - serverName = StringUtils.subAfter(serverName, ".", false); - cookie.setDomain("." + serverName); - } - cookie.setHttpOnly(httpOnly); - cookie.setMaxAge(maxAge); - cookie.setPath(path); - log.debug("生成cookie,编码方式:{},【{}={},domain:{};maxAge={};path={};httpOnly={}】", - charset.name(), name, value, domain, maxAge, path, httpOnly); - response.addCookie(cookie); - } - - /** - * 利用UTF-8对cookie值解码,避免中文乱码问题 - * @param cookieValue cookie原始值 - * @return 解码后的值 - */ - public String decode(String cookieValue){ - return URLDecoder.decode(cookieValue, charset); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/DateUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/DateUtils.java deleted file mode 100644 index 75043ba..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/DateUtils.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.date.LocalDateTimeUtil; - -import java.time.*; -import java.time.format.DateTimeFormatter; -import java.util.*; - -/** - * 时间工具类,用于本地时间操作,包含LocalDateTimeUtil的所有方法和自定义的LocalDateTime的操作方法及常量 - * - * @author wusongsong - * @version 1.0.0 1.0 - * @see 1.0 - * @since 从哪个版本开始支持该类的功能 - */ -public class DateUtils extends LocalDateTimeUtil { - - public static final String DEFAULT_YEAR_FORMAT = "yyyy"; - public static final String DEFAULT_MONTH_FORMAT = "yyyy-MM"; - public static final String DEFAULT_MONTH_FORMAT_SLASH = "yyyy/MM"; - public static final String DEFAULT_MONTH_FORMAT_EN = "yyyy年MM月"; - public static final String DEFAULT_MONTH_FORMAT_COMPACT = "yyyyMM"; - public static final String DEFAULT_WEEK_FORMAT = "yyyy-ww"; - public static final String DEFAULT_WEEK_FORMAT_EN = "yyyy年ww周"; - public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; - public static final String DEFAULT_DATE_FORMAT_EN = "yyyy年MM月dd日"; - public static final String DEFAULT_DATE_FORMAT_COMPACT = "yyyyMMdd"; - public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; - public static final String DEFAULT_DATE_TIME_COMPACT = "yyyyMMddHHmmss"; - public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss"; - public static final String DAY = "DAY"; - public static final String MONTH = "MONTH"; - public static final String WEEK = "WEEK"; - public static final long MAX_MONTH_DAY = 30L; - public static final long MAX_3_MONTH_DAY = 90L; - public static final long MAX_YEAR_DAY = 365L; - - public static final DateTimeFormatter SIGN_DATE_SUFFIX_FORMATTER = - DateTimeFormatter.ofPattern(":yyyyMM"); - public static final DateTimeFormatter POINTS_BOARD_SUFFIX_FORMATTER = - DateTimeFormatter.ofPattern("yyyyMM"); - - public static final String TIME_ZONE_8 = "GMT+8"; - - /** - * 获取utc时间 - * - * @param localDateTime 转化时间 - * @return utc时间 - */ - public static LocalDateTime getUTCTime(LocalDateTime localDateTime) { - ZoneId australia = ZoneId.of("Asia/Shanghai"); - ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localDateTime, australia); - ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(ZoneOffset.UTC); - return utcDate.toLocalDateTime(); - } - - /** - * 获取Asia时间 - * - * @param localDateTime 转化时间 - * @return Asia时间 - */ - public static LocalDateTime getAsiaTime(LocalDateTime localDateTime) { - ZoneId australia = ZoneId.of("Asia/Shanghai"); - ZonedDateTime dateAndTimeInSydney = ZonedDateTime.of(localDateTime, ZoneOffset.UTC); - ZonedDateTime utcDate = dateAndTimeInSydney.withZoneSameInstant(australia); - return utcDate.toLocalDateTime(); - } - - /** - * 获取某一天的开始:0点0分 - * - * @param localDateTime 指定日期 - * @return 转换后的时间 - */ - public static LocalDateTime getDayStartTime(LocalDateTime localDateTime) { - if (localDateTime == null) { - return null; - } - return localDateTime.toLocalDate().atStartOfDay(); - } - - /** - * 获取某一天的结束:23点 59分 59秒的时间 - * - * @param localDateTime 指定日期 - * @return 转换后的时间 - */ - public static LocalDateTime getDayEndTime(LocalDateTime localDateTime) { - if (localDateTime == null) { - return null; - } - return LocalDateTime.of(localDateTime.toLocalDate(), LocalTime.MAX); - } - - public static Date addDays(int i) { - Calendar c = Calendar.getInstance(TimeZone.getTimeZone(TIME_ZONE_8)); - c.add(Calendar.DAY_OF_MONTH, i); - return c.getTime(); - } - - - - public static LocalDate getMonthBegin(LocalDate date) { - return LocalDate.of(date.getYear(), date.getMonth(), 1); - } - - public static LocalDate getMonthEnd(LocalDate date) { - return LocalDate.of(date.getYear(), date.getMonthValue() + 1, 1).minusDays(1); - } - - public static LocalDateTime getMonthBeginTime(LocalDate date) { - return LocalDate.of(date.getYear(), date.getMonth(), 1).atStartOfDay(); - } - - public static LocalDateTime getMonthEndTime(LocalDate date) { - return LocalDate.of(date.getYear(), date.getMonthValue() + 1, 1) - .minusDays(1).atTime(LocalTime.MAX); - } - - public static LocalDateTime getWeekBeginTime(LocalDate now) { - return now.minusDays(now.getDayOfWeek().getValue() - 1).atStartOfDay(); - } - - public static LocalDateTime getWeekEndTime(LocalDate now) { - return LocalDateTime.of(now.plusDays(8 - now.getDayOfWeek().getValue()), LocalTime.MAX); - } - - /** - * 获取最近15天日期(不包含当天),格式MM.dd - * - * @return - */ - public static List last15Day(){ - // 1.定义日期列表 - List days = new ArrayList<>(); - // 2.获取15天前的时间 - LocalDateTime time = now().minusDays(15); - // 3.for循环遍历 - for (int count = 0; count < 15; count++){ - // 3.1.格式化时间 - days.add(String.format("%s.%s", - NumberUtils.repair0(time.getMonthValue(),2), NumberUtils.repair0(time.getDayOfMonth(), 2))); - // 3.2.日期加1天 - time = time.plusDays(1); - } - // 4.返回结果 - return days; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/EnumUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/EnumUtils.java deleted file mode 100644 index 4f1cb80..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/EnumUtils.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.util.EnumUtil; - -public class EnumUtils extends EnumUtil { -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/HttpUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/HttpUtils.java deleted file mode 100644 index 5b49f6d..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/HttpUtils.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.http.HttpUtil; - -public class HttpUtils extends HttpUtil { -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/IoUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/IoUtils.java deleted file mode 100644 index 0b78bb9..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/IoUtils.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.io.IoUtil; - -public class IoUtils extends IoUtil { -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/JsonUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/JsonUtils.java deleted file mode 100644 index ad635b6..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/JsonUtils.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.json.JSONUtil; - -public class JsonUtils extends JSONUtil { -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/MarkedRunnable.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/MarkedRunnable.java deleted file mode 100644 index d214d2d..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/MarkedRunnable.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.common.utils; - -import org.slf4j.MDC; - -import java.util.Map; - -public class MarkedRunnable implements Runnable{ - private Runnable runnable; - private Map context; - public MarkedRunnable(Runnable runnable) { - this.runnable = runnable; - this.context = MDC.getCopyOfContextMap(); - } - - @Override - public void run() { - if(context == null){ - MDC.clear(); - }else { - MDC.setContextMap(context); - } - try { - runnable.run(); - }finally { - MDC.clear(); - } - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/NumberUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/NumberUtils.java deleted file mode 100644 index df5735d..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/NumberUtils.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.util.NumberUtil; - -import java.math.BigDecimal; -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -public class NumberUtils extends NumberUtil { - - - /** - * 如果number为空,将number转换为0,否则原数字返回 - * - * @param number 原数值 - * @return 整型数字,0或原数字 - */ - public static Integer null2Zero(Integer number){ - return number == null ? 0 : number; - } - - /** - * 如果number为空,将number转换为0,否则原数字返回 - * - * @param number 原数值 - * @return 整型数字,0或原数字 - */ - public static Double null2Zero(Double number){ - return number == null ? 0 : number; - } - - /** - * 如果number为空,将number转换为0L,否则原数字返回 - * - * @param number 原数值 - * @return 长整型数字,0L或原数字 - */ - public static Long null2Zero(Long number){ - return number == null ? 0L : number; - } - - - public static Double setScale(Double number) { - return new BigDecimal(number) - .setScale(2, BigDecimal.ROUND_HALF_UP) - .doubleValue(); - } - /** - * 比较两个数字是否相同, - * @param number1 数值1 - * @param number2 数值2 - * @return 是否一致 - */ - public static boolean equals(Integer number1, Integer number2) { - if(number1 == null || number2 == null){ - return false; - } - return number1.equals(number2); - } - - /** - * 数字除法保留指定小数位 - * @param num1 被除数 - * @param num2 除数 - * @param scale 小数点位数 - * @return 结果 - */ - public static Double divToDouble(Integer num1, Integer num2, int scale){ - if(num2 == null || num2 ==0 || num1 == null || num1 == 0) { - return 0d; - } - return div(num1, num2, scale).doubleValue(); - } - - public static Double max(List data){ - if(CollUtils.isEmpty(data)){ - return null; - } - return data.stream() - .max(Comparator.comparingDouble(num -> num)) - .orElse(0d); - } - public static Double min(List data){ - if(CollUtils.isEmpty(data)){ - return null; - } - return data.stream() - .min(Comparator.comparingDouble(num -> num)) - .orElse(0d); - } - - public static Double average(List data){ - if(CollUtils.isEmpty(data)){ - return 0d; - } - return data.stream() - .collect(Collectors.averagingDouble(Double::doubleValue)); - - } - - public static Integer toInt(Object obj) { - return obj == null ? null - : obj instanceof Integer - ? (int) obj : null; - } - - /** - * 取绝对值,如果为null,返回0 - * @param number 数值 - * @return 绝对值 - */ - public static int abs(Integer number) { - return number == null - ? 0 - : Math.abs(number); - } - - /** - * 数字格式化字符串,不足位数补0 - * - * @param originNumber 原始数字 - * @param digit 数字位数 - * @return 字符串 - */ - public static String repair0(Integer originNumber, Integer digit){ - StringBuilder number = new StringBuilder(originNumber + ""); - while (number.length() < digit) { - number.insert(0, "0"); - } - return number.toString(); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ObjectUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ObjectUtils.java deleted file mode 100644 index 473a804..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ObjectUtils.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.util.ObjectUtil; - -import java.lang.reflect.Field; -import java.math.BigDecimal; - -/** - * Object操作工具 - **/ -public class ObjectUtils extends ObjectUtil { - - /** - * 为object设置默认值,对target中的基本类型进行默认值初始化, - * 为null的对象不操作 - * - * @param target 需要初始化的对象 - */ - public static void setDefault(Object target) { - if (target == null) { - return; - } - Class clazz = target.getClass(); - Field[] declaredFields = clazz.getDeclaredFields(); - for (Field field : declaredFields) { - setDefault(field, target); - } - - } - - /** - * 给某个字段设置为默认值 - * - * @param field - * @param target - */ - private static void setDefault(Field field, Object target) { - field.setAccessible(true); - try { - Object value = field.get(target); - if (value != null) { - return; - } - String type = field.getGenericType().toString(); - Object defaultValue; - switch (type) { - case "class java.lang.String": - case "class java.lang.Character": - defaultValue = ""; - break; - case "class java.lang.Double": - defaultValue = 0.0d; - break; - case "class java.lang.Long": - defaultValue = 0L; - break; - case "class java.lang.Short": - defaultValue = (short) 0; - break; - case "class java.lang.Integer": - defaultValue = 0; - break; - case "class java.lang.Float": - defaultValue = 0f; - break; - case "class java.lang.Byte": - defaultValue = (byte) 0; - break; - case "class java.math.BigDecimal": - defaultValue = BigDecimal.ZERO; - break; - case "class java.lang.Boolean": - defaultValue = Boolean.FALSE; - break; - default: - defaultValue = null; - - } - field.set(target, defaultValue); - } catch (Exception e) { - e.printStackTrace(); - } - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/QrCodeUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/QrCodeUtils.java deleted file mode 100644 index ead0bda..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/QrCodeUtils.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.extra.qrcode.QrCodeUtil; - -/** - * 二维码工具,想要使用此工具,项目中一定要引入com.google.zxing - **/ -public class QrCodeUtils extends QrCodeUtil { - - -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/RandomUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/RandomUtils.java deleted file mode 100644 index 498d32d..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/RandomUtils.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.util.RandomUtil; - -public class RandomUtils extends RandomUtil { -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ReflectUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ReflectUtils.java deleted file mode 100644 index f0b88ef..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ReflectUtils.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.util.ReflectUtil; - -/** - * 反射工具 - **/ -public class ReflectUtils extends ReflectUtil { - - /** - * 判断一个类中是否含有指定字段 - * - * @param fieldName 指定字段名称 - * @param clazz 类class - * @return 是否包含 true/false - */ - public static boolean containField(String fieldName, Class clazz) { - return getField(clazz, fieldName) != null; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/RequestIdUtil.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/RequestIdUtil.java deleted file mode 100644 index 5bb687e..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/RequestIdUtil.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.lang.UUID; -import org.slf4j.MDC; - -import static com.tianji.common.constants.Constant.REQUEST_ID_HEADER; - - -public class RequestIdUtil { - public static void markRequest() { - // 1.判断是否已经存在 - String requestId = MDC.get(REQUEST_ID_HEADER); - if(requestId != null){ - return; - } - // 2.尝试从请求头获取 - requestId = WebUtils.getRequestId(); - // 3.再次判断 - if (requestId == null) { - // 不存在则直接生成一个新的requestId - requestId = UUID.randomUUID().toString(true); - } - // 4.保存 - MDC.put(REQUEST_ID_HEADER, requestId); - } - public static void clear(){ - MDC.clear(); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/RequestUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/RequestUtils.java deleted file mode 100644 index 9b905c5..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/RequestUtils.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.common.utils; - -import org.springframework.web.util.UriUtils; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -public class RequestUtils { - public static final String UTF8_ENC = "UTF-8"; - - - /** - * 将请求参数进行升序排序,重新组装 - * - * @param originQueryParam 原始请求参数 - * @return 重组参数 - */ - public static String toSortQueryParams(String originQueryParam) { - List queryParams = new ArrayList(); - - //组装解码 - for (String kv : originQueryParam.split("&")) { - String[] t = kv.split("="); - if (t.length > 1) { - queryParams.add(String.format("%s=%s", UriUtils.decode(t[0], UTF8_ENC), UriUtils.decode(t[1], UTF8_ENC))); - } else { - queryParams.add(String.format("%s=", UriUtils.decode(t[0], UTF8_ENC))); - } - } - //排序 - Collections.sort(queryParams); - StringBuffer buffer = new StringBuffer(); - //重新拼装 - for (String queryParm : queryParams) { - buffer.append(queryParm).append("&"); - } - - return buffer.length() > 0 ? buffer.substring(0, buffer.length() - 2) : StringUtils.EMPTY; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SPELUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SPELUtils.java deleted file mode 100644 index a1d551c..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SPELUtils.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.tianji.common.utils; - -import lombok.Data; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class SPELUtils { - - - /** - * 将模板中的表达式替换成args参数中的值 - * - * @param formatter 模板 - * @param paraNameArr 方法对应的参数名称 - * @param args 方法参数值value,用来进行退换对应的表达式 - * @return 模板替换后的字符串 - * - * 例 format : tj:#{user.id} - * paraNameAddr [user] - * args [{"user":{"id":1}}] - * - * 转换后结果 -> tj:1 - */ - public static String parse(String formatter, String[] paraNameArr, Object[] args) { - if (StringUtils.isNotBlank(formatter) && formatter.indexOf("#") > -1) { - //正则表达式 #{user.id}, - Pattern pattern = Pattern.compile("(\\#\\{([^\\}]*)\\})"); - Matcher matcher = pattern.matcher(formatter); - //将正则表达式中#{}的值取出放在keys中 - List keys = new ArrayList<>(); - while (matcher.find()) { - keys.add(matcher.group()); - } - if (!CollUtils.isEmpty(keys)) { - //SPEL表达式对象 - ExpressionParser parser = new SpelExpressionParser(); - StandardEvaluationContext context = new StandardEvaluationContext(); - //将名称和value一一对应 - for (int i = 0; i < paraNameArr.length; i++) { - context.setVariable(paraNameArr[i], args[i]); - } - - for (String tmp : keys) { - formatter = formatter.replace(tmp, - //通过SPEL表达式获取对应的值,然后再替换掉原有值 - parser.parseExpression("#" + tmp.substring(2, tmp.length() - 1)).getValue(context, String.class)); - } - return formatter; - } - } - return null; - } - - @Data - public static class User { - private Long id = 1L; - } - public static void main(String[] args) { - - Object [] users = new Object[1]; - users[0] = new User(); - - System.out.println(parse("tj:#{user.id}", new String[]{"user"}, users)); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SignUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SignUtils.java deleted file mode 100644 index 171de05..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SignUtils.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.tianji.common.utils; - -/** - * @ClassName SignUtils - * @author wusongsong - * @since 2022/7/3 11:25 - * @version 1.0.0 - **/ - -import cn.hutool.core.util.HexUtil; -import com.tianji.common.exceptions.CommonException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.util.UriUtils; - -import java.io.UnsupportedEncodingException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 签名工具类 - *

- * 使用accesskey和secretkey进行签名调用第三方 - */ -@Slf4j -public class SignUtils { - - private static final String TOKEN_VERSION = "v1"; - - private static final List ALLOWED_METHODS = Arrays.asList("GET", "POST", "PUT", "DELETE", "HEAD"); - - /** - * 生成token,用于调用支付系统的模块或外部系统调用 - * 签名(Signature)加密前格式:|v1-{AK}-{ExpireTime}|{SK}|{UrlPath}|{Method}|{QueryParam}|{body}| - * 加密后token格式 : v1-{AK}-{ExpireTime}-{Signature} - * - * @param urlPath 访问uri - * @param method 访问方法 - * @param queryParam 链接请求参数 - * @param body 请求body - * @param expireTime 过期时间 单位ms - * @param accessKey 加密accesskey,公开 - * @param secretKey 加密串,保密 - * @return 访问token - */ - public static String generateToken(String urlPath, String method, String queryParam, - Object body, long expireTime, String accessKey, String secretKey) { - log.debug("generateToken: urlPath={}, method={}, queryParam={}, body={}, expireTime={}", urlPath, method, queryParam, body, expireTime); - if (StringUtils.isEmpty(accessKey) || StringUtils.isEmpty(secretKey)) { - log.error("invalid AK or SK"); - throw new CommonException("Invalid AK or SK"); - } - - if (StringUtils.isEmpty(urlPath)) { - log.error("urlPath can't be empty!"); - throw new CommonException("Empty url path"); - } - - if (!ALLOWED_METHODS.contains(method)) { - log.error("{} isn't an allowed method", method); - throw new CommonException("invalid request method"); - } - - String token = ""; - try { - // |v1-{AK}-{ExpireTime}|{SK}| - StringBuffer sbSign = new StringBuffer(String.format("|%s-%s-%d|%s|", TOKEN_VERSION, - accessKey, expireTime, secretKey)); - - // {UrlPath}| - sbSign.append(UriUtils.decode(urlPath, RequestUtils.UTF8_ENC)).append("|"); - - // {Method}| - sbSign.append(method.toUpperCase()).append("|"); - - // {QueryParam}| - sbSign.append(RequestUtils.toSortQueryParams(queryParam)); - sbSign.append("|"); - - // {body}| - if (!ObjectUtils.isEmpty(body)) { - if (body instanceof String) { - sbSign.append(body); - } else { - sbSign.append(JsonUtils.toJsonStr(body)); - } - } - sbSign.append("|"); - log.debug("signature contents: {}", sbSign.toString()); - - MessageDigest md5 = MessageDigest.getInstance("MD5"); - md5.reset(); - md5.update(sbSign.toString().getBytes("UTF-8")); - - // v2-{AK}-{ExpireTime}-{Signature} - token = String.format("%s-%s-%s-%s", TOKEN_VERSION, accessKey, expireTime, - new String(HexUtil.encodeHex(md5.digest()))); - log.info("token contents is : {}", token); - } catch (UnsupportedEncodingException e) { - log.error("failed to decode url or query path"); - throw new RuntimeException("Bad encoded url path or query string"); - } catch (NoSuchAlgorithmException e) { - log.error(""); - } - - return token; - } - - /** - * 校验token - * - * @param token 来自请求方法的token - * @param uri 请求uri - * @param method 请求方法 - * @param queryParam 请求参数 - * @param body 请求体 - * @param accessKey 加密accesskey,公开 - * @param secretKey 加密串,保密 - * @return 校验结果 - */ - public static boolean verifyToken(String token, String uri, String method, - String queryParam, Object body, String accessKey, String secretKey) { - log.debug("verifyToken: token={},urlPath={},method={},queryParam={},body={}", token, uri, method, queryParam, body); - - if (StringUtils.isEmpty(token)) { - log.warn("null token"); - return false; - } - - try { - String[] tokenParts = token.split("-"); - - if (tokenParts.length != 4) { - log.warn("invalid token format"); - return false; - } - - if (!TOKEN_VERSION.equals(tokenParts[0])) { - log.warn("invalid token protocol version"); - return false; - } - - long expireTime = Long.parseLong(tokenParts[2]); - if (expireTime < System.currentTimeMillis()) { - log.warn("expired token"); - return false; - } - - if (token.equals(generateToken(uri, method, queryParam, body, expireTime, accessKey, secretKey))) { - return true; - } - } catch (Exception e) { - log.error("failed to parse token '{}',e:", token, e); - - } - - return false; - } - - - public static void main(String[] args) { - String accessKey = "123"; - String secreatKey = "456"; - String urlPath = "/pay/123456789"; - String method = "GET"; - String params = ""; - Map body = new HashMap<>(); -// body.put("keyword", "123"); - String token = generateToken(urlPath, method, params, body, System.currentTimeMillis() + 360000, - accessKey, secreatKey); - log.info("token : {}", token); - - boolean verifyToken = verifyToken(token, urlPath, method, params, body, accessKey, secreatKey); - log.info("check {}", verifyToken); - - } - -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SqlWrapperUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SqlWrapperUtils.java deleted file mode 100644 index 4735c8b..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SqlWrapperUtils.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.tianji.common.utils; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; - -import java.lang.reflect.Field; - -/** - * 将查询条件对象、修改的查询条件转换为QueryWrapper - * 查询wrapper {@link LambdaQueryWrapper} - * 更新wrapper {@link LambdaUpdateWrapper} - * - * @ClassName SqlWrapperUtils - * @author wusongsong - * @since 2022/7/14 11:43 - * @version 1.0.0 - **/ -public class SqlWrapperUtils { - - - /** - * 用于生成查询语句columns - * - * @param clazz - * @param prefix - * @return - */ - public static String getSqlCoumns(Class clazz, String prefix) { - - Field[] fields = ReflectUtils.getFields(clazz); - if (ArrayUtils.isEmpty(fields)) { - //如果该模型没有字段,给一个空,防止下次继续查询 - return null; - } - if (StringUtils.isNotEmpty(prefix)) { - prefix = prefix + "."; - } - StringBuilder buffer = new StringBuilder(); - for (Field field : fields) { - String fieldName = field.getName(); - if (ReflectUtils.getMethod(clazz, "get" + StringUtils.upperFirst(fieldName)) != null) { - buffer.append(prefix).append(StringUtils.toUnderlineCase(fieldName)) - .append(","); - } - } - return buffer.substring(0, buffer.length() - 1); - } - - /** - * 将查询dto转换成LambdaQueryWrapper,目前支持equal查询 - * - * @param queryDTO sql查询条件dto - * @param targetClazz 查询的数据库对应的po的class - * @param 查询的数据库对应的po的类型 - * @param 需要转换的条件对象 - * @return LambdaQueryWrapper对象 - */ - public static LambdaQueryWrapper toLambdaQueryWrapper(R queryDTO, Class targetClazz) { - //sql查询条件 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - T target = BeanUtils.toBean(queryDTO, targetClazz); - queryWrapper.setEntity(target); - return queryWrapper; - } - - /** - * 将查询dto转换成QueryWrapper,目前支持equal查询 - * - * @param queryDTO sql查询条件dto - * @param targetClazz 查询的数据库对应的po的class - * @param 查询的数据库对应的po的类型 - * @param 需要转换的条件对象 - * @return QueryWrapper对象 - */ - public static QueryWrapper toQueryWrapper(R queryDTO, Class targetClazz) { - //sql查询条件 - QueryWrapper queryWrapper = new QueryWrapper<>(); - T target = BeanUtils.toBean(queryDTO, targetClazz); - queryWrapper.setEntity(target); - return queryWrapper; - } - - /** - * 联表分页查询时使用,用来补充第二个表中的字段 - * - * @param queryWrapper 查询QueryWrapper - * @param prefix 查询条件前缀 - * @param queryDTO 查询实体 - * @param targetClasszz 目标class - * @param 目标类型 - * @param 查询实体类型 - */ - public static void suppleQueryWrapper(QueryWrapper queryWrapper, String prefix, R queryDTO, Class targetClasszz) { - //将查询dto转换成目标对象 - T target = BeanUtils.toBean(queryDTO, targetClasszz); - //获取目标对象的字段 - Field[] fields = ReflectUtils.getFields(targetClasszz); - if (ArrayUtils.isNotEmpty(fields)) { - //遍历所有字段 - for (Field field : fields) { - //获取字段值 - Object value = ReflectUtils.getFieldValue(target, field); - //字段有值,并且字段有get方法(确保该字段是数据库中对应的字段),将该字段加入到查询语句中 - if (value != null && ReflectUtils.getMethod(targetClasszz, "get" + StringUtils.upperFirst(field.getName())) != null) { - queryWrapper.eq(prefix + "." + StringUtils.toUnderlineCase(field.getName()), value); - } - } - } - } - - /** - * 将更新dto转换成LambdaUpdateWrapper,目前支持equal查询,如果使用in或者日期的转换,使用convert处理 - * - * @param updateDTO sql更新条件dto - * @param targetClazz 更新的数据库对应的po的class - * @param 更新的数据库对应的po的类型 - * @param 需要转换的条件对象 - * @return LambdaQueryWrapper对象 - */ - public static LambdaUpdateWrapper toLambdaUpdateWrapper(R updateDTO, Class targetClazz) { - //sql查询条件 - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); - T target = BeanUtils.toBean(updateDTO, targetClazz); - updateWrapper.setEntity(target); - return updateWrapper; - } - -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/StringUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/StringUtils.java deleted file mode 100644 index 27a36d2..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/StringUtils.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.tianji.common.utils; - -import cn.hutool.core.util.StrUtil; - -/** - * 字符串工具类,继承了{@link StrUtil} - **/ -public class StringUtils extends StrUtil { -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SwaggerUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SwaggerUtils.java deleted file mode 100644 index 55f8d61..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/SwaggerUtils.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.common.utils; - -import io.swagger.models.Swagger; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.server.reactive.ServerHttpRequest; -import springfox.documentation.swagger2.web.SwaggerTransformationContext; - -import java.lang.reflect.Constructor; - -/** - * 处理swagger的工具 - **/ -@Slf4j -public class SwaggerUtils { - - - /** - * 通过反射获取创建SwaggerTransformationContext对象 - */ - public static SwaggerTransformationContext getInstance(Swagger swagger, ServerHttpRequest request){ - - Constructor constructor = - ReflectUtils.getConstructor(SwaggerTransformationContext.class); - try { - constructor.setAccessible(true); - return constructor.newInstance(swagger, request); - }catch (Exception e){ - log.error("生成swagger transformation 失败 e:",e); - } - return null; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/TreeDataUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/TreeDataUtils.java deleted file mode 100644 index a6bd4e7..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/TreeDataUtils.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.tianji.common.utils; - -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 树形数据处理工具 - * - * @ClassName TreeDataUtils - * @author wusongsong - * @since 2022/7/19 14:31 - * @version 1.0.0 - **/ -@Slf4j -public class TreeDataUtils { - - - /** - * 遍历树状数据计算目标 - * @param data - * @param calculateDataProcessor - * @param - * @return - */ - public static Object ergodicTreeCalculate(List data, CalculateDataProcessor calculateDataProcessor) { - if(CollUtils.isEmpty(data)){ - return null; - } - Object result = null; - for (T t :data ) { - Object tData = calculateDataProcessor.getData(t); - List childData = calculateDataProcessor.getChildData(t); - Object currentAllData = calculateDataProcessor.calculate(tData, ergodicTreeCalculate(childData, calculateDataProcessor)); - calculateDataProcessor.setResult(t, currentAllData); - result = calculateDataProcessor.calculate(result, currentAllData); - } - return result; - } - - /** - * 将树状数据转化成目标类型的列表数据,并建立数据之间的父子关系,采用了递归 - * - * @param parentKey 父数据key - * @param originData 原始树状数据 - * @param dataProcessor 数据转换器 - * @param clazz 目标类型 - * @param convert 原始数据转换成目标数据的转换器 - * @param targetData 目标数据放入到该列表中,该字段不能为空 - * @param 目标数据类型 - * @param 原始数据类型 - */ - public static void parseTreeToList(Object parentKey, List originData, - ToListDataProcessor dataProcessor, Class clazz, - Convert convert, List targetData, Filter filter) { - if (CollUtils.isNotEmpty(originData)) { - for (R data : originData) { - T target = BeanUtils.copyBean(data, clazz, convert); - dataProcessor.setParent(target, parentKey); - targetData.add(target); - parseTreeToList(dataProcessor.getKey(data), dataProcessor.getChildren(data), dataProcessor, clazz, convert, targetData, filter); - } - } - } - - /** - * 根据数据之间的父子关系将原始数据列表转化成树型数据,并将数据转化成目标类型 - * 适用场景 每一条数据都有一个唯一标识和父数据的唯一标识 - * - * @param originData 原始数据,列表 - * @param clazz 目标类型class - * @param dataProcessor 树形数据包装器 - * @param 目标数据的类型 - * @param 原始数据的类型 - * @return 目标数据类型的树状数据 - */ - public static List parseToTree(List originData, Class clazz, DataProcessor dataProcessor) { - return parseToTree(originData, clazz, null, dataProcessor, new DefaultFilter()); - } - - /** - * 根据数据之间的父子关系将原始数据列表转化成树型数据,并将数据转化成目标类型 - * 适用场景 每一条数据都有一个唯一标识和父数据的唯一标识 - * - * @param originData 原始数据,列表 - * @param clazz 目标类型class - * @param dataProcessor 树形数据包装器 - * @param 目标数据的类型 - * @param 原始数据的类型 - * @return 目标数据类型的树状数据 - */ - public static List parseToTree(List originData, Class clazz, DataProcessor dataProcessor, Filter filter) { - return parseToTree(originData, clazz, null, dataProcessor, filter); - } - - /** - * 根据数据之间的父子关系将原始数据列表转化成树型数据,并将数据转化成目标类型 - * 适用场景 每一条数据都有一个唯一标识和父数据的唯一标识 - * - * @param originData 原始数据,列表 - * @param clazz 目标类型class - * @param dataProcessor 树形数据包装器 - * @param 目标数据的类型 - * @param 原始数据的类型 - * @return 目标数据类型的树状数据 - */ - public static List parseToTree(List originData, Class clazz, Convert convert, DataProcessor dataProcessor) { - return parseToTree(originData, clazz, convert, dataProcessor, new DefaultFilter()); - } - - - /** - * 根据数据之间的父子关系将原始数据列表转化成树型数据,并将数据转化成目标类型 - * - * @param originData 原始数据,列表 - * @param clazz 目标类型class - * @param convert 从原始数据转换成目标数据的数据转化器 - * @param dataProcessor 树形数据包装器 - * @param 目标数据的类型 - * @param 原始数据的类型 - * @return 目标数据类型的树状数据 - */ - public static List parseToTree(List originData, Class clazz, Convert convert, DataProcessor dataProcessor, Filter filter) { - //1.原始数据为空,返回一个空列表 - if (CollUtils.isEmpty(originData)) { - return new ArrayList<>(); - } - //2.初始化一个map用于搭建树形关系 - Map resultMap = new HashMap<>(); - //3.遍历数据 - originData.stream().forEach(r -> { - if(!filter.filter(r)){ - return; - } - //3.1将数据转换为指定类型的数据 - T current = BeanUtils.copyBean(r, clazz, convert); - //3.2给当前数据初始化一个空的子数据列表 - dataProcessor.setChild(current, new ArrayList<>()); - //3.3获取当前数据的唯一key - Object key = dataProcessor.getKey(r); - //3.4从resultMap中获取当前数据,主要把已经添加的数据的子数据copy出来 - T currentInMap = resultMap.get(key); - if (currentInMap != null) { - //3.5发现当前数据在resultMap中已经保存了,将它的子列表设置到新生成的目标数据中 - List children = dataProcessor.getChild(currentInMap); - dataProcessor.setChild(current, children); - } - - //3.6获取当前数据的父数据key,如果父数据不存在初始化一个空 - Object parentKey = dataProcessor.getParentKey(r); - T parent = resultMap.get(parentKey); - //3.7初始化父数据 - if (parent == null) { - parent = ReflectUtils.newInstance(clazz); - dataProcessor.setChild(parent, new ArrayList<>()); - } - //3.8将子数据添加到父数据的子列表中 - List children = dataProcessor.getChild(parent); - children.add(current); - //3.9将父数据放入resultMap中 - resultMap.put(parentKey, parent); - //3.10将子数据放入resultMap中 - resultMap.put(dataProcessor.getKey(r), current); - }); - //4.将组装好的数据取出 - T t = resultMap.get(dataProcessor.getRootKey()); - return t== null ? null : dataProcessor.getChild(t); - } - - /** - * 树形数据处理器 - * - * @param 目标数据 - * @param 原始数据 - */ - public interface DataProcessor { - /** - * 从当前数据中获取父数据的key,也就是和父数据的关系 - * - * @param r - * @return - */ - Object getParentKey(R r); - - /** - * 获取当前数据的标识 - * - * @param r - * @return - */ - Object getKey(R r); - - /** - * 获取整个树的根数据 - * - * @return - */ - Object getRootKey(); - - /** - * 获取子数据列表 - * - * @param t - * @return - */ - List getChild(T t); - - /** - * 将子数据列表放入到父数据中 - * - * @param parent - * @param child - */ - void setChild(T parent, List child); - - } - - public interface ToListDataProcessor { - Object getKey(R r); - - void setParent(T t, Object parentKey); - - List getChildren(R r); - } - - public interface CalculateDataProcessor { - - Object getData(T t); - - List getChildData(T t); - - Object calculate(Object ... datas); - - void setResult(T t, Object result); - } - - /** - * 过滤器 - * @param - */ - public interface Filter{ - default boolean filter(T t){ - return true; - } - } - - public static class DefaultFilter implements Filter{ - - } -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/UserContext.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/UserContext.java deleted file mode 100644 index 7ee6f90..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/UserContext.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.common.utils; - -public class UserContext { - private static final ThreadLocal TL = new ThreadLocal<>(); - - /** - * 保存用户信息 - * @param userId 用户id - */ - public static void setUser(Long userId){ - TL.set(userId); - } - - /** - * 获取用户 - * @return 用户id - */ - public static Long getUser(){ - return TL.get(); - } - - /** - * 移除用户信息 - */ - public static void removeUser(){ - TL.remove(); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ViolationUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ViolationUtils.java deleted file mode 100644 index bab0cb4..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/ViolationUtils.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.common.utils; - -import com.tianji.common.exceptions.BadRequestException; - -import javax.validation.ConstraintViolation; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * 手动执行Violation处理校验结果 - * @ClassName ViolationUtils - * @author wusongsong - * @since 2022/7/18 20:52 - * @version 1.0.0 - **/ -public class ViolationUtils { - - public static void process(Set> violations) { - if(CollUtils.isEmpty(violations)){ - return; - } - String message = violations.stream().map(v -> v.getMessage()).collect(Collectors.joining("|")); - throw new BadRequestException(message); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/WebUtils.java b/tianji-master/tj-common/src/main/java/com/tianji/common/utils/WebUtils.java deleted file mode 100644 index ea435a9..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/utils/WebUtils.java +++ /dev/null @@ -1,164 +0,0 @@ -package com.tianji.common.utils; - - -import com.tianji.common.constants.Constant; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.util.Collection; -import java.util.Map; - -@Slf4j -public class WebUtils { - - /** - * 获取ServletRequestAttributes - * - * @return ServletRequestAttributes - */ - public static ServletRequestAttributes getServletRequestAttributes() { - RequestAttributes ra = RequestContextHolder.getRequestAttributes(); - if (ra == null) { - return null; - } - return (ServletRequestAttributes) ra; - } - - /** - * 获取request - * - * @return HttpServletRequest - */ - public static HttpServletRequest getRequest() { - ServletRequestAttributes servletRequestAttributes = getServletRequestAttributes(); - return servletRequestAttributes == null ? null : servletRequestAttributes.getRequest(); - } - - /** - * 获取response - * - * @return HttpServletResponse - */ - public static HttpServletResponse getResponse() { - ServletRequestAttributes servletRequestAttributes = getServletRequestAttributes(); - return servletRequestAttributes == null ? null : servletRequestAttributes.getResponse(); - } - - /** - * 获取request header中的内容 - * - * @param headerName 请求头名称 - * @return 请求头的值 - */ - public static String getHeader(String headerName) { - HttpServletRequest request = getRequest(); - if (request == null) { - return null; - } - return getRequest().getHeader(headerName); - } - - public static void setResponseHeader(String key, String value){ - HttpServletResponse response = getResponse(); - if (response == null) { - return; - } - response.setHeader(key, value); - } - - - public static String getRequestId() { - return getHeader(Constant.REQUEST_ID_HEADER); - } - - public static boolean isGatewayRequest() { - String originName = getHeader(Constant.REQUEST_FROM_HEADER); - return Constant.GATEWAY_ORIGIN_NAME.equals(originName); - } - - public static boolean isFeignRequest() { - String originName = getHeader(Constant.REQUEST_FROM_HEADER); - return Constant.FEIGN_ORIGIN_NAME.equals(originName); - } - - public static boolean isSuccess() { - HttpServletResponse response = getResponse(); - return response != null && response.getStatus() < 300; - } - - /** - * 获取请求地址中的请求参数组装成 key1=value1&key2=value2 - * 如果key对应多个值,中间使用逗号隔开例如 key1对应value1,key2对应value2,value3, key1=value1&key2=value2,value3 - * - * @param request - * @return 返回拼接字符串 - */ - public static String getParameters(HttpServletRequest request) { - Map parameterMap = request.getParameterMap(); - return getParameters(parameterMap); - } - - /** - * 获取请求地址中的请求参数组装成 key1=value1&key2=value2 - * 如果key对应多个值,中间使用逗号隔开例如 key1对应value1,key2对应value2,value3, key1=value1&key2=value2,value3 - * - * @param queries - * @return - */ - public static String getParameters(final Map queries) { - StringBuffer buffer = new StringBuffer(); - for (Map.Entry entry : queries.entrySet()) { - if(entry.getValue() instanceof String[]){ - buffer.append(entry.getKey()).append(String.join(",", ((String[])entry.getValue()))) - .append("&"); - }else if(entry.getValue() instanceof Collection){ - buffer.append(entry.getKey()).append( - CollUtils.join(((Collection)entry.getValue()),",") - ).append("&"); - } - } - return buffer.length() > 0 ? buffer.substring(0, buffer.length() - 1) : StringUtils.EMPTY; - } - - /** - * 获取请求url中的uri - * - * @param url - * @return - */ - public static String getUri(String url){ - if(StringUtils.isEmpty(url)) { - return null; - } - - String uri = url; - //uri中去掉 http:// 或者https - if(uri.contains("http://") ){ - uri = uri.replace("http://", StringUtils.EMPTY); - }else if(uri.contains("https://")){ - uri = uri.replace("https://", StringUtils.EMPTY); - } - - int endIndex = uri.length(); //uri 在url中的最后一个字符的序号+1 - if(uri.contains("?")){ - endIndex = uri.indexOf("?"); - } - return uri.substring(uri.indexOf("/"), endIndex); - } - - public static String getRemoteAddr() { - HttpServletRequest request = getRequest(); - if (request == null) { - return ""; - } - return request.getRemoteAddr(); - } - - public static CookieBuilder cookieBuilder(){ - return new CookieBuilder(getRequest(), getResponse()); - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/validate/Checker.java b/tianji-master/tj-common/src/main/java/com/tianji/common/validate/Checker.java deleted file mode 100644 index d99dffb..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/validate/Checker.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.common.validate; - -/** - * 实现后在接口访问时如果接口实现了这个接口 - * 会被自动自行接口check进行校验 - **/ -public interface Checker { - - /** - * 用于实现validation不能校验的数据逻辑 - */ - default void check(){ - - } - - default void check(T data){ - } -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/validate/EnumValidator.java b/tianji-master/tj-common/src/main/java/com/tianji/common/validate/EnumValidator.java deleted file mode 100644 index 907baac..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/validate/EnumValidator.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tianji.common.validate; - -import com.tianji.common.validate.annotations.EnumValid; -import com.tianji.common.utils.ArrayUtils; -import lombok.extern.slf4j.Slf4j; - -import javax.validation.ConstraintValidator; -import javax.validation.ConstraintValidatorContext; - -/** - * 枚举校验器校验逻辑 - * - **/ -@Slf4j -public class EnumValidator implements ConstraintValidator { - - private int[] enums = null; - - @Override - public void initialize(EnumValid enumValid) { - this.enums = enumValid.enumeration(); - log.info("payload>>{}",ArrayUtils.toString(enumValid.payload())); - } - - @Override - public boolean isValid(Integer value, ConstraintValidatorContext context) { - // 不做空校验 - if(value == null){ - return true; - } - //没有配置枚举值不校验 - if (ArrayUtils.isEmpty(enums)) { - return true; - } - for (int e : enums) { - if (e == value) { - return true; - } - } - return false; - } -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/validate/annotations/EnumValid.java b/tianji-master/tj-common/src/main/java/com/tianji/common/validate/annotations/EnumValid.java deleted file mode 100644 index a1958fe..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/validate/annotations/EnumValid.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.common.validate.annotations; - -import com.tianji.common.validate.EnumValidator; - -import javax.validation.Constraint; -import javax.validation.Payload; -import java.lang.annotation.*; - -/** - * 用于状态的枚举校验 - **/ -@Documented -@Retention(RetentionPolicy.RUNTIME) -@Target({ ElementType.PARAMETER, ElementType.FIELD, ElementType.METHOD }) -@Constraint(validatedBy = EnumValidator.class) -public @interface EnumValid { - String message() default "不满足业务条件"; - - int[] enumeration() default {}; - - Class[] groups() default { }; - - Class[] payload() default { }; -} diff --git a/tianji-master/tj-common/src/main/java/com/tianji/common/validate/annotations/ParamChecker.java b/tianji-master/tj-common/src/main/java/com/tianji/common/validate/annotations/ParamChecker.java deleted file mode 100644 index fdad2b9..0000000 --- a/tianji-master/tj-common/src/main/java/com/tianji/common/validate/annotations/ParamChecker.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.common.validate.annotations; - -/** - * 接口方法参数校验器 - * @ClassName ParamChecker - * @author wusongsong - * @since 2022/7/10 13:24 - * @version 1.0.0 - **/ -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.METHOD) -public @interface ParamChecker { -} diff --git a/tianji-master/tj-common/src/main/resources/META-INF/spring-configuration-metadata.json b/tianji-master/tj-common/src/main/resources/META-INF/spring-configuration-metadata.json deleted file mode 100644 index f9b58ed..0000000 --- a/tianji-master/tj-common/src/main/resources/META-INF/spring-configuration-metadata.json +++ /dev/null @@ -1,269 +0,0 @@ -{ - "groups": [ - { - "name": "tj.swagger", - "type": "com.tianji.common.autoconfigure.swagger.Knife4jConfiguration", - "sourceType": "com.tianji.common.autoconfigure.swagger.SwaggerConfigProperties" - }, - { - "name": "tj.mq" - }, - { - "name": "tj.redis" - }, - { - "name": "tj.mybatis" - }, - { - "name": "tj.xxl-job", - "type": "com.tianji.common.autoconfigure.xxljob.XxlJobConfig", - "sourceType": "com.tianji.common.autoconfigure.xxljob.XxlJobProperties" - } - ], - "properties": [ - { - "name": "tj.swagger.enable", - "type": "java.lang.Boolean", - "description": "是否开启swagger功能,默认false", - "sourceType": "com.tianji.common.autoconfigure.swagger.SwaggerConfigProperties", - "defaultValue": false - }, - { - "name": "tj.swagger.enableResponseWrap", - "type": "java.lang.Boolean", - "description": "是否开启响应结果包装功能,默认false", - "sourceType": "com.tianji.common.autoconfigure.swagger.SwaggerConfigProperties", - "defaultValue": false - }, - { - "name": "tj.swagger.packagePath", - "type": "java.lang.String", - "description": "API接口扫描包", - "sourceType": "com.tianji.common.autoconfigure.swagger.SwaggerConfigProperties", - "defaultValue": "" - }, - { - "name": "tj.swagger.title", - "type": "java.lang.String", - "description": "API文档标题", - "sourceType": "com.tianji.common.autoconfigure.swagger.SwaggerConfigProperties", - "defaultValue": "" - }, - { - "name": "tj.swagger.description", - "type": "java.lang.String", - "description": "文档描述", - "sourceType": "com.tianji.common.autoconfigure.swagger.SwaggerConfigProperties", - "defaultValue": "" - }, - { - "name": "tj.swagger.contactName", - "type": "java.lang.String", - "description": "联系人姓名", - "sourceType": "com.tianji.common.autoconfigure.swagger.SwaggerConfigProperties", - "defaultValue": "" - }, - { - "name": "tj.swagger.contactUrl", - "type": "java.lang.String", - "description": "联系人主页地址", - "sourceType": "com.tianji.common.autoconfigure.swagger.SwaggerConfigProperties", - "defaultValue": "" - }, - { - "name": "tj.swagger.contactEmail", - "type": "java.lang.String", - "description": "联系人邮箱", - "sourceType": "com.tianji.common.autoconfigure.swagger.SwaggerConfigProperties", - "defaultValue": "" - }, - { - "name": "tj.swagger.version", - "type": "java.lang.String", - "description": "版本", - "sourceType": "com.tianji.common.autoconfigure.swagger.SwaggerConfigProperties", - "defaultValue": "" - }, - { - "name": "tj.mq.host", - "type": "java.lang.String", - "description": "rabbitmq的地址", - "defaultValue": "192.168.150.101" - }, - { - "name": "tj.mq.port", - "type": "java.lang.Integer", - "description": "rabbitmq的端口", - "defaultValue": "5672" - }, - { - "name": "tj.mq.vhost", - "type": "java.lang.String", - "description": "rabbitmq的virtual-host地址", - "defaultValue": "/tjxt" - }, - { - "name": "tj.mq.username", - "type": "java.lang.String", - "description": "rabbitmq的用户名", - "defaultValue": "tjxt" - }, - { - "name": "tj.mq.password", - "type": "java.lang.String", - "description": "rabbitmq的密码", - "defaultValue": "123321" - }, - { - "name": "tj.mq.listener.retry.enable", - "type": "java.lang.Boolean", - "description": "是否开启rabbitmq的消费者重试机制", - "defaultValue": "true" - }, - { - "name": "tj.mq.listener.retry.interval", - "type": "java.time.Duration", - "description": "消费者重试初始失败等待时长", - "defaultValue": "1000ms" - }, - { - "name": "tj.mq.listener.retry.multiplier", - "type": "java.lang.Integer", - "description": "失败等待时长的递增倍数", - "defaultValue": "1" - }, - { - "name": "tj.mq.listener.retry.max-attempts", - "type": "java.lang.Integer", - "description": "消费者重试最大重试次数", - "defaultValue": "3" - }, - { - "name": "tj.mq.listener.retry.stateless", - "type": "java.lang.Boolean", - "description": "是否是无状态,默认true", - "defaultValue": "true" - }, - { - "name": "tj.redis.host", - "type": "java.lang.Boolean", - "description": "是否是无状态,默认true", - "defaultValue": "true" - }, - { - "name": "tj.redis.host", - "type": "java.lang.String", - "description": "redis的地址", - "defaultValue": "192.168.150.101" - }, - { - "name": "tj.redis.password", - "type": "java.lang.String", - "description": "redis的密码", - "defaultValue": "123321" - }, - { - "name": "tj.redis.pool.max-active", - "type": "java.lang.Integer", - "description": "redis的连接池最大连接数", - "defaultValue": "8" - }, - { - "name": "tj.redis.pool.max-idle", - "type": "java.lang.Integer", - "description": "redis的最大空闲连接", - "defaultValue": "8" - }, - { - "name": "tj.redis.pool.min-idle", - "type": "java.lang.Integer", - "description": "redis的最小空闲连接", - "defaultValue": "1" - }, - { - "name": "tj.redis.pool.max-wait", - "type": "java.lang.Integer", - "description": "无连接时最大空闲等待时间", - "defaultValue": "300" - }, - { - "name": "tj.jdbc.host", - "type": "java.lang.String", - "description": "数据库地址", - "defaultValue": "192.168.150.101" - }, - { - "name": "tj.jdbc.port", - "type": "java.lang.Integer", - "description": "数据库端口", - "defaultValue": "3306" - }, - { - "name": "tj.jdbc.database", - "type": "java.lang.String", - "description": "数据库database名", - "defaultValue": "" - }, - { - "name": "tj.jdbc.username", - "type": "java.lang.String", - "description": "数据库用户名", - "defaultValue": "root" - }, - { - "name": "tj.jdbc.password", - "type": "java.lang.String", - "description": "数据库密码", - "defaultValue": "123" - }, - { - "name": "tj.xxl-job.accessToken", - "type": "java.lang.String", - "description": "xxl-job的访问token", - "defaultValue": "" - }, - { - "name": "tj.xxl-job.admin.address", - "type": "java.lang.String", - "description": "xxl-job的管理端地址", - "defaultValue": "" - }, - { - "name": "tj.xxl-job.executor.appName", - "type": "java.lang.String", - "description": "xxl-job的执行器名称", - "defaultValue": "" - }, - { - "name": "tj.xxl-job.executor.address", - "type": "java.lang.String", - "description": "xxl-job的执行器地址,ip:port,可以为空", - "defaultValue": "" - }, - { - "name": "tj.xxl-job.executor.ip", - "type": "java.lang.String", - "description": "xxl-job的执行器ip", - "defaultValue": "" - }, - { - "name": "tj.xxl-job.executor.port", - "type": "java.lang.String", - "description": "xxl-job的执行器端口,如果为空则随机", - "defaultValue": "" - }, - { - "name": "tj.xxl-job.executor.logPath", - "type": "java.lang.String", - "description": "xxl-job的执行器日志目录", - "defaultValue": "" - }, - { - "name": "tj.xxl-job.executor.logRetentionDays", - "type": "java.lang.String", - "description": "xxl-job的执行器日志存储最长周期,过期会被清理", - "defaultValue": "" - } - ], - "hints": [] -} \ No newline at end of file diff --git a/tianji-master/tj-common/src/main/resources/META-INF/spring.factories b/tianji-master/tj-common/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 4322ae9..0000000 --- a/tianji-master/tj-common/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,9 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.tianji.common.autoconfigure.mq.MqConfig,\ - com.tianji.common.autoconfigure.mvc.JsonConfig,\ - com.tianji.common.autoconfigure.mvc.MvcConfig,\ - com.tianji.common.autoconfigure.mvc.ParamCheckerConfig,\ - com.tianji.common.autoconfigure.mybatis.MybatisConfig,\ - com.tianji.common.autoconfigure.redisson.RedissonConfig,\ - com.tianji.common.autoconfigure.swagger.Knife4jConfiguration, \ - com.tianji.common.autoconfigure.xxljob.XxlJobConfig \ No newline at end of file diff --git a/tianji-master/tj-course/pom.xml b/tianji-master/tj-course/pom.xml deleted file mode 100644 index 38c970e..0000000 --- a/tianji-master/tj-course/pom.xml +++ /dev/null @@ -1,122 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-course - - - 11 - 11 - - - - - com.tianji - tj-api - 1.0.0 - - - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-web - - - - com.baomidou - mybatis-plus-boot-starter - - - mysql - mysql-connector-java - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.redisson - redisson - - - - org.apache.commons - commons-pool2 - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - org.springframework.boot - spring-boot-starter-amqp - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-seata - - - - seata-spring-boot-starter - io.seata - - - - - seata-spring-boot-starter - io.seata - ${seata-version} - - - com.xuxueli - xxl-job-core - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - com.tianji.course.CourseApplication - - - - - \ No newline at end of file diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/CourseApplication.java b/tianji-master/tj-course/src/main/java/com/tianji/course/CourseApplication.java deleted file mode 100644 index 3ddfdaf..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/CourseApplication.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.tianji.course; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.annotation.EnableAspectJAutoProxy; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.annotation.EnableScheduling; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** - * 课程微服务启动器 - * @author wusongsong - * @since 2022/7/9 19:40 - * @version 1.0.0 - **/ -@SpringBootApplication -@EnableScheduling -@MapperScan("com.tianji.course.mapper") -@EnableAspectJAutoProxy -@Slf4j -public class CourseApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(CourseApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - } -} \ No newline at end of file diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/config/ThreadPoolConfig.java b/tianji-master/tj-course/src/main/java/com/tianji/course/config/ThreadPoolConfig.java deleted file mode 100644 index adc7903..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/config/ThreadPoolConfig.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.course.config; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -@Slf4j -public class ThreadPoolConfig { - - @Bean("taskExecutor") - public Executor asyncServiceExecutor() { - log.info("start asyncServiceExecutor"); - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - //配置核心线程数 - executor.setCorePoolSize(10); - //配置最大线程数 - executor.setMaxPoolSize(15); - //配置队列大小 - executor.setQueueCapacity(99999); - //配置线程池中的线程的名称前缀 - executor.setThreadNamePrefix("pd-user-async-service-"); - - // 设置拒绝策略:当pool已经达到max size的时候,如何处理新任务 - // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - //执行初始化 - executor.initialize(); - return executor; - } - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseConstants.java b/tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseConstants.java deleted file mode 100644 index 2f93de7..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseConstants.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tianji.course.constants; - -/** - * @author wusongsong - * @since 2022/7/14 13:44 - * @version 1.0.0 1.0 - **/ -public class CourseConstants { - - public static final long CATEGORY_ROOT = 0; - - public class CourseStep { - public static final int BASE_INFO = 1; //基本信息 - public static final int CATALOGUE = 2; //目录 - public static final int MEDIA = 3; //视频 - public static final int SUBJECT = 4; //题目 - public static final int TEACHER = 5; //老师 - } - - //目录类型 - public class CataType{ - public static final int CHAPTER = 1; //章 - public static final int SECTION = 2; //节 - public static final int PRATICE = 3; //练习或测试 - } - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseErrorInfo.java b/tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseErrorInfo.java deleted file mode 100644 index 6193a2f..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseErrorInfo.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.tianji.course.constants; - -/** - * @author wusongsong - * @since 2022/7/14 13:46 - * @version 1.0.0 - **/ -public class CourseErrorInfo { - - //错误信息 - public class Msg { - public static final String CATEGORY_PARENT_NOT_FOUND = "课程分类父分类没有找到"; - public static final String CATEGORY_CREATE_ON_THIRD = "三级分类下不能再创建子分类"; - public static final String CATEGORY_SAME_NAME = "分类名称不能重复!"; - public static final String CATEGORY_NOT_FOUND = "该分类未找到"; - public static final String CATEGORY_HAVE_CHILD = "该课程有子分类,不能删除"; - public static final String CATEGORY_ADD_NAME_NOT_NULL = "分类名称不能为空!"; - public static final String CATEGORY_ADD_NAME_SIZE = "名称不能超过15个字符"; - public static final String CATEGORY_ADD_INDEX_MAX_MIN = "分类序号格式错误,请重新输入!"; - public static final String CATEGORY_ADD_INDEX_NOT_NULL = "分类序号不能为空!"; - public static final String CATEGORY_ADD_OVER_THIRD_LEVEL = "课程分类不支持三级以上的分类"; - public static final String CATEGORY_ID_NOT_NULL = "未选中课程分类"; - public static final String CATEGORY_DISABLE_ENABLE_STATUS_ENUM = "只有禁用或启用两种状态"; - public static final String CATEGORY_UPDATE_NAME_NOT_NULL = "分类名称不能为空!"; - public static final String CATEGORY_UPDATE_NAME_SIZE = "名称不能超过15个字符"; - public static final String CATEGORY_UPDATE_INDEX_MAX_MIN = "分类序号格式错误,请重新输入!"; - public static final String CATEGORY_UPDATE_INDEX_NOT_NULL = "分类序号不能为空!"; - public static final String CATEGORY_DELETE_HAVE_SUBJECT = "该分类下含有题目,无法删除"; - public static final String CATEGORY_DELETE_HAVE_COURSE = "该分类下含有课程,无法删除"; - public static final String CATEGORY_QUERY_ID_NULL = "查询目录信息,id为空"; - public static final String CATEGORY_DELETE_FAILD = "课程分类删除失败"; - public static final String CATEGORY_ENABLE_CANNOT = "当前上级分类为禁用状态,无法启用"; - - public static final String SUBJECT_NAME_EXEISTS = "该题目已存在"; - public static final String SUBJECT_NO_DELETE_BY_USED = "当前题目已被引用,无法删除"; - public static final String SUBJECT_SAVE_CATEGORY_INCOMPLETE = "课程分类不完整"; - - public static final String COURSE_SAVE_FAILD = "课程基本信息保存失败"; - public static final String COURSE_SAVE_CATEGORY_NULL = "课程分类为空,请选择课程分类"; - public static final String COURSE_SAVE_CATEGORY_NOT_FOUND = "课程分类未找到"; - public static final String COURSE_CATEGORY_NOT_FOUND = "课程分类未找到"; - public static final String COURSE_SAVE_NAME_NULL = "课程名称为空,请填写课程名称"; - public static final String COURSE_SAVE_COVER_URL_NULL = "课程封面为空,请上传课程封面"; - public static final String COURSE_SAVE_FREE_NULL = "售卖模式为空,请选择售卖模式"; - public static final String COURSE_SAVE_PURCHASE_TIME_NULL = "课程周期为空,请设置课程周期"; - public static final String COURSE_SAVE_INTRODUCE_NULL = "课程介绍为空,请输入课程介绍"; - public static final String COURSE_SAVE_USE_PEOPLE_NULL = "适用人群为空,请输入适用人群"; - public static final String COURSE_SAVE_DETAIL_NULL = "课程详情为空,请输入课程详情"; - public static final String COURSE_SAVE_DURATION_NULL = "学习周期为空,请输入学习周期"; - public static final String COURSE_SAVE_PRICE_NULL = "课程价格为空,请输入课程价格"; - public static final String COURSE_SAVE_PRICE_NEGATIVE = "课程价格为正数,请输入合法的课程价格"; - public static final String COURSE_SAVE_PRICE_FREE = "免费课程没有价格,可以填0"; - public static final String COURSE_SAVE_PURCHASE_ILLEGAL = "课程下架时间不得早于当前时间"; - public static final String COURSE_SAVE_PURCHASE_ILLEGAL2 = "课程开始购买时间不得早于当前"; - public static final String COURSE_SAVE_NAME_EXISTS = "课程名称重复,请重新输入"; - public static final String COURSE_CATAS_SAVE_NAME_NULL = "章名称为空,请输入章名称"; - public static final String COURSE_CATAS_SAVE_NAME_SIZE = "章名称格格式错误,请重新输入"; - public static final String COURSE_CATAS_SAVE_NAME_SIZE2 = "小节名称格格式错误,请重新输入"; - public static final String COURSE_CATAS_SAVE_NAME_NULL2 = "小节名称为空,请输入小节名称"; - public static final String COURSE_CATAS_SAVE_CHAPTER_WITHOUT_SECTION = "章里必须有小节"; - public static final String COURSE_CATAS_SAVE_CHAPTER_NAME_DELETED = "已经上架的{}目录被删除了"; - public static final String COURSE_CATAS_SAVE_CHAPTER_NAME_MOVE = "已经上架的《%s》目录被移动了"; - public static final String COURSE_CATAS_SAVE_INEDX = "目录的章中有序号是重复的"; - public static final String COURSE_CATAS_SAVE_INEDX_JUMP = "目录的章中有序号不连续"; - public static final String COURSE_CATAS_SAVE_CHAPTER_INDEX_REPEAT = "章序号有重复的"; - public static final String COURSE_CATAS_SAVE_CHAPTER_INDEX_INTERRUPTED = "章序号填写有中断"; - public static final String COURSE_CATA_NOT_EXISTS = "目录结构不存在"; - public static final String COURSE_MEDIA_SAVE_ILLEGAL = "请求参数不合法"; - public static final String COURSE_MEDIA_SAVE_SIZE_WRONG = "请检查所有的小节是否关联媒资或题目"; - public static final String COURSE_MEDIA_SAVE_NO_EXECUTE = "媒资当前不能保存"; - public static final String COURSE_MEDIA_SAVE_MEDIA_NULL = "部分章节未选择视频,请选择/上传视频"; - public static final String COURSE_MEDIA_SAVE_TRAILER_NULL = "有课程还没有选择是否支持试看"; - public static final String COURSE_SUBJECT_SAVE_SUBJECT_IDS_NULL = "阶段测试为空,请设置阶段测试题目"; - public static final String COURSE_SUBJECT_SAVE_CATALOGUE_ID_NULL = "题目未指定练习id"; - public static final String COURSE_TEACHER_SAVE_COURSE_ID_NULL = "课程id不能为空"; - public static final String COURSE_TEACHER_SAVE_TEACHERS_NULL = "请至少设置一名教师"; -// public static final String COURSE_TEACHER_SAVE_TEACHERS_NUM_MAX = "最多可设置5名课程老师"; - public static final String COURSE_TEACHER_SAVE_TEACHERS_NUM_MAX = "必须设置老师1-到5人"; - public static final String COURSE_TEACHER_SAVE_TEACHER_SHOW = "老师用户端显示不能为空"; - public static final String COURSE_TEACHER_SAVE_TEACHER_ID_NULL = "老师id不能为空"; - - public static final String COURSE_OPERATE_ID_NULL = "未选定课程"; - - public static final String COURSE_UP_SHELF_INFO_INCOMPLETE = "课程信息未填写完,无法上架"; - public static final String COURSE_UP_SHELF_STATE_WRONG = "当前课程不能进行上架"; - public static final String COURSE_UP_SHELF_PURCHASE_ILLEGAL = "下架时间需晚于当前时间"; - public static final String COURSE_UP_SHELF_SECTION_WITHOUT_MEDIA = "小节《{}》未上传媒资"; - public static final String COURSE_UP_SHELF_PRACTICE_WITHOUT_SUBJECT = "练习《{}》未上传题目"; - public static final String COURSE_UP_SHELF_NOT_FOUND_COURSE = "未找到对应的课程"; - public static final String COURSE_UP_SHELF_AREADY = "课程已经上架,请勿重复操作"; - public static final String COURSE_DOWN_SHELF_FAILD = "当前课程不能下架"; - public static final String COURSE_CHECK_NOT_FOUND = "未查询到课程信息"; - public static final String COURSE_CHECK_NOT_EXISTS = "某些课程不存在或已经删除"; - public static final String COURSE_CHECK_DOWN_SHELF = "课程已经下架"; - public static final String COURSE_CHECK_FINISHED = "课程已经完结"; - public static final String COURSE_CHECK_NO_SALE = "课程还未开始销售"; - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseStatus.java b/tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseStatus.java deleted file mode 100644 index 5351505..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/CourseStatus.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.course.constants; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @ClassName CourseStatus - * @Author wusongsong - * @Date 2022/7/18 16:07 - * @Version - **/ -@Getter -@AllArgsConstructor -public enum CourseStatus { - NO_UP_SHELF(1, "待上架"), - SHELF(2, "已上架"), - DOWN_SHELF(3, "下架"), - FINISHED(4, "已完结"); - private Integer status; - private String desc; - - public static String desc(Integer status) { - for (CourseStatus courseStatus : values()) { - if (courseStatus.getStatus() == status) { - return courseStatus.getDesc(); - } - } - return null; - } - - public boolean equals(Integer status){ - return this.status.intValue() == status; - } -} \ No newline at end of file diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/RedisConstants.java b/tianji-master/tj-course/src/main/java/com/tianji/course/constants/RedisConstants.java deleted file mode 100644 index 20c7b9b..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/RedisConstants.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.course.constants; - -/** - * @author wusongsong - * @since 2022/7/17 17:20 - * @version 1.0.0 - **/ -public class RedisConstants { - - //一级二级分类拥有的三级分类的数量 - public static final String REDIS_KEY_CATEGORY_THIRD_NUMBER = "CATEGORY:THIRD_NUMBER"; - - public static class Formatter { - public static final String STATISTICS_EXAMINFO = "COURSE:SUBJECT:ANSWER_PROCESS_#{examDetailInfoDTO.recordId}"; - public static final String STATISTICS_COURSE_NUM_CATE = "COURSE:COURSE_NUM_CATEGORY"; - public static final String CATEGORY_ID_LIST_HAVE_COURSE = "COURSE:CATEGORY_ID_WITH_COURSE"; - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/RedisContants.java b/tianji-master/tj-course/src/main/java/com/tianji/course/constants/RedisContants.java deleted file mode 100644 index fe0eda3..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/RedisContants.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.course.constants; - -/** - * @ClassName RedisContants - * @Author wusongsong - * @Date 2022/7/17 17:20 - * @Version - **/ -public class RedisContants { - - //一级二级分类拥有的三级分类的数量 - public static final String REDIS_KEY_CATEGORY_THIRD_NUMBER = "CATEGORY:THIRD_NUMBER"; - - public static class Formatter { - public static final String STATISTICS_EXAMINFO = "COURSE:SUBJECT:ANSWER_PROCESS_#{examDetailInfoDTO.recordId}"; - public static final String STATISTICS_COURSE_NUM_CATE = "COURSE:COURSE_NUM_CATEGORY"; - public static final String CATEGORY_ID_LIST_HAVE_COURSE = "COURSE:CATEGORY_ID_WITH_COURSE"; - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/SubjectConstants.java b/tianji-master/tj-course/src/main/java/com/tianji/course/constants/SubjectConstants.java deleted file mode 100644 index 6963cc2..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/constants/SubjectConstants.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.tianji.course.constants; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @author wusongsong - * @since 2022/7/17 13:07 - * @version 1.0.0 - **/ -public class SubjectConstants { - - @AllArgsConstructor - @Getter - public enum Type { - SIGNLE_CHOICE(1, "单选题"), - MUtiple_CHOICE(2, "多选题"), - NON_DIRECTIONAL_CHOICE(3, "不定向选择题"), - JUDGEMENT_QUESTION(4, "判断题"); - private Integer type; - private String desc; - - public static String desc(Integer subjectType) { - for (Type type : values()) { - if (type.type == subjectType) { - return type.desc; - } - } - return null; - } - - } - - @AllArgsConstructor - @Getter - public enum Difficult { - EASY(1, "简单"), MEDIUM(2, "中等"), DIFFICULT(3, "困难"); - private Integer type; - private String desc; - - public static String desc(Integer type) { - for (Difficult difficult : values()) { - if (difficult.getType() == type) { - return difficult.desc; - } - } - return null; - } - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CatalogueController.java b/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CatalogueController.java deleted file mode 100644 index 7accb1b..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CatalogueController.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.course.controller; - -import com.tianji.course.domain.vo.CataSimpleInfoVO; -import com.tianji.course.service.ICourseCatalogueService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * 目录课程相关接口 - * - * @ClassName CatalogueController - * @Author wusongsong - * @Date 2022/7/27 13:59 - * @Version - **/ -@Api(tags = "章节目录相关接口") -@RestController -@RequestMapping("catalogues") -public class CatalogueController { - - @Autowired - private ICourseCatalogueService courseCatalogueService; - - @GetMapping("batchQuery") - @ApiOperation("根据章节目录批量查询基础信息") - public List batchQuery(@RequestParam("ids") List ids) { - return courseCatalogueService.getManyCataSimpleInfo(ids); - } - - @GetMapping("querySectionInfoById/{id}") - @ApiOperation("获取小节信息") - public CataSimpleInfoVO querySectionInfoById(@PathVariable("id") Long id) { - return courseCatalogueService.querySectionInfoById(id); - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CategoryController.java b/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CategoryController.java deleted file mode 100644 index 4952d47..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CategoryController.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.tianji.course.controller; - -import com.tianji.course.domain.dto.CategoryAddDTO; -import com.tianji.course.domain.dto.CategoryDisableOrEnableDTO; -import com.tianji.course.domain.dto.CategoryListDTO; -import com.tianji.course.domain.dto.CategoryUpdateDTO; -import com.tianji.course.domain.vo.CategoryInfoVO; -import com.tianji.course.domain.vo.CategoryVO; -import com.tianji.course.domain.vo.SimpleCategoryVO; -import com.tianji.course.service.ICategoryService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - * 课程分类 - * - * @ClassName CategoryController - * @Author wusongsong - * @Date 2022/7/10 11:16 - * @Version - **/ -@RestController -@Api(tags = "课程分类相关接口") -@RequestMapping("categorys") -@Slf4j -@Validated -public class CategoryController { - - @Autowired - private ICategoryService categoryService; - - @GetMapping("list") - @ApiOperation("查询课程分类信息") - public List list(CategoryListDTO categoryListDTO) { - log.info("list categoryListDTO : {}", categoryListDTO); - return categoryService.list(categoryListDTO); - } - - @GetMapping("{id}") - @ApiOperation("获取课程分类信息") - @ApiImplicitParams( - @ApiImplicitParam(name = "id", value = "分类id") - ) - public CategoryInfoVO get(@PathVariable("id") Long id) { - return categoryService.get(id); - } - - @PostMapping("add") - @ApiOperation("新增课程分类") - public void add(@Valid @RequestBody CategoryAddDTO categoryAddDTO) { - - categoryService.add(categoryAddDTO); - } - - @DeleteMapping("{id}") - @ApiOperation("删除分类信息") - @ApiImplicitParams( - @ApiImplicitParam(name = "id", value = "分类id") - ) - public void delete(@PathVariable("id") Long id) { - categoryService.delete(id); - } - - @PutMapping("disableOrEnable") - @ApiOperation("课程分类停用或启用") - public void disableOrEnable(@Validated @RequestBody CategoryDisableOrEnableDTO categoryDisableOrEnableDTO) { - categoryService.disableOrEnable(categoryDisableOrEnableDTO); - } - - @PutMapping("update") - @ApiOperation("更新课程分类") - public void updateCategory(@Validated @RequestBody CategoryUpdateDTO categoryUpdateDTO) { - categoryService.update(categoryUpdateDTO); - } - - @GetMapping("all") - @ApiOperation("获取所有的课程分类信息,只包含id,名称,课程分类关系") - public List all(@RequestParam(value = "admin",required = false, defaultValue = "0") Boolean admin) { - return categoryService.all(admin); - } - - @GetMapping("getAllOfOneLevel") - @ApiOperation("获取所有的课程分类,不分层") - public List allOfOneLevel() { - return categoryService.allOfOneLevel(); - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CourseController.java b/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CourseController.java deleted file mode 100644 index 58b508f..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CourseController.java +++ /dev/null @@ -1,229 +0,0 @@ -package com.tianji.course.controller; - -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.tianji.api.dto.course.CourseSimpleInfoDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.validate.annotations.ParamChecker; -import com.tianji.course.constants.CourseStatus; -import com.tianji.course.domain.dto.*; -import com.tianji.course.domain.vo.*; -import com.tianji.course.service.*; -import com.tianji.course.utils.CourseSaveBaseGroup; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - * 课程controller - * - * @ClassName CourseController - * @Author wusongsong - * @Date 2022/7/10 15:34 - * @Version - **/ -@Api(tags = "课程相关接口") -@RestController -@RequestMapping("courses") -@Slf4j -@Validated -public class CourseController { - - @Autowired - private ICourseDraftService courseDraftService; - - @Autowired - private ICourseCatalogueDraftService courseCatalogueDraftService; - - @Autowired - private ICourseTeacherDraftService courseTeacherDraftService; - - @Autowired - private ICourseService courseService; - - @Autowired - private ICourseCatalogueService courseCatalogueService; - - //todo 二期做 -// @GetMapping("statistics") -// @ApiOperation("课程数据统计") - public CourseStatisticsVO statistics() { - return null; - } - - @GetMapping("baseInfo/{id}") - @ApiOperation("获取课程基础信息") - @ApiImplicitParams({@ApiImplicitParam(name = "id", value = "课程id"), - @ApiImplicitParam(name = "see", value = "是否是用于查看页面查看数据,默认是查看,如果不是界面查看数据就是编辑页面使用")}) - public CourseBaseInfoVO baseInfo(@PathVariable("id") Long id, - @RequestParam(value = "see", required = false, defaultValue = "1") Boolean see) { - return courseDraftService.getCourseBaseInfo(id, see); - } - - @PostMapping("baseInfo/save") - @ApiOperation("保存课程基本信息") - @ParamChecker - //校验非业务限制的字段 - public CourseSaveVO save(@RequestBody @Validated(CourseSaveBaseGroup.class) CourseBaseInfoSaveDTO courseBaseInfoSaveDTO) { - return courseDraftService.save(courseBaseInfoSaveDTO); - } - - @GetMapping("catas/{id}") - @ApiOperation("获取课程的章节") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "课程id"), - @ApiImplicitParam(name = "see", value = "是否是用于查看页面查看数据,默认是查看,如果不是界面查看数据就是编辑页面使用") - }) - public List catas(@PathVariable(value = "id", required = false) Long id, - @RequestParam(value = "see", required = false, defaultValue = "1") Boolean see, - @RequestParam(value = "withPractice", required = false, defaultValue = "1") Boolean withPractice) { - return courseCatalogueDraftService.queryCourseCatalogues(id, see, withPractice); - } - - @PostMapping("catas/save/{id}/{step}") - @ApiOperation("保存章节") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "课程id"), - @ApiImplicitParam(name = "step", value = "步骤") - }) - @ParamChecker - public void catasSave(@RequestBody @Validated List cataSaveDTOS, - @PathVariable("id") Long id, @PathVariable(value = "step",required = false) Integer step) { - courseCatalogueDraftService.save(id, cataSaveDTOS, step); - } - - @PostMapping("media/save/{id}") - @ApiOperation("课程视频") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "课程id") - }) - public void mediaSave(@PathVariable("id") Long id, @RequestBody @Valid List courseMediaDTOS) { - courseCatalogueDraftService.saveMediaInfo(id, courseMediaDTOS); - } - - @PostMapping("subjects/save/{id}") - @ApiOperation("保存小节或练习中的题目") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "课程id") - }) - public void saveSuject(@PathVariable("id") Long id, @RequestBody @Validated List cataSubjectDTO) { - courseCatalogueDraftService.saveSuject(id, cataSubjectDTO); - } - - @GetMapping("subjects/get/{id}") - @ApiOperation("获取小节或练习中的题目(用于编辑)") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "课程id") - }) - public List getSuject(@PathVariable("id") Long id) { - return courseCatalogueDraftService.getSuject(id); - } - - @GetMapping("teachers/{id}") - @ApiOperation("查询课程相关的老师信息") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "课程id"), - @ApiImplicitParam(name = "see", value = "是否是用于查看页面查看数据,默认是查看,如果不是界面查看数据就是编辑页面使用") - }) - public List teacher(@PathVariable("id") Long id, - @RequestParam(value = "see", required = false, defaultValue = "1") Boolean see) { - return courseTeacherDraftService.queryTeacherOfCourse(id, see); - } - - @PostMapping("teachers/save") - @ApiOperation("保存老师信息") - public void teachersSave(@RequestBody @Validated CourseTeacherSaveDTO courseTeacherSaveDTO) { - courseTeacherDraftService.save(courseTeacherSaveDTO); - } - - - @PostMapping("upShelf") - @ApiOperation("课程上架") - public void upShelf(@RequestBody @Validated CourseIdDTO courseIdDTO) { - courseDraftService.upShelf(courseIdDTO.getId()); - } - - @GetMapping("checkBeforeUpShelf/{id}") - @ApiOperation("课程上架前校验") - public void checkBeforeUpShelf(@PathVariable("id") Long id){ - courseDraftService.checkBeforeUpShelf(id); - } - - @PostMapping("downShelf") - @ApiOperation("课程下架") - public void downShelf(@RequestBody @Validated CourseIdDTO courseIdDTO) { - courseDraftService.downShelf(courseIdDTO.getId()); - } - - /** - * 先去删除加上数据删除后,再去删除草稿 - * - * @param id - */ - @DeleteMapping("delete/{id}") - @ApiOperation("课程删除") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "id") - }) - public void deleteById(@PathVariable("id") Long id) { - courseService.delete(id); - } - - @ApiOperation("根根条件列表获取课程信息") - @GetMapping("/simpleInfo/list") - public List getSimpleInfoList(CourseSimpleInfoListDTO courseSimpleInfoListDTO) { - return courseService.getSimpleInfoList(courseSimpleInfoListDTO); - } - - @ApiOperation("根据课程id,查询所有章节的序号") - @GetMapping("/catas/index/list/{id}") - @ApiImplicitParams( - @ApiImplicitParam(name = "id", value = "课程id") - ) - public List catasIndexList(@PathVariable("id") Long id) { - return courseCatalogueService.getCatasIndexList(id); - } - - @ApiOperation("生成练习id") - @GetMapping("generator") - public CourseCataIdVO generator() { - return new CourseCataIdVO(IdWorker.getId()); - } - - @ApiOperation("管理端课程搜索接口") - @GetMapping("/page") - public PageDTO queryForPage(CoursePageQuery coursePageQuery) { - if(CourseStatus.NO_UP_SHELF.equals(coursePageQuery.getStatus()) || - CourseStatus.DOWN_SHELF.equals(coursePageQuery.getStatus())){ - //待上架已下架查询草稿 - return courseDraftService.queryForPage(coursePageQuery); - }else { - //已上架已完结查询正式数据 - return courseService.queryForPage(coursePageQuery); - } - } - - @ApiOperation("校验课程名称是否已经存在") - @GetMapping("/checkName") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "id"), - @ApiImplicitParam(name = "name", value = "课程名称") - }) - public NameExistVO checkNameExist(@RequestParam(value = "id",required = false) Long id, - @RequestParam(value = "name") String name){ - return courseService.checkName(name, id); - } - - @ApiOperation("查询课程基本信息、目录、学习进度") - @GetMapping("/{id}/catalogs") - public CourseAndSectionVO queryCourseAndCatalogById(@PathVariable("id") Long courseId){ - return courseService.queryCourseAndCatalogById(courseId); - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CourseInfoController.java b/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CourseInfoController.java deleted file mode 100644 index 4f93b88..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/controller/CourseInfoController.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.tianji.course.controller; - -import com.tianji.api.dto.course.*; -import com.tianji.common.utils.CollUtils; -import com.tianji.course.service.ICategoryService; -import com.tianji.course.service.ICourseCatalogueService; -import com.tianji.course.service.ICourseService; -import io.swagger.annotations.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * 内部服务接口调用 - * - * @ClassName CourseInfoController - * @Author wusongsong - * @Date 2022/7/18 15:19 - * @Version - **/ -@RestController -@RequestMapping("course") -@Api(tags = "课程相关接口,内部调用") -public class CourseInfoController { - - @Autowired - private ICourseCatalogueService courseCatalogueService; - - @Autowired - private ICourseService courseService; - - @Autowired - private ICategoryService categoryService; - - @GetMapping("infoByTeacherIds") - @ApiOperation("通过老师id获取老师负责的课程和出的题目数量") - public List infoByTeacherIds(@RequestParam("teacherIds") List teacherIds) { - - if (CollUtils.isEmpty(teacherIds)) { - return new ArrayList<>(); - } - return courseService.countSubjectNumAndCourseNumOfTeacher(teacherIds); - } - - /** - * 根据小节id获取小节对应的mediaId和课程id - * - * @param sectionId 小节id - * @return 小节对应的mediaId和课程id - */ - @GetMapping("/section/{id}") - @ApiImplicitParam(name = "id", value = "小节id,不支持章id或者练习id查询") - public SectionInfoDTO sectionInfo(@PathVariable("id") Long sectionId) { - return courseCatalogueService.getSimpleSectionInfo(sectionId); - } - - /** - * 根据媒资Id列表查询媒资被引用的次数 - * - * @param mediaIds 媒资id列表 - * @return 媒资id和媒资被引用的次数的列表 - */ - @GetMapping("/media/useInfo") - public List mediaUserInfo(@RequestParam("mediaIds") List mediaIds) { - return courseCatalogueService.countMediaUserInfo(mediaIds); - } - - @GetMapping("/{id}/searchInfo") - @ApiOperation("课程上架时,需要查询课程信息,加入索引库") - public CourseDTO getSearchInfo(@ApiParam("课程id") @PathVariable("id") Long id) { - return courseService.getCourseDTOById(id); - } - - @GetMapping("/{id}") - @ApiOperation("获取课程信息") - @ApiImplicitParams({ - @ApiImplicitParam(name = "id", value = "获取课程信息"), - @ApiImplicitParam(name = "withCatalogue", value = "是否要查询目录信息"), - @ApiImplicitParam(name = "withTeachers", value = "是否查询课程老师信息") - }) - public CourseFullInfoDTO getById( - @PathVariable("id") Long id, - @RequestParam(value = "withCatalogue", required = false) boolean withCatalogue, - @RequestParam(value = "withTeachers", required = false) boolean withTeachers) { - return courseService.getInfoById(id, withCatalogue, withTeachers); - } - - - @GetMapping("/getCateNameMap") - @ApiIgnore - public Map queryByThirdCateIds(@RequestParam("thirdCateIdList") List thirdCateIdList) { - return categoryService.queryByThirdCateIds(thirdCateIdList); - } - - @GetMapping("/name") - public List queryCoursesIdByName(@RequestParam("name") String name){ - return courseService.queryCourseIdByName(name); - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CataSaveDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CataSaveDTO.java deleted file mode 100644 index 7f09085..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CataSaveDTO.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.common.validate.Checker; -import com.tianji.course.constants.CourseConstants; -import com.tianji.course.constants.CourseErrorInfo; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.List; - -/** - * @author wusongsong - * @since 2022/7/11 16:49 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "章节") -public class CataSaveDTO implements Checker { - @ApiModelProperty("章、节、练习id") - private Long id; - @ApiModelProperty("目录类型1:章,2:节,3:测试") - @NotNull(message = "") - private Integer type; - @ApiModelProperty("章节练习名称") - private String name; - @ApiModelProperty("章排序,章一定要传,小节和练习不需要传") - private Integer index; - - @ApiModelProperty("当前章的小节或练习") - @Size(min = 1, message = "不能出现空章") - private List sections; - - @Override - public void check() { - //名称为空校验 - if(type == CourseConstants.CataType.CHAPTER && StringUtils.isEmpty(name)) { - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_NULL); - }else if(StringUtils.isEmpty(name)){ - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_NULL2); - } - //名称长度问题 - if (type == CourseConstants.CataType.CHAPTER && name.length() > 30){ - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_SIZE); - }else if(name.length() > 30) { - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_NAME_SIZE2); - } - if(CollUtils.isEmpty(sections)){ - throw new BadRequestException("不能出现空章"); - } - - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CataSubjectDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CataSubjectDTO.java deleted file mode 100644 index 83fbe84..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CataSubjectDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.course.constants.CourseErrorInfo; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.List; - -/** - * 保存章节信息 - * - * @author wusongsong - * @since 2022/7/11 18:10 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "小节、练习和题目关系模型") -public class CataSubjectDTO { - @ApiModelProperty("题目id") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SUBJECT_SAVE_SUBJECT_IDS_NULL) - @Size(min = 1,message = CourseErrorInfo.Msg.COURSE_SUBJECT_SAVE_SUBJECT_IDS_NULL) - private List subjectIds; - @ApiModelProperty("小节或练习id") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SUBJECT_SAVE_CATALOGUE_ID_NULL) - private Long cataId; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CateSimpleInfoDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CateSimpleInfoDTO.java deleted file mode 100644 index a6dd0cd..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CateSimpleInfoDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.course.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 三级分类 - * @ClassName CateSimpleInfoVO - * @Author wusongsong - * @Date 2022/7/11 20:59 - * @Version - **/ -@Data -@ApiModel("分类") -public class CateSimpleInfoDTO { - @ApiModelProperty("一级分类") - private Long firstCateId; - @ApiModelProperty("二级分类id") - private Long secondCateId; - @ApiModelProperty("三级分类id") - private Long thirdCateId; - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryAddDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryAddDTO.java deleted file mode 100644 index aee83c0..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryAddDTO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.course.constants.CourseErrorInfo; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 课程分类新增模型 - * - * @author wusongsong - * @since 2022/7/10 12:10 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "课程分类新增模型") -public class CategoryAddDTO { - @ApiModelProperty("父分类id, 如果是新增一级分类parentId传0") - private Long parentId; - - @ApiModelProperty(value = "名称",required = true) - @NotNull(message = CourseErrorInfo.Msg.CATEGORY_ADD_NAME_NOT_NULL) - @Size(max = 15, message = CourseErrorInfo.Msg.CATEGORY_ADD_NAME_SIZE) - private String name; - - @ApiModelProperty(value = "分类序号",required = true) - @Max(value = 99, message = CourseErrorInfo.Msg.CATEGORY_ADD_INDEX_MAX_MIN) - @Min(value = 1, message = CourseErrorInfo.Msg.CATEGORY_ADD_INDEX_MAX_MIN) - @NotNull(message = CourseErrorInfo.Msg.CATEGORY_ADD_INDEX_NOT_NULL) - private Integer index; - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryDisableOrEnableDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryDisableOrEnableDTO.java deleted file mode 100644 index 8fda20f..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryDisableOrEnableDTO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.common.validate.annotations.EnumValid; -import com.tianji.course.constants.CourseErrorInfo; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * 课程目录启用或停用模型 - * - * @author wusongsong - * @since 2022/7/10 15:24 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "课程分类启用/禁用") -public class CategoryDisableOrEnableDTO { - @ApiModelProperty("课程分类id") - @NotNull(message = CourseErrorInfo.Msg.CATEGORY_ID_NOT_NULL) - private Long id; - @ApiModelProperty("课程分类状态,1:启用,0:禁用") - @EnumValid(enumeration = {0,1}, message = CourseErrorInfo.Msg.CATEGORY_DISABLE_ENABLE_STATUS_ENUM) - private Integer status; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryListDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryListDTO.java deleted file mode 100644 index c827aea..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryListDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.course.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 课程类目分页查询 - * @author wusongsong - * @since 2022/7/10 11:21 - * @version 1.0.0 - **/ -@ApiModel(description = "课程类目分页查询条件") -@Data -public class CategoryListDTO { - @ApiModelProperty("类目状态1:正常,2:禁用") - private Integer status; - @ApiModelProperty("类目名称") - private String name; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryUpdateDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryUpdateDTO.java deleted file mode 100644 index a0cccec..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CategoryUpdateDTO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.course.constants.CourseErrorInfo; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; - -/** - * 课程分类更新类,只更新名称和排序 - * @author wusongsong - * @since 2022/7/10 15:32 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "分类信息更新模型") -public class CategoryUpdateDTO { - @ApiModelProperty("分类id") - @NotNull(message = CourseErrorInfo.Msg.CATEGORY_ID_NOT_NULL) - private Long id; - @ApiModelProperty("名称") - @NotNull(message = CourseErrorInfo.Msg.CATEGORY_UPDATE_NAME_NOT_NULL) - @Size(max = 15, message = CourseErrorInfo.Msg.CATEGORY_UPDATE_NAME_SIZE) - private String name; - @ApiModelProperty("分类序号") - @Max(value = 99, message = CourseErrorInfo.Msg.CATEGORY_UPDATE_INDEX_MAX_MIN) - @Min(value = 1, message = CourseErrorInfo.Msg.CATEGORY_UPDATE_INDEX_MAX_MIN) - @NotNull(message = CourseErrorInfo.Msg.CATEGORY_UPDATE_INDEX_NOT_NULL) - private Integer index; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseBaseInfoSaveDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseBaseInfoSaveDTO.java deleted file mode 100644 index 03d97a0..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseBaseInfoSaveDTO.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.DateUtils; -import com.tianji.common.validate.Checker; -import com.tianji.course.constants.CourseErrorInfo; -import com.tianji.course.utils.CourseSaveBaseGroup; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -/** - * 课程基本信息 - * - * @ClassName CourseBaseInfoSaveDTO - * @author wusongsong - * @since 2022/7/11 11:39 - * @version 1.0.0 - **/ - -@Data -@ApiModel(description = "课程基本信息保存") -public class CourseBaseInfoSaveDTO implements Checker { - @ApiModelProperty("课程id,新课程该值不能传,老课程必填") - private Long id; - @ApiModelProperty("课程名称") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SAVE_NAME_NULL) - private String name; - @ApiModelProperty("三级课程分类id") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SAVE_CATEGORY_NULL) - private Long thirdCateId; - @ApiModelProperty("封面链接url") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SAVE_COVER_URL_NULL, groups = CourseSaveBaseGroup.class) - private String coverUrl; - @ApiModelProperty("是否是免费") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SAVE_FREE_NULL) - private Boolean free; - @ApiModelProperty("课程价格") - @Min(value = 0, message = CourseErrorInfo.Msg.COURSE_SAVE_PRICE_NEGATIVE) - private Integer price; -// @ApiModelProperty("购买周期开始时间") -// @NotNull(message = CourseErrorInfo.Msg.COURSE_SAVE_PURCHASE_TIME_NULL) - private LocalDateTime purchaseStartTime; - @ApiModelProperty("购买周期结束时间") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SAVE_PURCHASE_TIME_NULL) - private LocalDateTime purchaseEndTime; - @ApiModelProperty("课程介绍") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SAVE_INTRODUCE_NULL, groups = CourseSaveBaseGroup.class) - private String introduce; - @ApiModelProperty("使用人群") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SAVE_USE_PEOPLE_NULL, groups = CourseSaveBaseGroup.class) - private String usePeople; - @ApiModelProperty("详情") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SAVE_DETAIL_NULL, groups = CourseSaveBaseGroup.class) - private String detail; - @ApiModelProperty("学习周期,0或不传表示没有期限,其他表示月数") - @NotNull(message = CourseErrorInfo.Msg.COURSE_SAVE_DURATION_NULL) - private Integer validDuration; - - @Override - public void check() { - if(!free) { //非免费 - if(price == null) { //付费课程未设置价格 - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_SAVE_PRICE_NULL); - } - if(price <= 0){ //付费课程设置价格小于0 - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_SAVE_PRICE_NEGATIVE); - } - }else { //免费 - if(price != null && price > 0){ //免费课程设置了价格 - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_SAVE_PRICE_FREE); - } - } - if(purchaseEndTime.isBefore(DateUtils.now())){ - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_SAVE_PURCHASE_ILLEGAL); - } -// if (purchaseStartTime.isAfter(purchaseEndTime)) { -// throw new BadRequestException(CourseErrorInfo.Msg.COURSE_SAVE_PURCHASE_ILLEGAL); -// } -// if(id == null && purchaseStartTime.isBefore(LocalDateTime.now())){ -// throw new BadRequestException(CourseErrorInfo.Msg.COURSE_SAVE_PURCHASE_ILLEGAL2); -// } - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseIdDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseIdDTO.java deleted file mode 100644 index 2bc7ef4..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseIdDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.course.constants.CourseErrorInfo; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * @author wusongsong - * @since 2022/7/20 16:50 - * @version 1.0.0 - **/ -@ApiModel(description = "课程id") -@Data -public class CourseIdDTO { - @ApiModelProperty("课程id") - @NotNull(message = CourseErrorInfo.Msg.COURSE_OPERATE_ID_NULL) - private Long id; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseMediaDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseMediaDTO.java deleted file mode 100644 index 0a6698f..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseMediaDTO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.course.constants.CourseErrorInfo; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; - -/** - * 课程视频模型 - * - * @author wusongsong - * @since 2022/7/11 17:12 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "课程视频模型") -public class CourseMediaDTO { - @ApiModelProperty("目录id") - @NotNull(message = CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_MEDIA_NULL) - private Long cataId; - @ApiModelProperty("媒资id") - @NotNull(message = CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_MEDIA_NULL) - private Long mediaId; - @ApiModelProperty("是否支持试看") - @NotNull(message = CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_MEDIA_NULL) - private Boolean trailer; - @ApiModelProperty("媒资名称") - @NotNull(message = CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_MEDIA_NULL) - @Length(min = 1, message = CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_MEDIA_NULL) - private String videoName; - @ApiModelProperty("媒资时长,单位s") - @NotNull(message = CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_MEDIA_NULL) - @Min(value = 1, message = CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_MEDIA_NULL) - private Integer mediaDuration; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseMediaSaveDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseMediaSaveDTO.java deleted file mode 100644 index 7b09ebf..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseMediaSaveDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.course.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 课程视频保存模型 - * @author wusongsong - * @since 2022/7/13 15:09 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "课程视频保存模型") -public class CourseMediaSaveDTO { - @ApiModelProperty("小节id") - private Long cataId; - @ApiModelProperty("媒资id") - private Long mediaId; - @ApiModelProperty("是否支持试看") - private Boolean trailer; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CoursePageQuery.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CoursePageQuery.java deleted file mode 100644 index d333aff..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CoursePageQuery.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.common.domain.query.PageQuery; -import com.tianji.common.utils.DateUtils; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "课程搜索条件") -public class CoursePageQuery extends PageQuery { - - @ApiModelProperty(value = "搜索关键字", example = "Redis") - private String keyword; - @ApiModelProperty(value = "课程1级分类id", example = "1") - private Long firstCateId; - @ApiModelProperty(value = "课程2级分类id", example = "2") - private Long secondCateId; - @ApiModelProperty(value = "课程3级分类id", example = "3") - private Long thirdCateId; - @ApiModelProperty(value = "售卖模式,true:免费,false:收费", example = "true") - private Boolean free; - @ApiModelProperty(value = "课程状态,1:待上架,2:已上架,3:已下架,4:已完结", example = "1", required = true) - private Integer status; - @ApiModelProperty(value = "课程类型,1-录播,2-直播", example = "1") - private Integer courseType; - @ApiModelProperty(value = "更新时间区间的开始时间", example = "2022-7-18 19:52:36") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime beginTime; - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - @ApiModelProperty(value = "更新时间区间的结束时间", example = "2022-7-18 19:52:36") - private LocalDateTime endTime; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseSimpleInfoListDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseSimpleInfoListDTO.java deleted file mode 100644 index 7cd1799..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseSimpleInfoListDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.course.domain.dto; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -/** - * @author wusongsong - * @since 2022/7/26 9:26 - * @version 1.0.0 - **/ -@Data -public class CourseSimpleInfoListDTO { - - @ApiModelProperty("三级分类id列表") - private List thirdCataIds; - - @ApiModelProperty("课程id列表") - private List ids; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseTeacherSaveDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseTeacherSaveDTO.java deleted file mode 100644 index 886d5b1..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/CourseTeacherSaveDTO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.course.constants.CourseErrorInfo; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.List; - -/** - * 保存老师课程关系 - * @ClassName CourseTeacherSaveDTO - * @Author wusongsong - * @Date 2022/7/13 14:59 - * @Version - **/ -@Data -@ApiModel("课程老师关系模型") -public class CourseTeacherSaveDTO { - @ApiModelProperty("课程id") - @NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_COURSE_ID_NULL) - private Long id; - @ApiModelProperty("老师id和用户端是否展示,该列表按照界面上的顺序") - @NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NULL) -// @Min(value = 1, message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NULL) - @Size(min = 1, max = 5, message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHERS_NUM_MAX ) - private List teachers; - - @Data - @ApiModel("老师id和用户端是否显示") - public static class TeacherInfo{ - @ApiModelProperty("老师id") - @NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHER_ID_NULL) - private Long id; - @ApiModelProperty("用户端是否展示") - @NotNull(message = CourseErrorInfo.Msg.COURSE_TEACHER_SAVE_TEACHER_SHOW) - private Boolean isShow; - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/SubjectPageParamDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/SubjectPageParamDTO.java deleted file mode 100644 index de8d4f7..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/SubjectPageParamDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.course.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -/** - * @ClassName SubjectPageParamDTO - * @Author wusongsong - * @Date 2022/7/11 20:07 - * @Version - **/ -@Data -@ApiModel(description = "题目分页参数") -public class SubjectPageParamDTO { - @ApiModelProperty("一级课程分类") - private Long firstCateId; - @ApiModelProperty("二级课程分类") - private Long secondCateId; - @ApiModelProperty("三级课程分类id列表") - private List thirdCateIds; - @ApiModelProperty("难易度,1:简单,2:中等,3:困难") - private Integer difficulty; - @ApiModelProperty("名称") - private String name; - @ApiModelProperty("题目类型,1:单选题,2:多选题,3:不定向选择题,4:判断题,多选中间逗号隔开,不传表示全选") - private String subjectTypes; - @ApiModelProperty("是否全选当前用户,默认搜索所有") - private Boolean own; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/SubjectSaveDTO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/SubjectSaveDTO.java deleted file mode 100644 index f73658e..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/dto/SubjectSaveDTO.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.tianji.course.domain.dto; - -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.common.validate.Checker; -import com.tianji.common.validate.annotations.EnumValid; -import com.tianji.course.constants.SubjectConstants; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.List; - -/** - * 题目保存模型 - * @author wusongsong - * @since 2022/7/11 21:10 - * @version 1.0.0 - **/ -@ApiModel("题目保存模型") -@Data -public class SubjectSaveDTO implements Checker { - @ApiModelProperty("题目id,为空新增,不为空更新") - private Long id; - @ApiModelProperty("名称") - @NotNull(message = "题目为空,请设置题目") - @Size(max = 200, min = 5, message = "题目长度为5-200") - private String name; - @ApiModelProperty("所属题目分类") - @NotNull(message = "题目分类为空,请设置题目分类") - private List> cates; - @ApiModelProperty("题目类型") - @NotNull(message = "题目类型为空,请设置题目类型") - @EnumValid(enumeration = {1,2,3,4,5}, message = "题目类型只有单选题,多选题,不定向选择题,判断题,您的题目超出题纲") - private Integer subjectType; - @ApiModelProperty("题目难易度") - @NotNull(message = "难度不能为空") - @EnumValid(enumeration = {1,2,3},message = "题目难度只有简单,中等,困难") - private Integer difficulty; - @ApiModelProperty("分值") - private Integer score; - - @ApiModelProperty("课程id") - private List courseIds; - - @ApiModelProperty("选项,最多10个") - private List options; - - @ApiModelProperty("答案,判断题,数组第一个如果是1,代表正确,其他代表错误") - @NotNull(message = "题目答案不能为空") - private List answers; - @ApiModelProperty("解析") - private String analysis; - - @Override - public void check() { - //选择题 单选,多选,不定向选择 - if(subjectType == SubjectConstants.Type.SIGNLE_CHOICE.getType() || - subjectType == SubjectConstants.Type.MUtiple_CHOICE.getType() || - subjectType == SubjectConstants.Type.NON_DIRECTIONAL_CHOICE.getType()){ - Integer answerOptionMax = answers.stream().max(Integer::compare).get(); - //选项最少1个最多10个 - if(CollUtils.isEmpty(options) || options.size() > 10){ - throw new BizIllegalException("最少1个选项,最多10个选项"); - } - //选择题答案 不能超过选项数 - if(answerOptionMax > options.size()){ - throw new BizIllegalException("存在正确的答案找不到选项"); - } - if(StringUtils.isNotEmpty(analysis) - && (StringUtils.length(analysis) < 5 - || StringUtils.length(analysis) > 300)) { - throw new BadRequestException("答案解析长度为5-300"); - } - } - - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CataIdAndSubScore.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CataIdAndSubScore.java deleted file mode 100644 index 591936f..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CataIdAndSubScore.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.course.domain.po; - -import lombok.Data; - -/** - * 查询某个课程中练习对应的练习id和该练习对应的题目id - * @author wusongsong - * @since 2022/7/22 16:04 - * @version 1.0.0 - **/ -@Data -public class CataIdAndSubScore { - //目录id - private Long cataId; - //题目id - private Long subjectId; - //题目对应的分 - private Integer score; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Category.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Category.java deleted file mode 100644 index 7ebd3af..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Category.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 课程分类 - *

- * - * @author wusongsong - * @since 2022-07-14 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("category") -public class Category implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 课程分类id - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 分类名称 - */ - private String name; - - /** - * 父分类id,一级分类父id为0 - */ - private Long parentId; - - /** - * 分类级别,1,2,3:代表一级分类,二级分类,三级分类 - */ - private Integer level; - - /** - * 同级目录优先级,数字越小优先级越高,可以重复 - */ - private Integer priority; - - /** - * 课程分类状态,1:正常,0:禁用 - */ - private Integer status; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - - /** - * 创建者 - */ - private Long creater; - - /** - * 更新者 - */ - private Long updater; - - @TableLogic - private Integer deleted; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Category3PO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Category3PO.java deleted file mode 100644 index 56de437..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Category3PO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tianji.course.domain.po; - -import lombok.Data; - -import java.util.List; - -/** - * @ClassName Category3PO - * @Author wusongsong - * @Date 2022/10/13 15:32 - * @Version - **/ -@Data -public class Category3PO { - private Long firstCateId; - private Long secondCateId; - private Long thirdCateId; - - public void setId(List categoryIdList) { - if(firstCateId != null) { - categoryIdList.add(firstCateId); - } - if (secondCateId != null) { - categoryIdList.add(secondCateId); - } - if(thirdCateId != null) { - categoryIdList.add(thirdCateId); - } - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Course.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Course.java deleted file mode 100644 index 506e490..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Course.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 草稿课程 - *

- * - * @author wusongsong - * @since 2022-07-18 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course") -public class Course implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 课程草稿id,对应正式草稿id - */ - private Long id; - - /** - * 课程名称 - */ - private String name; - - /** - * 课程类型,1:直播课,2:录播课 - */ - private Integer courseType; - - /** - * 封面链接 - */ - private String coverUrl; - - /** - * 一级课程分类id - */ - private Long firstCateId; - - /** - * 二级课程分类id - */ - private Long secondCateId; - - /** - * 三级课程分类id - */ - private Long thirdCateId; - - /** - * 售卖方式0付费,1:免费 - */ - private Integer free; - - /** - * 课程价格,单位为分 - */ - private Integer price; - - /** - * 模板类型,1:固定模板,2:自定义模板 - */ - private Integer templateType; - - /** - * 自定义模板的连接 - */ - private String templateUrl; - - /** - * 课程状态,1:待上架,2:已上架,3:下架,4:已完结 - */ - private Integer status; - - /** - * 课程购买有效期开始时间 - */ - private LocalDateTime purchaseStartTime; - - /** - * 课程购买有效期结束时间 - */ - private LocalDateTime purchaseEndTime; - - /** - * 信息填写进度 - */ - private Integer step; - - /** - * 课程评价得分,45代表4.5星 - */ - private Integer score; - - /** - * 课程总时长 - */ - private Integer mediaDuration; - - /** - * 课程有效期,单位月 - */ - private Integer validDuration; - - /** - * 课程总节数,包括练习 - */ - private Integer sectionNum; - - /** - * 部门id - */ - private Long depId; - - /** - * 发布次数 - */ - private Integer publishTimes; - - /** - * 最近一次发布时间 - */ - private LocalDateTime publishTime; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - /** - * 逻辑删除 - */ - private Integer deleted; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCataSubject.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCataSubject.java deleted file mode 100644 index f5ea391..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCataSubject.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - *

- * 课程-题目关系表草稿 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course_cata_subject") -public class CourseCataSubject implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 小节题目关系id - */ - private Long id; - - /** - * 课程id - */ - private Long courseId; - - /** - * 小节id - */ - private Long cataId; - - /** - * 题目id - */ - private Long subjectId; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCataSubjectDraft.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCataSubjectDraft.java deleted file mode 100644 index 2980277..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCataSubjectDraft.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 课程-题目关系表草稿 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course_cata_subject_draft") -public class CourseCataSubjectDraft implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 小节题目关系id - */ - private Long id; - - private Long courseId; - - /** - * 小节id - */ - private Long cataId; - - /** - * 题目id - */ - private Long subjectId; - - private LocalDateTime createTime; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCatalogue.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCatalogue.java deleted file mode 100644 index 62d44fd..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCatalogue.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 目录草稿 - *

- * - * @author wusongsong - * @since 2022-07-19 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course_catalogue") -public class CourseCatalogue implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 课程目录id - */ - private Long id; - - /** - * 目录名称 - */ - private String name; - - /** - * 是否支持试看 - */ - private Integer trailer; - - /** - * 课程id - */ - private Long courseId; - - /** - * 目录类型1:章,2:节,3:测试 - */ - private Integer type; - - /** - * 所属章id,只有小节和测试有该值,章没有,章默认为0 - */ - private Long parentCatalogueId; - - /** - * 媒资id - */ - private Long mediaId; - - /** - * 视频id - */ - private Long videoId; - - /** - * 视频名称 - */ - private String videoName; - - /** - * 直播开始时间 - */ - private LocalDateTime livingStartTime; - - /** - * 直播结束时间 - */ - private LocalDateTime livingEndTime; - - /** - * 是否支持回放 - */ - private Integer playBack; - - /** - * 视频时长,以秒为单位 - */ - private Integer mediaDuration; - - /** - * 用于章节排序 - */ - private Integer cIndex; - - /** - * 部门id - */ - private Long depId; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - /** - * 逻辑删除 - */ - private Integer deleted; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCatalogueDraft.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCatalogueDraft.java deleted file mode 100644 index 50c3ac6..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseCatalogueDraft.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.*; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 目录草稿 - *

- * - * @author wusongsong - * @since 2022-07-19 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course_catalogue_draft") -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class CourseCatalogueDraft implements Serializable { - - private static final long serialVersionUID = 1L; - /** - * 设置目录基本信息 - * - * @param cIndex 目录序号 - * @param name 目录名称 - * @param type 类型 - * @param parentCatalogueId 父目录id - * @param courseId 课程id - */ - public void setCataBaseInfo(Integer cIndex, String name, Integer type, Long parentCatalogueId, Long courseId){ - this.cIndex = cIndex; - this.name = name; - this.type = type; - this.parentCatalogueId = parentCatalogueId; - this.courseId = courseId; - } - - /** - * 课程目录id - */ - private Long id; - - /** - * 目录名称 - */ - private String name; - - /** - * 是否支持试看 - */ - private Integer trailer; - - /** - * 课程id - */ - private Long courseId; - - /** - * 目录类型1:章节,2:小节,3:测试 - */ - private Integer type; - - /** - * 所属章节id,只有小节和测试有该值,章节没有,章节默认为0 - */ - private Long parentCatalogueId; - - /** - * 媒资id - */ - private Long mediaId; - - /** - * 视频id - */ - private Long videoId; - - /** - * 视频名称 - */ - private String videoName; - - /** - * 直播开始时间 - */ - private LocalDateTime livingStartTime; - - /** - * 直播结束时间 - */ - private LocalDateTime livingEndTime; - - /** - * 是否支持回放 - */ - private Integer playBack; - - /** - * 用于章节排序 - */ - private Integer cIndex; - - /** - * 以s为单位 - */ - private Integer mediaDuration; - - /** - * 是否可以修改,上架后的目录位置不能移动 - */ - private Boolean canUpdate; - /** - * 部门id - */ - private Long depId; - - /** - * 创建时间 - */ - - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - /** - * 逻辑删除 - */ -// private Integer deleted; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseContent.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseContent.java deleted file mode 100644 index 76aac02..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseContent.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 课程内容,主要是一些大文本 - *

- * - * @author wusongsong - * @since 2022-07-21 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course_content") -public class CourseContent implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 课程内容id - */ - private Long id; - - /** - * 课程介绍 - */ - private String courseIntroduce; - - /** - * 适用人群 - */ - private String usePeople; - - /** - * 课程详情 - */ - private String courseDetail; - - /** - * 部门id - */ - private Long depId; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - /** - * 逻辑删除 - */ - private Integer deleted; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseContentDraft.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseContentDraft.java deleted file mode 100644 index a34f15f..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseContentDraft.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 课程内容,主要是一些大文本 - *

- * - * @author wusongsong - * @since 2022-07-18 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course_content_draft") -public class CourseContentDraft implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 课程内容id - */ - private Long id; - - /** - * 课程介绍 - */ - private String courseIntroduce; - - /** - * 适用人群 - */ - private String usePeople; - - /** - * 课程详情 - */ - private String courseDetail; - - /** - * 部门id - */ - private Long depId; - - /** - * 创建时间 - */ - - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - /** - * 逻辑删除 - */ -// private Integer deleted; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseDraft.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseDraft.java deleted file mode 100644 index fc1c602..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseDraft.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 草稿课程 - *

- * - * @author wusongsong - * @since 2022-07-23 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course_draft") -public class CourseDraft implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 课程草稿id,对应正式草稿id - */ - private Long id; - - /** - * 课程名称 - */ - private String name; - - /** - * 课程类型,1:直播课,2:录播课 - */ - private Integer courseType; - - /** - * 封面链接 - */ - private String coverUrl; - - /** - * 一级课程分类id - */ - private Long firstCateId; - - /** - * 二级课程分类id - */ - private Long secondCateId; - - /** - * 三级课程分类id - */ - private Long thirdCateId; - - /** - * 售卖方式0付费,1:免费 - */ - private Integer free; - - /** - * 课程价格,单位为分 - */ - private Integer price; - - /** - * 模板类型,1:固定模板,2:自定义模板 - */ - private Integer templateType; - - /** - * 自定义模板的连接 - */ - private String templateUrl; - - /** - * 课程状态,1:待上架,2:已上架,3:下架,4:已完结 - */ - private Integer status; - - /** - * 课程购买有效期开始时间 - */ - private LocalDateTime purchaseStartTime; - - /** - * 课程购买有效期结束时间 - */ - private LocalDateTime purchaseEndTime; - - /** - * 信息填写进度1:基本信息已经保存,2:课程目录已经保存,3:课程视频已保存,4:课程题目已保存,5:课程老师已经保存 - */ - private Integer step; - - /** - * 课程评分,45代表4.5星 - */ - private Integer score; - - /** - * 视频总时长 - */ - private Integer mediaDuration; - - /** - * 课程有效期,单位月 - */ - private Integer validDuration; - - /** - * 课程总节数 - */ - private Integer sectionNum; - - /** - * 是否可以修改 - */ - private Boolean canUpdate; - - private Integer cVersion; - /** - * 部门id - */ - private Long depId; - - /** - * 发布时间 - */ - private LocalDateTime publishTime; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseSubject.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseSubject.java deleted file mode 100644 index 540f688..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseSubject.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import javax.validation.constraints.NotNull; -import java.io.Serializable; - -/** - *

- * 课程题目关系列表 - *

- * - * @author wusongsong - * @since 2022-07-17 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course_subject") -@NotNull -@AllArgsConstructor -public class CourseSubject implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 课程题目关系id - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - private Long courseId; - - private Long subjectId; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseTeacher.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseTeacher.java deleted file mode 100644 index 1700312..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseTeacher.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 课程老师关系表草稿 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course_teacher") -public class CourseTeacher implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 课程老师关系id - */ - private Long id; - - /** - * 课程id - */ - private Long courseId; - - /** - * 老师id - */ - private Long teacherId; - - /** - * 用户端是否展示 - */ - private Integer isShow; - - /** - * 序号 - */ - private Integer cIndex; - - /** - * 部门id - */ - private Long depId; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - /** - * 逻辑删除 - */ - private Integer deleted; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseTeacherDraft.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseTeacherDraft.java deleted file mode 100644 index 259e5d0..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/CourseTeacherDraft.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 课程老师关系表草稿 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("course_teacher_draft") -public class CourseTeacherDraft implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 课程老师关系id - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 课程id - */ - private Long courseId; - - /** - * 老师id - */ - private Long teacherId; - - /** - * 用户端是否展示 - */ - private Integer isShow; - - /** - * 序号 - */ - private Integer cIndex; - - /** - * 部门id - */ - private Long depId; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - /** - * 逻辑删除 - */ - private Integer deleted; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Subject.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Subject.java deleted file mode 100644 index 3fe33ef..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/Subject.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.StringUtils; -import lombok.*; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - *

- * 题目 - *

- * - * @author wusongsong - * @since 2022-07-15 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("subject") -public class Subject implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 题目id - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 题干 - */ - private String name; - - /** - * 题目类型,1:单选题,2:多选题,3:不定向选择题,4:判断题,5:主观题 - */ - private Integer subjectType; - - /** - * 难易度,1:简单,2:中等,3:困难 - */ - private Integer difficulty; - - /** - * 选择题答案1, - */ - private String option1; - - /** - * 选择题答案2 - */ - private String option2; - - /** - * 选择题答案3 - */ - private String option3; - - /** - * 选择题答案4 - */ - private String option4; - - /** - * 选择题答案5 - */ - private String option5; - - /** - * 选择题答案6 - */ - private String option6; - - /** - * 选择题答案7 - */ - private String option7; - - /** - * 选择题答案8 - */ - private String option8; - - /** - * 选择题答案9 - */ - private String option9; - - /** - * 选择题答案10 - */ - private String option10; - - /** - * 选择题正确答案1到10,如果有多个答案,中间使用逗号隔开,如果是判断题,1:代表正确,其他代表错误 - */ - private String answer; - - /** - * 答案解析 - */ - private String analysis; - - /** - * 回答正确次数 - */ - private Integer correctTimes; - - /** - * 分值 - */ - private Integer score; - - /** - * 部门id - */ - private Long depId; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 引用次数 - */ - private Integer useTimes; - /** - * 作答次数 - */ - private Integer answerTimes; - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - /** - * 逻辑删除 - */ - @TableLogic - private Integer deleted; - - public List getOptions() { - return Stream.of(option1, option2, option3, option4, option5, option6, option7, option8, option9, option10) - .filter(StringUtils::isNotBlank).collect(Collectors.toList()); - } - - public List getAnswers() { - return CollUtils.convertToInteger(StringUtils.split(answer, ",")); - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/SubjectCategory.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/SubjectCategory.java deleted file mode 100644 index 358a41e..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/SubjectCategory.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.tianji.course.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - *

- * 课程分类关系表 - *

- * - * @author wusongsong - * @since 2022-07-15 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("subject_category") -public class SubjectCategory implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * id - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 题目id - */ - private Long subjectId; - - /** - * 一级课程分类id - */ - private Long firstCateId; - - /** - * 二级课程分类id - */ - private Long secondCateId; - - /** - * 三级课程分类id - */ - private Long thirdCateId; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/SubjectUseNum.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/SubjectUseNum.java deleted file mode 100644 index 539b438..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/po/SubjectUseNum.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.course.domain.po; - -import lombok.*; - -/** - * @ClassName SubjectUseNum - * @Author wusongsong - * @Date 2022/9/20 17:37 - * @Version - **/ -@Data -@EqualsAndHashCode -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class SubjectUseNum { - private Long id; - private Integer num; - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/query/CoursePageQuery.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/query/CoursePageQuery.java deleted file mode 100644 index ca0e447..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/query/CoursePageQuery.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.course.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import com.tianji.common.utils.DateUtils; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "课程搜索条件") -public class CoursePageQuery extends PageQuery { - - @ApiModelProperty(value = "搜索关键字", example = "Redis") - private String keyword; - @ApiModelProperty(value = "课程1级分类id", example = "1") - private Long firstCateId; - @ApiModelProperty(value = "课程2级分类id", example = "2") - private Long secondCateId; - @ApiModelProperty(value = "课程3级分类id", example = "3") - private Long thirdCateId; - @ApiModelProperty(value = "售卖模式,true:免费,false:收费", example = "true") - private Boolean free; - @ApiModelProperty(value = "课程状态,1:待上架,2:已上架,3:已下架,4:已完结", example = "1", required = true) - private Integer status; - @ApiModelProperty(value = "课程类型,1-录播,2-直播", example = "1") - private Integer courseType; - @ApiModelProperty(value = "更新时间区间的开始时间", example = "2022-7-18 19:52:36") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime beginTime; - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - @ApiModelProperty(value = "更新时间区间的结束时间", example = "2022-7-18 19:52:36") - private LocalDateTime endTime; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSimpleInfoVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSimpleInfoVO.java deleted file mode 100644 index 428141d..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSimpleInfoVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * @author wusongsong - * @since 2022/7/26 9:28 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "目录简单信息") -@AllArgsConstructor -@NoArgsConstructor -public class CataSimpleInfoVO { - @ApiModelProperty("目录id") - private Long id; - @ApiModelProperty("目录名称") - private String name; - @ApiModelProperty("目录序号1-1") - private String index; - @ApiModelProperty("数字序号,不包含章序号") - private Integer cIndex; - @ApiModelProperty("数字序号章序号") - private Integer chapterIndex; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSimpleSubjectVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSimpleSubjectVO.java deleted file mode 100644 index 63aedc5..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSimpleSubjectVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * @author wusongsong - * @since 2022/8/15 16:04 - * @version 1.0.0 - **/ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class CataSimpleSubjectVO { - @ApiModelProperty("小节或练习id") - private Long cataId; - @ApiModelProperty("题目id") - private List subjects; - - @Data - @AllArgsConstructor - @NoArgsConstructor - public static class SubjectInfo{ - private Long id; - private String name; - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSubjectVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSubjectVO.java deleted file mode 100644 index 5bac447..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataSubjectVO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 目录和习题模型 - * @author wusongsong - * @since 2022/7/11 17:45 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "课程题目统计") -public class CataSubjectVO { - @ApiModelProperty("小节或测试id") - private Long cataId; - @ApiModelProperty("小节或测试名称") - private String cataName; - @ApiModelProperty("类型,2:节,3:测试") - private Integer type; - @ApiModelProperty("题目数量") - private Integer subjectNum; - @ApiModelProperty("题目总分") - private Integer subjectScore; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataVO.java deleted file mode 100644 index 22a0d34..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CataVO.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -/** - * @ClassName CataVO - * @Author wusongsong - * @Date 2022/7/11 16:42 - * @Version - **/ -@Data -@ApiModel("课程目录") -public class CataVO { - @ApiModelProperty("章、节、练习id") - private Long id; - @ApiModelProperty("序号") - private Integer index; - @ApiModelProperty("章节练习名称") - private String name; - @ApiModelProperty("课程总时长,单位秒") - private Integer mediaDuration; - @ApiModelProperty("是否支持免费试看") - private Boolean trailer; - @ApiModelProperty("媒资名称") - private String mediaName; - @ApiModelProperty("媒资id") - private Long mediaId; - @ApiModelProperty("目录类型1:章,2:节,3:测试") - private Integer type; - @ApiModelProperty("题目数量") - private Integer subjectNum; - @ApiModelProperty("题目总分") - private Integer totalScore; - @ApiModelProperty("是否可以修改,默认不能修改") - private Boolean canUpdate = false; - @ApiModelProperty("该章的所有小节和练习") - private List sections; - @ApiModelProperty("已上架最大序号,查看时值为空,编辑查看时小节必有值") - private Integer maxIndexOnShelf; - @ApiModelProperty("已上架小节最大序号,查看时,值为空,编辑查看时小节必有字段") - private Integer maxSectionIndexOnShelf; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CateSimpleInfoVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CateSimpleInfoVO.java deleted file mode 100644 index e590915..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CateSimpleInfoVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 三级分类 - * @author wusongsong - * @since 2022/7/11 20:59 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "分类") -public class CateSimpleInfoVO { - @ApiModelProperty("一级分类") - private Long firstCateId; - @ApiModelProperty("一级分类名称") - private String firstCateName; - @ApiModelProperty("二级分类id") - private Long secondCateId; - @ApiModelProperty("二级分类名称") - private String secondCateName; - @ApiModelProperty("三级分类id") - private Long thirdCateId; - @ApiModelProperty("三级分类名称") - private String thirdCateName; - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CategoryInfoVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CategoryInfoVO.java deleted file mode 100644 index 1cdf24a..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CategoryInfoVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * @author wusongsong - * @since 2022/7/10 15:06 - * @version 1.0.0 - **/ -@Data -public class CategoryInfoVO { - @ApiModelProperty("课程分类id") - private Long id; - @ApiModelProperty("课程分类名称") - private String name; - @ApiModelProperty("状态:1:正常,2:禁用") - private Integer status; - @ApiModelProperty("状态描述") - private String statusDesc; - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - @ApiModelProperty("分类级别,1:一级分类,2:二级分类,3:三级分类") - private Integer categoryLevel; - @ApiModelProperty("一级分类名称") - private String firstCategoryName; - @ApiModelProperty("二级分类名称") - private String secondCategoryName; - @ApiModelProperty("排序") - private Integer index; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CategoryVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CategoryVO.java deleted file mode 100644 index bd6ce5a..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CategoryVO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * @author wusongsong - * @since 2022/7/10 11:32 - * @version 1.0.0 - **/ -@ApiModel(description = "课程分类信息") -@Data -public class CategoryVO { - @ApiModelProperty("课程分类id") - private Long id; - @ApiModelProperty("课程分类名称") - private String name; - @ApiModelProperty("三级分类数量") - private Integer thirdCategoryNum; - @ApiModelProperty("课程数量") - private Integer courseNum; - @ApiModelProperty("状态:1:正常,2:禁用") - private Integer status; - @ApiModelProperty("状态描述") - private String statusDesc; - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - @ApiModelProperty("排序") - private Integer index; - @ApiModelProperty("父id") - private Long parentId; - @ApiModelProperty("级别") - private Integer level; - @ApiModelProperty("子分类列表") - private List children; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/ChapterVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/ChapterVO.java deleted file mode 100644 index 3f28b88..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/ChapterVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@Data -@ApiModel(description = "章信息") -public class ChapterVO { - @ApiModelProperty("章id") - private Long id; - @ApiModelProperty("章索引") - private Integer index; - @ApiModelProperty("章名称") - private String name; - @ApiModelProperty("本章视频总时长") - private Integer mediaDuration; - - private List sections; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseAndSectionVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseAndSectionVO.java deleted file mode 100644 index 7c49b46..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseAndSectionVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@Data -@ApiModel(description = "课程和目录及学习进度信息") -public class CourseAndSectionVO { - @ApiModelProperty("id") - private Long id; - @ApiModelProperty("课程名称") - private String name; - @ApiModelProperty("课程封面") - private String coverUrl; - @ApiModelProperty("课程章节数量") - private Integer sections; - @ApiModelProperty("教师头像") - private String teacherIcon; - @ApiModelProperty("教师名称") - private String teacherName; - @ApiModelProperty("id") - private Long lessonId; - @ApiModelProperty("正在学习的小节id") - private Long latestSectionId; - private List chapters; -} \ No newline at end of file diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseBaseInfoVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseBaseInfoVO.java deleted file mode 100644 index bcd1a66..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseBaseInfoVO.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * @author wusongsong - * @since 2022/7/11 11:59 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "课程基本信息") -public class CourseBaseInfoVO { - @ApiModelProperty("课程id") - private Long id; - @ApiModelProperty("一级分类id") - private Long firstCateId; - @ApiModelProperty("二级分类id") - private Long secondCateId; - @ApiModelProperty("三级分类id") - private Long thirdCateId; - @ApiModelProperty("课程创建人") - private String createrName; - private Long creater; - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - @ApiModelProperty("封面url") - private String coverUrl; - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - @ApiModelProperty("更新人名称") - private String updaterName; - private Long updater; - @ApiModelProperty("课时总数量,去掉章,测试,用于编辑回显时该值为空") - private Integer cataTotalNum; - @ApiModelProperty("课程评分,用于编辑回显时该值为空") - private Double coureScore = 0d; - @ApiModelProperty("课程评分") - private Integer score; - @ApiModelProperty("报名人数,用于编辑回显时该值为空") - private Integer enrollNum = 0; - @ApiModelProperty("学习人数,用于编辑回显时该值为空") - private Integer studyNum = 0; - @ApiModelProperty("退款人数,用于编辑回显时该值为空") - private Integer refundNum = 0; - @ApiModelProperty("实付总金额,用于编辑回显时该值为空") - private Integer realPayAmount = 0; - @ApiModelProperty("课程名称") - private String name; - @ApiModelProperty("课程分类名称,中间使用/隔开") - private String cateNames; - @ApiModelProperty("课程价格") - private Integer price; - @ApiModelProperty("购买有效期开始") - private LocalDateTime purchaseStartTime; - @ApiModelProperty - private LocalDateTime purchaseEndTime; - @ApiModelProperty("有效期") - private Integer validDuration; - @ApiModelProperty("课程介绍") - private String introduce; - @ApiModelProperty("使用人群") - private String usePeople; - @ApiModelProperty("详情") - private String detail; - // - @ApiModelProperty("是否可以修改,默认不能修改") - private Boolean canUpdate = false; - @ApiModelProperty("是否免费") - private Boolean free; - @ApiModelProperty("步骤,1:已保存基本信息,2:已保存课程目录,3:已保存课程视频,4:已保存题目,5:已保存课程老师") - private Integer step; - @ApiModelProperty("课程状态,1:待上架,2:已上架,3:下架,4:已完结") - private Integer status; - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseCataIdVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseCataIdVO.java deleted file mode 100644 index 62f47b5..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseCataIdVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.course.domain.vo; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 章节id - * @author wusongsong - * @since 2022/8/15 15:10 - * @version 1.0.0 - **/ -@Data -@AllArgsConstructor -@NoArgsConstructor -public class CourseCataIdVO { - private Long id; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CoursePageVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CoursePageVO.java deleted file mode 100644 index 82e98ff..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CoursePageVO.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "课程信息") -public class CoursePageVO { - @ApiModelProperty(value = "课程id", example = "1") - private Long id; - @ApiModelProperty(value = "课程名称", example = "Java") - private String name; - @ApiModelProperty(value = "课程价格,单位分", example = "32900") - private Long price; - @ApiModelProperty(value = "课程封面地址", example = "default-cover-url.jpg") - private String coverUrl; - @ApiModelProperty(value = "课程分类,三级分类,以/隔开") - private String categories; - @ApiModelProperty(value = "课程章节数量", example = "25") - private Integer sections; - @ApiModelProperty(value = "课程报名人数(销量)", example = "3920") - private Integer sold; - @ApiModelProperty(value = "课程评价得分,45代表4.5星", example = "35") - private Integer score; - @ApiModelProperty(value = "课程状态,1:待上架,2:已上架,3:已下架,4:已完结", example = "1") - private Integer status; - @ApiModelProperty(value = "更新人名字", example = "32900") - private String updaterName; - @ApiModelProperty(value = "更新时间", example = "2022-7-18 19:52:36") - private LocalDateTime updateTime; - @ApiModelProperty("课程编辑进度:1:基本信息已经保存,2:课程目录已经保存,3:课程视频已保存,4:课程题目已保存,5:课程老师已经保存") - private Integer step; - @ApiModelProperty("课程发布时间") - private LocalDateTime publishTime; - @ApiModelProperty("下架时间") - private LocalDateTime purchaseEndTime; - - public static final String[] EXCLUDE_FIELDS = - {"free", "type", "teacher","duration","publishTime"}; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseSaveVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseSaveVO.java deleted file mode 100644 index 891a57e..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseSaveVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -/** - * @author wusongsong - * @since 2022/7/13 11:26 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "课程保存结果") -@AllArgsConstructor -@NotNull -@Builder -public class CourseSaveVO { - @ApiModelProperty("课程id") - private Long id; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseSimpleInfoVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseSimpleInfoVO.java deleted file mode 100644 index e656ed2..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseSimpleInfoVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - * 课程简单信息 - * @author wusongsong - * @since 2022/7/11 20:56 - * @version 1.0.0 - **/ -@Data -@ApiModel("课程简单信息") -public class CourseSimpleInfoVO { - @ApiModelProperty("课程id") - private Long id; - @ApiModelProperty("课程名称") - private String name; - @ApiModelProperty("封面url") - private String coverUrl; - @ApiModelProperty("价格") - private Integer price; - @ApiModelProperty("一级分类id") - private Long firstCateId; - @ApiModelProperty("二级分类id") - private Long secondCateId; - @ApiModelProperty("三级分类id") - private Long thirdCateId; - - @ApiModelProperty("章节数量") - private Integer sectionNum; - @ApiModelProperty("课程有效期") - private Integer validDuration; - @ApiModelProperty("课程过期时间") - private LocalDateTime purchaseEndTime; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseStatisticsVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseStatisticsVO.java deleted file mode 100644 index bb17c7e..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseStatisticsVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 课程数据统计 - * @author wusongsong - * @since 2022/7/10 15:36 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "课程统计数据") -public class CourseStatisticsVO { - @ApiModelProperty("课程总数量") - private Integer totalNum; - @ApiModelProperty("上架课程数量") - private Integer onSaleNum; - @ApiModelProperty("下架课程数量") - private Integer offShelfNum; - @ApiModelProperty("待上架课程数量") - private Integer noSaleNum; - @ApiModelProperty("完结课程数量") - private Integer finishedNum; - @ApiModelProperty("录播课程数量") - private Integer recordNum; - @ApiModelProperty("直播课程数") - private Integer liveNum; - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseTeacherVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseTeacherVO.java deleted file mode 100644 index 679279c..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/CourseTeacherVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 课程相关老师信息 - * @ClassName CourseTeacherVO - * @Author wusongsong - * @Date 2022/7/11 18:17 - * @Version - **/ -@Data -@ApiModel("老师课程信息") -public class CourseTeacherVO { - @ApiModelProperty("老师课程关系id") - private Long id; - @ApiModelProperty("老师头像") - private String icon; - @ApiModelProperty("形象照") - private String photo; - @ApiModelProperty("老师姓名") - private String name; - @ApiModelProperty("老师介绍") - private String introduce; - @ApiModelProperty("用户端是否显示") - private Boolean isShow; - @ApiModelProperty("职位") - private String job; - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/NameExistVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/NameExistVO.java deleted file mode 100644 index f343ddb..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/NameExistVO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.course.domain.vo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotNull; - -/** - * @ClassName NameExistVO - * @Author wusongsong - * @Date 2022/9/19 16:20 - * @Version - **/ -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class NameExistVO { - public static final NameExistVO EXISTED = new NameExistVO(true); - public static final NameExistVO NOT_EXIST = new NameExistVO(false); - - private Boolean existed; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SectionVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SectionVO.java deleted file mode 100644 index 1ed8105..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SectionVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "小节信息及学习进度") -public class SectionVO { - @ApiModelProperty("对应章节的id") - private Long id; - @ApiModelProperty("对应章节的名称") - private String name; - @ApiModelProperty("小节序号") - private Integer index; - @ApiModelProperty("对应章节的类型,2-视频(小节),3-考试") - private Integer type; - @ApiModelProperty("视频总时长,单位秒") - private Integer mediaDuration; - @ApiModelProperty("媒资id") - private Long mediaId; - @ApiModelProperty("是否支持免费试看") - private Boolean trailer; - @ApiModelProperty("题目数量") - private Integer subjectNum; - @ApiModelProperty("是否包含小节测试") - private Boolean hasTest; - @ApiModelProperty("视频的当前观看时长,单位秒") - private Integer moment = 0; - @ApiModelProperty("是否完成学习,默认false") - private Boolean finished; - - public Boolean getHasTest() { - return subjectNum != null && subjectNum > 0; - } -} \ No newline at end of file diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SimpleCategoryVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SimpleCategoryVO.java deleted file mode 100644 index c01eea1..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SimpleCategoryVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * 所有课程分类数据 - * @author wusongsong - * @since 2022/7/14 18:15 - * @version 1.0.0 - **/ -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -@ApiModel(description = "所有课程分类数据") -public class SimpleCategoryVO { - private Long id; - private String name; - private List children; - private Integer level; - private Long parentId; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectInfoVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectInfoVO.java deleted file mode 100644 index 4dda4ba..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectInfoVO.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 题目详情 - * - * @author wusongsong - * @since 2022/7/11 20:54 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "题目详情") -public class SubjectInfoVO { - @ApiModelProperty("题目id") - private Long id; - @ApiModelProperty("名称") - private String name; - @ApiModelProperty("所属题目分类") - private List cates; - @ApiModelProperty("题目类型") - private Integer subjectType; - @ApiModelProperty("题目难易度") - private Integer difficulty; - @ApiModelProperty("分值") - private Integer score; - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - @ApiModelProperty("更新人") - private String updaterName; - @ApiModelProperty("课程名称信息") - private List courses; - - @ApiModelProperty("选项") - private List options; - @ApiModelProperty("答案,判断题,数组第一个如果是1,代表正确,其他代表错误") - private List answers; - @ApiModelProperty("解析") - private String analysis; - @ApiModelProperty("课程id列表") - private List courseIds; - @ApiModelProperty(value = "被引用次数", example = "10") - private Integer useTimes; - @ApiModelProperty("作答次数") - private Integer answerTimes; - @ApiModelProperty("正确率") - private Double correctRate; - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectSimpleVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectSimpleVO.java deleted file mode 100644 index f096236..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectSimpleVO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -/** - * @author wusongsong - * @since 2022/8/18 11:40 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "题目简要信息") -public class SubjectSimpleVO { - @ApiModelProperty("题目id") - private Long id; - - @ApiModelProperty("题干") - private String name; - - @ApiModelProperty("选择题的选项") - private List options; - - @ApiModelProperty("分值") - private Integer score; - - @ApiModelProperty("问题类型,1:单选题,2:多选题,3:不定向选择题,4:判断题,5:主观题") - private Integer subjectType; - - @ApiModelProperty("难易度,1:简单,2:中等,3:困难") - private Integer difficulty; - - @ApiModelProperty("解析") - private String analysis; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectVO.java b/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectVO.java deleted file mode 100644 index 4fd58dc..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/domain/vo/SubjectVO.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.tianji.course.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -/** - * 题目数据 - * @author wusongsong - * @since 2022/7/11 20:24 - * @version 1.0.0 - **/ -@Data -@ApiModel(description = "题目分页数据") -public class SubjectVO { - @ApiModelProperty("题目id") - private Long id; - @ApiModelProperty("名称") - private String name; - @ApiModelProperty("所属分类,每一个分类三级分类中间使用/分开") - private List cates; - @ApiModelProperty("题目类型") - private Integer subjectType; - @ApiModelProperty("题目类型描述") - private String subjectTypeDesc; - @ApiModelProperty("题目难易度描述") - private String difficultDesc; - @ApiModelProperty("难易度,1:简单,2:中等,3:困难") - private String difficulty; - @ApiModelProperty("分值") - private Integer score; - @ApiModelProperty("使用次数") - private Integer useTimes; - @ApiModelProperty("作答次数") - private Integer answerTimes; - @ApiModelProperty("更新人") - private String updaterName; - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - @ApiModelProperty("选项") - private List options; - @ApiModelProperty("答案,判断题,数组第一个如果是1,代表正确,其他代表错误") - private List answers; - @ApiModelProperty("解析") - private String analysis; - @ApiModelProperty("正确率,百分号精确到小数点后一位") - private String accuRate; -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/handler/CourseJobHandler.java b/tianji-master/tj-course/src/main/java/com/tianji/course/handler/CourseJobHandler.java deleted file mode 100644 index 54dcc3b..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/handler/CourseJobHandler.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.course.handler; - -import com.tianji.course.service.ICourseService; -import com.xxl.job.core.handler.annotation.XxlJob; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -/** - * @ClassName CourseJobHandler - * @Author wusongsong - * @Date 2022/9/16 15:04 - * @Version - **/ -@Component -@Slf4j -public class CourseJobHandler { - - @Autowired - private ICourseService courseService; - - @XxlJob("courseFinished") - public void courseFinished(){ - courseService.courseFinished(); - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CategoryMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CategoryMapper.java deleted file mode 100644 index 53c8e6a..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CategoryMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.course.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.course.domain.po.Category; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.ResultMap; -import org.apache.ibatis.annotations.Select; - -/** - *

- * 课程分类 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-14 - */ -public interface CategoryMapper extends BaseMapper { - - String COLUMNS = "c.id,c.name,c.parent_id,c.level,c.priority,c.status,c.create_time,c.update_time,c.creater,c.updater,c.deleted"; - @Select("select " + COLUMNS + " from category c LEFT JOIN category c2 on c.id=c2.parent_id where c2.id=#{childId} limit 1") - @ResultMap("BaseResultMap") - Category getByChildId(@Param("childId") Long childId); -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCataSubjectDraftMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCataSubjectDraftMapper.java deleted file mode 100644 index ca4e2e4..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCataSubjectDraftMapper.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.tianji.course.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.course.domain.po.CataIdAndSubScore; -import com.tianji.course.domain.po.CourseCataSubjectDraft; -import org.apache.ibatis.annotations.*; - -import java.util.List; - -/** - *

- * 课程-题目关系表草稿 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -public interface CourseCataSubjectDraftMapper extends BaseMapper { - - @Insert("") - int batchInsert(@Param("pos")List courseCataSubjectDrafts); - - /** - * 根据id删除课程对应的题目 - * @param courseId - * @return - */ - @Delete("delete from course_cata_subject_draft where course_id=#{courseId}") - int deleteByCourseId(@Param("courseId") Long courseId); - - @Select("select course_id,cata_id,subject_id from course_cata_subject_draft where course_id=#{courseId}") - @ResultMap("BaseResultMap") - List getByCourseId(@Param("courseId") Long courseId); - - @Insert("insert into course_cata_subject_draft (course_id,cata_id,subject_id) " + - "(select course_id,cata_id,subject_id from course_cata_subject where course_id=#{courseId})") - int insertFromCourseCataSubject(@Param("courseId") Long courseId); - - @Select("select ccs.cata_id as cataId,ccs.subject_id as subjectId, s.score from course_cata_subject_draft ccs " + - "left join subject s on ccs.subject_id=s.id where ccs.course_id=#{courseId}") - List queryCataIdAndScoreByCorseId(@Param("courseId") Long courseId); - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCataSubjectMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCataSubjectMapper.java deleted file mode 100644 index 7a9df80..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCataSubjectMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.course.mapper; - -import com.tianji.course.domain.po.CataIdAndSubScore; -import com.tianji.course.domain.po.CourseCataSubject; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Delete; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - *

- * 课程-题目关系表草稿 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -public interface CourseCataSubjectMapper extends BaseMapper { - - @Insert("") - int batchInsert(@Param("courseCataSubjects")List courseCataSubjects); - - @Delete("delete from course_cata_subject where course_id=#{courseId}") - int deleteByCourseId(@Param("courseId") Long courseId); - - @Select("select ccs.cata_id as cataId,ccs.subject_id as subjectId, s.score from course_cata_subject ccs " + - "left join subject s on ccs.subject_id=s.id where ccs.course_id=#{courseId}") - List queryCataIdAndScoreByCorseId(@Param("courseId") Long courseId); - - @Select("select subject_id from course_cata_subject where cata_id=#{cataId}") - List querySubjectIdByCataId(@Param("cataId") Long cataId); - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCatalogueDraftMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCatalogueDraftMapper.java deleted file mode 100644 index 847fd57..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCatalogueDraftMapper.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.course.mapper; - -import com.tianji.course.domain.po.CourseCatalogueDraft; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.*; - -import java.util.List; - -/** - *

- * 目录草稿 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-19 - */ -public interface CourseCatalogueDraftMapper extends BaseMapper { - - String COLUMNS = "id, name, trailer, course_id, type, parent_catalogue_id, media_id, video_id, video_name, living_start_time, living_end_time, play_back, c_index, media_duration, dep_id, create_time, update_time, creater, updater"; - /** - * 查询出需要更新到架上的目录数据 - */ - @Select("select id, name, trailer, course_id, type, parent_catalogue_id, media_id, video_name, c_index, " + - "media_duration, dep_id from course_catalogue_draft where course_id=#{courseId}") - @ResultMap("BaseResultMap") - List getByCourseId(@Param("courseId") Long courseId); - - @Delete("") - int deleteByCourseId(@Param("courseId") Long couseId, @Param("types")List types); - - - @Insert("insert into course_catalogue_draft(" + COLUMNS + ",can_update) " + - "(select " + COLUMNS + ",0 from course_catalogue where course_id=#{courseId})" ) - int insertFromCourseCatalogue(@Param("courseId") Long courseId); - - @Select("SELECT id FROM course_catalogue_draft WHERE course_id=#{courseId} AND type IN (2, 3)") - List getSectionIdByCourseId(Long courseId); -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCatalogueMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCatalogueMapper.java deleted file mode 100644 index 0525929..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseCatalogueMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.course.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.course.domain.po.CourseCatalogue; - -/** - *

- * 目录草稿 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-19 - */ -public interface CourseCatalogueMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseContentDraftMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseContentDraftMapper.java deleted file mode 100644 index f39f3f4..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseContentDraftMapper.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.course.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.course.domain.po.CourseContentDraft; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Param; - -/** - *

- * 课程内容,主要是一些大文本 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-18 - */ -public interface CourseContentDraftMapper extends BaseMapper { - - String COLUMNS ="id,course_introduce,use_people,course_detail,dep_id,create_time,update_time,creater,updater,deleted"; - - @Insert("insert into course_content_draft (" + COLUMNS + - ") (select " + COLUMNS + " from course_content where id=#{id})") - int insertFromCourseContent(@Param("id") Long id); - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseContentMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseContentMapper.java deleted file mode 100644 index 552f93e..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseContentMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.course.mapper; - -import com.tianji.course.domain.po.CourseContent; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 课程内容,主要是一些大文本 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-21 - */ -public interface CourseContentMapper extends BaseMapper { - - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseDraftMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseDraftMapper.java deleted file mode 100644 index 9058996..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseDraftMapper.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.tianji.course.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.course.domain.po.CourseDraft; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - *

- * 草稿课程 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-21 - */ -public interface CourseDraftMapper extends BaseMapper { - String COLUMNS = "id, name, course_type, cover_url, first_cate_id, second_cate_id, third_cate_id, free, price, template_type, template_url, status, purchase_start_time, purchase_end_time, step, media_duration,valid_duration, section_num, dep_id, create_time, update_time, creater, updater,score,publish_time"; - - @Insert("insert into course_draft(" + COLUMNS + ",can_update) (select " + COLUMNS + ",0 from course where id=#{id} )") - int insertFromCourse(@Param("id") Long id); - - /** - * 批量查询老师所负责的课程数量 - * @param teacherIds - * @return - */ - @Select("") - List countCourseNumOfTeacher(@Param("teacherIds")List teacherIds); - - /** - * 统计草稿中其他课程 - * @param name - * @return - */ - @Select("") - int countByNameAndId(@Param("name") String name, @Param("id") Long id); -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseMapper.java deleted file mode 100644 index b3ad5f4..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseMapper.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.course.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.course.domain.po.Category3PO; -import com.tianji.course.domain.po.Course; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - *

- * 草稿课程 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-22 - */ -public interface CourseMapper extends BaseMapper { - @Select("select count(1) from course where name = #{name}") - int countSameName(@Param("name") String name); - - int updateVariableById(@Param("po") Course course); - - /** - * 批量查询老师所负责的课程数量 - * @param teacherIds - * @return - */ - @Select("") - List countCourseNumOfTeacher(@Param("teacherIds")List teacherIds); - - @Select("select distinct first_cate_id as 'firstCateId',second_cate_id as 'secondCateId'," + - "third_cate_id as 'thirdCateId' from course where status=2") - List queryCategoryIdWithCourse(); -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseSubjectMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseSubjectMapper.java deleted file mode 100644 index 0bb5800..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseSubjectMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.course.mapper; - -import com.tianji.course.domain.po.CourseSubject; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - *

- * 课程题目关系列表 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-17 - */ -public interface CourseSubjectMapper extends BaseMapper { - - @Insert("") - int batchInsert(@Param("courseSubjects")List courseSubjects); -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseTeacherDraftMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseTeacherDraftMapper.java deleted file mode 100644 index bed7f11..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseTeacherDraftMapper.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.tianji.course.mapper; - -import com.tianji.course.domain.po.CourseTeacherDraft; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Delete; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Param; - -/** - *

- * 课程老师关系表草稿 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -public interface CourseTeacherDraftMapper extends BaseMapper { - - String COLUMNS = "id, course_id, teacher_id, is_show, c_index, dep_id, create_time, update_time, creater, updater, deleted"; - /** - * 根据课程id删除课程中的老师 - * @param courseId - * @return - */ - @Delete("delete from course_teacher_draft where course_id=#{courseId}") - int deleteByCourseId(@Param("courseId") Long courseId); - - @Insert("insert into course_teacher_draft (" + COLUMNS + ") (select " + COLUMNS + " from course_teacher " + - "where course_id= #{courseId} and deleted = 0)") - int insertFromCourseTeacher(@Param("courseId") Long courseId); - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseTeacherMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseTeacherMapper.java deleted file mode 100644 index fd21082..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/CourseTeacherMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.course.mapper; - -import com.tianji.course.domain.po.CourseTeacher; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Delete; -import org.apache.ibatis.annotations.Param; - -/** - *

- * 课程老师关系表草稿 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -public interface CourseTeacherMapper extends BaseMapper { - - @Delete("delete from course_teacher where course_id=#{courseId}") - int deleteByCourseId(@Param("courseId") Long courseId); - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/SubjectCategoryMapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/SubjectCategoryMapper.java deleted file mode 100644 index e3f7588..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/mapper/SubjectCategoryMapper.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.course.mapper; - -import com.tianji.course.domain.po.SubjectCategory; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - *

- * 课程分类关系表 Mapper 接口 - *

- * - * @author wusongsong - * @since 2022-07-15 - */ -public interface SubjectCategoryMapper extends BaseMapper { - - @Insert("") - int batchInsert(@Param("scs") List subjectCategoryList); - - /** - * 获取指定课程分类下所有课程的数量 - * - * @param categoryId - * @param level - * @return - */ - @Select("") - int countSubjectNum(@Param("categoryId") Long categoryId, @Param("level") Integer level); - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/properties/CourseProperties.java b/tianji-master/tj-course/src/main/java/com/tianji/course/properties/CourseProperties.java deleted file mode 100644 index f03be82..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/properties/CourseProperties.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tianji.course.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.NestedConfigurationProperty; -import org.springframework.context.annotation.Configuration; - -/** - * @ClassName CourseProperties - * @Author wusongsong - * @Date 2022/7/20 9:13 - * @Version - **/ -@Data -@Configuration -@ConfigurationProperties(prefix = "course") -public class CourseProperties { - - @NestedConfigurationProperty - private Media media; - - @Data - public static class Media { - //免费试看时间 - private Integer trailerDuration; - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICategoryService.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICategoryService.java deleted file mode 100644 index 2f73aa4..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICategoryService.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.tianji.course.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.course.domain.dto.CategoryAddDTO; -import com.tianji.course.domain.dto.CategoryDisableOrEnableDTO; -import com.tianji.course.domain.dto.CategoryListDTO; -import com.tianji.course.domain.dto.CategoryUpdateDTO; -import com.tianji.course.domain.po.Category; -import com.tianji.course.domain.po.Course; -import com.tianji.course.domain.vo.CategoryInfoVO; -import com.tianji.course.domain.vo.CategoryVO; -import com.tianji.course.domain.vo.SimpleCategoryVO; -import org.springframework.web.bind.annotation.RequestParam; - -import java.util.List; -import java.util.Map; - -/** - *

- * 课程分类 服务类 - *

- * - * @author wusongsong - * @since 2022-07-14 - */ -public interface ICategoryService extends IService { - - /** - * 分页查询课程信息 - * - * @param categoryPageDTO 分页参数 - * @return 课程分页信息 - */ - List list(CategoryListDTO categoryPageDTO); - - /** - * 新增课程分页 - * - * @param categoryAddDTO 分类信息 - */ - void add(CategoryAddDTO categoryAddDTO); - - /** - * 获取课程分类信息 - * @param id 课程id - * @return 课程分类信息 - */ - CategoryInfoVO get(Long id); - - /** - * 删除课程分类 - * @param id 分类id - */ - void delete(Long id); - - /** - * 课程分类启用或禁用 - */ - void disableOrEnable(CategoryDisableOrEnableDTO categoryDisableOrEnableDTO); - - /** - * 更新课程分类信息 - */ - void update(CategoryUpdateDTO categoryUpdateDTO); - - /** - * 获取所有分类的数据及结构 - */ - List all(Boolean admin); - - /** - * 获取课程分类id和名称 - * @return 课程分类id和名称 - */ - Map getCateIdAndName(); - - List allOfOneLevel(); - - /** - * 根据课程分类id查询分类列表 - * @param ids 课程分类id - * @return 分类列表 - */ - List queryByIds(List ids); - - /** - * 根据三级课程分类查询课程分类信息 - * @param thirdCateIdList 三级课程分类 - * @return 课程分类信息 - */ - Map queryByThirdCateIds(@RequestParam("thirdCateIdList") List thirdCateIdList); - - /** - * 获取课程分类信息 - * - * @param course - * @return - */ - List queryCourseCategorys(Course course); - - /** - * 校验课程分类是否符合要求,并按顺序返回一二三级课程分类id列表 - * - * @param thirdCateId 三级课程分类 - * @return 一二三级课程分类id列表 - */ - List checkCategory(Long thirdCateId); -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCataSubjectDraftService.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCataSubjectDraftService.java deleted file mode 100644 index c62813f..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCataSubjectDraftService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.course.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.course.domain.po.CourseCataSubjectDraft; - -/** - *

- * 课程-题目关系表草稿 服务类 - *

- * - * @author wusongsong - * @since 2022-09-21 - */ -public interface ICourseCataSubjectDraftService extends IService { - /** - * 删除不在的课程小节目录 - * @param courseId - */ - void deleteNotInCataIdList(Long courseId); -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCatalogueDraftService.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCatalogueDraftService.java deleted file mode 100644 index 13b1681..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCatalogueDraftService.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.tianji.course.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.course.domain.dto.CataSaveDTO; -import com.tianji.course.domain.dto.CataSubjectDTO; -import com.tianji.course.domain.dto.CourseMediaDTO; -import com.tianji.course.domain.po.CourseCatalogueDraft; -import com.tianji.course.domain.vo.CataSimpleSubjectVO; -import com.tianji.course.domain.vo.CataVO; - -import java.util.List; -import java.util.Map; - -/** - *

- * 目录草稿 服务类 - *

- * - * @author wusongsong - * @since 2022-07-19 - */ -public interface ICourseCatalogueDraftService extends IService { - - /** - * 保存课程对应的目录结构 - * - * @param courseId 课程id - * @param cataSaveDTOS 课程目录信息 - */ - void save(Long courseId, List cataSaveDTOS, Integer step); - - /** - * 查询课程的目录 - * - * @param courseId 课程id必填 - * @param see 是否用于查看数据 - * @return - */ - List queryCourseCatalogues(Long courseId, Boolean see, Boolean withPractice); - - /** - * 保存媒资信息 - */ - void saveMediaInfo(Long courseId, List courseMediaDTOS); - - void saveSuject(Long courseId, List cataSubjectDTOS); - - /** - * 根据课程id,获取题目,用于草稿编辑 - * - * @param courseId - * @return - */ - List getSuject(Long courseId); - - /** - * 校验课程对应的目录数据完整,包含 视频,题目, - * - * @param courseId - */ - void checkCataInfoImplated(Long courseId); - - /** - * 复制试题到架上 - * - * @param courseId - * @param isFirstShelf - */ - void copySubjectToShelf(Long courseId, Boolean isFirstShelf); - - /** - * copy目录到架上 - * - * @param courseId - * @param isFirstShelf - */ - void copyToShelf(Long courseId, Boolean isFirstShelf); - - /** - * 计算当前课程中每个章媒资时长 - * - * @param courseId - * @return - */ - Map calculateMediaDuration(Long courseId); - - /** - * 课程总节和练习数,不包含章 - * - * @param courseId - * @return - */ - Integer totalSectionNums(Long courseId); - - /** - * 根据类型查询课程小节/章/测试id列表 - * - * @param courseId - * @param types - * @return - */ - List queryCataIdsOfCourse(Long courseId, List types); - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCatalogueService.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCatalogueService.java deleted file mode 100644 index a20feae..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseCatalogueService.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.tianji.course.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.api.dto.course.CatalogueDTO; -import com.tianji.api.dto.course.MediaQuoteDTO; -import com.tianji.api.dto.course.SectionInfoDTO; -import com.tianji.course.domain.po.CourseCatalogue; -import com.tianji.course.domain.vo.CataSimpleInfoVO; -import com.tianji.course.domain.vo.CataVO; - -import java.util.List; - -/** - *

- * 目录草稿 服务类 - *

- * - * @author wusongsong - * @since 2022-07-19 - */ -public interface ICourseCatalogueService extends IService { - - /** - * 查询线上课程目录 - * - * @param courseId 课程id - * @return 课程目录 - */ - List queryCourseCatalogues(Long courseId, Boolean withPractice); - - /** - * 批量统计媒资id引用次数 - * - * @param mediaIds 媒资id - * @return 媒资引用次数 - */ - List countMediaUserInfo(List mediaIds); - - /** - * 获取简单的小节信息, - * - * @param sectionId 小节id - * @return 课程id,媒资id,是否支持免费试看,免费试看时长 - */ - SectionInfoDTO getSimpleSectionInfo(Long sectionId); - - /** - * 根据课程id获取课程的目录列表 - * - * @param courseId 课程id - * @return 课程的目录列表 - */ - List getCatasIndexList(Long courseId); - - List getManyCataSimpleInfo(List ids); - - CataSimpleInfoVO querySectionInfoById(Long id); - - List queryCourseCataloguesVO(Long courseId, Boolean withPractice); -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseDraftService.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseDraftService.java deleted file mode 100644 index 396be0c..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseDraftService.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.tianji.course.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.api.dto.course.CourseDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.course.domain.dto.CourseBaseInfoSaveDTO; -import com.tianji.course.domain.dto.CoursePageQuery; -import com.tianji.course.domain.po.CourseDraft; -import com.tianji.course.domain.vo.CourseBaseInfoVO; -import com.tianji.course.domain.vo.CoursePageVO; -import com.tianji.course.domain.vo.CourseSaveVO; -import com.tianji.course.domain.vo.NameExistVO; - -import java.util.List; -import java.util.Map; - -/** - *

- * 草稿课程 服务类 - *

- * - * @author wusongsong - * @since 2022-07-18 - */ -public interface ICourseDraftService extends IService { - - /** - * 保存草稿 - * - * @param courseBaseInfoSaveDTO 课程基础信息 - */ - CourseSaveVO save(CourseBaseInfoSaveDTO courseBaseInfoSaveDTO); - - /** - * 如果用于编辑,需要先去草稿中拿出已经编辑的内容,如果不是用于编辑直接获取正式数据 - * - * @param id 课程id - * @param see 是否用于查看页面查看数据使用,不是的话就是编辑页面使用 - * @return 课程基本信息 - */ - CourseBaseInfoVO getCourseBaseInfo(Long id, Boolean see); - - /** - * 修改课程草稿进行到哪一步了,步骤只能一步步升,不能跳填,不能往回填 - * @param id 课程id - * @param step 完成的步数 - */ - void updateStep(Long id, Integer step); - - /** - * 课程上架 - * - * @param id 课程上架 - */ - void upShelf(Long id); - - void checkBeforeUpShelf(Long id); - - /** - * 课程下架 - * - * @param id 课程id - */ - void downShelf(Long id); - - /** - * 获取课程的搜索信息 - * @param id 课程id - * @return 课程数据 - */ - CourseDTO getCourseDTOById(Long id); - - /** - * 删除课程的草稿 - * - * @param id 课程id - */ - void delete(Long id); - - /** - * 分页查询更新时间 - * @param coursePageQuery 课程分页参数 - * @return 课程分页数据 - */ - PageDTO queryForPage(CoursePageQuery coursePageQuery); - - /** - * 校验名称是否存在,或者被其他课程占用 - * @param name 课程名称 - * @param id 当前课程名称 - */ - NameExistVO checkName(String name, Long id); - - /** - * 查询课程id列表中存在的id - * @param idList - * @return - */ - List queryExists(List idList); - - /** - * 统计草稿中的课程分类拥有的课程数量 - * @return - */ - Map countCourseNumOfCategory(); -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseService.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseService.java deleted file mode 100644 index 79ebc2b..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseService.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.tianji.course.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.api.dto.course.*; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.course.domain.dto.CoursePageQuery; -import com.tianji.course.domain.dto.CourseSimpleInfoListDTO; -import com.tianji.course.domain.po.Course; -import com.tianji.course.domain.vo.CourseAndSectionVO; -import com.tianji.course.domain.vo.CoursePageVO; -import com.tianji.course.domain.vo.NameExistVO; - -import java.util.List; -import java.util.Map; - -/** - *

- * 草稿课程 服务类 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -public interface ICourseService extends IService { - - /** - * 修改课程状态 - * - * @param id 课程id - * @param status 课程状态 - */ - void updateStatus(Long id, Integer status); - - CourseDTO getCourseDTOById(Long id); - - - void delete(Long id); - - /** - * 根据条件查询课程简单信息 - * - * @param courseSimpleInfoListDTO 课程三级分类列表 - * @return 课程信息列表 - */ - List getSimpleInfoList(CourseSimpleInfoListDTO courseSimpleInfoListDTO); - - /** - * 查询老师出题数目和课程数目 - * @param teacherIds 老师id - * @return 老师的出题数量 - */ - List countSubjectNumAndCourseNumOfTeacher(List teacherIds); - - /** - * 课程完结 - */ - int courseFinished(); - - /** - * 统计每个分类id所拥有的课程数量 - * @return 分类对应的课程数量 - */ - Map countCourseNumOfCategory(); - - /** - * 查询有已上架课程分类的分类id - * @return - */ - List getCategoryIdListWithCourse(); - - /** - * 统计某个课程分类的课程数量 - * - * @param categoryId 课程分类id - * @return 课程数量 - */ - Integer countCourseNumOfCategory(Long categoryId); - - /** - * 查询课程的详细信息 - * @param id 课程id - * @param withCatalogue 是否查询目录数据 - * @param withTeachers 是否查询教师数据 - * @return 课程详细信息 - */ - CourseFullInfoDTO getInfoById(Long id, boolean withCatalogue, boolean withTeachers); - - /** - * 分页查询课程信息 - * @param coursePageQuery 分页参数 - * @return 课程分页数据 - */ - PageDTO queryForPage(CoursePageQuery coursePageQuery); - /** - * 根据课程分类id查询课程列表 - * @param categoryId 课程分类id - * @param level 课程分类级别 - * @return - */ - List queryByCategoryIdAndLevel(Long categoryId, Integer level); - - /** - * 校验名称是否存在,或者被其他课程占用 - * @param name 课程名称 - * @param id 当前课程名称 - */ - NameExistVO checkName(String name, Long id); - - /** - * 查询课程id列表中 - * @param idList - * @return - */ - List queryExists(List idList,List statusList); - - /** - * 根据课程name模糊查询课程id列表 - * @param name - * @return - */ - List queryCourseIdByName(String name); - - CourseAndSectionVO queryCourseAndCatalogById(Long courseId); -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseTeacherDraftService.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseTeacherDraftService.java deleted file mode 100644 index bdf4b1b..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseTeacherDraftService.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.course.service; - -import com.tianji.course.domain.dto.CourseTeacherSaveDTO; -import com.tianji.course.domain.po.CourseTeacherDraft; -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.course.domain.vo.CourseTeacherVO; - -import java.util.List; - -/** - *

- * 课程老师关系表草稿 服务类 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -public interface ICourseTeacherDraftService extends IService { - - /** - * 保存课程指定的老师 - * @param courseTeacherSaveDTO 教师数据 - */ - void save(CourseTeacherSaveDTO courseTeacherSaveDTO); - - /** - * 查询指定课程对应的老师 - * - * @param courseId 课程id - * @param see 是否用于查看 - * @return 老师数据 - */ - List queryTeacherOfCourse(Long courseId,Boolean see); - - /** - * 课程老师上架 - * @param courseId 课程id - */ - void copyToShelf(Long courseId, Boolean isFirstShelf); - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseTeacherService.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseTeacherService.java deleted file mode 100644 index aa47b6f..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/ICourseTeacherService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.course.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.course.domain.po.CourseTeacher; -import com.tianji.course.domain.vo.CourseTeacherVO; - -import java.util.List; - -/** - *

- * 课程老师关系表草稿 服务类 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -public interface ICourseTeacherService extends IService { - - /** - * 查询老师课程信息 - * @param couserId 课程id - * @return 教师信息 - */ - List queryTeachers(Long couserId); - - void deleteByCourseId(Long courserId); - - /** - * 根据课程id获取老师id列表,并且排序 - * @param courseId 课程id - * @return 教师信息 - */ - List getTeacherIdOfCourse(Long courseId); - - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CategoryServiceImpl.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CategoryServiceImpl.java deleted file mode 100644 index 897ecc8..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CategoryServiceImpl.java +++ /dev/null @@ -1,647 +0,0 @@ -package com.tianji.course.service.impl; - -import cn.hutool.core.collection.CollectionUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.constants.Constant; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.enums.CommonStatus; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.*; -import com.tianji.course.constants.CourseConstants; -import com.tianji.course.constants.CourseErrorInfo; -import com.tianji.course.constants.CourseStatus; -import com.tianji.course.domain.dto.CategoryAddDTO; -import com.tianji.course.domain.dto.CategoryDisableOrEnableDTO; -import com.tianji.course.domain.dto.CategoryListDTO; -import com.tianji.course.domain.dto.CategoryUpdateDTO; -import com.tianji.course.domain.po.Category; -import com.tianji.course.domain.po.Course; -import com.tianji.course.domain.vo.CategoryInfoVO; -import com.tianji.course.domain.vo.CategoryVO; -import com.tianji.course.domain.vo.SimpleCategoryVO; -import com.tianji.course.mapper.CategoryMapper; -import com.tianji.course.mapper.SubjectCategoryMapper; -import com.tianji.course.service.ICategoryService; -import com.tianji.course.service.ICourseDraftService; -import com.tianji.course.service.ICourseService; -import com.tianji.course.utils.CategoryDataWrapper; -import com.tianji.course.utils.CategoryDataWrapper2; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.util.*; -import java.util.concurrent.Executor; -import java.util.stream.Collectors; - -/** - *

- * 课程分类 服务实现类 - *

- * - * @author wusongsong - * @since 2022-07-14 - */ -@Service -@Slf4j -public class CategoryServiceImpl extends ServiceImpl implements ICategoryService { - - @Autowired - private RedisTemplate redisTemplate; - - @Autowired - private SubjectCategoryMapper subjectCategoryMapper; - - @Autowired - private ICourseService courseService; - - @Autowired - private ICourseDraftService courseDraftService; - - @Resource(name = "taskExecutor") - private Executor taskExecutor; - - @Override - public List list(CategoryListDTO categoryListDTO) { - - //1.搜索条件根据priority正序排序,id逆序排序 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(Category.class) - .orderByAsc(Category::getPriority) - .orderByDesc(Category::getUpdateTime); - //2.查询数据 - List list = super.list(queryWrapper); - if (CollUtils.isEmpty(list)) { - return new ArrayList<>(); - } - - //3.获取课程分类拥有的课程数量 - Map thirdCategoryNumMap = this.statisticThirdCategory(); - - Map cateIdAndNumMap = courseService - .countCourseNumOfCategory(); - //4.通过TreeDataUtils组装数据 - List categoryVOS = TreeDataUtils.parseToTree(list, CategoryVO.class, - //4.1设置转换 - (category, categoryVO) -> { - //4.2设置三级分类数量、课程数量、状态描述、排序 - categoryVO.setThirdCategoryNum(NumberUtils.null2Zero(thirdCategoryNumMap.get(category.getId())).intValue()); - categoryVO.setCourseNum(NumberUtils.null2Zero(cateIdAndNumMap.get(category.getId()))); - categoryVO.setStatusDesc(CommonStatus.desc(category.getStatus())); - categoryVO.setIndex(category.getPriority()); - }, new CategoryDataWrapper2()); - //5.根据条件过滤 - if (CollUtils.isNotEmpty(categoryVOS)) { - return fiter(categoryVOS, categoryListDTO); - } else { - return new ArrayList<>(); - } - } - - @Override - @Transactional(rollbackFor = {DbException.class, Exception.class}) - public void add(CategoryAddDTO categoryAddDTO) { - - //校验名称是否重复 - checkSameName(categoryAddDTO.getParentId(), categoryAddDTO.getName(), null); - int level = 1; //默认一级分类 - if (CourseConstants.CATEGORY_ROOT != categoryAddDTO.getParentId()) { - //校验父分类是否存在 - Category parentCategory = this.baseMapper.selectById(categoryAddDTO.getParentId()); - if (parentCategory == null) { - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_PARENT_NOT_FOUND); - } - //三级课程分类下不能在创建子分类 - if (parentCategory.getLevel() == 3) { - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_CREATE_ON_THIRD); - } - //分类级别,父分类+1 - level = parentCategory.getLevel() + 1; - } - if (level > 3) { - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_ADD_OVER_THIRD_LEVEL); - } - - //将请求参数转换成PO - Category category = BeanUtils.copyBean(categoryAddDTO, Category.class, (dto, po) -> { - po.setPriority(dto.getIndex()); - po.setStatus(CommonStatus.DISABLE.getValue()); - }); - //设置分类级别 - category.setLevel(level); - if (this.baseMapper.insert(category) <= 0) { - throw new DbException(null); - } - } - - @Override - public CategoryInfoVO get(Long id) { - //1.查询数据 - Category category = this.baseMapper.selectById(id); - //1.1判空 - if (category == null) { - return new CategoryInfoVO(); - } - //2.数据组装 - CategoryInfoVO categoryInfoVO = BeanUtils.toBean(category, CategoryInfoVO.class); - //2.1.课程分类级别 - categoryInfoVO.setCategoryLevel(category.getLevel()); - //2.2.课程分类状态描述 - categoryInfoVO.setStatusDesc(CommonStatus.desc(category.getStatus())); - //2.3课程分类序号 - categoryInfoVO.setIndex(category.getPriority()); - Long firstCategoryId = null; - if (category.getLevel() == 3) { - //2.4.查询二级课程分类 - Category secondCategory = this.baseMapper.selectById(category.getParentId()); //所在二级目录 - //2.5.设置二级课程分类名称 - categoryInfoVO.setSecondCategoryName(secondCategory.getName()); - //2.6.设置一级课程分类id - firstCategoryId = secondCategory.getParentId(); - } else if (category.getLevel() == 2) { - //2.7.设置一级课程分类id - firstCategoryId = category.getParentId(); - } - - if (firstCategoryId != null) { - //2.8.查询一级课程分类信息 - Category firstCategory = this.baseMapper.selectById(firstCategoryId); - //2.9设置一级课程分类名称 - categoryInfoVO.setFirstCategoryName(firstCategory.getName()); - } - return categoryInfoVO; - } - - @Override - public void delete(Long id) { - //1.子分类查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(Category.class) - .eq(Category::getParentId, id); - //1.1查询子分类信息 - List categories = this.baseMapper.selectList(queryWrapper); - //1.2.子分类判空 - if (CollectionUtil.isNotEmpty(categories)) { //分类有子分类 - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_HAVE_CHILD); - } - //2.查询分类信息 - Category category = this.baseMapper.selectById(id); - //2.1.判空 - if (category == null) { - throw new DbException(ErrorInfo.Msg.DB_DELETE_EXCEPTION); - } - //3.统计分类拥有的课程数量 - Integer courseNum = courseService.countCourseNumOfCategory(id); - //3.1.分类拥有课程数据量判空 - if (courseNum > 0) { - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_DELETE_HAVE_COURSE); - } - //4.统计分类拥有的题目数量 - int subjectNum = subjectCategoryMapper.countSubjectNum(category.getId(), category.getLevel()); - //4.1.分类拥有的题目数量判空 - if (subjectNum > 0) { //课程含有题目 - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_DELETE_HAVE_SUBJECT); - } - //5.删除课程 - int result = this.baseMapper.deleteById(id); - if (result <= 0) { - throw new DbException(CourseErrorInfo.Msg.CATEGORY_DELETE_FAILD); - } - } - - /** - * 功能点: - * 1.启用或禁用课程,下一级或下一级的课程同时启用或禁用, - * 联动启用或禁用 - * - * @param categoryDisableOrEnableDTO - */ - @Override - @Transactional(rollbackFor = {DbException.class, Exception.class}) - public void disableOrEnable(CategoryDisableOrEnableDTO categoryDisableOrEnableDTO) { - - //1.获取禁用/启用的课程分类 - Category category = baseMapper.selectById(categoryDisableOrEnableDTO.getId()); - if (category == null) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_CATEGORY_NOT_FOUND); - } - //2.校验 - if (category.getParentId() != 0) { //校验父级分类 - //2.1启用校验 - if (categoryDisableOrEnableDTO.getStatus() == CommonStatus.ENABLE.getValue()) { - //2.2获取父分类 - Category parentCategory = baseMapper.selectById(category.getParentId()); - if (parentCategory == null) { - log.error("操作异常,根据父类id查询课程分类未查询到,parentId : {}", category.getParentId()); - throw new BizIllegalException(ErrorInfo.Msg.OPERATE_FAILED); - } - //2.3父分类禁用下不能启用当前分类 - if (CommonStatus.DISABLE.getValue() == parentCategory.getStatus()) { - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_ENABLE_CANNOT); - } - } - } - - //3.获取启用/禁用时联动启用的分类 - List childCategoryIds = new ArrayList<>(); - LambdaQueryWrapper directQueryWrapper = new LambdaQueryWrapper<>(); - directQueryWrapper.eq(Category::getParentId, categoryDisableOrEnableDTO.getId()); - //3.1获取启用分类的子分类列表 - List categories = baseMapper.selectList(directQueryWrapper); - if (CollUtils.isNotEmpty(categories)) { //直接子分类 - //3.2将子类id写入到childCategoryIds中 - childCategoryIds.addAll(categories.stream().map(Category::getId).collect(Collectors.toList())); - } - //3.3获取启用分类子分类的子分类列表 - if (CollUtils.isNotEmpty(childCategoryIds)) { - LambdaQueryWrapper inDirectQueryWrapper = new LambdaQueryWrapper<>(); - inDirectQueryWrapper.in(Category::getParentId, childCategoryIds); - List inDirectCategorys = baseMapper.selectList(inDirectQueryWrapper); - if (CollUtils.isNotEmpty(inDirectCategorys)) { - //3.4将子分类的子分类id列表写入childCategoryIds中 - childCategoryIds.addAll(inDirectCategorys.stream() - .map(Category::getId).collect(Collectors.toList())); - } - } - - //4.更新当前分类,启用/禁用 - int result = this.baseMapper.updateById(BeanUtils.toBean(categoryDisableOrEnableDTO, Category.class)); - if (result <= 0) { - throw new BizIllegalException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - //5.启用或禁用关联课程分类 - if (CollUtils.isNotEmpty(childCategoryIds)) { - //5.1更新条件 - LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper(); - updateWrapper.in(Category::getId, childCategoryIds); - Category updateCategory = new Category(); - updateCategory.setStatus(categoryDisableOrEnableDTO.getStatus()); - //5.2更新关联分类状态 - baseMapper.update(updateCategory, updateWrapper); - } - //6.课程分类禁用触发课程批量下架 - if (categoryDisableOrEnableDTO.getStatus() == CommonStatus.DISABLE.getValue()) { - Long userId = UserContext.getUser(); - taskExecutor.execute(() -> { - batchDownShelfCourse(category.getId(), category.getLevel(), userId); - }); - - } - } - - @Override - @Transactional(rollbackFor = {DbException.class, Exception.class}) - public void update(CategoryUpdateDTO categoryUpdateDTO) { - //1.查询更新数据 - Category category = this.baseMapper.selectById(categoryUpdateDTO.getId()); - if (category == null) { - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_NOT_FOUND); - } - //2.校验名称是否可以更新 - checkSameName(category.getParentId(), categoryUpdateDTO.getName(), categoryUpdateDTO.getId()); - //3.设置更新字段 - Category updateCategory = new Category(); - updateCategory.setId(categoryUpdateDTO.getId()); //修改课程分类id - updateCategory.setPriority(categoryUpdateDTO.getIndex()); - updateCategory.setName(categoryUpdateDTO.getName()); - //4.更新 - int result = this.baseMapper.updateById(updateCategory); - if (result <= 0) { - throw new BizIllegalException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - } - - @Override - public List all(Boolean admin) { - // 1.查询有课程的课程分类id列表 - List categoryIdList = admin ? - null :courseService.getCategoryIdListWithCourse(); - // 1.1.判空 - if(!admin && CollUtils.isEmpty(categoryIdList)){ - return new ArrayList<>(); - } - - // 2.升序查询所有未禁用的课程分类 - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(Category.class) - .eq(!admin, Category::getStatus, CommonStatus.ENABLE.getValue()) - .in(CollectionUtil.isNotEmpty(categoryIdList), Category::getId, categoryIdList) - .orderByAsc(Category::getPriority) - .orderByDesc(Category::getId); - List categories = this.baseMapper.selectList(queryWrapper); - - // 3.将课程分类转换成树状结构 - List simpleCategoryVOS = TreeDataUtils.parseToTree(categories, - SimpleCategoryVO.class, new CategoryDataWrapper()); - // 4.过滤掉没有三级子课程分类的课程分类 - filter(simpleCategoryVOS); - return simpleCategoryVOS; - - } - - @Override - public Map getCateIdAndName() { - List categories = this.baseMapper.selectList(null); - return categories.stream() - .collect(Collectors.toMap(Category::getId, Category::getName)); - } - - @Override - public List allOfOneLevel() { - //1.查询数据 - List list = super.list(); - if (CollUtils.isEmpty(list)) { - return new ArrayList<>(); - } - - //2.统计一级二级目录对应的三级目录的数量,做一个三分钟的redis缓存 - Map thirdCategoryNumMap = this.statisticThirdCategory(); - return BeanUtils.copyList(list, CategoryVO.class, (category, categoryVO) -> { - categoryVO.setThirdCategoryNum(thirdCategoryNumMap.getOrDefault(category.getId(), 0L).intValue()); - }); - } - - @Override - public List queryByIds(List ids) { - if (CollUtils.isEmpty(ids)) { - return new ArrayList<>(); - } - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(Category.class) - .in(Category::getId, ids); - return baseMapper.selectList(queryWrapper); - } - - @Override - public Map queryByThirdCateIds(List thirdCateIdList) { - Map resultMap = new HashMap<>(); - //1.校验 - // 1.1判断参数是否为空 - if (CollUtils.isEmpty(thirdCateIdList)) { - return resultMap; - } - // 1.2校验分类id都是三级分类id - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(Category::getLevel, 3) - .in(Category::getId, thirdCateIdList); - int thirdCateNum = baseMapper.selectCount(queryWrapper); - if (!NumberUtils.equals(thirdCateNum, thirdCateIdList.size())) { - throw new BizIllegalException(ErrorInfo.Msg.REQUEST_PARAM_ILLEGAL); - } - //2.查询所有分类,并将分类转化成map - List categories = baseMapper.selectList(null); - Map categoryMap = categories.stream() - .collect(Collectors.toMap(Category::getId, p -> p)); - //3.遍历三级分类id - for (Long thirdCateId : thirdCateIdList) { - //3.1三级分类 - Category thirdCategory = categoryMap.get(thirdCateId); - - //3.2二级分类 - Category secondCategory = categoryMap.get(thirdCategory.getParentId()); - //3.3一级分类 - Category firstCategory = categoryMap.get(thirdCateId); - resultMap.put(thirdCateId, StringUtils.format("{}/{}/{}", - firstCategory.getName(), secondCategory.getName(), thirdCategory.getName())); - } - return resultMap; - } - - @Override - public List queryCourseCategorys(Course course) { - //1.查询课程分类 - List categories = baseMapper.selectBatchIds( - Arrays.asList(course.getFirstCateId(), - course.getSecondCateId(), - course.getThirdCateId())); - if (CollUtils.isNotEmpty(categories)) { - return new ArrayList<>(); - } - Map categoryIdAndNameMap = categories.stream() - .collect(Collectors.toMap(Category::getId, Category::getName)); - //2.按照分类层级关系组装成列表 - return Arrays.asList(categoryIdAndNameMap.get(course.getFirstCateId()), - categoryIdAndNameMap.get(course.getSecondCateId()), - categoryIdAndNameMap.get(course.getThirdCateId())); - } - - @Override - public List checkCategory(Long thirdCateId) { - //1.查询三级课程分类 - Category thirdCategory = baseMapper.selectById(thirdCateId); - //1.1判断三级课程分类状态 - if (thirdCategory.getStatus() != CommonStatus.ENABLE.getValue()) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_CATEGORY_NOT_FOUND); - } - //2.查询二级课程分类 - Category secondCategory = baseMapper.selectById(thirdCategory.getParentId()); - //2.1判断三级课程分类状态 - if (secondCategory.getStatus() != CommonStatus.ENABLE.getValue()) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_CATEGORY_NOT_FOUND); - } - //3.返回数据 - return Arrays.asList(secondCategory.getParentId(), secondCategory.getId(), thirdCateId); - } - - /** - * 获取一级二级没有下一级分类的分类id列表 - * @return - */ - private List getCateIdsWithoutChildCateId(){ - // 1.查询数据 - List list = list(); - // 1.1.判空 - if(CollUtils.isEmpty(list)){ - return new ArrayList<>(); - } - // 2.list转map - Map> idAndParentIdMap = list.stream() - .collect(Collectors.groupingBy(Category::getParentId)); - // 3.遍历 - return list.stream() - .filter(category -> category.getLevel() < 3 && !idAndParentIdMap.containsKey(category.getId())) - .map(Category::getId) - .collect(Collectors.toList()); - } - - - /** - * 新增或更新时校验是否有同名的分类 - * - * @param parentId 父id - * @param name - * @param currentId - */ - private void checkSameName(Long parentId, String name, Long currentId) { - //1.统计同一个父分类的子分类列表中有同名分类,或和父分类同名查询条件 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.or().eq(true, Category::getParentId, parentId) - .eq(Category::getName, name) - .eq(Category::getDeleted, Constant.DATA_NOT_DELETE); - queryWrapper.or().eq(Category::getId, parentId) - .eq(Category::getName, name); - //2.统计符合上述条件的分类列表 - List categories = this.baseMapper.selectList(queryWrapper); - //3.新增情况下,有同名的分类 - if (currentId == null && CollectionUtil.isNotEmpty(categories)) { - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_SAME_NAME); - } - //4.更新情况下出现同名,需要判断是否是当前分类的名称 - if (CollectionUtil.isNotEmpty(categories) && categories.get(0).getId() != currentId.longValue()) { - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_SAME_NAME); - } - } - - private void setThirdCategoryNum(List categoryVOList){ - // 1.判空 - if(CollUtils.isEmpty(categoryVOList)){ - return; - } - // 2. - } - - /** - * 统计每个一级目录二级目录有多少个三级目录 - * - * @return - */ - private Map statisticThirdCategory() { - Map result = new HashMap<>(); - // 1.查询所有数据 - List categories = baseMapper.selectList(null); - // 1.1.判空 - if(CollUtils.isEmpty(categories)){ - return result; - } - - // 2.二级分类的拥有的三级课程分类数量 - Map collect = categories.stream() - .filter(category -> category.getLevel() == 3) - .collect(Collectors.groupingBy(Category::getParentId, Collectors.counting())); - result.putAll(collect); - // 3.一级分类拥有的三级课程分类数量 - Map> category2Map = categories.stream() - .filter(category -> category.getLevel() == 2) - .collect(Collectors.groupingBy(Category::getParentId)); - // 3.1.遍历category2Map - for (Map.Entry> entry : category2Map.entrySet()){ - long sum = entry.getValue() - .stream() - .map(category -> NumberUtils.null2Zero(result.get(category.getId()))) - .collect(Collectors.summarizingLong(num -> num)) - .getSum(); - result.put(entry.getKey(), sum); - } - // 4.返回结果 - return result; - } - - /** - * 根据条件过滤课程分类 - * - * @param categoryVOList - * @param categoryListDTO - * @return - */ - private List fiter(List categoryVOList, CategoryListDTO categoryListDTO) { - if (CollUtils.isEmpty(categoryVOList)) { - return new ArrayList<>(); - } - return categoryVOList.stream(). - filter(categoryVO -> filter(categoryVO, categoryListDTO)) - .collect(Collectors.toList()); - } - - /** - * 递归过滤出查询的数据,当前分类是否符合条件 = 当前分类信息符合条件 OR 有符合条件的子分类 - * 1.校验信息状态和名称符合dto要求 - * 2.循环遍历子分类,子分类不符合条件将从子分类列表中删除 - * 3.步骤1中通过 + 是否还有子分类(步骤2删除了不符合条件的) - * - * @param categoryVO - * @param categoryListDTO - * @return 当前分类是否符合条件 - */ - private boolean filter(CategoryVO categoryVO, CategoryListDTO categoryListDTO) { - - //当前分类通过,或者子分类有一个通过则都通过 - //不需要过滤 - if (StringUtils.isEmpty(categoryListDTO.getName()) && categoryListDTO.getStatus() == null) { - return true; - } - boolean pass = true; - // 状态校验 - if (categoryListDTO.getStatus() != null) { //和查询状态一致pass - pass = (categoryVO.getStatus() == categoryListDTO.getStatus()); - } - //名称校验 - if (pass && StringUtils.isNotEmpty(categoryListDTO.getName())) {//状态pass通过后校验名称,包含名称关键字 通过 - pass = StringUtils.isNotEmpty(categoryVO.getName()) && categoryVO.getName().contains(categoryListDTO.getName()); - } - //分类信息校验未通过,并且没有子分类,当前分类不符合条件 - if (!pass && CollUtils.isEmpty(categoryVO.getChildren())) { //告诉上一级没通过 - return false; - } - //遍历子分类是否符合条件 - for (int count = categoryVO.getChildren().size() - 1; count >= 0; count--) { - CategoryVO child = categoryVO.getChildren().get(count); - //子分类校验 - boolean childPass = filter(child, categoryListDTO); - if (!childPass) { //子分类不符合条件,从子分类列表中删除 - categoryVO.getChildren().remove(count); - } - } - return pass || CollUtils.isNotEmpty(categoryVO.getChildren()); - } - - private void batchDownShelfCourse(Long categoryId, Integer level, Long userId) { - //1.多线程下设置操作用户id - UserContext.setUser(userId); - //2.查询需要下架的课程 - List courses = courseService.queryByCategoryIdAndLevel(categoryId, level); - if (CollUtils.isEmpty(courses)) { - return; - } - //3.遍历下架课程 - for (Course course : courses) { - //4.判断状态是否可以下架 - if (!CourseStatus.SHELF.equals(course.getStatus())) { - continue; - } - try { - //5.课程下架 - courseDraftService.downShelf(course.getId()); - } catch (Exception e) { - log.error("课程下架异常"); - } - } - } - - /** - * 过滤掉没有三级课程分类的 - * @param simpleCategoryVOS - */ - private void filter(List simpleCategoryVOS){ - // 1.判空 - if(CollUtils.isEmpty(simpleCategoryVOS)){ - return; - } - // 2.遍历分类列表 - for (int count = simpleCategoryVOS.size() -1; count >= 0; count--) { - SimpleCategoryVO simpleCategoryVO = simpleCategoryVOS.get(count); - if(simpleCategoryVO.getLevel() == 3){ - continue; - } - filter(simpleCategoryVO.getChildren()); - if(CollUtils.isEmpty(simpleCategoryVO.getChildren())){ - simpleCategoryVOS.remove(count); - } - } - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCataSubjectDraftServiceImpl.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCataSubjectDraftServiceImpl.java deleted file mode 100644 index 72c3b99..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCataSubjectDraftServiceImpl.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.tianji.course.service.impl; - -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.utils.CollUtils; -import com.tianji.course.constants.CourseConstants; -import com.tianji.course.domain.po.CourseCataSubjectDraft; -import com.tianji.course.mapper.CourseCataSubjectDraftMapper; -import com.tianji.course.service.ICourseCataSubjectDraftService; -import com.tianji.course.service.ICourseCatalogueDraftService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Arrays; -import java.util.List; - -/** - *

- * 课程-题目关系表草稿 服务实现类 - *

- * - * @author wusongsong - * @since 2022-09-21 - */ -@Service -public class CourseCataSubjectDraftServiceImpl extends ServiceImpl implements ICourseCataSubjectDraftService { - - @Autowired - private ICourseCatalogueDraftService courseCatalogueDraftService; - - @Override - @Transactional - public void deleteNotInCataIdList(Long courseId) { - - //1.获取所有课程的小节和练习 - List cataIdList = courseCatalogueDraftService.queryCataIdsOfCourse(courseId, - Arrays.asList( - CourseConstants.CataType.SECTION, - CourseConstants.CataType.PRATICE - )); - //1.删除条件 - LambdaUpdateWrapper updateWrapper = - Wrappers.lambdaUpdate(CourseCataSubjectDraft.class) - .eq(CourseCataSubjectDraft::getCourseId, courseId) - .notIn(CollUtils.isNotEmpty(cataIdList), - CourseCataSubjectDraft::getCataId, cataIdList); - //2.删除题目 - baseMapper.delete(updateWrapper); - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCatalogueDraftServiceImpl.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCatalogueDraftServiceImpl.java deleted file mode 100644 index f581e18..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCatalogueDraftServiceImpl.java +++ /dev/null @@ -1,727 +0,0 @@ -package com.tianji.course.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.exam.ExamClient; -import com.tianji.api.dto.exam.QuestionBizDTO; -import com.tianji.api.dto.exam.QuestionDTO; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.*; -import com.tianji.common.validate.Checker; -import com.tianji.course.constants.CourseConstants; -import com.tianji.course.constants.CourseErrorInfo; -import com.tianji.course.constants.CourseStatus; -import com.tianji.course.domain.dto.CataSaveDTO; -import com.tianji.course.domain.dto.CataSubjectDTO; -import com.tianji.course.domain.dto.CourseMediaDTO; -import com.tianji.course.domain.po.*; -import com.tianji.course.domain.vo.CataSimpleSubjectVO; -import com.tianji.course.domain.vo.CataVO; -import com.tianji.course.mapper.CourseCataSubjectDraftMapper; -import com.tianji.course.mapper.CourseCataSubjectMapper; -import com.tianji.course.mapper.CourseCatalogueDraftMapper; -import com.tianji.course.mapper.CourseCatalogueMapper; -import com.tianji.course.service.ICourseCataSubjectDraftService; -import com.tianji.course.service.ICourseCatalogueDraftService; -import com.tianji.course.service.ICourseCatalogueService; -import com.tianji.course.service.ICourseDraftService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -/** - *

- * 目录草稿 服务实现类 - *

- * - * @author wusongsong - * @since 2022-07-19 - */ -@Service -@Slf4j -public class CourseCatalogueDraftServiceImpl extends ServiceImpl implements ICourseCatalogueDraftService { - - @Autowired - private CourseCatalogueMapper courseCatalogueMapper; - - @Autowired - private ICourseCatalogueService courseCatalogueService; - - @Autowired - private ICourseDraftService courseDraftService; - - @Autowired - private CourseCataSubjectDraftMapper courseCataSubjectDraftMapper; - - @Autowired - private CourseCataSubjectMapper courseCataSubjectMapper; - - @Autowired - private CourseCatalogueDraftMapper courseCatalogueDraftMapper; - - @Autowired - private ExamClient examClient; - - @Autowired - private ICourseCataSubjectDraftService courseCataSubjectDraftService; - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public void save(Long courseId, List cataSaveDTOS, Integer step) { - //1.根据章的序号按照升序重新排序 - cataSaveDTOS = cataSaveDTOS - .stream() - .sorted(Comparator.comparing(CataSaveDTO::getIndex)) - .collect(Collectors.toList()); - - //2.校验章的序号 - if (cataSaveDTOS.size() != cataSaveDTOS - .stream() - .map(CataSaveDTO::getIndex) - .distinct() - .count()) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_INEDX); - } - if (cataSaveDTOS.size() < cataSaveDTOS.get(cataSaveDTOS.size() - 1).getIndex()) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_INEDX_JUMP); - } - - //2.已经上架的目录 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseCatalogue.class) - .eq(CourseCatalogue::getCourseId, courseId); - List courseCatalogues = courseCatalogueMapper.selectList(queryWrapper); - - //2.1.校验以上架目录是否更新 - checkIndex(cataSaveDTOS, courseCatalogues); - //3.组装数据保存到数据库 - List courseCatalogueDrafts = - packageCatalogue(courseId, cataSaveDTOS, courseCatalogues); - //4.删除原有目录信息 - if (step == CourseConstants.CourseStep.CATALOGUE) { - //4.1删除小节和章数据 - courseCatalogueDraftMapper.deleteByCourseId(courseId, - Arrays.asList( - CourseConstants.CataType.CHAPTER, - CourseConstants.CataType.SECTION)); - } else if (step == CourseConstants.CourseStep.SUBJECT) { - //4.2保存题目时需要删除所有目录 - courseCatalogueDraftMapper.deleteByCourseId(courseId, - Arrays.asList( - CourseConstants.CataType.CHAPTER, - CourseConstants.CataType.SECTION, - CourseConstants.CataType.PRATICE)); - } else { - throw new BizIllegalException(ErrorInfo.Msg.OPERATE_FAILED); - } - //5.目录重新插入草稿 - this.saveOrUpdateBatch(courseCatalogueDrafts); - - //6.修改课程编辑进度 - courseDraftService.updateStep(courseId, CourseConstants.CourseStep.CATALOGUE); - - //7.删除已删除章节题目 - courseCataSubjectDraftService.deleteNotInCataIdList(courseId); - } - - @Override - public List queryCourseCatalogues(Long courseId, Boolean see, Boolean withPractice) { - if (see) { - //1.1查询正式数据目录 - List cataVOS = courseCatalogueService.queryCourseCataloguesVO(courseId, withPractice); - if (CollUtils.isNotEmpty(cataVOS)) { - return cataVOS; - } - //1.2查看草稿目录 - cataVOS = queryCourseCatalogues(courseId, withPractice); - return CollUtils.isEmpty(cataVOS) ? new ArrayList<>() : cataVOS; - - } else { - //2.1查看草稿目录 - List cataVOS = queryCourseCatalogues(courseId, withPractice); - return CollUtils.isEmpty(cataVOS) ? new ArrayList<>() : cataVOS; - } - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public void saveMediaInfo(Long courseId, List courseMediaDTOS) { - //1.校验保存视频的小节id是否属于当前课程中的小节, - List cataIds = - courseMediaDTOS.stream() - .map(CourseMediaDTO::getCataId) - .collect(Collectors.toList()); - //2.每个小节都有上传媒资 - checkSectionIds(cataIds, courseId); - - //3.获取课程草稿信息 - CourseDraft courseDraft = courseDraftService.getById(courseId); - //3.1判断新增课程是否按照顺序上传媒资 - if (courseDraft == null || - courseDraft.getStep() < CourseConstants.CourseStep.CATALOGUE) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_NO_EXECUTE); - } - - //4.媒资设置到小节信息中 - List catalogueDrafts = - BeanUtils.copyList(courseMediaDTOS, CourseCatalogueDraft.class, - (dto, courseCatalogueDraft) -> - courseCatalogueDraft.setId(dto.getCataId())); - //4.1.更新小节媒资信息 - this.updateBatchById(catalogueDrafts); - //4.2.更新课程填写步骤 - courseDraftService.updateStep(courseId, CourseConstants.CourseStep.MEDIA); - //5.统计每个章节媒资播放总时长 - List courseCatalogueDrafts = calculateCatalogMediaDuration(courseId); - //5.1批量更新每个大章的课时总数量 - this.updateBatchById(courseCatalogueDrafts, 500); - - - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public void saveSuject(Long courseId, List cataSubjectDTOS) { - //1.数据校验 - //1.1.转化目录id列表 - List cataIds = cataSubjectDTOS - .stream() - .map(CataSubjectDTO::getCataId) - .collect(Collectors.toList()); - checkPracticeIds(cataIds, courseId); - List cataSubjectDrafts = new ArrayList<>(); - - //2.查询课程草稿 - CourseDraft courseDraft = courseDraftService.getById(courseId); - //2.1.判断当前是否可以上传题目 - if (courseDraft == null || courseDraft.getStep() < CourseConstants.CourseStep.MEDIA) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_NO_EXECUTE); - } - - //3.组装题目目录关系 - for (CataSubjectDTO cataSubjectDTO : cataSubjectDTOS) { - for (Long subjectId : cataSubjectDTO.getSubjectIds()) { - CourseCataSubjectDraft courseCataSubjectDraft = new CourseCataSubjectDraft(); - //3.1.课程id - courseCataSubjectDraft.setCourseId(courseId); - //3.2.题目id - courseCataSubjectDraft.setSubjectId(subjectId); - //3.3.课程目录 - courseCataSubjectDraft.setCataId(cataSubjectDTO.getCataId()); - if (courseCataSubjectDraft.getId() == null) { - courseCataSubjectDraft.setId(IdWorker.getId()); - } - //3.4.课程题目关系添加到 - cataSubjectDrafts.add(courseCataSubjectDraft); - } - } - //4.删除练习和题目对应的关系 - courseCataSubjectDraftMapper.deleteByCourseId(courseId); - //5.批量插入练习和题目之间的关系 - if (!cataSubjectDrafts.isEmpty()) { - courseCataSubjectDraftMapper.batchInsert(cataSubjectDrafts); - } - //6.修改课程填写进度 - courseDraftService.updateStep(courseId, CourseConstants.CourseStep.SUBJECT); - } - - @Override - public List getSuject(Long courseId) { - - //1.查询课程目录和题目关系 - List cataSubjectDrafts = courseCataSubjectDraftMapper.getByCourseId(courseId); - if (CollUtils.isEmpty(cataSubjectDrafts)) { - return new ArrayList<>(); - } - List subjectIdList = cataSubjectDrafts.stream().map(CourseCataSubjectDraft::getSubjectId).collect(Collectors.toList()); - List subjects = examClient.queryQuestionByIds(subjectIdList); - Map subjectIdAndNameMap = subjects.stream() - .collect(Collectors.toMap(QuestionDTO::getId, QuestionDTO::getName)); - - //4.组装数据 - return cataSubjectDrafts.stream() - //4.1.分组 - .collect(Collectors.groupingBy(CourseCataSubjectDraft::getCataId)) - .entrySet().stream().map(entry -> { - //4.2.小节或测试对应的题目列表 - List subjectInfos = new ArrayList<>(); - for (CourseCataSubjectDraft cataSubjectDraft : entry.getValue()) { - //4.3.将题目id和题目名称加入到小节或测试的题目列表中 - subjectInfos.add(new CataSimpleSubjectVO.SubjectInfo( - cataSubjectDraft.getSubjectId(), - subjectIdAndNameMap.get(cataSubjectDraft.getSubjectId()))); - } - //4.4.组装小节或测试对应题目列表model - return new CataSimpleSubjectVO(entry.getKey(), subjectInfos); - }).collect(Collectors.toList()); - } - - @Override - public void checkCataInfoImplated(Long courseId) { - //查询所有目录 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(CourseCatalogueDraft::getCourseId, courseId); - List courseCatalogueDrafts = baseMapper.selectList(queryWrapper); - - List courseCataSubjectDrafts = courseCataSubjectDraftMapper.getByCourseId(courseId); - - Map subjectNumMap = CollUtils.isEmpty(courseCataSubjectDrafts) ? new HashMap<>() : - courseCataSubjectDrafts.stream().collect( - Collectors.groupingBy(CourseCataSubjectDraft::getCataId, - Collectors.counting())); - - //校验练习或小节有没有上传题目和媒资 - CollUtils.check(courseCatalogueDrafts, new Checker() { - @Override - public void check(CourseCatalogueDraft courseCatalogueDraft) { - if (courseCatalogueDraft.getType() == CourseConstants.CataType.SECTION - && StringUtils.isEmpty(courseCatalogueDraft.getVideoName())) { //小节未上传视频 - throw new BizIllegalException( - StringUtils.format(CourseErrorInfo.Msg.COURSE_UP_SHELF_SECTION_WITHOUT_MEDIA, courseCatalogueDraft.getName())); - } else if (courseCatalogueDraft.getType() == CourseConstants.CataType.PRATICE - && NumberUtils.null2Zero(subjectNumMap.get(courseCatalogueDraft.getId())) <= 0) { //练习未添加题目 - throw new BizIllegalException( - StringUtils.format(CourseErrorInfo.Msg.COURSE_UP_SHELF_PRACTICE_WITHOUT_SUBJECT, - courseCatalogueDraft.getName()) - ); - } - } - }); - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public void copySubjectToShelf(Long courseId, Boolean isFirstShelf) { - //1.从草稿中查出题目信息 - List courseCataSubjectDrafts = courseCataSubjectDraftMapper.getByCourseId(courseId); - List subjects = courseCataSubjectDrafts.stream() - .map(s -> QuestionBizDTO.of(s.getCataId(), s.getSubjectId())).collect(Collectors.toList()); - //2.删除练习和题目之间的关系 - if (CollUtils.isEmpty(courseCataSubjectDrafts)) { - // 草稿中没有题目,直接结束 - return; - } - //3.将新的练习和题目之间的关系上架 - examClient.saveQuestionBizInfoBatch(subjects); - //4.删除草稿 - int result = courseCataSubjectDraftMapper.deleteByCourseId(courseId); - if (result != courseCataSubjectDrafts.size()) { - throw new DbException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public void copyToShelf(Long courseId, Boolean isFirstShelf) { - //1.从草稿中查出目录信息 - List courseCatalogueDrafts = baseMapper.getByCourseId(courseId); - List courseCatalogues = BeanUtils.copyList(courseCatalogueDrafts, CourseCatalogue.class); - //2.保存数据上架 - boolean result = courseCatalogueService.saveOrUpdateBatch(courseCatalogues); - if (!result) { - throw new DbException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - //3.删除草稿 - int deleteResult = courseCatalogueDraftMapper.deleteByCourseId(courseId, Arrays.asList( - CourseConstants.CataType.CHAPTER, - CourseConstants.CataType.SECTION, - CourseConstants.CataType.PRATICE - )); - if (deleteResult != courseCatalogueDrafts.size()) { - throw new DbException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - } - - @Override - public Map calculateMediaDuration(Long courseId) { - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseCatalogueDraft.class) - .eq(CourseCatalogueDraft::getCourseId, courseId) - .eq(CourseCatalogueDraft::getType, CourseConstants.CataType.SECTION); - List list = list(queryWrapper); - if (CollUtils.isEmpty(list)) { - return new HashMap<>(); - } - return list.stream() - .collect(Collectors.groupingBy( - CourseCatalogueDraft::getParentCatalogueId, - Collectors.summingInt(CourseCatalogueDraft::getMediaDuration))); - } - - @Override - public Integer totalSectionNums(Long courseId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(CourseCatalogueDraft::getCourseId, courseId) - .in(CourseCatalogueDraft::getType, - Arrays.asList(CourseConstants.CataType.SECTION, CourseConstants.CataType.PRATICE)); - return count(queryWrapper); - } - - @Override - public List queryCataIdsOfCourse(Long courseId, List types) { - //1.查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseCatalogueDraft.class) - .eq(CourseCatalogueDraft::getCourseId, courseId) - .in(CourseCatalogueDraft::getType, types); - //2.查询数据 - List courseCatalogueDrafts = baseMapper.selectList(queryWrapper); - //3.返回数据 - return CollUtils.isEmpty(courseCatalogueDrafts) - ? new ArrayList<>() - : courseCatalogueDrafts - .stream() - .map(CourseCatalogueDraft::getId) - .collect(Collectors.toList()); - } - - - /** - * 校验已经上架课程的章节是否被调动或删除 - * - * @param courseCatalogues 已上架的 - * @param cataSaveDTOS 前端传来要保存的目录列表 - */ - private void checkIndex(List cataSaveDTOS, List courseCatalogues) { - - //校验章序号是否有重复的 - Map collect = cataSaveDTOS.stream().collect(Collectors.toMap(CataSaveDTO::getIndex, p -> p)); - if (collect.size() < cataSaveDTOS.size()) { //有重复的章序号 - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_CHAPTER_INDEX_REPEAT); - } - //cataSaveDTOS 是按升序排的 最大的章序号大于章数量,说明章列表cataSaveDTOS的序号有间断设置 - if (cataSaveDTOS.get(cataSaveDTOS.size() - 1).getIndex() > cataSaveDTOS.size()) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_CHAPTER_INDEX_INTERRUPTED); - } - - if (CollUtils.isEmpty(courseCatalogues)) { - return; - } - final Map saveIndexMap = new HashMap<>(); - for (CataSaveDTO cataSaveDTO : cataSaveDTOS) {//章的序号 - if (cataSaveDTO.getId() != null) { - saveIndexMap.put(cataSaveDTO.getId(), cataSaveDTO.getIndex()); - } - - //小节和练习的序号 - if (CollUtils.isEmpty(cataSaveDTO.getSections())) { //章没有对应的小节 - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_CHAPTER_WITHOUT_SECTION); - } - AtomicInteger count = new AtomicInteger(1); - //小节需要排序,练习不需要排序 - cataSaveDTO.getSections().stream().filter(section -> section.getType() == CourseConstants.CataType.SECTION) - .forEach(section -> { - if (section.getId() == null) { - //序号从1开始 - saveIndexMap.put(section.getId(), count.incrementAndGet()); - } - }); - } - - for (CourseCatalogue courseCatalogue : courseCatalogues) { - if (courseCatalogue.getType() != CourseConstants.CataType.CHAPTER) { - continue; - } - Integer index = saveIndexMap.get(courseCatalogue.getId()); - if (index == null) { - throw new BizIllegalException(StringUtils.format(CourseErrorInfo.Msg.COURSE_CATAS_SAVE_CHAPTER_NAME_DELETED, courseCatalogue.getName())); - } - //章排序 - if (!index.equals(courseCatalogue.getCIndex())) { - throw new BizIllegalException(StringUtils.format(ErrorInfo.Msg.OPERATE_FAILED, courseCatalogue.getName())); - } - } - } - - /** - * 组装数据,数据优先级,本次保存数据>草稿中的数据>已上架数据 - * 通过map来实现数据的覆盖,map key的目录id,value是目录信息 - * 1.先将已上架的数据放入map - * 2.将草稿中的数据放入map,放入的过程中草稿中和已上架都存在,草稿中的数据会自动覆盖掉已上架数据 - * 3.遍历本次保存数据, - * 3.1 如果目录信息没有id,生成一个 - * 3.2 在map中获取目录信息,没有找到生成一个目录草稿类 - * 3.3 向目录信息中添加要保存的数据 序号、名称、小节id、目录id - * - * @param courseId 课程id - * @param cataSaveDTOS 课程目录列表 - * @return 数据库中存储的课程目录列表 - */ - private List packageCatalogue(Long courseId, List cataSaveDTOS, List shelfCourseCatalogues) { - final Map savedMap = new HashMap<>(); - if (CollUtils.isNotEmpty(shelfCourseCatalogues)) { - //将已经上架的目录copy下来 - shelfCourseCatalogues.stream().forEach(courseCatalogue -> - savedMap.put(courseCatalogue.getId(), BeanUtils.toBean(courseCatalogue, CourseCatalogueDraft.class))); - } - //获取已经保存的草稿 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(CourseCatalogueDraft::getCourseId, courseId); - List savedCourseCataloguesDraft = list(queryWrapper); - if (CollUtils.isNotEmpty(savedCourseCataloguesDraft)) { - //存在草稿覆盖已经上架的课程 - savedCourseCataloguesDraft.stream().forEach(courseCatalogueDraft -> - savedMap.put(courseCatalogueDraft.getId(), courseCatalogueDraft)); - } - //需要保存的草稿 - List courseCatalogueDrafts = new ArrayList<>(); - for (CataSaveDTO cataSaveDTO : cataSaveDTOS) { - Long chapterId = cataSaveDTO.getId() == null ? IdWorker.getId() : cataSaveDTO.getId(); - //章目录 - CourseCatalogueDraft courseCatalogueDraft = savedMap.get(chapterId); - if (courseCatalogueDraft == null) { //未保存过 - courseCatalogueDraft = new CourseCatalogueDraft(); - courseCatalogueDraft.setId(chapterId); - } - - //设置目录添加或修改时的基本信息 - courseCatalogueDraft.setCataBaseInfo(cataSaveDTO.getIndex(), cataSaveDTO.getName(), CourseConstants.CataType.CHAPTER, - 0L, courseId); - courseCatalogueDrafts.add(courseCatalogueDraft); - //小节练习目录,小节有需要,练习没有需要 - //序号 - AtomicInteger indexCount = new AtomicInteger(0); - cataSaveDTO.getSections().stream().forEach(section -> { - Long sectionId = section.getId() == null ? IdWorker.getId() : section.getId(); - //小节练习目录 - CourseCatalogueDraft courseCatalogueDraftSection = savedMap.get(sectionId); - if (courseCatalogueDraftSection == null) { //未保存过 - courseCatalogueDraftSection = new CourseCatalogueDraft(); - courseCatalogueDraftSection.setId(sectionId); - } - Integer index = section.getType() == CourseConstants.CataType.SECTION ? - indexCount.incrementAndGet() : null; - - //设置目录添加或修改时的基本信息 - courseCatalogueDraftSection.setCataBaseInfo(index, section.getName(), section.getType(), - chapterId, courseId); - courseCatalogueDrafts.add(courseCatalogueDraftSection); - }); - } - return courseCatalogueDrafts; - } - - private List queryCourseCatalogues(Long courseId, Boolean withPractice) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(CourseCatalogueDraft::getCourseId, courseId); - if (!withPractice) { - queryWrapper.in(CourseCatalogueDraft::getType, - Arrays.asList(CourseConstants.CataType.CHAPTER, CourseConstants.CataType.SECTION)); - } - //根据类型和排序,按照 - queryWrapper.last(" order by type,c_index"); - List courseCatalogueDrafts = baseMapper.selectList(queryWrapper); - if (CollUtils.isEmpty(courseCatalogueDrafts)) { - return null; - } - CourseDraft courseDraft = courseDraftService.getById(courseId); - - // 最大上架数,待上架设置空map,已上架需要排序并去小节序号(同一个章中)中最大小节 - Map chapterIdAndMaxSectionMap = - (courseDraft.getStatus() == CourseStatus.NO_UP_SHELF.getStatus()) - ? new HashMap<>() : - courseCatalogueDrafts.parallelStream() - .filter(ccd -> ccd.getType() == CourseConstants.CataType.SECTION && !ccd.getCanUpdate()) - .collect(Collectors.groupingBy(CourseCatalogueDraft::getParentCatalogueId, - Collectors.collectingAndThen( - Collectors.reducing( - (c1, c2) -> c2.getCIndex().compareTo(c1.getCIndex()) > 0 ? c2 : c1), - Optional::get))); - int maxChapterIndex = (courseDraft.getStatus() == CourseStatus.NO_UP_SHELF.getStatus()) - ? 0 - : courseCatalogueDrafts.stream() - .filter(ccd -> ccd.getType() == CourseConstants.CataType.CHAPTER && !ccd.getCanUpdate()) - .map(CourseCatalogueDraft::getCIndex) - .max(Integer::compare).get(); - - - // 4.查询课程对应的小节和题目信息 - List subjects = courseCataSubjectDraftMapper.getByCourseId(courseId); - // 4.1.统计题目数量 - Map cataIdAndNumMap = CollUtils.isEmpty(subjects) ? new HashMap<>() : - subjects.stream().collect(Collectors.groupingBy(CourseCataSubjectDraft::getCataId, Collectors.counting())); - // 4.2.查询分数 - Map cataIdAndTotalScoreMap = new HashMap<>(cataIdAndNumMap.size()); - if (CollUtils.isNotEmpty(subjects)) { - Set questionIds = subjects.stream().map(CourseCataSubjectDraft::getSubjectId).collect(Collectors.toSet()); - Map scoreMap = examClient.queryQuestionScores(questionIds); - cataIdAndTotalScoreMap.putAll( - subjects.stream().collect(Collectors.groupingBy( - CourseCataSubjectDraft::getCataId, - Collectors.summingInt(d -> scoreMap.get(d.getSubjectId())) - ))); - } - return TreeDataUtils.parseToTree(courseCatalogueDrafts, CataVO.class, (catalogueDraft, vo) -> { - int maxIndexOnShelf = 0; - int maxSectionIndexOnShelf = 0; - if (catalogueDraft.getType() == CourseConstants.CataType.SECTION) { - //小节最大编辑数 - CourseCatalogueDraft courseCatalogueDraft = chapterIdAndMaxSectionMap.get(catalogueDraft.getParentCatalogueId()); - maxIndexOnShelf = NumberUtils.null2Zero( - courseCatalogueDraft == null ? 0 : courseCatalogueDraft.getCIndex()); - } else if (catalogueDraft.getType() == CourseConstants.CataType.CHAPTER) { - maxIndexOnShelf = maxChapterIndex; - CourseCatalogueDraft courseCatalogueDraft = chapterIdAndMaxSectionMap.get(catalogueDraft.getId()); - maxSectionIndexOnShelf = NumberUtils.null2Zero( - courseCatalogueDraft == null ? 0 : courseCatalogueDraft.getCIndex()); - } - vo.setIndex(catalogueDraft.getCIndex()); - vo.setMediaName(catalogueDraft.getVideoName()); - vo.setSubjectNum(NumberUtils.null2Zero(cataIdAndNumMap.get(catalogueDraft.getId())).intValue()); //练习总数量 - vo.setTotalScore(NumberUtils.null2Zero(cataIdAndTotalScoreMap.get(catalogueDraft.getId()))); //练习总分数 - vo.setMaxIndexOnShelf(maxIndexOnShelf); - vo.setMaxSectionIndexOnShelf(maxSectionIndexOnShelf); - }, new CourseCatalogDraftDataWrapper()); - } - - /** - * 校验练习id列表 - * 1.校验本课程所有的练习都添加了题目 - * 2.校验上传的数据中有其他课程的数据, - * 前端传过来的章节id列表为A,课程所有小节id和练习id列表为B,课程所有练习id列表为c - * 原理:1. 判断A是不是B的子集,如果A不是B的子集,则前端传过来的id列表中有非当前课程的小节或练习 - * 2.判断c是A的子集,如果c不是A的子集,说明前端有漏传的该课程的练习id - * - * @param cataIds 前端传过来的小节id列表或者练习列表 - * @param courseId 课程id - */ - private void checkPracticeIds(List cataIds, Long courseId) { - //查询所有小节和练习的目录列表 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(CourseCatalogueDraft::getCourseId, courseId).in(CourseCatalogueDraft::getType, - Arrays.asList(CourseConstants.CataType.SECTION, CourseConstants.CataType.PRATICE)); - List courseCatalogueDrafts = baseMapper.selectList(queryWrapper); - if (CollUtils.isEmpty(courseCatalogueDrafts)) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_CATA_NOT_EXISTS); - } - //所有小节和练习的目录id列表 - List allCataIdList = courseCatalogueDrafts - .stream() - .map(CourseCatalogueDraft::getId) - .collect(Collectors.toList()); - - //判断前端传过来的章节id列表是该课程所有小节和练习集合的子集, - // 如果不是子集,说明前端传过来的章节id不属于当前课程 - if (!CollUtils.containsAll(allCataIdList, cataIds)) { - log.error("传过来了其他章节的章节id,courseId:{},cataIds:{}", courseId, cataIds); - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_ILLEGAL); - } - //所有练习的id列表 - List practiceIdList = courseCatalogueDrafts.stream().filter(practice -> practice.getType() == CourseConstants.CataType.PRATICE). - map(CourseCatalogueDraft::getId).collect(Collectors.toList()); - //判断前端传过来的章节id列表是否符合是课程练习id父集合 - if (!CollUtils.containsAll(cataIds, practiceIdList)) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_SUBJECT_SAVE_SUBJECT_IDS_NULL); - } - } - - /** - * 校验小节或练习id列表 - * 1.校验本课程所有的小节都添加了视频 - * 2.校验上传的数据中有其他课程的数据, - * 原理:1.先比较接口传递过来的数据和数据库中的小节总数量一致,不一致返回失败 - * 2.总数量一致,再求两者的交集,交集集合长度和前端传过来的数量一致,则通过 - * - * @param cataIds 前端传过来的小节id列表或者练习列表 - * @param courseId 课程id - */ - private void checkSectionIds(List cataIds, Long courseId) { - //1.数据库小节查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseCatalogueDraft.class) - .eq(CourseCatalogueDraft::getType, CourseConstants.CataType.SECTION) - .eq(CourseCatalogueDraft::getCourseId, courseId); - //2.查询小节 - List courseCatalogueDrafts = baseMapper.selectList(queryWrapper); - - //3.判断数据库中的小节和前端传来的小节数量是否一致 - if (CollUtils.size(courseCatalogueDrafts) != CollUtils.size(cataIds)) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_MEDIA_NULL); - } - //4.转化出数据库中课程小节id列表 - List cataIdsInDb = - courseCatalogueDrafts - .stream() - .map(CourseCatalogueDraft::getId) - .collect(Collectors.toList()); - //5.取前端传来小节id列表和数据库中小节id列表交集 - Collection cataIdsOfIntersection = CollUtils.intersection(cataIds, cataIdsInDb); - //6.判断小节交集id列表数量和前端传来小节id列表数量是否一致 - if (cataIdsOfIntersection.size() != cataIds.size()) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_MEDIA_SAVE_MEDIA_NULL); - } - } - - /** - * 根据课程id统计每个大章的媒资总时长 - * - * @param courseId - * @return - */ - private List calculateCatalogMediaDuration(Long courseId) { - //1.查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseCatalogueDraft.class) - .eq(CourseCatalogueDraft::getCourseId, courseId) - .eq(CourseCatalogueDraft::getType, CourseConstants.CataType.SECTION); - //2.查询数据 - List courseCatalogueDrafts = baseMapper.selectList(queryWrapper); - if (CollUtils.isEmpty(courseCatalogueDrafts)) { - return new ArrayList<>(); - } - //3.统计每个章的课时总时长 - Map capthIdAndMediaDurationMap = - courseCatalogueDrafts.stream().collect(Collectors.groupingBy( - CourseCatalogueDraft::getParentCatalogueId, - Collectors.summingInt(CourseCatalogueDraft::getMediaDuration))); - //4.封装数据 - return capthIdAndMediaDurationMap.keySet() - .stream() - .map(key -> CourseCatalogueDraft.builder() - .id(key) - .mediaDuration(capthIdAndMediaDurationMap.get(key)) - .build()) - .collect(Collectors.toList()); - } - - /** - * 课程目录草稿树型数据转换器 - */ - private class CourseCatalogDraftDataWrapper implements TreeDataUtils.DataProcessor { - - @Override - public Object getParentKey(CourseCatalogueDraft courseCatalogueDraft) { - return courseCatalogueDraft.getParentCatalogueId(); - } - - @Override - public Object getKey(CourseCatalogueDraft courseCatalogueDraft) { - return courseCatalogueDraft.getId(); - } - - @Override - public Object getRootKey() { - return 0L; - } - - @Override - public List getChild(CataVO cataVO) { - return cataVO.getSections(); - } - - @Override - public void setChild(CataVO parent, List child) { - parent.setSections(child); - } - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCatalogueServiceImpl.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCatalogueServiceImpl.java deleted file mode 100644 index bb778d6..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseCatalogueServiceImpl.java +++ /dev/null @@ -1,308 +0,0 @@ -package com.tianji.course.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.exam.ExamClient; -import com.tianji.api.dto.course.CatalogueDTO; -import com.tianji.api.dto.course.MediaQuoteDTO; -import com.tianji.api.dto.course.SectionInfoDTO; -import com.tianji.api.dto.exam.QuestionBizDTO; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.*; -import com.tianji.course.constants.CourseConstants; -import com.tianji.course.constants.CourseErrorInfo; -import com.tianji.course.domain.po.CourseCatalogue; -import com.tianji.course.domain.vo.CataSimpleInfoVO; -import com.tianji.course.domain.vo.CataVO; -import com.tianji.course.mapper.CourseCatalogueMapper; -import com.tianji.course.properties.CourseProperties; -import com.tianji.course.service.ICourseCatalogueService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.*; -import java.util.stream.Collectors; - -/** - *

- * 目录草稿 服务实现类 - *

- * - * @author wusongsong - * @since 2022-07-19 - */ -@Service -public class CourseCatalogueServiceImpl extends ServiceImpl implements ICourseCatalogueService { - - @Autowired - private CourseProperties courseProperties; - - @Autowired - private ExamClient examClient; - - @Override - public List queryCourseCatalogues(Long courseId, Boolean withPractice) { - //1.课程目录查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseCatalogue.class) - .eq(CourseCatalogue::getCourseId, courseId); - if (!withPractice) { - //1.1课程目录不带练习设置目录查询类型 - queryWrapper.in(CourseCatalogue::getType, - Arrays.asList(CourseConstants.CataType.SECTION, - CourseConstants.CataType.CHAPTER)); - } - //1.2根据目录类型和序号排序 - queryWrapper.last(" order by type,c_index"); - //2.查询课程目录列表 - List courseCatalogues = baseMapper.selectList(queryWrapper); - if (CollUtils.isEmpty(courseCatalogues)) { - return null; - } - - return TreeDataUtils.parseToTree(courseCatalogues, CatalogueDTO.class, (courseCatalogue, cataVO)->{ - cataVO.setMediaName(courseCatalogue.getVideoName()); - cataVO.setIndex(courseCatalogue.getCIndex()); - }, new CourseCatalogDataWrapper()); - } - - @Override - public List countMediaUserInfo(List mediaIds) { - //1.判断媒资id列表为空判断 - if (CollUtils.isEmpty(mediaIds)) { - return CollUtils.emptyList(); - } - //2.课程目录查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseCatalogue.class) - .in(CourseCatalogue::getMediaId, mediaIds); - //2.1查询课程目录列表 - List courseCatalogues = baseMapper.selectList(queryWrapper); - //3.未查询到媒资对应的课程目录 - if (CollUtils.isEmpty(courseCatalogues)) { - //3.1媒资都未被引用,都给一个引用次数0 - return mediaIds.stream() - .map(mediaId -> new MediaQuoteDTO(mediaId, 0)) - .collect(Collectors.toList()); - } - //4.分组统计媒资被引用次数 - Map mediaAndCount = - courseCatalogues.stream() - .collect(Collectors.groupingBy( - CourseCatalogue::getMediaId, Collectors.counting())); - //5.组装数据,设置 - return mediaIds.stream().map( - mediaId -> new MediaQuoteDTO(mediaId, - NumberUtils.null2Zero(mediaAndCount.get(mediaId)) - .intValue()) - ).collect(Collectors.toList()); - } - - @Override - public SectionInfoDTO getSimpleSectionInfo(Long sectionId) { - //1.小节id判空 - if (sectionId == null) { - throw new BizIllegalException(CourseErrorInfo.Msg.CATEGORY_QUERY_ID_NULL); - } - //2.获取小节对应的目录信息 - CourseCatalogue courseCatalogue = baseMapper.selectById(sectionId); - if (courseCatalogue == null) { - return new SectionInfoDTO(); - } - //3.判断目录类型是否为小节 - if (courseCatalogue.getType() != CourseConstants.CataType.SECTION) { - return new SectionInfoDTO(); - } - //4.组装数据 - SectionInfoDTO sectionInfoDTO = BeanUtils.toBean(courseCatalogue, SectionInfoDTO.class); - //5.设置免费试看时长 - sectionInfoDTO.setFreeDuration(courseCatalogue.getTrailer() == 1 ? - courseProperties.getMedia().getTrailerDuration() : 0); - return sectionInfoDTO; - } - - @Override - public List getCatasIndexList(Long courseId) { - //1.课程目录(不含练习)查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseCatalogue.class) - .eq(CourseCatalogue::getCourseId, courseId) - .in(CourseCatalogue::getType, Arrays.asList( - CourseConstants.CataType.CHAPTER, - CourseConstants.CataType.SECTION - )); - //1.1查询课程目录 - List courseCatalogues = baseMapper.selectList(queryWrapper); - if (CollUtils.isEmpty(courseCatalogues)) { - return new ArrayList<>(); - } - //2.章id与章序号映射关系 - Map chapterMap = - courseCatalogues - .stream() - .filter(courseCatalogue -> courseCatalogue.getType() == CourseConstants.CataType.CHAPTER) - .collect(Collectors.toMap(CourseCatalogue::getId, CourseCatalogue::getCIndex)); - //3.遍历课程目录,组装数据 - return courseCatalogues.stream() - .filter(courseCatalogue -> courseCatalogue.getType() != CourseConstants.CataType.CHAPTER) - - .map(courseCatalogue -> { - //3.1组装目录序号 - String index = StringUtils.format("{}-{}", - chapterMap.get(courseCatalogue.getParentCatalogueId()), - courseCatalogue.getCIndex()); - //3.2组装目录信息,目录id,目录名称,目录序号 - return new CataSimpleInfoVO(courseCatalogue.getId(), - courseCatalogue.getName(), index, courseCatalogue.getCIndex(), null); - }) - .collect(Collectors.toList()); - } - - @Override - public List getManyCataSimpleInfo(List ids) { - // 1.判空 - if(CollUtils.isEmpty(ids)){ - return CollUtils.emptyList(); - } - //2.查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseCatalogue.class) - .in(CourseCatalogue::getId, ids); - //3.查询数据 - List courseCatalogues = baseMapper.selectList(queryWrapper); - //4.数据转化 - return BeanUtils.copyList(courseCatalogues, CataSimpleInfoVO.class); - } - - @Override - public CataSimpleInfoVO querySectionInfoById(Long id) { - // 1.查询数据 - CourseCatalogue currentCourseCatalogue = baseMapper.selectById(id); - // 2.判断是否是小节 - if(currentCourseCatalogue != null - && currentCourseCatalogue.getType() == CourseConstants.CataType.SECTION) { - // 2.1.转换数据 - CataSimpleInfoVO cataSimpleInfoVO = BeanUtils.toBean(currentCourseCatalogue, CataSimpleInfoVO.class); - // 3.查询章信息 - CourseCatalogue courseCatalogue = baseMapper.selectById(currentCourseCatalogue.getParentCatalogueId()); - // 3.1.章id - cataSimpleInfoVO.setChapterIndex(courseCatalogue.getCIndex()); - return cataSimpleInfoVO; - } - // 4.返回空数据 - return new CataSimpleInfoVO(); - } - - @Override - public List queryCourseCataloguesVO(Long courseId, Boolean withPractice) { - //1.课程目录查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseCatalogue.class) - .eq(CourseCatalogue::getCourseId, courseId); - if (!withPractice) { - //1.1课程目录不带练习设置目录查询类型 - queryWrapper.in(CourseCatalogue::getType, - Arrays.asList(CourseConstants.CataType.SECTION, - CourseConstants.CataType.CHAPTER)); - } - //1.2根据目录类型和序号排序 - queryWrapper.last(" order by type,c_index"); - //2.查询课程目录列表 - List courseCatalogues = baseMapper.selectList(queryWrapper); - if (CollUtils.isEmpty(courseCatalogues)) { - return null; - } - - //3.查询课程目录id、题目id及分数列表 - Set ids = courseCatalogues.stream().map(CourseCatalogue::getId).collect(Collectors.toSet()); - List questionBizDTOS = examClient.queryQuestionIdsByBizIds(ids); - //4.转化目录id和题目id、分数对应关系 - Map cataIdAndNumMap = - CollUtils.isEmpty(questionBizDTOS) - ? new HashMap<>() : - questionBizDTOS - .stream() - .collect(Collectors.groupingBy(QuestionBizDTO::getBizId, Collectors.counting())); - //5.转化录id和题目id、总分数关系 - Map cataIdAndTotalScoreMap = examClient.queryQuestionScoresByBizIds(ids); - //6.数据目录结构转化 - List cataVOS = - TreeDataUtils.parseToTree(courseCatalogues, CataVO.class, - (courseCatalogue, cataVO) -> { - //6.1设置媒资名称 - cataVO.setMediaName(courseCatalogue.getVideoName()); - //6.2设置目录索引 - cataVO.setIndex(courseCatalogue.getCIndex()); - //6.3设置题目数量 - cataVO.setSubjectNum(NumberUtils.null2Zero( - cataIdAndNumMap.get(courseCatalogue.getId())) - .intValue()); //练习总数量 - //6.4设置题目总分数 - cataVO.setTotalScore(NumberUtils.null2Zero( - cataIdAndTotalScoreMap.get(courseCatalogue.getId()))); //练习总分数 - }, new CourseCatalogDataWrapper2()); - - return cataVOS; - } - - //课程目录树形转化模型 - private static class CourseCatalogDataWrapper implements TreeDataUtils.DataProcessor { - - - @Override - public Object getParentKey(CourseCatalogue courseCatalogue) { - return courseCatalogue.getParentCatalogueId(); - } - - @Override - public Object getKey(CourseCatalogue courseCatalogue) { - return courseCatalogue.getId(); - } - - @Override - public Object getRootKey() { - return 0L; - } - - @Override - public List getChild(CatalogueDTO catalogueDTO) { - return catalogueDTO.getSections(); - } - - @Override - public void setChild(CatalogueDTO parent, List child) { - parent.setSections(child); - } - } - - //课程目录树形转化模型 - private static class CourseCatalogDataWrapper2 implements TreeDataUtils.DataProcessor { - - - @Override - public Object getParentKey(CourseCatalogue courseCatalogue) { - return courseCatalogue.getParentCatalogueId(); - } - - @Override - public Object getKey(CourseCatalogue courseCatalogue) { - return courseCatalogue.getId(); - } - - @Override - public Object getRootKey() { - return 0L; - } - - @Override - public List getChild(CataVO catalogueDTO) { - return catalogueDTO.getSections(); - } - - @Override - public void setChild(CataVO parent, List child) { - parent.setSections(child); - } - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseDraftServiceImpl.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseDraftServiceImpl.java deleted file mode 100644 index d9289e9..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseDraftServiceImpl.java +++ /dev/null @@ -1,676 +0,0 @@ -package com.tianji.course.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.exam.ExamClient; -import com.tianji.api.client.learning.LearningClient; -import com.tianji.api.client.trade.TradeClient; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.course.CourseDTO; -import com.tianji.api.dto.course.CoursePurchaseInfoDTO; -import com.tianji.api.dto.exam.QuestionBizDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.*; -import com.tianji.course.constants.CourseConstants; -import com.tianji.course.constants.CourseErrorInfo; -import com.tianji.course.constants.CourseStatus; -import com.tianji.course.domain.dto.CourseBaseInfoSaveDTO; -import com.tianji.course.domain.dto.CoursePageQuery; -import com.tianji.course.domain.po.*; -import com.tianji.course.domain.vo.CourseBaseInfoVO; -import com.tianji.course.domain.vo.CoursePageVO; -import com.tianji.course.domain.vo.CourseSaveVO; -import com.tianji.course.domain.vo.NameExistVO; -import com.tianji.course.mapper.*; -import com.tianji.course.service.*; -import io.seata.spring.annotation.GlobalTransactional; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import javax.validation.ValidatorFactory; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - *

- * 草稿课程 服务实现类 - *

- * - * @author wusongsong - * @since 2022-07-18 - */ -@Service -public class CourseDraftServiceImpl extends ServiceImpl implements ICourseDraftService { - - @Autowired - private CourseMapper courseMapper; - - @Autowired - private ICourseService courseService; - - @Autowired - private CourseContentDraftMapper courseContentDraftMapper; - - @Autowired - private CourseContentMapper courseContentMapper; - - @Autowired - private ValidatorFactory validatorFactory; - - @Autowired - private ICourseCatalogueDraftService courseCatalogueDraftService; - - @Autowired - private ICourseTeacherDraftService courseTeacherDraftService; - - @Autowired - private CourseCatalogueDraftMapper courseCatalogueDraftMapper; - - @Autowired - private CourseTeacherDraftMapper courseTeacherDraftMapper; - - @Autowired - private CourseCataSubjectDraftMapper courseCataSubjectDraftMapper; - - @Autowired - private UserClient userClient; - - @Autowired - private ICategoryService categoryService; - - @Autowired - private RabbitMqHelper rabbitMqHelper; - - @Autowired - private TradeClient tradeClient; - - @Autowired - private ExamClient examClient; - - @Autowired - private LearningClient learningClient; - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public CourseSaveVO save(CourseBaseInfoSaveDTO courseBaseInfoSaveDTO) { - List categoryIdList = null; - Course course = null; - //1.数据校验 - if (courseBaseInfoSaveDTO.getId() == null) { - //1.1新增数据调起数据校验器 - ViolationUtils.process(validatorFactory.getValidator().validate(courseBaseInfoSaveDTO)); - //1.1.2.校验课程分类 - categoryIdList = categoryService.checkCategory(courseBaseInfoSaveDTO.getThirdCateId()); - } else { - //1.2.未上架课程校验 - course = courseMapper.selectById(courseBaseInfoSaveDTO.getId()); - if (course == null) { - //1.2.1.未上架课程校验请求参数 - ViolationUtils.process(validatorFactory.getValidator().validate(courseBaseInfoSaveDTO)); - //1.2.2.同名课程判空 - checkSameCourse(courseBaseInfoSaveDTO.getId(), courseBaseInfoSaveDTO.getName()); - //1.2.3.校验课程分类 - categoryIdList = categoryService.checkCategory(courseBaseInfoSaveDTO.getThirdCateId()); - } - } - - CourseDraft courseDraft = new CourseDraft(); - //2.数据封装 - //2.1.content数据封装 课程介绍、课程细节、适用人群 - CourseContentDraft courseContentDraft = new CourseContentDraft(); - courseContentDraft.setCourseIntroduce(courseBaseInfoSaveDTO.getIntroduce()); - courseContentDraft.setCourseDetail(courseBaseInfoSaveDTO.getDetail()); - courseContentDraft.setUsePeople(courseBaseInfoSaveDTO.getUsePeople()); - //2.2.课程封面和课程下架时间 - courseDraft.setCoverUrl(courseBaseInfoSaveDTO.getCoverUrl()); - courseDraft.setPurchaseEndTime(courseBaseInfoSaveDTO.getPurchaseEndTime()); - //2.3.未上架数据封装,已上架课程不能修改字段 - if (course == null) { - //2.3.1.课程价格 - courseDraft.setPrice(NumberUtils.null2Zero(courseBaseInfoSaveDTO.getPrice())); - //2.3.2.课程有效期 - courseDraft.setValidDuration(courseBaseInfoSaveDTO.getValidDuration()); - //2.3.3.课程状态 - courseDraft.setStatus(CourseStatus.NO_UP_SHELF.getStatus()); - //2.3.4.一级课程分类id - courseDraft.setFirstCateId(categoryIdList.get(0)); - //2.3.5.二级课程分类id - courseDraft.setSecondCateId(categoryIdList.get(1)); - //2.3.6.三级课程分类id - courseDraft.setThirdCateId(categoryIdList.get(2)); - //2.3.7.售卖模式 - courseDraft.setFree(courseBaseInfoSaveDTO.getFree() ? 1 : 0); - //2.3.8.课程名称 - courseDraft.setName(courseBaseInfoSaveDTO.getName()); - } - - //3.操作 - if (courseBaseInfoSaveDTO.getId() == null) { - //3.1.新增课程草稿 - //3.1.1.新生成课程id - Long id = IdWorker.getId(); - //3.1.2.设置课程id - courseContentDraft.setId(id); - courseDraft.setId(id); - //3.1.3.设置课程编辑进度 - courseDraft.setStep(CourseConstants.CourseStep.BASE_INFO); - //3.1.4.插入课程草稿 - baseMapper.insert(courseDraft); - //3.1.5.插入课程草稿内容 - courseContentDraftMapper.insert(courseContentDraft); - } else { - //3.2.编辑课程草稿 - //3.2.1.设置课程id - courseContentDraft.setId(courseBaseInfoSaveDTO.getId()); - courseDraft.setId(courseBaseInfoSaveDTO.getId()); - //3.2.2.更新课程草稿 - baseMapper.updateById(courseDraft); - //3.2.3.更新课程草稿内容 - courseContentDraftMapper.updateById(courseContentDraft); - } - //4.返回课程新增dto - return CourseSaveVO - .builder() - .id(courseDraft.getId()) - .build(); - } - - @Override - public CourseBaseInfoVO getCourseBaseInfo(Long id, Boolean see) { - - CourseBaseInfoVO courseBaseInfoVO = null; - if (see) { - //1.查询课程信息 - Course course = courseMapper.selectById(id); - if (course != null) { - //1.1.查询课程对应的报名购买人数和退款人数 - CoursePurchaseInfoDTO coursePurchaseInfoDTO = tradeClient.getPurchaseInfoOfCourse(id); - //1.2.组装数据 - courseBaseInfoVO = BeanUtils.toBean(course, CourseBaseInfoVO.class); - //1.3.查询课程内容 - CourseContent courseContent = courseContentMapper.selectById(id); - //1.4.设置课程评分 - courseBaseInfoVO.setCoureScore(NumberUtils.div(NumberUtils.null2Zero(course.getScore()) * 1.0, 10, 2)); - //1.5.设置报名人数 - courseBaseInfoVO.setEnrollNum(coursePurchaseInfoDTO.getEnrollNum()); - //1.6.设置学习人数 - courseBaseInfoVO.setStudyNum(learningClient.countLearningLessonByCourse(id)); - //1.7.设置退款人数 - courseBaseInfoVO.setRefundNum(coursePurchaseInfoDTO.getRefundNum()); - //1.8.设置实付金额 - courseBaseInfoVO.setRealPayAmount(coursePurchaseInfoDTO.getRealPayAmount()); - //1.9.设置课程详情 - courseBaseInfoVO.setDetail(courseContent.getCourseDetail()); - //1.10.设置课程介绍 - courseBaseInfoVO.setIntroduce(courseContent.getCourseIntroduce()); - //1.11.设置课程适用人群 - courseBaseInfoVO.setUsePeople(courseContent.getUsePeople()); - //1.12.设置小节总数量 - courseBaseInfoVO.setCataTotalNum(course.getSectionNum()); - } - } - //2.查询草稿信息 - if (courseBaseInfoVO == null) { - //2.1.查询草稿课程信息 - CourseDraft courseDraft = baseMapper.selectById(id); - //2.2.有草稿课程信息 - if (courseDraft != null) { - //2.3.组装课程信息 - courseBaseInfoVO = BeanUtils.toBean(courseDraft, CourseBaseInfoVO.class); - //2.4.查询课程内容信息 - CourseContentDraft courseContentDraft = courseContentDraftMapper.selectById(id); - //2.5.设置课程详情 - courseBaseInfoVO.setDetail(courseContentDraft.getCourseDetail()); - //2.6.设置课程介绍 - courseBaseInfoVO.setIntroduce(courseContentDraft.getCourseIntroduce()); - //2.7.适用人群 - courseBaseInfoVO.setUsePeople(courseContentDraft.getUsePeople()); - //2.8.课程章节数 - courseBaseInfoVO.setCataTotalNum(courseDraft.getSectionNum()); - //2.9.设置课程评分 - courseBaseInfoVO.setCoureScore(0d); - //2.10.设置报名人数 - courseBaseInfoVO.setEnrollNum(0); - //2.11.设置学习人数 - courseBaseInfoVO.setStudyNum(0); - //2.12.设置退款人数 - courseBaseInfoVO.setRefundNum(0); - //2.13.设置实付金额 - courseBaseInfoVO.setRealPayAmount(0); - } - } - if(courseBaseInfoVO == null){ - return new CourseBaseInfoVO(); - } - - //3.查询创建者,更新者姓名 - List userDTOS = userClient.queryUserByIds( - Arrays.asList(courseBaseInfoVO.getCreater(), courseBaseInfoVO.getUpdater()) - .stream() - .distinct() - .collect(Collectors.toList()) - ); - if (CollUtils.isNotEmpty(userDTOS)) { - //3.1.创建者,更新至id+name映射关系 - Map operatorMap = userDTOS - .stream() - .collect(Collectors.toMap(UserDTO::getId, UserDTO::getName)); - //3.2.设置创建者姓名 - courseBaseInfoVO.setCreaterName(operatorMap.get(courseBaseInfoVO.getCreater())); - //3.3.设置更新者姓名 - courseBaseInfoVO.setUpdaterName(operatorMap.get(courseBaseInfoVO.getUpdater())); - } - - //4.课程分类信息 - List categories = categoryService.queryByIds( - Arrays.asList(courseBaseInfoVO.getFirstCateId(), - courseBaseInfoVO.getSecondCateId(), - courseBaseInfoVO.getThirdCateId())); - if (CollUtils.isNotEmpty(categories)) { - //4.1分类id和名称关系 - Map categoryIdAndName = categories - .stream() - .collect(Collectors.toMap(Category::getId, Category::getName)); - //4.2.设置课程分类名称 - courseBaseInfoVO.setCateNames( - StringUtils.format("{}/{}/{}", - categoryIdAndName.get(courseBaseInfoVO.getFirstCateId()), - categoryIdAndName.get(courseBaseInfoVO.getSecondCateId()), - categoryIdAndName.get(courseBaseInfoVO.getThirdCateId())) - ); - } - return courseBaseInfoVO; - } - - @Override - public void updateStep(Long id, Integer step) { - //1.查询课程草稿 - CourseDraft courseDraft = baseMapper.selectById(id); - CourseDraft updateCourseDraft = new CourseDraft(); - updateCourseDraft.setId(id); - updateCourseDraft.setCVersion(courseDraft.getCVersion() + 1); - //2.设置课程步骤,课程步骤只能前进不能后退 - if (courseDraft.getStep() < step) { - updateCourseDraft.setStep(step); - }else { - updateCourseDraft.setStep(courseDraft.getStep()); - } - //3.设置课时数,保存目录和保存题目两部进行修改 - if (CourseConstants.CourseStep.CATALOGUE == step || - CourseConstants.CourseStep.SUBJECT == step) { - //3.1题目保存和目录保存都会修改课时数量 - updateCourseDraft.setSectionNum(courseCatalogueDraftService.totalSectionNums(id)); - } - //4.更新課程狀態 - baseMapper.updateById(updateCourseDraft); - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public void upShelf(Long id) { - // 1.信息获取 - //1.1获取上架的课程草稿信息 - CourseDraft courseDraft = baseMapper.selectById(id); - //1.2获取课程信息 - Course course = courseMapper.selectById(id); - boolean isFirstUpShelf = (course == null); - - // 2.校验课程 - checkBeforeUpShelf(id); - - //3.计算每个章节的课时视频时长 - Map mediaDurations = courseCatalogueDraftService.calculateMediaDuration(id); - //3.1.计算课程视屏总时长 - int totalMediaDuration = mediaDurations - .values() - .stream() - .mapToInt(p -> p) - .sum(); - - - //4.草稿信息上架到正式环境 - //4.1课程老师信息 - courseTeacherDraftService.copyToShelf(id, isFirstUpShelf); - //4.2 题目信息上架 - courseCatalogueDraftService.copySubjectToShelf(id, isFirstUpShelf); - //4.3目录信息上架 - courseCatalogueDraftService.copyToShelf(id, isFirstUpShelf); - //4.4 组装课程基本信息、课程内容信息 - CourseContentDraft courseContentDraft = courseContentDraftMapper.selectById(id); - CourseContent courseContent = BeanUtils.toBean(courseContentDraft, CourseContent.class); - Course courseToShelf = BeanUtils.toBean(courseDraft, Course.class); - //4.4.1.课程视频总时长 - courseToShelf.setMediaDuration(totalMediaDuration); - //4.4.2.课程有效期月数 - courseToShelf.setValidDuration(courseDraft.getValidDuration()); - //4.4.3.课程发布时间 - courseToShelf.setPublishTime(DateUtils.now()); - //4.4.4.课程状态设置为已上架 - courseToShelf.setStatus(CourseStatus.SHELF.getStatus()); - //4.4.5.课程发布次数 - int publishTimes = (course == null) ? - 1 : NumberUtils.null2Zero(course.getPublishTimes()) + 1; - courseToShelf.setPublishTimes(publishTimes); - // 4.4.6.评分 - courseToShelf.setScore((int)(Math.random() * 10) + 40); - - //4.5.首次上架 - if (isFirstUpShelf) { - //4.5.1.插入课程内容信息 - int result = courseContentMapper.insert(courseContent); - if (result <= 0) { - throw new DbException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - //4.5.2.插入课程基本信息 - result = courseMapper.insert(courseToShelf); - if (result <= 0) { - throw new DbException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - //4.5.1.删除课程草稿基本信息 - baseMapper.deleteById(id); - //4.5.2.删除课程草稿内容信息 - courseContentDraftMapper.deleteById(id); - } else { - //4.6.再次上架 - //4.6.1.更新正式课程内容信息 - int result = courseContentMapper.updateById(courseContent); - if (result <= 0) { - throw new DbException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - //4.6.2.更新正式课程基本信息 - result = courseMapper.updateVariableById(courseToShelf); - if (result <= 0) { - throw new DbException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - //4.6.3.删除课程草稿基本信息 - baseMapper.deleteById(id); - //4.6.4.删除课程草稿内容信息 - courseContentDraftMapper.deleteById(id); - - } - //5.课程上架mq - rabbitMqHelper.sendAsyn(MqConstants.Exchange.COURSE_EXCHANGE, - MqConstants.Key.COURSE_UP_KEY, - id, - 200L); - } - - @Override - public void checkBeforeUpShelf(Long id) { - //1.获取上架的课程草稿信息 - CourseDraft courseDraft = baseMapper.selectById(id); - //1.1.获取课程信息 - Course course = courseMapper.selectById(id); - //2.课程校验 - //2.1.课程上架幂等校验 - if (courseDraft == null && course != null) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_UP_SHELF_AREADY); - } - //2.2.课程id不存在的课程无法上架 - if (courseDraft == null && course == null) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_UP_SHELF_NOT_FOUND_COURSE); - - } - //2.3.草稿信息不完整无法上架 - if (courseDraft.getStep() != CourseConstants.CourseStep.TEACHER) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_UP_SHELF_INFO_INCOMPLETE); - } - //课程 - //2.4.已上架/已完结课程不能上架 - if (course != null && course.getStatus() != CourseStatus.DOWN_SHELF.getStatus()) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_UP_SHELF_STATE_WRONG); - } - //2.5.校验课程结束时间 - if(courseDraft.getPurchaseEndTime().isBefore(DateUtils.now())){ - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_UP_SHELF_PURCHASE_ILLEGAL); - } - //2.6.首次上架校验逻辑 - if (course == null) { - //2.5.1.统计同名的课程数量 - int sameNameNum = courseMapper.countSameName(courseDraft.getName()); - //2.5.2.有同名课程不能上架 - if (sameNameNum > 0) { - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_SAVE_NAME_EXISTS); - } - } - //2.7.校验课程目录 - courseCatalogueDraftService.checkCataInfoImplated(id); - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public void downShelf(Long id) { - //1.查询课程基本信息 - Course course = courseService.getById(id); - //1.1课程状态判断 - if (course == null || !course.getStatus().equals(CourseStatus.SHELF.getStatus())) { - throw new BizIllegalException(CourseErrorInfo.Msg.COURSE_DOWN_SHELF_FAILD); - } - //2.先更新课程状态 - courseService.updateStatus(id, CourseStatus.DOWN_SHELF.getStatus()); - //3.课程基本信息和内容信息copy到草稿中 - baseMapper.insertFromCourse(id); - //4.课程内容copy到草稿中 - courseContentDraftMapper.insertFromCourseContent(id); - //5.目录内容copy到草稿中 - courseCatalogueDraftMapper.insertFromCourseCatalogue(id); - //6.课程题目copy到草稿中 - copySubject2Draft(id); - //7.课程老师copy到草稿中 - courseTeacherDraftMapper.insertFromCourseTeacher(id); - //8.下架mq广播 - rabbitMqHelper.send(MqConstants.Exchange.COURSE_EXCHANGE, MqConstants.Key.COURSE_DOWN_KEY, id); - } - - @GlobalTransactional - public void copySubject2Draft(Long courseId) { - // 1.查询课程有关的小节信息 - List sectionIds = courseCatalogueDraftMapper.getSectionIdByCourseId(courseId); - if (CollUtils.isEmpty(sectionIds)) { - log.error("课程小节数据为空"); - return; - } - // 2.查询题目关系 - List qbs = examClient.queryQuestionIdsByBizIds(sectionIds); - if (CollUtils.isEmpty(qbs)) { - return; - } - List list = qbs.stream().map(q -> new CourseCataSubjectDraft() - .setCourseId(courseId).setCataId(q.getBizId()).setSubjectId(q.getQuestionId()) - ).collect(Collectors.toList()); - // 3.保存到草稿表 - courseCataSubjectDraftMapper.batchInsert(list); - } - - @Override - public CourseDTO getCourseDTOById(Long id) { - //1.查询课程草稿基础信息 - CourseDraft courseDraft = baseMapper.selectById(id); - //1.1.判空 - if (courseDraft == null) { - return new CourseDTO(); - } - //2.查询课程老师列表,并去序号的第一个 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseTeacherDraft.class) - .eq(CourseTeacherDraft::getCourseId, id) - .orderBy(true, false, CourseTeacherDraft::getCIndex) - .last(true, "limit 1"); - //2.1.查询课程老师信息 - CourseTeacherDraft courseTeacherDraft = courseTeacherDraftMapper.selectOne(queryWrapper); - //3.组装数据 - CourseDTO courseDTO = BeanUtils.toBean(courseDraft, CourseDTO.class); - //3.1.设置课程分类,一级、二级、三级课程分类 - courseDTO.setCategoryIdLv1(courseDraft.getFirstCateId()); - courseDTO.setCategoryIdLv2(courseDraft.getSecondCateId()); - courseDTO.setCategoryIdLv3(courseDraft.getThirdCateId()); - //3.2.设置课程视频播放总时长 - courseDTO.setDuration(courseDraft.getMediaDuration()); - //3.3.设置课程总小节数 - courseDTO.setSections(courseDraft.getSectionNum()); - //3.4.设置课程教师id - if (courseTeacherDraft != null) { - courseDTO.setTeacher(courseTeacherDraft.getTeacherId()); - } else { - courseDTO.setTeacher(0L); - } - - return courseDTO; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public void delete(Long id) { - //1.删除课程草稿 - baseMapper.deleteById(id); - //2.删除课程内容草稿 - courseContentDraftMapper.deleteById(id); - //3.删除课程题目关系草稿 - courseCataSubjectDraftMapper.deleteByCourseId(id); - //4.删除课程目录草稿 - courseCatalogueDraftMapper.deleteByCourseId(id, Arrays.asList( - CourseConstants.CataType.CHAPTER, - CourseConstants.CataType.SECTION, - CourseConstants.CataType.PRATICE - )); - //5.删除课程老师关系草稿 - courseTeacherDraftMapper.deleteByCourseId(id); - } - - @Override - public PageDTO queryForPage(CoursePageQuery coursePageQuery) { - //1.课程草稿分页查询条件 - LambdaQueryWrapper queryWrapper = - SqlWrapperUtils.toLambdaQueryWrapper(coursePageQuery, CourseDraft.class); - //1.1课程查询条件-更新时间 - queryWrapper.between( - ObjectUtils.isNotEmpty(coursePageQuery.getBeginTime()) && - ObjectUtils.isNotEmpty(coursePageQuery.getEndTime()), - CourseDraft::getUpdateTime, - coursePageQuery.getBeginTime(), - coursePageQuery.getEndTime()); - //1.2课程查询条件-搜索关键字 - queryWrapper.like(StringUtils.isNotEmpty(coursePageQuery.getKeyword()), - CourseDraft::getName, coursePageQuery.getKeyword()); - //1.3.分页查询查询数据 - Page page = page(coursePageQuery.toMpPage(), queryWrapper); - //1.4.分页查询结果判空 - if (CollUtils.isEmpty(page.getRecords())) { - return PageDTO.empty(page); - } - //2.组装数据查询 - //2.1.课程更新人id列表 - List updaterList = page.getRecords().stream() - .map(CourseDraft::getUpdater) - .collect(Collectors.toList()); - //2.2.查询更新人用户信息 - List userDTOS = userClient.queryUserByIds(updaterList); - //2.3.转化更新人用户id+name 映射关系 - Map updaterMap = - CollUtils.isEmpty(updaterList) ? - new HashMap<>() : userDTOS.stream().collect(Collectors.toMap(UserDTO::getId, UserDTO::getName)); - //2.4.查询课程分类列表 - List list = categoryService.list(); - //2.5.转化课程分类id+name映射关系 - Map categoryNameMap = - CollUtils.isEmpty(list) ? - new HashMap<>() : list.stream().collect(Collectors.toMap(Category::getId, Category::getName)); - //2.6.课程id列表 - List courseIdList = page.getRecords().stream().map(CourseDraft::getId).collect(Collectors.toList()); - //2.7.统计课程报名人数map - Map peoNumOfCourseMap = tradeClient.countEnrollNumOfCourse(courseIdList); - //3.数据封装 - return PageDTO.of(page, CoursePageVO.class, (course, coursePageVO) -> { - //3.1.拼接课程分类 - String categories = StringUtils.format("{}/{}/{}", - categoryNameMap.get(course.getFirstCateId()), - categoryNameMap.get(course.getSecondCateId()), - categoryNameMap.get(course.getThirdCateId())); - //3.2.设置课程分类 - coursePageVO.setCategories(categories); - //3.3.设置课程更新人 - coursePageVO.setUpdaterName(updaterMap.get(course.getUpdater())); - //3.4.设置课程报名人数 - coursePageVO.setSold(NumberUtils.null2Zero(peoNumOfCourseMap.get(course.getId()))); - //3.5.设置课程总课时数 - coursePageVO.setSections(course.getSectionNum()); - }); - } - - @Override - public NameExistVO checkName(String name, Long id) { - //1.课程草稿同名查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseDraft.class) - .eq(CourseDraft::getName, name) - .last(id != null, " and id !=" + id); - //2.统计同名课程数量 - Integer num = baseMapper.selectCount(queryWrapper); - //3.返回同名课程VO - return new NameExistVO(num > 0); - } - - @Override - public List queryExists(List idList) { - //1.查询草稿课程基础信息列表 - List courses = baseMapper.selectBatchIds(idList); - //1.1.草稿课程信息列表判空 - if (CollUtils.isEmpty(courses)) { - return null; - } - //2.组装数据 - return courses.stream() - .map(CourseDraft::getId) - .collect(Collectors.toList()); - } - - @Override - public Map countCourseNumOfCategory() { - //1.查询所有课程草稿 - List courses = baseMapper.selectList(null); - Map cateIdAndNumMap = new HashMap<>(); - //2.遍历统计每个课程分类拥有的课程数量 - for (CourseDraft course : courses) { - //2.1.统计一级课程分类课程数量 - Integer firstCateNum = cateIdAndNumMap.get(course.getFirstCateId()); - cateIdAndNumMap.put(course.getFirstCateId(), firstCateNum == null ? 1 : firstCateNum + 1); - //2.2.统计二级课程分类课程数量 - Integer secondCateNum = cateIdAndNumMap.get(course.getSecondCateId()); - cateIdAndNumMap.put(course.getSecondCateId(), secondCateNum == null ? 1 : secondCateNum + 1); - //2.3.统计三级课程分类课程数量 - Integer thirdCateNum = cateIdAndNumMap.get(course.getThirdCateId()); - cateIdAndNumMap.put(course.getThirdCateId(), thirdCateNum == null ? 1 : thirdCateNum + 1); - } - return cateIdAndNumMap; - } - - private void checkSameCourse(Long id, String name) { - //1.查询正式环境是否有同名课程 - int countSameNameNum = courseMapper.countSameName(name); - //1.1.同名课程数据判0 - if (countSameNameNum > 0) { //名称已经存在,提交时做双重校验 - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_SAVE_NAME_EXISTS); - } - //2.查询正式环境是否有同名课程 - countSameNameNum = baseMapper.countByNameAndId(name, id); - //2.1.同名课程数据判0 - if (countSameNameNum > 0) { - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_SAVE_NAME_EXISTS); - } - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseServiceImpl.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseServiceImpl.java deleted file mode 100644 index a0d836a..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseServiceImpl.java +++ /dev/null @@ -1,559 +0,0 @@ -package com.tianji.course.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.exam.ExamClient; -import com.tianji.api.client.learning.LearningClient; -import com.tianji.api.client.trade.TradeClient; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.api.dto.course.*; -import com.tianji.api.dto.leanring.LearningLessonDTO; -import com.tianji.api.dto.leanring.LearningRecordDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.*; -import com.tianji.course.constants.CourseErrorInfo; -import com.tianji.course.constants.CourseStatus; -import com.tianji.course.constants.RedisContants; -import com.tianji.course.domain.dto.CoursePageQuery; -import com.tianji.course.domain.dto.CourseSimpleInfoListDTO; -import com.tianji.course.domain.po.Category; -import com.tianji.course.domain.po.Category3PO; -import com.tianji.course.domain.po.Course; -import com.tianji.course.domain.po.CourseTeacher; -import com.tianji.course.domain.vo.*; -import com.tianji.course.mapper.CourseDraftMapper; -import com.tianji.course.mapper.CourseMapper; -import com.tianji.course.mapper.CourseTeacherMapper; -import com.tianji.course.service.*; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.annotation.Cacheable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - -/** - *

- * 草稿课程 服务实现类 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -@Service -@Slf4j -public class CourseServiceImpl extends ServiceImpl implements ICourseService { - - @Autowired - private CourseTeacherMapper courseTeacherMapper; - - @Autowired - private CourseDraftMapper courseDraftMapper; - - @Autowired - private ICourseDraftService courseDraftService; - - @Autowired - private RabbitMqHelper rabbitMqHelper; - - @Autowired - private ICourseCatalogueService courseCatalogueService; - - @Autowired - private ICourseTeacherService courseTeacherService; - - @Autowired - private ICategoryService categoryService; - - @Autowired - private UserClient userClient; - - @Autowired - private TradeClient tradeClient; - - @Autowired - private ExamClient examClient; - - @Autowired - private LearningClient learningClient; - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public void updateStatus(Long id, Integer status) { - //1.组装数据 - Course course = new Course(); - course.setId(id); - course.setStatus(status); - course.setUpdateTime(LocalDateTime.now()); - //2.更新数据 - int result = baseMapper.updateById(course); - //3.判断直接条数是1条 - if (result != 1) { - throw new DbException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - } - - @Override - public CourseDTO getCourseDTOById(Long id) { - // 1.查询课程信息 - Course course = baseMapper.selectById(id); - //1.1判空 - if (course == null) { - return null; - } - //2.教师查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseTeacher.class) - .eq(CourseTeacher::getCourseId, id) - .orderBy(true, false, CourseTeacher::getCIndex) - .last(true, "limit 1"); - // 2.查询教师 - List courseTeachers = courseTeacherMapper.selectList(queryWrapper); - - // 3.课程数据封装 - CourseDTO courseDTO = BeanUtils.toBean(course, CourseDTO.class); - //3.1.一级课程分类 - courseDTO.setCategoryIdLv1(course.getFirstCateId()); - //3.2.二级课程分类 - courseDTO.setCategoryIdLv2(course.getSecondCateId()); - //3.3.三级课程分类 - courseDTO.setCategoryIdLv3(course.getThirdCateId()); - //3.4.媒资信息 - courseDTO.setDuration(course.getMediaDuration()); - //3.5.课程发布时间 - courseDTO.setPublishTime(course.getCreateTime()); - //3.6.课程小节数量 - courseDTO.setSections(course.getSectionNum()); - //3.7.课程第一位老师 - if (CollUtils.isNotEmpty(courseTeachers)) { - courseDTO.setTeacher(courseTeachers.get(0).getTeacherId()); - } else { - courseDTO.setTeacher(0L); - } - - // 4.统计课程销量 - Map peoNumOfCourseMap = tradeClient.countEnrollNumOfCourse(CollUtils.singletonList(id)); - if (CollUtils.isNotEmpty(peoNumOfCourseMap)) { - courseDTO.setSold(peoNumOfCourseMap.getOrDefault(id, 0)); - } - //5.返回数据 - return courseDTO; - - } - - @Override - public void delete(Long id) { - //1.删除草稿信息 - courseDraftService.delete(id); - //2.发送删除草稿mq - rabbitMqHelper.send(MqConstants.Exchange.COURSE_EXCHANGE, MqConstants.Key.COURSE_DELETE_KEY, id); - } - - @Override - public List getSimpleInfoList(CourseSimpleInfoListDTO courseSimpleInfoListDTO) { - //1.课程查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(Course.class) - .in(CollUtils.isNotEmpty(courseSimpleInfoListDTO.getThirdCataIds()), - Course::getThirdCateId, courseSimpleInfoListDTO.getThirdCataIds()) - .in(CollUtils.isNotEmpty(courseSimpleInfoListDTO.getIds()), - Course::getId, courseSimpleInfoListDTO.getIds()); - //2.查询课程 - List courses = baseMapper.selectList(queryWrapper); - //3.课程信息转化 - return BeanUtils.copyList(courses, CourseSimpleInfoDTO.class); - } - - @Override - public List queryByCategoryIdAndLevel(Long categoryId, Integer level) { - //1.课程基本信息查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(Course.class) - .eq(level == 1, Course::getFirstCateId, categoryId) //一级课程分类 - .eq(level == 2, Course::getSecondCateId, categoryId) //二级课程分类 - .eq(level == 3, Course::getThirdCateId, categoryId);//三级课程分类 - //2.查询课程基本信息 - return baseMapper.selectList(queryWrapper); - } - - @Override - public NameExistVO checkName(String name, Long id) { - //1.正式课程同名课程数量 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(Course.class) - .eq(Course::getName, name) - .last(id != null, " and id !=" + id); - //2.统计数量 - Integer num = baseMapper.selectCount(queryWrapper); - if (num > 0) { - return NameExistVO.EXISTED; - } - //3.统计草稿课程同名数量 - return courseDraftService.checkName(name, id); - } - - @Override - public List queryExists(List idList, List statusList) { - //1.指定状态的课程id存在查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(Course.class) - .in(Course::getId, idList) - .in(Course::getStatus, statusList); - //2.根据条件查询课程 - List courses = baseMapper.selectList(queryWrapper); - if (CollUtils.isEmpty(courses)) { - return null; - } - //3.组装数据 - return courses.stream() - .map(Course::getId) - .collect(Collectors.toList()); - } - - @Override - public List queryCourseIdByName(String name) { - // 1.查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(Course.class) - .like(Course::getName, name); - // 2.查询数据 - List courses = baseMapper.selectList(queryWrapper); - // 3.转换出课程id列表 - return courses.stream() - .map(Course::getId) - .collect(Collectors.toList()); - } - - - @Override - public CourseAndSectionVO queryCourseAndCatalogById(Long courseId) { - // 1.获取当前用户 - Long userId = UserContext.getUser(); - // 2.查询课程详情 - CourseFullInfoDTO course = getInfoById(courseId, true, true); - if (course == null) { - return null; - } - // 3.组织VO - CourseAndSectionVO vo = new CourseAndSectionVO(); - vo.setId(courseId); - vo.setName(course.getName()); - vo.setSections(course.getSectionNum()); - vo.setCoverUrl(course.getCoverUrl()); - // 4.查询教师信息 - List teachers = userClient.queryUserByIds(course.getTeacherIds()); - if (CollUtils.isNotEmpty(teachers)) { - UserDTO teacher = teachers.get(0); - vo.setTeacherName(teacher.getName()); - vo.setTeacherIcon(teacher.getIcon()); - } - // 5.组装小节信息 - List catas = course.getChapters(); - List chapters = new ArrayList<>(catas.size()); - for (CatalogueDTO c : catas) { - ChapterVO cv = new ChapterVO(); - cv.setId(c.getId()); - cv.setName(c.getName()); - cv.setIndex(c.getIndex()); - cv.setMediaDuration(c.getMediaDuration()); - List sections = BeanUtils.copyToList(c.getSections(), SectionVO.class); - cv.setSections(sections); - chapters.add(cv); - } - vo.setChapters(chapters); - // 6.查询学习进度 - if (learningClient == null) { - return vo; - } - // 6.1.查询学习记录 - LearningLessonDTO lessonDTO = learningClient.queryLearningRecordByCourse(courseId); - if (lessonDTO == null) { - // 没有查询到课表信息,说明是免费试看,直接返回 - return vo; - } - vo.setLessonId(lessonDTO.getId()); - if (CollUtils.isEmpty(lessonDTO.getRecords())) { - // 有课表信息,但是没有学习记录,不用处理进度问题了,直接返回 - return vo; - } - List records = lessonDTO.getRecords(); - // 6.2.获取最近学习的记录。由于查询时按照学习时间排序,第一条记录就是最近学习的小节记录 - Long latestSectionId = lessonDTO.getLatestSectionId(); - if(latestSectionId == null) { - latestSectionId = records.get(0).getSectionId(); - } - vo.setLatestSectionId(latestSectionId); - // 6.3.处理记录为一个map - Map rMap = records.stream() - .collect(Collectors.toMap(LearningRecordDTO::getSectionId, r -> r)); - // 6.4.填充学习进度到章节中 - for (ChapterVO chapter : vo.getChapters()) { - for (SectionVO section : chapter.getSections()) { - LearningRecordDTO r = rMap.get(section.getId()); - if (r == null) continue; - section.setFinished(r.getFinished()); - section.setMoment(r.getMoment()); - } - } - return vo; - } - - @Override - public List countSubjectNumAndCourseNumOfTeacher(List teacherIds) { - // 1.统计数据 - // 1.1.老师id和课程数量(已上架、已下架、已过期) - Map teacherIdAndCourseNumMap = - IdAndNumDTO.toMap(baseMapper.countCourseNumOfTeacher(teacherIds)); - // 1.2.待上架 - Map teacherIdAndCourseNumMap2 = - IdAndNumDTO.toMap(courseDraftMapper.countCourseNumOfTeacher(teacherIds)); - // 1.3.统计老师的出题数量 - Map teacherIdAndSubjectNumMap = examClient.countSubjectNumOfTeacher(teacherIds); - - // 2.遍历老师id - List subNumAndCourseNumDTOS = new ArrayList<>(); - for (Long teacherId : teacherIds) { - subNumAndCourseNumDTOS.add(new SubNumAndCourseNumDTO( - //2.1.设置老师id - teacherId, - //2.2.设置老师课程数量 - NumberUtils.null2Zero(teacherIdAndCourseNumMap.get(teacherId)) + - NumberUtils.null2Zero(teacherIdAndCourseNumMap2.get(teacherId)), - //2.3.设置老师出题数量 - NumberUtils.null2Zero(teacherIdAndSubjectNumMap.get(teacherId)))); - } - return subNumAndCourseNumDTOS; - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) - public int courseFinished() { - //1.完结课程查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(Course.class) - .le(Course::getPurchaseEndTime, LocalDateTime.now()) - .in(Course::getStatus, - List.of(CourseStatus.DOWN_SHELF.getStatus(), - CourseStatus.SHELF.getStatus())); - - //1.2.查询完结课程 - List courses = baseMapper.selectList(queryWrapper); - //1.3.完结课程判空 - if (CollUtils.isEmpty(courses)) { - return 0; - } - //2.组装数据 - List updateCourses = new ArrayList<>(); - for (Course course : courses) { - Course updateCourse = new Course(); - //2.1.设置课程id - updateCourse.setId(course.getId()); - //2.2.设置课程状态-已完结 - updateCourse.setStatus(CourseStatus.FINISHED.getStatus()); - updateCourses.add(updateCourse); - } - //3.批量完结课程 - updateBatchById(updateCourses); - //4.发送课程完结mq - sendFinishedCourse(courses); - //5.清理草稿 - for (Course course: courses){ - courseDraftService.delete(course.getId()); - } - - return updateCourses.size(); - } - - @Override - @Cacheable(cacheNames = RedisContants.Formatter.STATISTICS_COURSE_NUM_CATE) - public Map countCourseNumOfCategory() { - //1.统计课程分类拥有已上架、已完成的课程数量 - Map nomalCourseNumOfCategory = - countNomalCourseNumOfCategory(); - //2.统计课程分类待上架,已下架的课程分类的数量 - Map draftCourseNumOfCategory = - courseDraftService.countCourseNumOfCategory(); - //3.两组数据聚合 - return CollUtils.union(nomalCourseNumOfCategory, draftCourseNumOfCategory); - } - - @Override - @Cacheable(cacheNames = RedisContants.Formatter.CATEGORY_ID_LIST_HAVE_COURSE) - public List getCategoryIdListWithCourse() { - // 1.查询条件 - List category3s = baseMapper.queryCategoryIdWithCourse(); - // 1.1.判空 - if(CollUtils.isEmpty(category3s)) { - return new ArrayList<>(); - } - // 2.将课程分类id设置到categoryIdList - List categoryIdList = new ArrayList<>(); - category3s.stream().forEach(category3->{ - category3.setId(categoryIdList); - }); - // 2.1.去重,并返回数据 - return categoryIdList.stream() - .distinct() - .collect(Collectors.toList()); - } - - @Override - public Integer countCourseNumOfCategory(Long categoryId) { - //1.课程统计条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(Course.class) - .or().eq(Course::getFirstCateId, categoryId) - .or().eq(Course::getSecondCateId, categoryId) - .or().eq(Course::getThirdCateId, categoryId); - //2.统计课程数量 - return baseMapper.selectCount(queryWrapper); - } - - @Override - public CourseFullInfoDTO getInfoById(Long id, boolean withCatalogue, boolean withTeachers) { - // 1.查询课程基本信息 - Course course = baseMapper.selectById(id); - if (course == null) { - throw new BadRequestException(CourseErrorInfo.Msg.COURSE_CHECK_NOT_EXISTS); - } - // 2.转换vo - CourseFullInfoDTO courseFullInfoDTO = BeanUtils.toBean(course, CourseFullInfoDTO.class); - - // 3.查询目录信息 - if (withCatalogue) { - courseFullInfoDTO.setChapters(courseCatalogueService.queryCourseCatalogues(id, true)); - } - // 4.查询教师信息 - if (withTeachers) { - courseFullInfoDTO.setTeacherIds(courseTeacherService.getTeacherIdOfCourse(id)); - } - return courseFullInfoDTO; - } - - @Override - public PageDTO queryForPage(CoursePageQuery coursePageQuery) { - //1.课程查询条件 - LambdaQueryWrapper queryWrapper = - SqlWrapperUtils.toLambdaQueryWrapper(coursePageQuery, Course.class); - //1.1.课程条件-更新时间 - queryWrapper.between( - ObjectUtils.isNotEmpty(coursePageQuery.getBeginTime()) - && ObjectUtils.isNotEmpty(coursePageQuery.getEndTime()), - Course::getUpdateTime, - coursePageQuery.getBeginTime(), - coursePageQuery.getEndTime()); - //1.2.课程查询条件-名称 - queryWrapper.like( - StringUtils.isNotEmpty(coursePageQuery.getKeyword()), - Course::getName, - coursePageQuery.getKeyword()); - //1.3.分页查询数据 - Page page = page(coursePageQuery.toMpPage(), queryWrapper); - //1.4.分页数据判空 - if (CollUtils.isEmpty(page.getRecords())) { - return PageDTO.empty(page); - } - //2.课程更新人id列表 - List updaterList = page - .getRecords() - .stream() - .map(Course::getUpdater) - .collect(Collectors.toList()); - //2.1查询更新人用户信息 - List userDTOS = userClient.queryUserByIds(updaterList); - //2.2.转化课程更新人id+name map - Map updaterMap = - CollUtils.isEmpty(updaterList) ? - new HashMap<>() - : userDTOS - .stream() - .collect(Collectors.toMap(UserDTO::getId, UserDTO::getName)); - //3.获取所有课程分类信息 - List list = categoryService.list(); - //3.1.转化课程分类id+name map关系 - Map categoryNameMap = - CollUtils.isEmpty(list) ? - new HashMap<>() - : list.stream() - .collect(Collectors.toMap(Category::getId, Category::getName)); - //4.课程id列表 - List courseIdList = page - .getRecords() - .stream() - .map(Course::getId) - .collect(Collectors.toList()); - //4.1.统计每个课程报名人数map关系 - Map peoNumOfCourseMap = tradeClient.countEnrollNumOfCourse(courseIdList); - //5.组装数据 - return PageDTO.of(page, CoursePageVO.class, (course, coursePageVO) -> { - //5.1.拼接课程分类名称 - String categories = StringUtils.format("{}/{}/{}", - categoryNameMap.get(course.getFirstCateId()), - categoryNameMap.get(course.getSecondCateId()), - categoryNameMap.get(course.getThirdCateId())); - //5.2.设置课程分类名称 - coursePageVO.setCategories(categories); - //5.3.设置课程更新人姓名 - coursePageVO.setUpdaterName(updaterMap.get(course.getUpdater())); - //5.4.设置课程报名人数 - coursePageVO.setSold(NumberUtils.null2Zero(peoNumOfCourseMap.get(course.getId()))); - //5.5.设置课程小节数 - coursePageVO.setSections(course.getSectionNum()); - }); - } - - /** - * 异步发送课程完结mq - * - * @param finishedCourse - */ - private void sendFinishedCourse(List finishedCourse) { - //1.遍历发送课程完结mq - for (Course course : finishedCourse) { - rabbitMqHelper.sendAsyn(MqConstants.Exchange.COURSE_EXCHANGE, - MqConstants.Key.COURSE_EXPIRE_KEY, - course.getId()); - } - } - - /** - * 统计课程分类上架和已完结课程的数量 - * - * @return - */ - private Map countNomalCourseNumOfCategory() { - //1.查询条件 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.in(Course::getStatus, - Arrays.asList(CourseStatus.SHELF.getStatus(), CourseStatus.FINISHED.getStatus())); - //2.查询数据 - List courses = baseMapper.selectList(queryWrapper); - Map cateIdAndNumMap = new HashMap<>(); - //3.统计每个分类的课程数量 - for (Course course : courses) { - //3.1一级分类数量 - Integer firstCateNum = cateIdAndNumMap.get(course.getFirstCateId()); - cateIdAndNumMap.put(course.getFirstCateId(), firstCateNum == null ? 1 : firstCateNum + 1); - //3.2二级分类数量 - Integer secondCateNum = cateIdAndNumMap.get(course.getSecondCateId()); - cateIdAndNumMap.put(course.getSecondCateId(), secondCateNum == null ? 1 : secondCateNum + 1); - //3.3三级分类数量够 - Integer thirdCateNum = cateIdAndNumMap.get(course.getThirdCateId()); - cateIdAndNumMap.put(course.getThirdCateId(), thirdCateNum == null ? 1 : thirdCateNum + 1); - } - return cateIdAndNumMap; - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseTeacherDraftServiceImpl.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseTeacherDraftServiceImpl.java deleted file mode 100644 index b42fa8e..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseTeacherDraftServiceImpl.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.tianji.course.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.course.constants.CourseConstants; -import com.tianji.course.domain.dto.CourseTeacherSaveDTO; -import com.tianji.course.domain.po.CourseTeacher; -import com.tianji.course.domain.po.CourseTeacherDraft; -import com.tianji.course.domain.vo.CourseTeacherVO; -import com.tianji.course.mapper.CourseTeacherDraftMapper; -import com.tianji.course.service.ICourseDraftService; -import com.tianji.course.service.ICourseTeacherDraftService; -import com.tianji.course.service.ICourseTeacherService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - *

- * 课程老师关系表草稿 服务实现类 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -@Service -public class CourseTeacherDraftServiceImpl extends ServiceImpl implements ICourseTeacherDraftService { - - @Autowired - private ICourseDraftService courseDraftService; - - @Autowired - private ICourseTeacherService courseTeacherService; - - @Autowired - private UserClient userClient; - - @Override - @Transactional(propagation = Propagation.REQUIRED) - public void save(CourseTeacherSaveDTO courseTeacherSaveDTO) { - - //1.数据删除条件 - LambdaUpdateWrapper updateWrapper = - Wrappers.lambdaUpdate(CourseTeacherDraft.class) - .eq(CourseTeacherDraft::getCourseId, courseTeacherSaveDTO.getId()); - //1.1.数据删除 - baseMapper.delete(updateWrapper); - - //2.组装即将插入的数据 - List courseTeacherDrafts = - BeanUtils.copyList(courseTeacherSaveDTO.getTeachers(), - CourseTeacherDraft.class, (teacherInfo, teacherDraft) -> { - //2.1.设置课程id - teacherDraft.setCourseId(courseTeacherSaveDTO.getId()); - //2.2.设置老师id - teacherDraft.setTeacherId(teacherInfo.getId()); - //2.3.设置课程中老师排序 - teacherDraft.setCIndex(courseTeacherSaveDTO.getTeachers().indexOf(teacherInfo)); - }); - //3.批量插入课程的老师信息 - saveBatch(courseTeacherDrafts); - //4.更新课程填写进度 - courseDraftService.updateStep(courseTeacherSaveDTO.getId(), CourseConstants.CourseStep.TEACHER); - } - - @Override - public List queryTeacherOfCourse(Long courseId, Boolean see) { - if (see) { - //1.查询课程老师关系 - List courseTeacherVOS = courseTeacherService.queryTeachers(courseId); - //1.1.课程老师关系判非空 - if (CollUtils.isNotEmpty(courseTeacherVOS)) { - return courseTeacherVOS; - } - //2.查询草稿中的课程老师关系 - courseTeacherVOS = queryTeachers(courseId); - //3.组装数据 - return CollUtils.isEmpty(courseTeacherVOS) ? new ArrayList<>() : courseTeacherVOS; - } else { - //4.查询草稿中的课程老师关系 - return queryTeachers(courseId); - } - } - - @Override - @Transactional(rollbackFor = {DbException.class, Exception.class}) - public void copyToShelf(Long courseId, Boolean isFirstShelf) { - //1.先将草稿中的数据查出来 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(CourseTeacherDraft::getCourseId, courseId); - List courseTeacherDrafts = baseMapper.selectList(queryWrapper); - //2.删除架上的老师数据, - if (!isFirstShelf) { - courseTeacherService.deleteByCourseId(courseId); - } - //3.将草稿上架 - List courseTeachers = BeanUtils.copyList(courseTeacherDrafts, CourseTeacher.class); - courseTeacherService.saveOrUpdateBatch(courseTeachers); - //4.删除草稿 - if (baseMapper.deleteByCourseId(courseId) <= 0) { - throw new DbException(ErrorInfo.Msg.DB_DELETE_EXCEPTION); - } - } - - private List queryTeachers(Long couserId) { - - //1.查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseTeacherDraft.class) - .eq(CourseTeacherDraft::getCourseId, couserId); - //1.1.查询数据 - List courseTeacherDrafts = baseMapper.selectList(queryWrapper); - //1.2.数据判空 - if (CollUtils.isEmpty(courseTeacherDrafts)) { - return new ArrayList<>(); - } - - // 2.查询教师详细信息 - List UserDTOS = userClient.queryUserByIds( - courseTeacherDrafts.stream().map(CourseTeacherDraft::getTeacherId).collect(Collectors.toList())); - // 3.组织为map - Map UserDTOMap = UserDTOS.stream().collect(Collectors.toMap(UserDTO::getId, UserDTO -> UserDTO)); - - //4.数据组装 - return BeanUtils.copyList(courseTeacherDrafts, CourseTeacherVO.class, - (courseTeacher, courseTeacherVO) -> { - //4.1.老师信息 - UserDTO teacherDetailDTO = UserDTOMap.get(courseTeacher.getTeacherId()); - if (teacherDetailDTO != null) { - //4.2.设置老师形象照 - courseTeacherVO.setIcon(teacherDetailDTO.getIcon()); - courseTeacherVO.setPhoto(teacherDetailDTO.getPhoto()); - //4.3.设置老师姓名 - courseTeacherVO.setName(teacherDetailDTO.getName()); - //4.4.设置老师介绍 - courseTeacherVO.setIntroduce(teacherDetailDTO.getIntro()); - //4.5.设置老师职业 - courseTeacherVO.setJob(teacherDetailDTO.getJob()); - } - //4.6.设置老师id - courseTeacherVO.setId(courseTeacher.getTeacherId()); - }); - } - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseTeacherServiceImpl.java b/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseTeacherServiceImpl.java deleted file mode 100644 index 711ced7..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/service/impl/CourseTeacherServiceImpl.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.tianji.course.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.course.domain.po.CourseTeacher; -import com.tianji.course.domain.vo.CourseTeacherVO; -import com.tianji.course.mapper.CourseTeacherMapper; -import com.tianji.course.service.ICourseTeacherService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - *

- * 课程老师关系表草稿 服务实现类 - *

- * - * @author wusongsong - * @since 2022-07-20 - */ -@Service -public class CourseTeacherServiceImpl extends ServiceImpl implements ICourseTeacherService { - - @Autowired - private UserClient userClient; - - @Override - public List queryTeachers(Long couserId) { - //1.查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseTeacher.class) - .eq(CourseTeacher::getCourseId, couserId); - //2.查询数据 - List courseTeachers = baseMapper.selectList(queryWrapper); - //2.1.数据判空 - if (CollUtils.isEmpty(courseTeachers)) { - return null; - } - //3.查询教师信息 - List teacherDetailDTOS = - userClient.queryUserByIds( - courseTeachers - .stream() - .map(CourseTeacher::getTeacherId) - .collect(Collectors.toList())); - //3.1.教师id+教师信息map - Map teacherDetailDTOMap = - teacherDetailDTOS - .stream() - .collect(Collectors.toMap(UserDTO::getId, - TeacherDetailDTO -> TeacherDetailDTO)); - //4.组装数据 - return BeanUtils.copyList(courseTeachers, CourseTeacherVO.class, - (courseTeacher, courseTeacherVO) -> { - //4.1.教师信息 - UserDTO teacherDetailDTO = teacherDetailDTOMap.get(courseTeacher.getTeacherId()); - if (teacherDetailDTO != null) { - //4.2设置教师形象照 - courseTeacherVO.setIcon(teacherDetailDTO.getPhoto()); - //4.3设置教师姓名 - courseTeacherVO.setName(teacherDetailDTO.getName()); - //4.4.设置教师简介 - courseTeacherVO.setIntroduce(teacherDetailDTO.getIntro()); - //4.5.设置教师职业 - courseTeacherVO.setJob(teacherDetailDTO.getJob()); - } - //4.6.设置教师id - courseTeacherVO.setId(courseTeacher.getTeacherId()); - }); - } - - @Override - @Transactional(propagation = Propagation.REQUIRED, rollbackFor = {DbException.class, Exception.class}) - public void deleteByCourseId(Long courserId) { - //1.删除教师-课程关系 - if (baseMapper.deleteByCourseId(courserId) <= 0) { - throw new DbException(ErrorInfo.Msg.DB_DELETE_EXCEPTION); - } - } - - @Override - public List getTeacherIdOfCourse(Long courseId) { - //1.查询条件 - LambdaQueryWrapper queryWrapper = - Wrappers.lambdaQuery(CourseTeacher.class) - .eq(CourseTeacher::getCourseId, courseId) - .orderByAsc(CourseTeacher::getCIndex); - //2.查询数据 - List courseTeachers = baseMapper.selectList(queryWrapper); - //3.组装数据 - return CollUtils.isEmpty(courseTeachers) ? - new ArrayList<>() : courseTeachers - .stream() - .map(CourseTeacher::getTeacherId) - .collect(Collectors.toList()); - } - -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/utils/CategoryDataWrapper.java b/tianji-master/tj-course/src/main/java/com/tianji/course/utils/CategoryDataWrapper.java deleted file mode 100644 index 064ab72..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/utils/CategoryDataWrapper.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.course.utils; - -import com.tianji.common.utils.TreeDataUtils; -import com.tianji.course.domain.po.Category; -import com.tianji.course.domain.vo.SimpleCategoryVO; - -import java.util.List; - -/** - * @ClassName CategoryDataWrapper - * @Author wusongsong - * @Date 2022/9/21 17:45 - * @Version - **/ -public class CategoryDataWrapper implements TreeDataUtils.DataProcessor { - - @Override - public Object getParentKey(Category category) { - return category.getParentId(); - } - - @Override - public Object getKey(Category category) { - return category.getId(); - } - - @Override - public Object getRootKey() { - return 0L; - } - - @Override - public List getChild(SimpleCategoryVO simpleCategoryVO) { - return simpleCategoryVO.getChildren(); - } - - @Override - public void setChild(SimpleCategoryVO parent, List child) { - parent.setChildren(child); - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/utils/CategoryDataWrapper2.java b/tianji-master/tj-course/src/main/java/com/tianji/course/utils/CategoryDataWrapper2.java deleted file mode 100644 index 153fc4d..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/utils/CategoryDataWrapper2.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.course.utils; - -import com.tianji.common.utils.TreeDataUtils; -import com.tianji.course.domain.po.Category; -import com.tianji.course.domain.vo.CategoryVO; - -import java.util.List; - -/** - * @ClassName CategoryDataWrapper2 - * @Author wusongsong - * @Date 2022/9/21 19:44 - * @Version - **/ -public class CategoryDataWrapper2 implements TreeDataUtils.DataProcessor { - @Override - public Object getParentKey(Category category) { - return category.getParentId(); - } - - @Override - public Object getKey(Category category) { - return category.getId(); - } - - @Override - public Object getRootKey() { - return 0L; - } - - @Override - public List getChild(CategoryVO categoryVO) { - return categoryVO.getChildren(); - } - - @Override - public void setChild(CategoryVO parent, List child) { - parent.setChildren(child); - } -} diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/utils/CourseSaveBaseGroup.java b/tianji-master/tj-course/src/main/java/com/tianji/course/utils/CourseSaveBaseGroup.java deleted file mode 100644 index 28ac08c..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/utils/CourseSaveBaseGroup.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.tianji.course.utils; - -/** - * 用于校验课程分组的基本信息, - * @ClassName CourseSaveBaseGroup - * @Author wusongsong - * @Date 2022/7/18 21:04 - * @Version - **/ -public interface CourseSaveBaseGroup { -} \ No newline at end of file diff --git a/tianji-master/tj-course/src/main/java/com/tianji/course/utils/SubjectUtils.java b/tianji-master/tj-course/src/main/java/com/tianji/course/utils/SubjectUtils.java deleted file mode 100644 index 3a5a75b..0000000 --- a/tianji-master/tj-course/src/main/java/com/tianji/course/utils/SubjectUtils.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.tianji.course.utils; - -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.ObjectUtils; -import com.tianji.common.utils.ReflectUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.course.domain.po.Subject; - -import java.util.ArrayList; -import java.util.List; - -/** - * 题目工具类 - * - * @ClassName SubjectUtils - * @Author wusongsong - * @Date 2022/7/15 17:13 - * @Version - **/ -public class SubjectUtils { - - /** - * 将选项列表中的选项设置到题目中 - * - * @param subject 题目 - * @param options 选项 - */ - public static void setOptions(Subject subject, List options) { - if (CollUtils.isNotEmpty(options)) { - for (int count = 0; count < options.size(); count++) { - ReflectUtils.setFieldValue(subject, "option" + (count + 1), options.get(count)); - } - } - } - - /** - * 从题目中获取选项 - * - * @param subject 题目 - * @return 选项 - */ - public static List getOptions(Subject subject) { - List options = new ArrayList<>(); - for (int count = 1; count <= 10; count++) { - Object option = ReflectUtils.getFieldValue(subject, "option" + count); - if (ObjectUtils.isEmpty(option) || StringUtils.isEmpty((String)option)) { - return options; - } - options.add((String) option); - } - return options; - } -} diff --git a/tianji-master/tj-course/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-course/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-course/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-course/src/main/resources/bootstrap-local.yml b/tianji-master/tj-course/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-course/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-course/src/main/resources/bootstrap.yml b/tianji-master/tj-course/src/main/resources/bootstrap.yml deleted file mode 100644 index 6a7a611..0000000 --- a/tianji-master/tj-course/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,40 +0,0 @@ -server: - port: 8086 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: course-service - main: - allow-circular-references: true - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - data-id: shared-spring.yaml # 共享spring配置 - - data-id: shared-redis.yaml # 共享redis配置 - - data-id: shared-mybatis.yaml # 共享mybatis配置 - - data-id: shared-logs.yaml # 共享日志配置 - - data-id: shared-feign.yaml # 共享feign配置 - - data-id: shared-mq.yaml # 共享MQ配置 - - data-id: shared-seata.yaml # 共享seata配置 - - data-id: shared-xxljob.yaml # 共享seata配置 -tj: - swagger: - enable: true - package-path: com.tianji.course.controller - title: 智汇云课堂 - 课程系统接口文档 - description: 该服务包含课程管理相关功能 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - enableResponseWrap: true - auth: - resource: - enable: false - jdbc: - database: tj_course diff --git a/tianji-master/tj-course/src/main/resources/mapper/AvailablePolicy.xml b/tianji-master/tj-course/src/main/resources/mapper/AvailablePolicy.xml deleted file mode 100644 index 9835dcf..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/AvailablePolicy.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - id, name, trailer, course_id, type, parent_catalogue_id, media_id, video_id, video_name, living_start_time, living_end_time, play_back, c_index, media_duration, dep_id, create_time, update_time, creater, updater - - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CouponCalculate.xml b/tianji-master/tj-course/src/main/resources/mapper/CouponCalculate.xml deleted file mode 100644 index e6e52b1..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CouponCalculate.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CourseCataSubjectDraftMapper.xml b/tianji-master/tj-course/src/main/resources/mapper/CourseCataSubjectDraftMapper.xml deleted file mode 100644 index 8be65a4..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CourseCataSubjectDraftMapper.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - id, course_id, cata_id, subject_id, create_time - - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CourseCataSubjectMapper.xml b/tianji-master/tj-course/src/main/resources/mapper/CourseCataSubjectMapper.xml deleted file mode 100644 index 65fccf2..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CourseCataSubjectMapper.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - id, course_id, cata_id, subject_id - - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CourseCatalogueMapper.xml b/tianji-master/tj-course/src/main/resources/mapper/CourseCatalogueMapper.xml deleted file mode 100644 index 83ed4f4..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CourseCatalogueMapper.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - id, name, trailer, course_id, type, parent_catalogue_id, media_id, video_id, video_name, living_start_time, living_end_time, play_back, media_duration, c_index, dep_id, create_time, update_time, creater, updater, deleted - - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CourseContentDraftMapper.xml b/tianji-master/tj-course/src/main/resources/mapper/CourseContentDraftMapper.xml deleted file mode 100644 index 6dc75dc..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CourseContentDraftMapper.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CourseContentMapper.xml b/tianji-master/tj-course/src/main/resources/mapper/CourseContentMapper.xml deleted file mode 100644 index be2ae29..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CourseContentMapper.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - id, course_introduce, use_people, course_detail, dep_id, create_time, update_time, creater, updater, deleted - - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CourseDraftMapper.xml b/tianji-master/tj-course/src/main/resources/mapper/CourseDraftMapper.xml deleted file mode 100644 index 75abd3f..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CourseDraftMapper.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - id, name, course_type, cover_url, first_cate_id, second_cate_id, third_cate_id, free, price, template_type, template_url, status, purchase_start_time, purchase_end_time, step, score, media_duration, valid_duration, section_num, can_update, dep_id, publish_time, create_time, update_time, creater, updater,c_version - - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CourseMapper.xml b/tianji-master/tj-course/src/main/resources/mapper/CourseMapper.xml deleted file mode 100644 index c35184f..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CourseMapper.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - id, name, course_type, cover_url, first_cate_id, second_cate_id, third_cate_id, free, price, template_type, template_url, status, purchase_start_time, purchase_end_time, step, score, media_duration, valid_duration, section_num, dep_id, publish_times, publish_time, create_time, update_time, creater, updater, deleted - - - - update course set status=#{po.status}, - cover_url=#{po.coverUrl}, - purchase_start_time=#{po.purchaseStartTime}, - purchase_end_time=#{po.purchaseEndTime}, - media_duration=#{po.mediaDuration}, - update_time=#{po.updateTime}, - updater=#{po.updater}, - publish_time=#{po.publishTime}, - publish_times=#{po.publishTimes}, - score=#{po.score}, - section_num=#{po.sectionNum} - where id=#{po.id} - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CourseSubjectMapper.xml b/tianji-master/tj-course/src/main/resources/mapper/CourseSubjectMapper.xml deleted file mode 100644 index 29ed6e8..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CourseSubjectMapper.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CourseTeacherDraftMapper.xml b/tianji-master/tj-course/src/main/resources/mapper/CourseTeacherDraftMapper.xml deleted file mode 100644 index 8288d24..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CourseTeacherDraftMapper.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - id, course_id, teacher_id, is_show, c_index, dep_id, create_time, update_time, creater, updater, deleted - - - diff --git a/tianji-master/tj-course/src/main/resources/mapper/CourseTeacherMapper.xml b/tianji-master/tj-course/src/main/resources/mapper/CourseTeacherMapper.xml deleted file mode 100644 index 6212b5c..0000000 --- a/tianji-master/tj-course/src/main/resources/mapper/CourseTeacherMapper.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - id, course_id, teacher_id, is_show, c_index, dep_id, create_time, update_time, creater, updater, deleted - - - diff --git a/tianji-master/tj-data/pom.xml b/tianji-master/tj-data/pom.xml deleted file mode 100644 index 83d8e57..0000000 --- a/tianji-master/tj-data/pom.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-data - - - 11 - 11 - - - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - com.tianji - tj-api - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-web - - - - com.baomidou - mybatis-plus-boot-starter - - - mysql - mysql-connector-java - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.redisson - redisson - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - org.springframework.boot - spring-boot-starter-amqp - - - - com.xuxueli - xxl-job-core - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - com.tianji.data.DataCenterApplication - - - - - \ No newline at end of file diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/DataCenterApplication.java b/tianji-master/tj-data/src/main/java/com/tianji/data/DataCenterApplication.java deleted file mode 100644 index a038d4b..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/DataCenterApplication.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.data; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@SpringBootApplication -@MapperScan("com.tianji.data.mapper") -@Slf4j -public class DataCenterApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(DataCenterApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - } -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/constants/DataTypeEnum.java b/tianji-master/tj-data/src/main/java/com/tianji/data/constants/DataTypeEnum.java deleted file mode 100644 index cde2668..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/constants/DataTypeEnum.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.tianji.data.constants; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * @ClassName DataTypeEnum - * @Author wusongsong - * @Date 2022/10/10 15:28 - * @Version - **/ -@AllArgsConstructor -@Getter -public enum DataTypeEnum { - - VISITS(1, "访问量", "次","bar"), - ORDER_AMOUNT(2, "订单金额", "元","bar"), - ORDER_NUM(3, "订单笔数", "笔","line"), - STU_NEW_NUM(4, "新增学员", "人","line"), - CUSTOMER_UNIT_PRICE(5, "客单价", "元","bar"), - STU_TOTAL_NUM(6, "学员总数", "人", "bar"), - DAILY_LIVING_NUM(7, "日活用户", "个", "bar"), - VISITOR_NUM(8, "访客数", "个", "bar"), - PURCHASE_NUM(9, "购买量", "笔", "line"), - NULL(null, null, null,null); - - private Integer type; - private String name; - private String unit; - private String axisType; - - public static DataTypeEnum get(Integer type){ - for (DataTypeEnum dataTypeEnum : values()){ - if(dataTypeEnum.getType().equals(type)){ - return dataTypeEnum; - } - } - return NULL; - } - - public String nameWithUnit(){ - return String.format("%s (%s)", name, unit); - } - - public static void main(String[] args) { - System.out.println(DataTypeEnum.ORDER_AMOUNT.nameWithUnit()); - } -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/constants/RedisConstants.java b/tianji-master/tj-data/src/main/java/com/tianji/data/constants/RedisConstants.java deleted file mode 100644 index fe46394..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/constants/RedisConstants.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.data.constants; - -/** - * @ClassName RedisConstants - * @Author wusongsong - * @Date 2022/10/10 17:02 - * @Version - **/ -public class RedisConstants { - - public static final String KEY_BOARD_DATA = "DATA:BORAD:"; - - public static final String KEY_TOP10 = "DATA:TOP10:"; - - public static final String KEY_TODAY = "DATA:TODAY:"; -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/controller/BoardController.java b/tianji-master/tj-data/src/main/java/com/tianji/data/controller/BoardController.java deleted file mode 100644 index b235855..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/controller/BoardController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.data.controller; - -import com.tianji.data.model.dto.BoardDataSetDTO; -import com.tianji.data.model.vo.EchartsVO; -import com.tianji.data.service.BoardService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - * @ClassName BoardController - * @Author wusongsong - * @Date 2022/10/10 11:27 - * @Version - **/ -@RestController -@RequestMapping("/data/board") -@Api(tags = "看板数据相关操作") -@Slf4j -public class BoardController { - - @Autowired - private BoardService boardService; - - @GetMapping("") - @ApiOperation("看板数据获取") - public EchartsVO boardData(@RequestParam("types") List types) { - return boardService.boardData(types); - } - - @PutMapping("set") - @ApiOperation("看板数据设置") - public void setBoardData(@Validated @RequestBody BoardDataSetDTO boardDataSetDTO) { - boardService.setBoardData(boardDataSetDTO); - } -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/controller/TodayDataController.java b/tianji-master/tj-data/src/main/java/com/tianji/data/controller/TodayDataController.java deleted file mode 100644 index 1cb19ab..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/controller/TodayDataController.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.data.controller; - - -import com.tianji.data.model.dto.TodayDataDTO; -import com.tianji.data.model.vo.TodayDataVO; -import com.tianji.data.service.TodayDataService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -/** - * 今日数据 - * @ClassName TodayDataController - * @Author wusongsong - * @Date 2022/10/13 9:21 - * @Version - **/ -@RestController -@RequestMapping("/data/today") -@Api(tags = "今日数据相关接口") -public class TodayDataController { - - @Autowired - private TodayDataService todayDataService; - - @GetMapping("") - @ApiOperation("获取今日数据") - public TodayDataVO get(){ - return todayDataService.get(); - } - - @PutMapping("set") - @ApiOperation("设置线上数据") - public void set(@RequestBody TodayDataDTO todayDataDTO) { - todayDataService.set(todayDataDTO); - } -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/controller/Top10Controller.java b/tianji-master/tj-data/src/main/java/com/tianji/data/controller/Top10Controller.java deleted file mode 100644 index bf39bfa..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/controller/Top10Controller.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.data.controller; - -import com.tianji.data.model.dto.Top10DataSetDTO; -import com.tianji.data.model.vo.Top10DataVO; -import com.tianji.data.service.Top10Service; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -/** - * @ClassName Top10Controller - * @Author wusongsong - * @Date 2022/10/10 19:27 - * @Version - **/ -@RestController -@Api(tags = "工作台top10数据相关接口") -@RequestMapping("/data/top10") -public class Top10Controller { - - @Autowired - private Top10Service top10Service; - - @GetMapping("") - @ApiOperation("top10数据获取") - public Top10DataVO getTop10Data() { - return top10Service.getTop10Data(); - } - - @PutMapping("set") - @ApiOperation("设置top10数据") - public void setTop10Data(@RequestBody @Validated Top10DataSetDTO top10DataSetDTO) { - top10Service.setTop10Data(top10DataSetDTO); - } - -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/BoardDataSetDTO.java b/tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/BoardDataSetDTO.java deleted file mode 100644 index b775d4f..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/BoardDataSetDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.data.model.dto; - -import lombok.Data; - -import javax.validation.constraints.Max; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.List; - -/** - * @ClassName BoardDataSetDTO - * @Author wusongsong - * @Date 2022/10/10 19:14 - * @Version - **/ -@Data -public class BoardDataSetDTO { - @NotNull(message = "版本") - private Integer version; - @NotNull(message = "数据类型不能为空") - @Min(value = 1, message = "数据类型1-9") - @Max(value = 9, message = "数据类型1-9") - private Integer type; - @NotNull(message = "设置数据不能为空") - @Size(min = 15, max = 15, message = "需要设置15天的数据") - private List data; -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/TodayDataDTO.java b/tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/TodayDataDTO.java deleted file mode 100644 index c449c63..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/TodayDataDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.data.model.dto; - -import lombok.Data; - -/** - * @ClassName TodayDataVO - * @Author wusongsong - * @Date 2022/10/13 9:23 - * @Version - **/ -@Data -public class TodayDataDTO { - private Integer version; - //访问量,万次单位 - private Double visits; - //今日订单金额,万元单位 - private Double orderAmount; - //今日订单笔数 - private Integer orderNum; - //今日新增学员数 - private Integer stuNewNum; -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/Top10DataSetDTO.java b/tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/Top10DataSetDTO.java deleted file mode 100644 index 9d0a2a6..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/model/dto/Top10DataSetDTO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tianji.data.model.dto; - -import lombok.Data; -import org.springframework.validation.annotation.Validated; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.List; - -/** - * @ClassName Top10DataSetDTO - * @Author wusongsong - * @Date 2022/10/10 19:57 - * @Version - **/ -@Data -@Validated -public class Top10DataSetDTO { - private Integer version = 0; - @Size(min = 10, message = "数据最少设置10个") - private List data; - - @Data - @Validated - public static class Top10DataSetUnitDTO { - @NotNull(message = "分类名称不能为空") - private String category; - @NotNull(message = "课程名称不能为空") - private String name; - @NotNull(message = "新增学员人数不能为空") - private Integer newStuNum; - @NotNull(message = "订单金额不能为空") - private Double orderAmount; - } -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/model/po/CourseInfo.java b/tianji-master/tj-data/src/main/java/com/tianji/data/model/po/CourseInfo.java deleted file mode 100644 index 59ed371..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/model/po/CourseInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.data.model.po; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @ClassName CourseInfo - * @Author wusongsong - * @Date 2022/10/10 19:33 - * @Version - **/ -@Data -public class CourseInfo implements Serializable { - private String category; - private String name; - private Integer newStuNum; - private Double orderAmount; -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/model/po/TodayDataInfo.java b/tianji-master/tj-data/src/main/java/com/tianji/data/model/po/TodayDataInfo.java deleted file mode 100644 index 8a9d176..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/model/po/TodayDataInfo.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.data.model.po; - -import lombok.Data; - -/** - * @ClassName TodayDataVO - * @Author wusongsong - * @Date 2022/10/13 9:23 - * @Version - **/ -@Data -public class TodayDataInfo { - //访问量,万次单位 - private Double visits; - //今日订单金额,万元单位 - private Double orderAmount; - //今日订单笔数 - private Integer orderNum; - //今日新增学员数 - private Integer stuNewNum; -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/AxisVO.java b/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/AxisVO.java deleted file mode 100644 index d897a1d..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/AxisVO.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.tianji.data.model.vo; - -import com.tianji.common.utils.DateUtils; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * @ClassName AxisVO - * @Author wusongsong - * @Date 2022/10/10 10:55 - * @Version - **/ -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class AxisVO { - - //数值轴 - public static final String TYPE_VALUE = "value"; - //类目轴 - public static final String TYPE_CATEGORY = "category"; - //时间轴 - public static final String TYPE_TIME = "time"; - //对数轴 - public static final String TYPE_LOG = "log"; - - private String type; - //最大值 带单位 - private Double max; - //最小值 带单位 - private Double min; - //平均值不带单位 - private Double average; - // 数据 - private List data; - //interval - private Double interval; - - - public static AxisVO last15Day() { - - return new AxisVO( - TYPE_CATEGORY, - null, - null, - null, - DateUtils.last15Day(), - null - ); - } - -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/EchartsVO.java b/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/EchartsVO.java deleted file mode 100644 index 2e7e027..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/EchartsVO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.data.model.vo; - -import lombok.Data; - -import java.util.List; - -/** - * echartVO - * @ClassName EchartsVO - * @Author wusongsong - * @Date 2022/10/10 10:52 - * @Version - **/ -@Data -public class EchartsVO { - private List xAxis; - private List yAxis; - private List series; -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/SerierVO.java b/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/SerierVO.java deleted file mode 100644 index f9dac2c..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/SerierVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.data.model.vo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -/** - * @ClassName SerieVO - * @Author wusongsong - * @Date 2022/10/10 11:03 - * @Version - **/ -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class SerierVO { - - //折线图 - public static final String TYPE_LINE = "line"; - //柱状图 - public static final String TYPE_BAR = "bar"; - //饼图 - public static final String TYPE_PIE = "pie"; - - private String name; - private String type; - private List data; - private String max; - private String min; - - -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/TodayDataVO.java b/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/TodayDataVO.java deleted file mode 100644 index 9605820..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/TodayDataVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.data.model.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * @ClassName TodayDataVO - * @Author wusongsong - * @Date 2022/10/13 9:23 - * @Version - **/ -@Data -public class TodayDataVO { - @ApiModelProperty("访问量,万次单位") - private Double visits; - @ApiModelProperty("今日订单金额,万元单位") - private Double orderAmount; - @ApiModelProperty("今日订单笔数") - private Integer orderNum; - @ApiModelProperty("今日新增学员数") - private Integer stuNewNum; -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/Top10DataVO.java b/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/Top10DataVO.java deleted file mode 100644 index 4128493..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/model/vo/Top10DataVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.data.model.vo; - -import com.tianji.data.model.po.CourseInfo; -import lombok.Data; - -import java.util.List; - -/** - * @ClassName Top10DataVO - * @Author wusongsong - * @Date 2022/10/10 19:33 - * @Version - **/ -@Data -public class Top10DataVO { - // 热门课程 - private List hot; - // 热销课程 - private List hotSales; -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/service/BoardService.java b/tianji-master/tj-data/src/main/java/com/tianji/data/service/BoardService.java deleted file mode 100644 index 652c207..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/service/BoardService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.data.service; - - -import com.tianji.data.model.dto.BoardDataSetDTO; -import com.tianji.data.model.vo.EchartsVO; - -import java.util.List; - -/** - * @ClassName BoardService - * @Author wusongsong - * @Date 2022/10/10 16:30 - * @Version - **/ -public interface BoardService { - - /** - * 看板数据获取 - * - * @param types 数据类型 - * @return - */ - EchartsVO boardData(List types); - - /** - * 设置看板数据 - * - * @param boardDataSetDTO - */ - void setBoardData(BoardDataSetDTO boardDataSetDTO); -} \ No newline at end of file diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/service/TodayDataService.java b/tianji-master/tj-data/src/main/java/com/tianji/data/service/TodayDataService.java deleted file mode 100644 index 250a8df..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/service/TodayDataService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.data.service; - - -import com.tianji.data.model.dto.TodayDataDTO; -import com.tianji.data.model.vo.TodayDataVO; - -/** - * @author wusongsong - * @since 2022/10/13 9:27 - **/ -public interface TodayDataService { - - /** - * 获取今日数据 - * @return - */ - TodayDataVO get(); - - /** - * 设置今日数据 - * @param todayDataDTO - */ - void set(TodayDataDTO todayDataDTO); -} \ No newline at end of file diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/service/Top10Service.java b/tianji-master/tj-data/src/main/java/com/tianji/data/service/Top10Service.java deleted file mode 100644 index 028964c..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/service/Top10Service.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.data.service; - - -import com.tianji.data.model.dto.Top10DataSetDTO; -import com.tianji.data.model.vo.Top10DataVO; - -/** - * @author wusongsong - * @since 2022/10/10 19:39 - **/ -public interface Top10Service { - - /** - * 获取top数据 - * - * @return - */ - Top10DataVO getTop10Data(); - - /** - * top 10数据设置 - * @param top10DataSetDTO - */ - void setTop10Data(Top10DataSetDTO top10DataSetDTO); -} \ No newline at end of file diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/BoardServiceImpl.java b/tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/BoardServiceImpl.java deleted file mode 100644 index 4d3fb64..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/BoardServiceImpl.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.tianji.data.service.impl; - -import com.tianji.common.utils.JsonUtils; -import com.tianji.common.utils.NumberUtils; -import com.tianji.data.constants.DataTypeEnum; -import com.tianji.data.model.dto.BoardDataSetDTO; -import com.tianji.data.model.vo.AxisVO; -import com.tianji.data.model.vo.EchartsVO; -import com.tianji.data.model.vo.SerierVO; -import com.tianji.data.service.BoardService; -import com.tianji.data.utils.DataUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import static com.tianji.data.constants.RedisConstants.KEY_BOARD_DATA; - -/** - * @ClassName BoardServiceImpl - * @Author wusongsong - * @Date 2022/10/10 16:32 - * @Version - **/ -@Service -public class BoardServiceImpl implements BoardService { - - @Autowired - private StringRedisTemplate redisTemplate; - - @Override - public EchartsVO boardData(List types) { - // 1.定义echarts变量 - EchartsVO echartsVO = new EchartsVO(); - List yAxis = new ArrayList<>(); - List series = new ArrayList<>(); - // 2.遍历数据类型types - // 2.1.数据版本 - int version = DataUtils.getVersion(1); - - for (Integer type : types) { - // 2.1.获取数据类型 - DataTypeEnum dataTypeEnum = DataTypeEnum.get(type); - // 2.2.获取数据 - Object originData = redisTemplate.opsForHash().get(KEY_BOARD_DATA + version, type.toString()); - List data = originData == null - ? new ArrayList<>() - : JsonUtils.toList(originData.toString(), Double.class); - // 2.3.计算最大最小值 - Double max = NumberUtils.null2Zero(NumberUtils.max(data)); - Double min = NumberUtils.null2Zero(NumberUtils.min(data)); - // 2.2.设置数据 - series.add(new SerierVO( - dataTypeEnum.nameWithUnit(), - dataTypeEnum.getAxisType(), - data, - max + dataTypeEnum.getUnit(), - min + dataTypeEnum.getUnit() - )); - // 2.3.设置y轴数据 - yAxis.add(AxisVO.builder() - .max(max) - .min(NumberUtils.setScale(min * 0.9)) - .interval(((int)NumberUtils.div((max - min * 0.9), 10.0) + 1) * 1.0) - .average( - NumberUtils.setScale(NumberUtils.null2Zero(NumberUtils.average(data)))) - .type(AxisVO.TYPE_VALUE) - .build()); - } - // 3.封装数据 - // 3.1.x轴数据 - echartsVO.setXAxis(Collections.singletonList(AxisVO.last15Day())); - // 3.2.y轴数据 - echartsVO.setYAxis(yAxis); - // 3.3.series数据 - echartsVO.setSeries(series); - return echartsVO; - } - - @Override - public void setBoardData(BoardDataSetDTO boardDataSetDTO) { - String key = KEY_BOARD_DATA + boardDataSetDTO.getVersion(); - redisTemplate.opsForHash() - .put(key, - boardDataSetDTO.getType().toString(), - JsonUtils.toJsonStr(boardDataSetDTO.getData())); - } -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/TodayDataServiceImpl.java b/tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/TodayDataServiceImpl.java deleted file mode 100644 index 98cd7c4..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/TodayDataServiceImpl.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.tianji.data.service.impl; - -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.JsonUtils; -import com.tianji.data.constants.RedisConstants; -import com.tianji.data.model.dto.TodayDataDTO; -import com.tianji.data.model.po.TodayDataInfo; -import com.tianji.data.model.vo.TodayDataVO; -import com.tianji.data.service.TodayDataService; -import com.tianji.data.utils.DataUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; - -/** - * @ClassName TodayDataServiceImpl - * @Author wusongsong - * @Date 2022/10/13 9:28 - * @Version - **/ -@Service -public class TodayDataServiceImpl implements TodayDataService { - - @Autowired - private StringRedisTemplate redisTemplate; - - @Override - public TodayDataVO get() { - // 1.数据redis存储key - String key = RedisConstants.KEY_TODAY + DataUtils.getVersion(1); - // 2.获取数据 - Object originData = redisTemplate.opsForValue().get(key); - // 2.1.数据判空 - if (originData == null) { - return new TodayDataVO(); - } - return JsonUtils.toBean(originData.toString(), TodayDataVO.class); - } - - @Override - public void set(TodayDataDTO todayDataDTO) { - // 1.数据redis存储key - String key = RedisConstants.KEY_TODAY + todayDataDTO.getVersion(); - // 2.数据转化 - TodayDataInfo todayDataInfo = BeanUtils.toBean(todayDataDTO, TodayDataInfo.class); - // 3.数据存储 - redisTemplate.opsForValue().set(key, JsonUtils.toJsonStr(todayDataInfo)); - } -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/Top10ServiceImpl.java b/tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/Top10ServiceImpl.java deleted file mode 100644 index 1c83bdb..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/service/impl/Top10ServiceImpl.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.tianji.data.service.impl; - -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.JsonUtils; -import com.tianji.data.constants.RedisConstants; -import com.tianji.data.model.dto.Top10DataSetDTO; -import com.tianji.data.model.po.CourseInfo; -import com.tianji.data.model.vo.Top10DataVO; -import com.tianji.data.service.Top10Service; -import com.tianji.data.utils.DataUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; - -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @ClassName Top10ServiceImpl - * @Author wusongsong - * @Date 2022/10/10 19:46 - * @Version - **/ -@Service -public class Top10ServiceImpl implements Top10Service { - - @Autowired - private StringRedisTemplate redisTemplate; - - @Override - public Top10DataVO getTop10Data() { - // 1.数据redis存储key - String key = RedisConstants.KEY_TOP10 + DataUtils.getVersion(1); - // 2.获取数据 - Object originData = redisTemplate.opsForValue().get(key); - // 2.1.数据判空 - if (originData == null) { - return new Top10DataVO(); - } - // 3.数据转换成课程信息 - List data = JsonUtils.toList(originData.toString(), CourseInfo.class); - // 4.数据组装 - Top10DataVO top10DataVO = new Top10DataVO(); - // 4.1.设置热门课程 - top10DataVO.setHot(data.stream() - .sorted(Comparator.comparing(CourseInfo::getNewStuNum).reversed()) - .limit(10) - .collect(Collectors.toList())); - // 4.2.设置热销课程 - top10DataVO.setHotSales(data.stream() - .sorted(Comparator.comparing(CourseInfo::getOrderAmount).reversed()) - .limit(10) - .collect(Collectors.toList())); - return top10DataVO; - } - - @Override - public void setTop10Data(Top10DataSetDTO top10DataSetDTO) { - // 1.数据redis存储key - String key = RedisConstants.KEY_TOP10 + top10DataSetDTO.getVersion(); - // 2.数据转化 - List courseInfoList = BeanUtils.copyList(top10DataSetDTO.getData(), CourseInfo.class); - - //3.新增或重置数据 - redisTemplate.opsForValue().set( - key, - JsonUtils.toJsonStr(courseInfoList) - ); - } -} diff --git a/tianji-master/tj-data/src/main/java/com/tianji/data/utils/DataUtils.java b/tianji-master/tj-data/src/main/java/com/tianji/data/utils/DataUtils.java deleted file mode 100644 index 111cb4a..0000000 --- a/tianji-master/tj-data/src/main/java/com/tianji/data/utils/DataUtils.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.data.utils; - -import com.tianji.common.utils.DateUtils; -import lombok.extern.slf4j.Slf4j; - -/** - * @ClassName DataUtils - * @Author wusongsong - * @Date 2022/10/10 19:40 - * @Version - **/ -@Slf4j -public class DataUtils { - - public static int getVersion(int totalVersion) { - return DateUtils.now().getDayOfMonth() % totalVersion; - } -} diff --git a/tianji-master/tj-data/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-data/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-data/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-data/src/main/resources/bootstrap-local.yml b/tianji-master/tj-data/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-data/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-data/src/main/resources/bootstrap.yml b/tianji-master/tj-data/src/main/resources/bootstrap.yml deleted file mode 100644 index 204eff8..0000000 --- a/tianji-master/tj-data/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,44 +0,0 @@ -server: - port: 8092 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: data-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - data-id: shared-spring.yaml # 共享spring配置 - refresh: false - - data-id: shared-redis.yaml # 共享redis配置 - refresh: false - - data-id: shared-mybatis.yaml # 共享mybatis配置 - refresh: false - - data-id: shared-logs.yaml # 共享日志配置 - refresh: false - - data-id: shared-feign.yaml # 共享feign配置 - refresh: false - - data-id: shared-mq.yaml # 共享mq配置 - refresh: false - - data-id: shared-xxljob.yaml # 共享job配置 - refresh: false -tj: - swagger: - enable: true - enableResponseWrap: true - package-path: com.tianji.data.controller - title: 智汇云课堂 - 学习中心接口文档 - description: 该服务包含用户学习的各种辅助功能 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - jdbc: - database: tj_data - auth: - resource: - enable: true diff --git a/tianji-master/tj-exam/pom.xml b/tianji-master/tj-exam/pom.xml deleted file mode 100644 index 98f9576..0000000 --- a/tianji-master/tj-exam/pom.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-exam - - - 11 - 11 - - - - com.tianji - tj-common - 1.0.0 - - - com.tianji - tj-api - 1.0.0 - - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus.version} - - - mysql - mysql-connector-java - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - org.springframework.boot - spring-boot-starter-amqp - - - - com.xuxueli - xxl-job-core - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-seata - - - - seata-spring-boot-starter - io.seata - - - - - seata-spring-boot-starter - io.seata - ${seata-version} - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - - - \ No newline at end of file diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/ExamApplication.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/ExamApplication.java deleted file mode 100644 index 6afa50f..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/ExamApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.exam; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@Slf4j -@MapperScan("com.tianji.exam.mapper") -@SpringBootApplication -public class ExamApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(ExamApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - - } -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/constants/ExamErrorInfo.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/constants/ExamErrorInfo.java deleted file mode 100644 index 7fa201f..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/constants/ExamErrorInfo.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.tianji.exam.constants; - -public interface ExamErrorInfo { - String QUESTION_NOT_EXISTS = "题目不存在"; -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/constants/QuestionType.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/constants/QuestionType.java deleted file mode 100644 index 693a7c0..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/constants/QuestionType.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tianji.exam.constants; - -import com.tianji.common.enums.BaseEnum; -import lombok.Getter; - -@Getter -public enum QuestionType implements BaseEnum { - // 1:单选题,2:多选题,3:不定向选择题,4:判断题,5:主观题 - RADIO(1, "单选题"), - MULTI(2, "多选题"), - UNCERTAINTY(3, "不定向选择题"), - JUDGE(4, "判断题"), - SUBJECTIVE(5, "主观题"), - ; - int value; - String desc; - - QuestionType(int value, String desc) { - this.value = value; - this.desc = desc; - } - - - public static QuestionType of(Integer value){ - if (value == null) { - return null; - } - for (QuestionType status : values()) { - if (status.equalsValue(value)) { - return status; - } - } - return null; - } -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/controller/QuestionBizController.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/controller/QuestionBizController.java deleted file mode 100644 index bf0da76..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/controller/QuestionBizController.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.tianji.exam.controller; - - -import com.tianji.api.dto.exam.QuestionBizDTO; -import com.tianji.exam.service.IQuestionBizService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -/** - *

- * 问题和业务关联表,例如把小节id和问题id关联,一个小节下可以有多个问题 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -@Api(tags = "题目管理相关接口") -@RestController -@RequestMapping("/question-biz") -@RequiredArgsConstructor -public class QuestionBizController { - - private final IQuestionBizService bizService; - - @ApiOperation("批量保存题目和业务关系") - @PostMapping("list") - public void saveQuestionBizInfoBatch(@RequestBody List qbs){ - bizService.saveQuestionBizInfoBatch(qbs); - } - - @ApiOperation("查询与业务有关的题目id") - @GetMapping("/biz/{id}") - public List queryQuestionIdsByBizId(@ApiParam("业务id") @PathVariable("id") Long bizId){ - return bizService.queryQuestionIdsByBizId(bizId); - } - - @ApiOperation("批量查询与业务有关的题目id") - @GetMapping("/biz/list") - public List queryQuestionIdsByBizIds(@ApiParam("业务id集合") @RequestParam("ids") List bizIds){ - return bizService.queryQuestionIdsByBizIds(bizIds); - } - - @ApiOperation("查询业务下的题目分数和") - @GetMapping("/scores") - public Map queryQuestionScoresByBizIds(@RequestParam("ids") List bizIds){ - return bizService.queryQuestionScoresByBizIds(bizIds); - } -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/controller/QuestionController.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/controller/QuestionController.java deleted file mode 100644 index 0d47717..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/controller/QuestionController.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.tianji.exam.controller; - - -import com.tianji.api.dto.exam.QuestionDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.exam.domain.dto.QuestionFormDTO; -import com.tianji.exam.domain.query.QuestionPageQuery; -import com.tianji.exam.domain.vo.QuestionDetailVO; -import com.tianji.exam.domain.vo.QuestionPageVO; -import com.tianji.exam.service.IQuestionService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; -import java.util.Map; - -/** - *

- * 题目 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -@Api(tags = "题目管理相关接口") -@RequiredArgsConstructor -@RestController -@RequestMapping("/questions") -public class QuestionController { - - private final IQuestionService questionService; - - @ApiOperation("新增题目") - @PostMapping - public void addQuestion(@Valid @RequestBody QuestionFormDTO questionDTO){ - questionService.addQuestion(questionDTO); - } - - @ApiOperation("修改题目") - @PutMapping("/{id}") - public void updateQuestion( - @ApiParam("要修改的题目的id") @PathVariable("id") Long id, - @RequestBody QuestionFormDTO questionDTO){ - questionDTO.setId(id); - questionService.updateQuestion(questionDTO); - } - - @ApiOperation("删除题目") - @DeleteMapping("/{id}") - public void deleteQuestionById( @ApiParam("要删除的题目的id") @PathVariable("id") Long id){ - questionService.deleteQuestionById(id); - } - - @ApiOperation("分页查询题目") - @GetMapping("page") - public PageDTO queryQuestionByPage(QuestionPageQuery query){ - return questionService.queryQuestionByPage(query); - } - - @ApiOperation("查询题目详情") - @GetMapping("{id}") - public QuestionDetailVO queryQuestionDetailById(@ApiParam("要查询的题目的id") @PathVariable("id") Long id){ - return questionService.queryQuestionDetailById(id); - } - - @ApiOperation("查询题目列表") - @GetMapping("list") - public List queryQuestionByIds(@ApiParam("要查询的题目的id集合") @RequestParam("ids") List ids){ - return questionService.queryQuestionByIds(ids); - } - - @ApiOperation("查询题目分值") - @GetMapping("/scores") - public Map queryQuestionScores( - @ApiParam("要查询的题目的id集合") @RequestParam("ids") List ids){ - return questionService.queryQuestionScores(ids); - } - - @ApiOperation("查询老师出题数量") - @GetMapping("/numOfTeacher") - public Map countSubjectNumOfTeacher( - @ApiParam("要查询的老师的集合") @RequestParam("ids") List createrIds){ - return questionService.countQuestionNumOfCreater(createrIds); - } - - @ApiOperation("查询业务关联的题目列表") - @GetMapping("listOfBiz") - public List queryQuestionByBizId(@ApiParam("要查询的题目的id集合") @RequestParam("bizId") Long bizId){ - return questionService.queryQuestionByBizId(bizId); - } - - @ApiOperation("校验名称是否有效,存在则无效返回false,不存在返回true") - @GetMapping("/checkName") - public Boolean checkNameValid(@RequestParam("name") String name){ - return questionService.checkNameValid(name); - } -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/dto/QuestionFormDTO.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/dto/QuestionFormDTO.java deleted file mode 100644 index 61427e2..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/dto/QuestionFormDTO.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.tianji.exam.domain.dto; - -import com.tianji.common.validate.annotations.EnumValid; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.io.Serializable; -import java.util.List; - -/** - *

- * 题目表单实体 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@ApiModel(description = "考试题目表单实体") -public class QuestionFormDTO implements Serializable { - - private static final long serialVersionUID = 1L; - - @ApiModelProperty("题目id,新增不用填写") - private Long id; - - @ApiModelProperty("题目名称,题干") - private String name; - - @ApiModelProperty("题目类型,1:单选题,2:多选题,3:不定向选择题,4:判断题,5:主观题") - @NotNull(message = "题目类型为空,请设置题目类型") - @EnumValid(enumeration = {1,2,3,4,5}, message = "题目类型错误") - private Integer type; - - @ApiModelProperty("课程三级分类的id集合") - private List cateIds; - - @ApiModelProperty("难易度,1:简单,2:中等,3:困难") - @NotNull(message = "难度不能为空") - @EnumValid(enumeration = {1,2,3},message = "题目难度错误") - private Integer difficulty; - - @ApiModelProperty("分值") - private Integer score; - - @ApiModelProperty("选择题选项,json数组格式") - private List options; - - @ApiModelProperty("选择题正确答案1到10,如果有多个答案,中间使用逗号隔开,如果是判断题,1:代表正确,其他代表错误") - @NotNull(message = "题目答案不能为空") - private String answer; - - @ApiModelProperty("答案解析") - @Size(max = 300, min = 5, message = "答案解析长度为5-300") - private String analysis; -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/Question.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/Question.java deleted file mode 100644 index 4321c70..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/Question.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.tianji.exam.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 题目 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("question") -public class Question implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 题目id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 题干 - */ - private String name; - - /** - * 题目类型,1:单选题,2:多选题,3:不定向选择题,4:判断题,5:主观题 - */ - private Integer type; - - /** - * 1级课程分类id - */ - private Long cateId1; - - /** - * 2级课程分类id - */ - private Long cateId2; - - /** - * 3级课程分类id - */ - private Long cateId3; - - /** - * 难易度,1:简单,2:中等,3:困难 - */ - private Integer difficulty; - - /** - * 回答正确次数 - */ - private Integer correctTimes; - - /** - * 回答次数 - */ - private Integer answerTimes; - - /** - * 分值 - */ - private Integer score; - - /** - * 部门id - */ - private Long depId; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - - private Long creater; - - /** - * 更新人 - */ - - private Long updater; - - -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/QuestionBiz.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/QuestionBiz.java deleted file mode 100644 index c9574c4..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/QuestionBiz.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.tianji.exam.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - *

- * 问题和业务关联表,例如把小节id和问题id关联,一个小节下可以有多个问题 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("question_biz") -@NoArgsConstructor -@AllArgsConstructor(staticName = "of") -public class QuestionBiz implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 业务id,要关联问题的某业务id,例如小节id - */ - private Long bizId; - - /** - * 问题id - */ - private Long questionId; - - -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/QuestionDetail.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/QuestionDetail.java deleted file mode 100644 index b984a31..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/po/QuestionDetail.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.tianji.exam.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.List; - -/** - *

- * 题目 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName(value = "question_detail", autoResultMap = true) -public class QuestionDetail implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 题目id - */ - @TableId(value = "id", type = IdType.INPUT) - private Long id; - - /** - * 选择题选项,json数组格式 - */ - @TableField(typeHandler = JacksonTypeHandler.class) - private List options; - - /** - * 选择题正确答案1到10,如果有多个答案,中间使用逗号隔开,如果是判断题,1:代表正确,其他代表错误 - */ - private String answer; - - /** - * 答案解析 - */ - private String analysis; -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/query/QuestionPageQuery.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/query/QuestionPageQuery.java deleted file mode 100644 index 0da4e7e..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/query/QuestionPageQuery.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.exam.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "题目分页查询条件") -public class QuestionPageQuery extends PageQuery { - @ApiModelProperty("三级分类id集合") - private List cateIds; - @ApiModelProperty("题目类型,1:单选题,2:多选题,3:不定向选择题,4:判断题,5:主观题") - private List types; - @ApiModelProperty("难易度,1:简单,2:中等,3:困难") - private Integer difficulty; - @ApiModelProperty("题目名称关键字") - private String keyword; - @ApiModelProperty("题目录入者id") - private Long creater; -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/vo/QuestionDetailVO.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/vo/QuestionDetailVO.java deleted file mode 100644 index 81b4b9a..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/vo/QuestionDetailVO.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.tianji.exam.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; -import java.util.List; - -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@ApiModel(description = "考试详情数据") -public class QuestionDetailVO { - - @ApiModelProperty("题目id") - private Long id; - - @ApiModelProperty("题目名称,题干") - private String name; - - @ApiModelProperty("题目类型,1:单选题,2:多选题,3:不定向选择题,4:判断题,5:主观题") - private Integer type; - - @ApiModelProperty("1级课程分类id") - private Long cateId1; - - @ApiModelProperty("2级课程分类id") - private Long cateId2; - - @ApiModelProperty("3级课程分类id") - private Long cateId3; - @ApiModelProperty("课程三级分类的名称集合") - private List categories; - - @ApiModelProperty("难易度,1:简单,2:中等,3:困难") - private Integer difficulty; - - @ApiModelProperty("分值") - private Integer score; - - @ApiModelProperty("引用次数") - private Integer useTimes; - - @ApiModelProperty("回答正确次数") - private Integer correctTimes; - - @ApiModelProperty("回答次数") - private Integer answerTimes; - - @ApiModelProperty("更新人") - private String updater; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; - - @ApiModelProperty("选择题选项,json数组格式") - private List options; - - @ApiModelProperty("选择题正确答案1到10,如果有多个答案,中间使用逗号隔开,如果是判断题,1:代表正确,其他代表错误") - private String answer; - - @ApiModelProperty("答案解析") - private String analysis; -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/vo/QuestionPageVO.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/vo/QuestionPageVO.java deleted file mode 100644 index 3a8fc40..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/domain/vo/QuestionPageVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.tianji.exam.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; -import java.util.List; - -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@ApiModel(description = "考试题目分页数据") -public class QuestionPageVO { - - @ApiModelProperty("题目id") - private Long id; - - @ApiModelProperty("题目名称,题干") - private String name; - - @ApiModelProperty("题目类型,1:单选题,2:多选题,3:不定向选择题,4:判断题,5:主观题") - private Integer type; - - @ApiModelProperty("课程三级分类的名称集合") - private List categories; - - @ApiModelProperty("难易度,1:简单,2:中等,3:困难") - private Integer difficulty; - - @ApiModelProperty("分值") - private Integer score; - - @ApiModelProperty("引用次数") - private Integer useTimes; - - @ApiModelProperty("回答次数") - private Integer answerTimes; - - @ApiModelProperty("更新人") - private String updater; - - @ApiModelProperty("更新时间") - private LocalDateTime updateTime; -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionBizMapper.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionBizMapper.java deleted file mode 100644 index 6f1a8bb..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionBizMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.exam.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.exam.domain.po.QuestionBiz; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - *

- * 问题和业务关联表,例如把小节id和问题id关联,一个小节下可以有多个问题 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -public interface QuestionBizMapper extends BaseMapper { - - List countQuestionScoresByBizIds(@Param("bizIds") Iterable bizIds); - - List countUsedTimes(@Param("qIds") Iterable qIds); -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionDetailMapper.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionDetailMapper.java deleted file mode 100644 index baecfe0..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionDetailMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.exam.mapper; - -import com.tianji.exam.domain.po.QuestionDetail; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 题目 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -public interface QuestionDetailMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionMapper.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionMapper.java deleted file mode 100644 index 7cab15f..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/mapper/QuestionMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.exam.mapper; - -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.exam.domain.po.Question; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - *

- * 题目 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -public interface QuestionMapper extends BaseMapper { - - List countQuestionOfCreater(@Param("createrIds") List createrIds); - -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionBizService.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionBizService.java deleted file mode 100644 index 0d92ea2..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionBizService.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.exam.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.api.dto.exam.QuestionBizDTO; -import com.tianji.exam.domain.po.QuestionBiz; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - *

- * 问题和业务关联表,例如把小节id和问题id关联,一个小节下可以有多个问题 服务类 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -public interface IQuestionBizService extends IService { - - int countUsedTimes(Long questionId); - - Map countUsedTimes(Set qIds); - - List queryQuestionIdsByBizId(Long bizId); - - List queryQuestionIdsByBizIds(List bizIds); - - void saveQuestionBizInfoBatch(List qbs); - - Map queryQuestionScoresByBizIds(Iterable bizIds); -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionDetailService.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionDetailService.java deleted file mode 100644 index 88cbcc0..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionDetailService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.exam.service; - -import com.tianji.exam.domain.po.QuestionDetail; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 题目 服务类 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -public interface IQuestionDetailService extends IService { - -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionService.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionService.java deleted file mode 100644 index 804e5e1..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/IQuestionService.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.tianji.exam.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.api.dto.exam.QuestionDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.exam.domain.dto.QuestionFormDTO; -import com.tianji.exam.domain.po.Question; -import com.tianji.exam.domain.query.QuestionPageQuery; -import com.tianji.exam.domain.vo.QuestionDetailVO; -import com.tianji.exam.domain.vo.QuestionPageVO; - -import java.util.List; -import java.util.Map; - -/** - *

- * 题目 服务类 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -public interface IQuestionService extends IService { - - void addQuestion(QuestionFormDTO questionFormDTO); - - void updateQuestion(QuestionFormDTO questionDTO); - - void deleteQuestionById(Long id); - - PageDTO queryQuestionByPage(QuestionPageQuery query); - - QuestionDetailVO queryQuestionDetailById(Long id); - - List queryQuestionByIds(List ids); - - Map countQuestionNumOfCreater(List createrIds); - - List queryQuestionByBizId(Long bizId); - - Boolean checkNameValid(String name); - - Map queryQuestionScores(List ids); -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionBizServiceImpl.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionBizServiceImpl.java deleted file mode 100644 index 3e503e1..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionBizServiceImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.tianji.exam.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.api.dto.exam.QuestionBizDTO; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.exam.domain.po.QuestionBiz; -import com.tianji.exam.mapper.QuestionBizMapper; -import com.tianji.exam.service.IQuestionBizService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -/** - *

- * 问题和业务关联表,例如把小节id和问题id关联,一个小节下可以有多个问题 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -@Service -public class QuestionBizServiceImpl extends ServiceImpl implements IQuestionBizService { - - @Override - public int countUsedTimes(Long questionId) { - Integer count = lambdaQuery() - .eq(QuestionBiz::getQuestionId, questionId) - .count(); - return count == null ? 0 : count; - } - - @Override - public Map countUsedTimes(Set qIds) { - // 1.统计引用次数 - List list = baseMapper.countUsedTimes(qIds); - // 2.转换返回 - return IdAndNumDTO.toMap(list); - } - - @Override - public List queryQuestionIdsByBizId(Long bizId) { - List list = lambdaQuery() - .eq(QuestionBiz::getBizId, bizId) - .list(); - return BeanUtils.copyList(list, QuestionBizDTO.class); - } - - @Override - public List queryQuestionIdsByBizIds(List bizIds) { - if (CollUtils.isEmpty(bizIds)) { - return CollUtils.emptyList(); - } - List list = lambdaQuery() - .in(QuestionBiz::getBizId, bizIds) - .list(); - return BeanUtils.copyList(list, QuestionBizDTO.class); - } - - @Override - @Transactional - public void saveQuestionBizInfoBatch(List qbs) { - if (CollUtils.isEmpty(qbs)) { - return; - } - // 1.获取业务id - Set bizIds = qbs.stream().map(QuestionBizDTO::getBizId).collect(Collectors.toSet()); - // 2.删除旧数据 - remove(new LambdaQueryWrapper().in(QuestionBiz::getBizId, bizIds)); - // 3.插入新数据 - List list = qbs.stream() - .map(q -> QuestionBiz.of(null, q.getBizId(), q.getQuestionId())) - .collect(Collectors.toList()); - saveBatch(list); - } - - @Override - public Map queryQuestionScoresByBizIds(Iterable bizIds) { - if (CollUtils.isEmpty(bizIds)) { - return CollUtils.emptyMap(); - } - // 1.统计biz及对应题目的分数和 - List list = baseMapper.countQuestionScoresByBizIds(bizIds); - // 2.数据处理 - return IdAndNumDTO.toMap(list); - } -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionDetailServiceImpl.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionDetailServiceImpl.java deleted file mode 100644 index 3901c06..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionDetailServiceImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.exam.service.impl; - -import com.tianji.exam.domain.po.QuestionDetail; -import com.tianji.exam.mapper.QuestionDetailMapper; -import com.tianji.exam.service.IQuestionDetailService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; - -/** - *

- * 题目 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -@Service -public class QuestionDetailServiceImpl extends ServiceImpl implements IQuestionDetailService { - -} diff --git a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionServiceImpl.java b/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionServiceImpl.java deleted file mode 100644 index 6d17945..0000000 --- a/tianji-master/tj-exam/src/main/java/com/tianji/exam/service/impl/QuestionServiceImpl.java +++ /dev/null @@ -1,256 +0,0 @@ -package com.tianji.exam.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.cache.CategoryCache; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.api.dto.exam.QuestionDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.constants.Constant; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.exam.domain.dto.QuestionFormDTO; -import com.tianji.exam.domain.po.Question; -import com.tianji.exam.domain.po.QuestionBiz; -import com.tianji.exam.domain.po.QuestionDetail; -import com.tianji.exam.domain.query.QuestionPageQuery; -import com.tianji.exam.domain.vo.QuestionDetailVO; -import com.tianji.exam.domain.vo.QuestionPageVO; -import com.tianji.exam.mapper.QuestionMapper; -import com.tianji.exam.service.IQuestionBizService; -import com.tianji.exam.service.IQuestionDetailService; -import com.tianji.exam.service.IQuestionService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.stream.Collectors; - -import static com.tianji.exam.constants.ExamErrorInfo.QUESTION_NOT_EXISTS; - -/** - *

- * 题目 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-09-02 - */ -@Service -@RequiredArgsConstructor -public class QuestionServiceImpl extends ServiceImpl implements IQuestionService { - - private final IQuestionDetailService detailService; - private final IQuestionBizService bizService; - private final UserClient userClient; - private final CategoryCache categoryCache; - - @Override - @Transactional - public void addQuestion(QuestionFormDTO questionDTO) { - // 1.保存题目信息 - Question question = BeanUtils.copyBean(questionDTO, Question.class); - List cateIds = questionDTO.getCateIds(); - if (cateIds.size() < 3) { - throw new BadRequestException("题目必须关联三级分类"); - } - question.setCateId1(cateIds.get(0)); - question.setCateId2(cateIds.get(1)); - question.setCateId3(cateIds.get(2)); - save(question); - - // 2.保存详情 - QuestionDetail detail = new QuestionDetail() - .setId(question.getId()) - .setAnalysis(questionDTO.getAnalysis()) - .setAnswer(questionDTO.getAnswer()) - .setOptions(questionDTO.getOptions()); - detailService.save(detail); - } - - @Override - public void updateQuestion(QuestionFormDTO questionDTO) { - // 1.保存题目信息 - Question question = BeanUtils.copyBean(questionDTO, Question.class); - List cateIds = questionDTO.getCateIds(); - if (CollUtils.isNotEmpty(cateIds) && cateIds.size() == 3) { - question.setCateId1(cateIds.get(0)); - question.setCateId2(cateIds.get(1)); - question.setCateId3(cateIds.get(2)); - } - updateById(question); - - // 2.保存详情 - QuestionDetail detail = new QuestionDetail() - .setId(question.getId()) - .setAnalysis(questionDTO.getAnalysis()) - .setAnswer(questionDTO.getAnswer()) - .setOptions(questionDTO.getOptions()); - detailService.updateById(detail); - } - - @Override - public void deleteQuestionById(Long id) { - // 1.查询题目和业务之间是否有关联 - int usedTimes = bizService.countUsedTimes(id); - if (usedTimes > 0) { - throw new BadRequestException("题目被使用中,无法删除"); - } - // 2.删除题目 - removeById(id); - // 3.删除详情 - detailService.removeById(id); - } - - @Override - public PageDTO queryQuestionByPage(QuestionPageQuery query) { - // 1.分页搜索 - Page page = lambdaQuery() - .eq(query.getDifficulty() != null, Question::getDifficulty, query.getDifficulty()) - .eq(query.getCreater() != null, Question::getCreater, query.getCreater()) - .in(CollUtils.isNotEmpty(query.getTypes()), Question::getType, query.getTypes()) - .in(CollUtils.isNotEmpty(query.getCateIds()), Question::getCateId3, query.getCateIds()) - .like(StringUtils.isNotBlank(query.getKeyword()), Question::getName, query.getKeyword()) - .page(query.toMpPage(Constant.DATA_FIELD_NAME_UPDATE_TIME, false)); - // 2.判空 - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(page); - } - // 3.查询VO信息,包含:引用次数、提问者信息 - Set qIds = new HashSet<>(); - Set uIds = new HashSet<>(); - for (Question record : records) { - qIds.add(record.getId()); - uIds.add(record.getUpdater()); - } - // 3.1.统计引用次数 - Map countMap = bizService.countUsedTimes(qIds); - // 3.2.查询用户 - Map userMap = new HashMap<>(uIds.size()); - if (CollUtils.isNotEmpty(uIds)) { - List users = userClient.queryUserByIds(uIds); - userMap = users.stream().collect(Collectors.toMap(UserDTO::getId, u -> u)); - } - // 4.处理vo - List list = new ArrayList<>(records.size()); - for (Question r : records) { - // 4.1.转换为vo - QuestionPageVO v = BeanUtils.toBean(r, QuestionPageVO.class); - list.add(v); - // 4.2.获取用户 - UserDTO u = userMap.get(r.getUpdater()); - v.setUpdater(u == null ? "" : u.getName()); - // 4.3.分类 - v.setCategories(categoryCache.getCategoryNameList(List.of(r.getCateId1(), r.getCateId2(), r.getCateId3()))); - // 4.4.引用次数 - v.setUseTimes(countMap.getOrDefault(r.getId(), 0)); - } - return PageDTO.of(page, list); - } - - @Override - public QuestionDetailVO queryQuestionDetailById(Long id) { - // 1.查询题目 - Question q = getById(id); - if (q == null) { - throw new BadRequestException(QUESTION_NOT_EXISTS); - } - // 2.查询详情 - QuestionDetail detail = detailService.getById(id); - if (detail == null) { - throw new BadRequestException(QUESTION_NOT_EXISTS); - } - // 3.查询题目的录入者 - UserDTO u = userClient.queryUserById(q.getCreater()); - // 4.转换vo - QuestionDetailVO v = BeanUtils.copyBean(q, QuestionDetailVO.class); - // 4.1.详情 - v.setOptions(detail.getOptions()); - v.setAnalysis(detail.getAnalysis()); - v.setAnswer(detail.getAnswer()); - // 4.2.用户 - v.setUpdater(u == null ? "" : u.getName()); - // 4.3.分类 - v.setCategories(categoryCache.getCategoryNameList(List.of(q.getCateId1(), q.getCateId2(), q.getCateId3()))); - // 4.4.引用次数 - v.setUseTimes(bizService.countUsedTimes(id)); - return v; - } - - @Override - public List queryQuestionByIds(List ids) { - // 1.查询题目集合 - List questions = listByIds(ids); - if (CollUtils.isEmpty(questions)) { - return CollUtils.emptyList(); - } - - // 2.查询详情 - List details = detailService.listByIds(ids); - if (details == null || questions.size() != details.size()) { - throw new BadRequestException(QUESTION_NOT_EXISTS); - } - Map detailMap = details.stream().collect(Collectors.toMap(QuestionDetail::getId, d -> d)); - - // 3.数据转换 - List list = new ArrayList<>(questions.size()); - for (Question q : questions) { - // 3.1.转vo - QuestionDTO d = BeanUtils.toBean(q, QuestionDTO.class); - list.add(d); - // 3.2.获取详情 - QuestionDetail detail = detailMap.get(q.getId()); - d.setOptions(detail.getOptions()); - d.setAnalysis(detail.getAnalysis()); - d.setAnswer(detail.getAnswer()); - } - return list; - } - - @Override - public Map countQuestionNumOfCreater(List createrIds) { - // 1.统计 - List list = baseMapper.countQuestionOfCreater(createrIds); - // 2.处理结果 - return IdAndNumDTO.toMap(list); - } - - @Override - public List queryQuestionByBizId(Long bizId) { - // 1.查询中间表 - List list = bizService.lambdaQuery() - .eq(QuestionBiz::getBizId, bizId) - .list(); - if (CollUtils.isEmpty(list)) { - return CollUtils.emptyList(); - } - // 2.获取问题id - List ids = list.stream().map(QuestionBiz::getQuestionId).collect(Collectors.toList()); - // 3.查询数据集合 - return queryQuestionByIds(ids); - } - - @Override - public Boolean checkNameValid(String name) { - return lambdaQuery() - .eq(Question::getName, name) - .count()<=0; - } - - @Override - public Map queryQuestionScores(List ids) { - // 1.根据id查询题目 - List questions = listByIds(ids); - // 2.判空 - if (CollUtils.isEmpty(questions)) { - return CollUtils.emptyMap(); - } - return questions.stream().collect(Collectors.toMap(Question::getId, Question::getScore)); - } -} diff --git a/tianji-master/tj-exam/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-exam/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-exam/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-exam/src/main/resources/bootstrap-local.yml b/tianji-master/tj-exam/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-exam/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-exam/src/main/resources/bootstrap.yml b/tianji-master/tj-exam/src/main/resources/bootstrap.yml deleted file mode 100644 index a34b5bb..0000000 --- a/tianji-master/tj-exam/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,40 +0,0 @@ -server: - port: 8089 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 - error: - include-message: always #返回的响应体带上message -spring: - profiles: - active: dev - application: - name: exam-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - dataId: shared-spring.yaml # 共享spring配置 - - dataId: shared-redis.yaml # 共享redis配置 - - dataId: shared-mybatis.yaml # 共享mybatis配置 - - dataId: shared-logs.yaml # 共享日志配置 - - dataId: shared-feign.yaml # 共享feign配置 - - dataId: shared-mq.yaml # 共享mq配置 - - dataId: shared-xxljob.yaml # 共享mq配置 - - dataId: shared-seata.yaml # 共享seata配置 -tj: - swagger: - enable: true - enableResponseWrap: true - package-path: com.tianji.exam.controller - title: 智汇云课堂 - 考试中心接口文档 - description: 该服务提供题目管理、考试管理、数据统计等功能 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - jdbc: - database: tj_exam - auth: - resource: - enable: false \ No newline at end of file diff --git a/tianji-master/tj-exam/src/main/resources/mapper/QuestionBizMapper.xml b/tianji-master/tj-exam/src/main/resources/mapper/QuestionBizMapper.xml deleted file mode 100644 index 86b1cf6..0000000 --- a/tianji-master/tj-exam/src/main/resources/mapper/QuestionBizMapper.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - diff --git a/tianji-master/tj-exam/src/main/resources/mapper/QuestionDetailMapper.xml b/tianji-master/tj-exam/src/main/resources/mapper/QuestionDetailMapper.xml deleted file mode 100644 index c5c3505..0000000 --- a/tianji-master/tj-exam/src/main/resources/mapper/QuestionDetailMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-exam/src/main/resources/mapper/QuestionMapper.xml b/tianji-master/tj-exam/src/main/resources/mapper/QuestionMapper.xml deleted file mode 100644 index c274c5a..0000000 --- a/tianji-master/tj-exam/src/main/resources/mapper/QuestionMapper.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - diff --git a/tianji-master/tj-gateway/pom.xml b/tianji-master/tj-gateway/pom.xml deleted file mode 100644 index e2786a5..0000000 --- a/tianji-master/tj-gateway/pom.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-gateway - - - 11 - 11 - - - - com.tianji - tj-auth-gateway-sdk - 1.0.0 - - - org.springframework.cloud - spring-cloud-starter-gateway - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - org.apache.commons - commons-pool2 - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - com.tianji.gateway.GatewayApplication - - - - - \ No newline at end of file diff --git a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/GatewayApplication.java b/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/GatewayApplication.java deleted file mode 100644 index 85d195e..0000000 --- a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/GatewayApplication.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.gateway; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.annotation.EnableScheduling; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@SpringBootApplication -@Slf4j -@EnableScheduling -public class GatewayApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(GatewayApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - } -} diff --git a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/config/AuthProperties.java b/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/config/AuthProperties.java deleted file mode 100644 index 75f73c1..0000000 --- a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/config/AuthProperties.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.gateway.config; - -import lombok.Data; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -import java.util.Set; - -@Data -@Component -@ConfigurationProperties(prefix = "tj.auth") -public class AuthProperties implements InitializingBean { - - private Set excludePath; - - @Override - public void afterPropertiesSet() throws Exception { - // 添加默认不拦截的路径 - excludePath.add("/error/**"); - excludePath.add("/jwks"); - excludePath.add("/accounts/login"); - excludePath.add("/accounts/admin/login"); - excludePath.add("/accounts/refresh"); - } -} diff --git a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/exception/handler/GatewayExceptionHandler.java b/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/exception/handler/GatewayExceptionHandler.java deleted file mode 100644 index 06bc4b6..0000000 --- a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/exception/handler/GatewayExceptionHandler.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.tianji.gateway.exception.handler; - -import com.tianji.common.constants.Constant; -import com.tianji.common.domain.R; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.exceptions.UnauthorizedException; -import com.tianji.common.utils.JsonUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.web.reactive.error.ErrorWebExceptionHandler; -import org.springframework.cloud.gateway.support.NotFoundException; -import org.springframework.core.Ordered; -import org.springframework.http.MediaType; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.http.server.reactive.ServerHttpResponse; -import org.springframework.stereotype.Component; -import org.springframework.web.server.ResponseStatusException; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Mono; - -import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.util.List; - -import static com.tianji.common.constants.ErrorInfo.Code.FAILED; -import static com.tianji.common.constants.ErrorInfo.Msg.SERVER_INTER_ERROR; - -@Slf4j -@Component -public class GatewayExceptionHandler implements ErrorWebExceptionHandler, Ordered { - - @Override - public Mono handle(ServerWebExchange exchange, Throwable ex) { - // 1.获取响应 - ServerHttpResponse response = exchange.getResponse(); - // 2.判断是否已处理 - if (response.isCommitted()) { - // 如果已经提交,直接结束,避免重复处理 - return Mono.error(ex); - } - - // 3.按照异常类型进行翻译处理,翻译的结果易于前端理解 - String message; - int code = FAILED; - if (ex instanceof UnauthorizedException) { - // 登录异常,直接返回状态码 - UnauthorizedException e = (UnauthorizedException) ex; - return Mono.error(new ResponseStatusException(e.getStatus(), e.getMessage(), e)); - } else if (ex instanceof CommonException) { - CommonException e = (CommonException) ex; - code = e.getCode(); - message = e.getMessage(); - } else if (ex instanceof NotFoundException) { - message = "服务不存在"; - } else if (ex instanceof ResponseStatusException) { - message = ex.getMessage(); - } else { - message = SERVER_INTER_ERROR; - // 4.记录日志 - writeLog(exchange, ex); - } - // 5.设置响应结果为 JSON - response.getHeaders().setContentType(MediaType.APPLICATION_JSON); - // 6.封装响应结果并写出 - R r = R.error(code, message); - List requestIds = response.getHeaders().get(Constant.REQUEST_ID_HEADER); - if (requestIds != null) { - r.requestId(requestIds.get(0)); - } - byte[] resp = JsonUtils.toJsonStr(r).getBytes(StandardCharsets.UTF_8); - return response.writeWith( - Mono.fromSupplier( - () -> response.bufferFactory().wrap(resp) - )); - } - - private void writeLog(ServerWebExchange exchange, Throwable ex) { - ServerHttpRequest request = exchange.getRequest(); - URI uri = request.getURI(); - String host = uri.getHost(); - int port = uri.getPort(); - log.error("网关路由异常-host:{} ,port:{},uri:{}, errormessage:", - host, port, request.getPath(), ex); - } - - @Override - public int getOrder() { - return HIGHEST_PRECEDENCE; - } -} \ No newline at end of file diff --git a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/filter/AccountAuthFilter.java b/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/filter/AccountAuthFilter.java deleted file mode 100644 index 0cf4d53..0000000 --- a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/filter/AccountAuthFilter.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.tianji.gateway.filter; - -import com.tianji.authsdk.gateway.util.AuthUtil; -import com.tianji.common.domain.R; -import com.tianji.common.domain.dto.LoginUserDTO; -import com.tianji.gateway.config.AuthProperties; -import org.springframework.cloud.gateway.filter.GatewayFilterChain; -import org.springframework.cloud.gateway.filter.GlobalFilter; -import org.springframework.core.Ordered; -import org.springframework.http.server.reactive.ServerHttpRequest; -import org.springframework.stereotype.Component; -import org.springframework.util.AntPathMatcher; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Mono; - -import java.util.List; - -import static com.tianji.auth.common.constants.JwtConstants.AUTHORIZATION_HEADER; -import static com.tianji.auth.common.constants.JwtConstants.USER_HEADER; - -@Component -public class AccountAuthFilter implements GlobalFilter, Ordered { - - private final AuthUtil authUtil; - private final AuthProperties authProperties; - private final AntPathMatcher antPathMatcher = new AntPathMatcher(); - - public AccountAuthFilter(AuthUtil authUtil, AuthProperties authProperties) { - this.authUtil = authUtil; - this.authProperties = authProperties; - } - - @Override - public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - // 1.获取请求request信息 - ServerHttpRequest request = exchange.getRequest(); - String method = request.getMethodValue(); - String path = request.getPath().toString(); - String antPath = method + ":" + path; - - // 2.判断是否是无需登录的路径 - if(isExcludePath(antPath)){ - // 直接放行 - return chain.filter(exchange); - } - - // 3.尝试获取用户信息 - List authHeaders = exchange.getRequest().getHeaders().get(AUTHORIZATION_HEADER); - String token = authHeaders == null ? "" : authHeaders.get(0); - R r = authUtil.parseToken(token); - - // 4.如果用户是登录状态,尝试更新请求头,传递用户信息 - if(r.success()){ - exchange.mutate() - .request(builder -> builder.header(USER_HEADER, r.getData().getUserId().toString())) - .build(); - } - - // 5.校验权限 - authUtil.checkAuth(antPath, r); - - // 6.放行 - return chain.filter(exchange); - } - - private boolean isExcludePath(String antPath) { - for (String pathPattern : authProperties.getExcludePath()) { - if(antPathMatcher.match(pathPattern, antPath)){ - return true; - } - } - return false; - } - - @Override - public int getOrder() { - return 1000; - } -} diff --git a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/filter/RequestIdRelayFilter.java b/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/filter/RequestIdRelayFilter.java deleted file mode 100644 index e677cfc..0000000 --- a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/filter/RequestIdRelayFilter.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.tianji.gateway.filter; - -import cn.hutool.core.lang.UUID; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.cloud.gateway.filter.GatewayFilterChain; -import org.springframework.cloud.gateway.filter.GlobalFilter; -import org.springframework.core.Ordered; -import org.springframework.stereotype.Component; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Mono; - -import static com.tianji.common.constants.Constant.*; - -@Slf4j -@Component -public class RequestIdRelayFilter implements GlobalFilter, Ordered { - @Override - public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - // 1.生成 RequestId - String requestId = UUID.randomUUID().toString(true); - // 2.保存到日志变量池 - MDC.put(REQUEST_ID_HEADER, requestId); - // 3.更新请求头,添加标示 - String path = exchange.getRequest().getPath().toString(); - exchange = exchange.mutate().request(b -> { - // 3.1.添加请求id标示 - b.header(REQUEST_ID_HEADER, requestId); - // 3.2.添加网关标示 - if (!path.startsWith("/ps/notify")) { - b.header(REQUEST_FROM_HEADER, GATEWAY_ORIGIN_NAME); - } - } - ).build(); - - return chain.filter(exchange); - } - - @Override - public int getOrder() { - return Ordered.HIGHEST_PRECEDENCE; - } -} diff --git a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/swagger/GatewaySwaggerResourceProvider.java b/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/swagger/GatewaySwaggerResourceProvider.java deleted file mode 100644 index 30cbd21..0000000 --- a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/swagger/GatewaySwaggerResourceProvider.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.tianji.gateway.swagger; - -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.gateway.route.RouteLocator; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; -import springfox.documentation.swagger.web.SwaggerResource; -import springfox.documentation.swagger.web.SwaggerResourcesProvider; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -@Component -@Primary -@RequiredArgsConstructor -public class GatewaySwaggerResourceProvider implements SwaggerResourcesProvider { - - /** - * swagger2默认的url后缀 - */ - private static final String SWAGGER2_URL = "/v2/api-docs"; - - /** - * 路由定位器 - */ - private final RouteLocator routeLocator; - - /** - * 网关应用名称 - */ - @Value("${spring.application.name}") - private String gatewayName; - - /** - * 获取 Swagger 资源 - */ - @Override - public List get() { - List resources = new ArrayList<>(); - Map servers = new HashMap<>(); - // 1.获取路由 Uri中的 Host 作为服务名,把路由id作为请求路径,这里要确保路由id与路由path前缀一致 - routeLocator.getRoutes() - .filter(route -> route.getUri().getHost() != null) - .filter(route -> !gatewayName.equals(route.getUri().getHost())) - .subscribe( r -> servers.put(r.getUri().getHost(), r.getId())); - // 2.创建自定义资源 - servers.forEach((name, path) -> { - // 创建Swagger 资源 - SwaggerResource swaggerResource = new SwaggerResource(); - // 设置访问地址 - swaggerResource.setUrl("/" + path + SWAGGER2_URL); - // 设置名称 - swaggerResource.setName(name); - swaggerResource.setSwaggerVersion("3.0.0"); - resources.add(swaggerResource); - }); - return resources; - } -} \ No newline at end of file diff --git a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/swagger/SwaggerResourceController.java b/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/swagger/SwaggerResourceController.java deleted file mode 100644 index ad128f2..0000000 --- a/tianji-master/tj-gateway/src/main/java/com/tianji/gateway/swagger/SwaggerResourceController.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.gateway.swagger; - -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import springfox.documentation.swagger.web.SwaggerResource; - -import java.util.List; - -@RestController -@RequestMapping("/swagger-resources") -@RequiredArgsConstructor -public class SwaggerResourceController { - - private final GatewaySwaggerResourceProvider gatewaySwaggerResourceProvider; - - @RequestMapping - public ResponseEntity> swaggerResources() { - return new ResponseEntity<>(gatewaySwaggerResourceProvider.get(), HttpStatus.OK); - } -} \ No newline at end of file diff --git a/tianji-master/tj-gateway/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-gateway/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-gateway/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-gateway/src/main/resources/bootstrap-local.yml b/tianji-master/tj-gateway/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-gateway/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-gateway/src/main/resources/bootstrap.yml b/tianji-master/tj-gateway/src/main/resources/bootstrap.yml deleted file mode 100644 index ef490c5..0000000 --- a/tianji-master/tj-gateway/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,97 +0,0 @@ -server: - port: 10010 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: gateway-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - data-id: shared-spring.yaml # 共享spring配置 - refresh: false - - data-id: shared-redis.yaml # 共享redis配置 - refresh: false - - data-id: shared-logs.yaml # 共享日志配置 - refresh: false - gateway: - routes: - - id: ms - uri: lb://media-service - predicates: - - Path=/ms/** - - id: as - uri: lb://auth-service - predicates: - - Path=/as/** - filters: - - PreserveHostHeader - - id: ds - uri: lb://data-service - predicates: - - Path=/ds/** - - id: sms - uri: lb://message-service - predicates: - - Path=/sms/** - - id: us - uri: lb://user-service - predicates: - - Path=/us/** - - id: cs - uri: lb://course-service - predicates: - - Path=/cs/** - - id: os - uri: lb://order-service - predicates: - - Path=/os/** - - id: ss - uri: lb://search-service - predicates: - - Path=/ss/** - - id: ls - uri: lb://learning-service - predicates: - - Path=/ls/** - - id: ps - uri: lb://pay-service - predicates: - - Path=/ps/** - - id: ts - uri: lb://trade-service - predicates: - - Path=/ts/** - - id: es - uri: lb://exam-service - predicates: - - Path=/es/** - - id: rs - uri: lb://remark-service - predicates: - - Path=/rs/** - default-filters: - - StripPrefix=1 - globalcors: # 全局的跨域处理 - add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题 - corsConfigurations: - '[/**]': - allowedOriginPatterns: # 允许哪些网站的跨域请求 - - "*" - allowedMethods: # 允许的跨域ajax的请求方式 - - "GET" - - "POST" - - "DELETE" - - "PUT" - - "OPTIONS" - allowedHeaders: "*" # 允许在请求中携带的头信息 - allowCredentials: true # 是否允许携带cookie - maxAge: 360000 # 这次跨域检测的有效期 - -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-learning/pom.xml b/tianji-master/tj-learning/pom.xml deleted file mode 100644 index b1a9035..0000000 --- a/tianji-master/tj-learning/pom.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-learning - - - 11 - 11 - - - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - com.tianji - tj-api - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-web - - - - com.baomidou - mybatis-plus-boot-starter - - - mysql - mysql-connector-java - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.redisson - redisson - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - com.github.ben-manes.caffeine - caffeine - - - - org.springframework.boot - spring-boot-starter-amqp - - - - com.xuxueli - xxl-job-core - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - com.tianji.learning.LearningApplication - - - - - \ No newline at end of file diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/LearningApplication.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/LearningApplication.java deleted file mode 100644 index 52f575c..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/LearningApplication.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.learning; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.annotation.EnableScheduling; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@SpringBootApplication -@EnableScheduling -@MapperScan("com.tianji.learning.mapper") -@Slf4j -public class LearningApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(LearningApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/config/MybatisConfiguration.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/config/MybatisConfiguration.java deleted file mode 100644 index c5e9af0..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/config/MybatisConfiguration.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.learning.config; - -import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler; -import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor; -import com.tianji.learning.utils.TableInfoContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.HashMap; -import java.util.Map; - -@Configuration -public class MybatisConfiguration { - - @Bean - public DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor() { - Map map = new HashMap<>(1); - map.put("points_board", (sql, tableName) -> TableInfoContext.getInfo()); - return new DynamicTableNameInnerInterceptor(map); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/constants/LearningConstants.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/constants/LearningConstants.java deleted file mode 100644 index a4ceddd..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/constants/LearningConstants.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.tianji.learning.constants; - -public interface LearningConstants { - String POINTS_BOARD_TABLE_PREFIX = "points_board_"; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/constants/RedisConstants.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/constants/RedisConstants.java deleted file mode 100644 index 327d8d2..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/constants/RedisConstants.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.tianji.learning.constants; - -public interface RedisConstants { - /** - * 签到记录的Key的前缀:sign:uid:110:202301 - */ - String SIGN_RECORD_KEY_PREFIX = "sign:uid:"; - /** - * 积分排行榜的Key的前缀:boards:202301 - */ - String POINTS_BOARD_KEY_PREFIX = "boards:"; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionQuestionAdminController.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionQuestionAdminController.java deleted file mode 100644 index 79e75be..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionQuestionAdminController.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.tianji.learning.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.learning.domain.query.QuestionAdminPageQuery; -import com.tianji.learning.domain.vo.QuestionAdminVO; -import com.tianji.learning.service.IInteractionQuestionService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 互动提问的问题表 前端控制器 - *

- * - * @author 虎哥 - */ -@RestController -@RequestMapping("/admin/questions") -@Api(tags = "互动问答的相关接口") -@RequiredArgsConstructor -public class InteractionQuestionAdminController { - - private final IInteractionQuestionService questionService; - - @ApiOperation("管理端分页查询互动问题") - @GetMapping("page") - public PageDTO queryQuestionPageAdmin(QuestionAdminPageQuery query){ - return questionService.queryQuestionPageAdmin(query); - } - - @ApiOperation("管理端根据id查询互动问题") - @GetMapping("{id}") - public QuestionAdminVO queryQuestionByIdAdmin(@PathVariable("id") Long id){ - return questionService.queryQuestionByIdAdmin(id); - } - - @ApiOperation("隐藏或显示问题") - @PutMapping("/{id}/hidden/{hidden}") - public void hiddenQuestion( - @ApiParam(value = "问题id", example = "1") @PathVariable("id") Long id, - @ApiParam(value = "是否隐藏,true/false", example = "true") @PathVariable("hidden") Boolean hidden - ){ - questionService.hiddenQuestion(id, hidden); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionQuestionController.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionQuestionController.java deleted file mode 100644 index bf90af3..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionQuestionController.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.tianji.learning.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.learning.domain.dto.QuestionFormDTO; -import com.tianji.learning.domain.query.QuestionPageQuery; -import com.tianji.learning.domain.vo.QuestionVO; -import com.tianji.learning.service.IInteractionQuestionService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - *

- * 互动提问的问题表 前端控制器 - *

- * - * @author 虎哥 - */ -@RestController -@RequestMapping("/questions") -@Api(tags = "互动问答的相关接口") -@RequiredArgsConstructor -public class InteractionQuestionController { - - private final IInteractionQuestionService questionService; - - @ApiOperation("新增互动问题") - @PostMapping - public void saveQuestion(@Valid @RequestBody QuestionFormDTO questionDTO){ - questionService.saveQuestion(questionDTO); - } - - @ApiOperation("修改提问") - @PutMapping("/{id}") - public void updateQuestion( - @ApiParam("要修改的问题的id") @PathVariable("id") Long id, - @RequestBody QuestionFormDTO questionDTO){ - questionService.updateQuestion(id, questionDTO); - } - - @ApiOperation("分页查询互动问题") - @GetMapping("page") - public PageDTO queryQuestionPage(QuestionPageQuery query){ - return questionService.queryQuestionPage(query); - } - - @ApiOperation("根据id查询互动问题") - @GetMapping("{id}") - public QuestionVO queryQuestionById(@PathVariable("id") Long id){ - return questionService.queryQuestionById(id); - } - - @ApiOperation("根据id删除当前用户问题") - @DeleteMapping("/{id}") - public void deleteQuestion( - @ApiParam(value = "问题id", example = "1") @PathVariable("id") Long id - ){ - questionService.deleteById(id); - } - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionReplyAdminController.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionReplyAdminController.java deleted file mode 100644 index b33c5bd..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionReplyAdminController.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.tianji.learning.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.learning.domain.query.ReplyPageQuery; -import com.tianji.learning.domain.vo.ReplyVO; -import com.tianji.learning.service.IInteractionReplyService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 互动提问的问题表 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-10-21 - */ -@Api(tags = "问题管理相关接口") -@RestController -@RequestMapping("/admin/replies") -@RequiredArgsConstructor -public class InteractionReplyAdminController { - - private final IInteractionReplyService replyService; - - @ApiOperation("隐藏或显示评论") - @PutMapping("/{id}/hidden/{hidden}") - public void hiddenReply( - @ApiParam(value = "问题id", example = "1") @PathVariable("id") Long id, - @ApiParam(value = "是否隐藏,true/false", example = "true") @PathVariable("hidden") Boolean hidden - ){ - replyService.hiddenReply(id, hidden); - } - - @ApiOperation("分页查询回答或评论") - @GetMapping("page") - public PageDTO queryReplyPage(ReplyPageQuery pageQuery){ - return replyService.queryReplyPage(pageQuery, true); - } - - @ApiOperation("根据id查询回答或评论") - @GetMapping("{id}") - public ReplyVO queryReplyById(@ApiParam(value = "问题id", example = "1") @PathVariable("id") Long id){ - return replyService.queryReplyById(id); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionReplyController.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionReplyController.java deleted file mode 100644 index f3d2b92..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/InteractionReplyController.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.learning.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.learning.domain.dto.ReplyDTO; -import com.tianji.learning.domain.query.ReplyPageQuery; -import com.tianji.learning.domain.vo.ReplyVO; -import com.tianji.learning.service.IInteractionReplyService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 互动问题的回答或评论 前端控制器 - *

- * - * @author 虎哥 - */ -@RestController -@RequestMapping("/replies") -@RequiredArgsConstructor -@Api(tags = "互动问答相关接口 ") -public class InteractionReplyController { - - private final IInteractionReplyService replyService; - - @ApiOperation("新增回答或评论") - @PostMapping - public void saveReply(@RequestBody ReplyDTO replyDTO) { - replyService.saveReply(replyDTO); - } - - @ApiOperation("分页查询回答或评论") - @GetMapping("page") - public PageDTO queryReplyPage(ReplyPageQuery pageQuery){ - return replyService.queryReplyPage(pageQuery, false); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/LearningLessonController.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/LearningLessonController.java deleted file mode 100644 index 38a4931..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/LearningLessonController.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.tianji.learning.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.domain.query.PageQuery; -import com.tianji.learning.domain.dto.LearningPlanDTO; -import com.tianji.learning.domain.vo.LearningLessonVO; -import com.tianji.learning.domain.vo.LearningPlanPageVO; -import com.tianji.learning.service.ILearningLessonService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - *

- * 学生课程表 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-12-02 - */ -@RestController -@RequestMapping("/lessons") -@Api(tags = "我的课表相关接口") -@RequiredArgsConstructor -public class LearningLessonController { - - private final ILearningLessonService lessonService; - - @GetMapping("/page") - @ApiOperation("分页查询我的课表") - public PageDTO queryMyLessons(PageQuery query) { - return lessonService.queryMyLessons(query); - } - - @GetMapping("/now") - @ApiOperation("查询我正在学习的课程") - public LearningLessonVO queryMyCurrentLesson() { - return lessonService.queryMyCurrentLesson(); - } - - @GetMapping("/{courseId}") - @ApiOperation("查询指定课程信息") - public LearningLessonVO queryLessonByCourseId( - @ApiParam(value = "课程id" ,example = "1") @PathVariable("courseId") Long courseId) { - return lessonService.queryLessonByCourseId(courseId); - } - - @DeleteMapping("/{courseId}") - @ApiOperation("删除指定课程信息") - public void deleteCourseFromLesson( - @ApiParam(value = "课程id" ,example = "1") @PathVariable("courseId") Long courseId) { - lessonService.deleteCourseFromLesson(null, courseId); - } - - @ApiOperation("统计课程学习人数") - @GetMapping("/{courseId}/count") - public Integer countLearningLessonByCourse( - @ApiParam(value = "课程id" ,example = "1") @PathVariable("courseId") Long courseId){ - return lessonService.countLearningLessonByCourse(courseId); - } - - @ApiOperation("校验当前课程是否已经报名") - @GetMapping("/{courseId}/valid") - public Long isLessonValid( - @ApiParam(value = "课程id" ,example = "1") @PathVariable("courseId") Long courseId){ - return lessonService.isLessonValid(courseId); - } - - @ApiOperation("创建学习计划") - @PostMapping("/plans") - public void createLearningPlans(@Valid @RequestBody LearningPlanDTO planDTO){ - lessonService.createLearningPlan(planDTO.getCourseId(), planDTO.getFreq()); - } - - @ApiOperation("查询我的学习计划") - @GetMapping("/plans") - public LearningPlanPageVO queryMyPlans(PageQuery query){ - return lessonService.queryMyPlans(query); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/LearningRecordController.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/LearningRecordController.java deleted file mode 100644 index bdbfde8..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/LearningRecordController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.learning.controller; - - -import com.tianji.api.dto.leanring.LearningLessonDTO; -import com.tianji.learning.domain.dto.LearningRecordFormDTO; -import com.tianji.learning.service.ILearningRecordService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 学习记录表 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-12-10 - */ -@RestController -@RequestMapping("/learning-records") -@Api(tags = "学习记录的相关接口") -@RequiredArgsConstructor -public class LearningRecordController { - - private final ILearningRecordService recordService; - - @ApiOperation("查询指定课程的学习记录") - @GetMapping("/course/{courseId}") - public LearningLessonDTO queryLearningRecordByCourse( - @ApiParam(value = "课程id", example = "2") @PathVariable("courseId") Long courseId){ - return recordService.queryLearningRecordByCourse(courseId); - } - - @ApiOperation("提交学习记录") - @PostMapping - public void addLearningRecord(@RequestBody LearningRecordFormDTO formDTO){ - recordService.addLearningRecord(formDTO); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/PointsBoardController.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/PointsBoardController.java deleted file mode 100644 index e29d2b7..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/PointsBoardController.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.tianji.learning.controller; - -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.learning.domain.po.PointsBoardSeason; -import com.tianji.learning.domain.query.PointsBoardQuery; -import com.tianji.learning.domain.vo.PointsBoardSeasonVO; -import com.tianji.learning.domain.vo.PointsBoardVO; -import com.tianji.learning.service.IPointsBoardSeasonService; -import com.tianji.learning.service.IPointsBoardService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.time.LocalDateTime; -import java.util.List; - -/** - *

- * 学霸天梯榜 控制器 - *

- * - * @author 虎哥 - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/boards") -@Api(tags = "积分相关接口") -public class PointsBoardController { - - private final IPointsBoardService pointsBoardService; - - private final IPointsBoardSeasonService seasonService; - - @GetMapping - @ApiOperation("分页查询指定赛季的积分排行榜") - public PointsBoardVO queryPointsBoardBySeason(PointsBoardQuery query){ - return pointsBoardService.queryPointsBoardBySeason(query); - } - - @ApiOperation("查询赛季信息列表") - @GetMapping("/seasons/list") - public List queryPointsBoardSeasons(){ - // 1.获取时间 - LocalDateTime now = LocalDateTime.now(); - - // 2.查询赛季列表,必须是当前赛季之前的(开始时间小于等于当前时间) - List list = seasonService.lambdaQuery() - .le(PointsBoardSeason::getBeginTime, now).list(); - if (CollUtils.isEmpty(list)) { - return CollUtils.emptyList(); - } - // 3.返回VO - return BeanUtils.copyToList(list, PointsBoardSeasonVO.class); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/PointsRecordController.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/PointsRecordController.java deleted file mode 100644 index d08842a..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/PointsRecordController.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.learning.controller; - -import com.tianji.learning.domain.vo.PointsStatisticsVO; -import com.tianji.learning.service.IPointsRecordService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - *

- * 学习积分记录,每个月底清零 控制器 - *

- * - * @author 虎哥 - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/points") -@Api(tags = "积分相关接口") -public class PointsRecordController { - - private final IPointsRecordService pointsRecordService; - - @ApiOperation("查询我的今日积分") - @GetMapping("today") - public List queryMyPointsToday(){ - return pointsRecordService.queryMyPointsToday(); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/SignRecordController.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/SignRecordController.java deleted file mode 100644 index f18b49b..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/controller/SignRecordController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.learning.controller; - -import com.tianji.learning.domain.vo.SignResultVO; -import com.tianji.learning.service.ISignRecordService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Api(tags = "签到相关接口") -@RestController -@RequestMapping("sign-records") -@RequiredArgsConstructor -public class SignRecordController { - - private final ISignRecordService recordService; - - @PostMapping - @ApiOperation("签到功能接口") - public SignResultVO addSignRecords(){ - return recordService.addSignRecords(); - } - - @GetMapping - @ApiOperation("查询签到记录") - public Byte[] querySignRecords(){ - return recordService.querySignRecords(); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/LearningPlanDTO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/LearningPlanDTO.java deleted file mode 100644 index c7736f4..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/LearningPlanDTO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.learning.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.hibernate.validator.constraints.Range; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; - -@Data -@ApiModel(description = "学习计划表单实体") -public class LearningPlanDTO { - @NotNull - @ApiModelProperty("课程表id") - @Min(1) - private Long courseId; - @NotNull - @Range(min = 1, max = 50) - @ApiModelProperty("每周学习频率") - private Integer freq; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/LearningRecordFormDTO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/LearningRecordFormDTO.java deleted file mode 100644 index e60dcc0..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/LearningRecordFormDTO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tianji.learning.domain.dto; - -import com.tianji.common.validate.annotations.EnumValid; -import com.tianji.learning.enums.SectionType; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "学习记录") -public class LearningRecordFormDTO { - - @ApiModelProperty("小节类型:1-视频,2-考试") - @NotNull(message = "小节类型不能为空") - @EnumValid(enumeration = {1, 2}, message = "小节类型错误,只能是:1-视频,2-考试") - private SectionType sectionType; - - @ApiModelProperty("课表id") - @NotNull(message = "课表id不能为空") - private Long lessonId; - - @ApiModelProperty("对应节的id") - @NotNull(message = "节的id不能为空") - private Long sectionId; - - @ApiModelProperty("视频总时长,单位秒") - private Integer duration; - - @ApiModelProperty("视频的当前观看时长,单位秒,第一次提交填0") - private Integer moment; - - @ApiModelProperty("提交时间") - private LocalDateTime commitTime; -} \ No newline at end of file diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/QuestionFormDTO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/QuestionFormDTO.java deleted file mode 100644 index 780d9b2..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/QuestionFormDTO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.learning.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotNull; - -@Data -@ApiModel(description = "互动问题表单信息") -public class QuestionFormDTO { - @ApiModelProperty("课程id") - @NotNull(message = "课程id不能为空") - private Long courseId; - @ApiModelProperty("章id") - @NotNull(message = "章id不能为空") - private Long chapterId; - @ApiModelProperty("小节id") - @NotNull(message = "小节id不能为空") - private Long sectionId; - @ApiModelProperty("标题") - @NotNull(message = "标题不能为空") - @Length(min = 1, max = 254, message = "标题长度太长") - private String title; - @ApiModelProperty("互动问题描述") - @NotNull(message = "问题描述不能为空") - private String description; - @ApiModelProperty("是否匿名提问") - private Boolean anonymity; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/ReplyDTO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/ReplyDTO.java deleted file mode 100644 index 356fcf1..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/dto/ReplyDTO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.learning.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Data -@ApiModel(description = "互动回答信息") -public class ReplyDTO { - @ApiModelProperty("回答内容") - @NotNull(message = "回答内容不能为空") - private String content; - - @ApiModelProperty("是否匿名提问") - private Boolean anonymity; - - @ApiModelProperty("互动问题id") - @NotNull(message = "问题id不能为空") - private Long questionId; - - @ApiModelProperty("回复的上级回答id,没有可不填") - private Long answerId; - - @ApiModelProperty("回复的目标回复id,没有可不填") - private Long targetReplyId; - - @ApiModelProperty("回复的目标用户id,没有可不填") - private Long targetUserId; - - @ApiModelProperty("标记是否是学生提交的回答,默认true") - private Boolean isStudent = true; -} \ No newline at end of file diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/InteractionQuestion.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/InteractionQuestion.java deleted file mode 100644 index 462a6fd..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/InteractionQuestion.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.tianji.learning.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.learning.enums.QuestionStatus; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 互动提问的问题表 - *

- * - * @author 虎哥 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("interaction_question") -public class InteractionQuestion implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键,互动问题的id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 互动问题的标题 - */ - private String title; - - /** - * 问题描述信息 - */ - private String description; - - /** - * 所属课程id - */ - private Long courseId; - - /** - * 所属课程章id - */ - private Long chapterId; - - /** - * 所属课程节id - */ - private Long sectionId; - - /** - * 提问学员id - */ - private Long userId; - - /** - * 最新的一个回答的id - */ - private Long latestAnswerId; - - /** - * 问题下的回答数量 - */ - private Integer answerTimes; - - /** - * 是否匿名,默认false - */ - private Boolean anonymity; - - /** - * 是否被隐藏,默认false - */ - private Boolean hidden; - - /** - * 管理端问题状态:0-未查看,1-已查看 - */ - private QuestionStatus status; - - /** - * 提问时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/InteractionReply.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/InteractionReply.java deleted file mode 100644 index 3a77826..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/InteractionReply.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.tianji.learning.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 互动问题的回答或评论 - *

- * - * @author 虎哥 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("interaction_reply") -public class InteractionReply implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 互动问题的回答id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 互动问题问题id - */ - private Long questionId; - - /** - * 回复的上级回答id - */ - private Long answerId; - - /** - * 回答者id - */ - private Long userId; - - /** - * 回答内容 - */ - private String content; - - /** - * 回复的目标用户id - */ - private Long targetUserId; - - /** - * 回复的目标回复id - */ - private Long targetReplyId; - - /** - * 评论数量 - */ - private Integer replyTimes; - - /** - * 点赞数量 - */ - private Integer likedTimes; - - /** - * 是否被隐藏,默认false - */ - private Boolean hidden; - - /** - * 是否匿名,默认false - */ - private Boolean anonymity; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/LearningLesson.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/LearningLesson.java deleted file mode 100644 index eb51bda..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/LearningLesson.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.tianji.learning.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.learning.enums.LessonStatus; -import com.tianji.learning.enums.PlanStatus; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 学生课程表 - *

- * - * @author 虎哥 - * @since 2022-12-02 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("learning_lesson") -public class LearningLesson implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 学员id - */ - private Long userId; - - /** - * 课程id - */ - private Long courseId; - - /** - * 课程状态,0-未学习,1-学习中,2-已学完,3-已失效 - */ - private LessonStatus status; - - /** - * 每周学习频率,每周3天,每天2节,则频率为6 - */ - private Integer weekFreq; - - /** - * 学习计划状态,0-没有计划,1-计划进行中 - */ - private PlanStatus planStatus; - - /** - * 已学习小节数量 - */ - private Integer learnedSections; - - /** - * 最近一次学习的小节id - */ - private Long latestSectionId; - - /** - * 最近一次学习的时间 - */ - private LocalDateTime latestLearnTime; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 过期时间 - */ - private LocalDateTime expireTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/LearningRecord.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/LearningRecord.java deleted file mode 100644 index 39e8d69..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/LearningRecord.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.tianji.learning.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 学习记录表 - *

- * - * @author 虎哥 - * @since 2022-12-10 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("learning_record") -public class LearningRecord implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 学习记录的id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 对应课表的id - */ - private Long lessonId; - - /** - * 对应小节的id - */ - private Long sectionId; - - /** - * 用户id - */ - private Long userId; - - /** - * 视频的当前观看时间点,单位秒 - */ - private Integer moment; - - /** - * 是否完成学习,默认false - */ - private Boolean finished; - - /** - * 第一次观看时间 - */ - private LocalDateTime createTime; - - /** - * 完成学习的时间 - */ - private LocalDateTime finishTime; - - /** - * 更新时间(最近一次观看时间) - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsBoard.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsBoard.java deleted file mode 100644 index cc2e7f3..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsBoard.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.tianji.learning.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - *

- * 学霸天梯榜 - *

- * - * @author 虎哥 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("points_board") -public class PointsBoard implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 榜单id - */ - @TableId(value = "id", type = IdType.INPUT) - private Long id; - - /** - * 学生id - */ - private Long userId; - - /** - * 积分值 - */ - private Integer points; - - /** - * 名次,只记录赛季前100 - */ - @TableField(exist = false) - private Integer rank; - - /** - * 赛季id - */ - @TableField(exist = false) - private Integer season; - - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsBoardSeason.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsBoardSeason.java deleted file mode 100644 index 1fad010..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsBoardSeason.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.tianji.learning.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDate; - -/** - *

- * - *

- * - * @author 虎哥 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("points_board_season") -public class PointsBoardSeason implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 自增长id,season标示 - */ - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - /** - * 赛季名称,例如:第1赛季 - */ - private String name; - - /** - * 赛季开始时间 - */ - private LocalDate beginTime; - - /** - * 赛季结束时间 - */ - private LocalDate endTime; - - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsRecord.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsRecord.java deleted file mode 100644 index ecf4332..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/po/PointsRecord.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.tianji.learning.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.learning.enums.PointsRecordType; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 学习积分记录,每个月底清零 - *

- * - * @author 虎哥 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("points_record") -public class PointsRecord implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 积分记录表id - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 用户id - */ - private Long userId; - - /** - * 积分方式:1-课程学习,2-每日签到,3-课程问答, 4-课程笔记,5-课程评价 - */ - private PointsRecordType type; - - /** - * 积分值 - */ - private Integer points; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/PointsBoardQuery.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/PointsBoardQuery.java deleted file mode 100644 index f3cc4f9..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/PointsBoardQuery.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.learning.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "积分排行榜分页查询条件") -public class PointsBoardQuery extends PageQuery { - @ApiModelProperty(value = "赛季id,为null或者0则代表查询当前赛季") - private Long season; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/QuestionAdminPageQuery.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/QuestionAdminPageQuery.java deleted file mode 100644 index aa50954..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/QuestionAdminPageQuery.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tianji.learning.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import com.tianji.common.utils.DateUtils; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "互动问题管理端分页查询条件") -public class QuestionAdminPageQuery extends PageQuery { - @ApiModelProperty(value = "课程名称搜索关键字", example = "Redis") - private String courseName; - @ApiModelProperty(value = "管理端问题状态:0-未查看,1-已查看", example = "1") - private Integer status; - @ApiModelProperty(value = "更新时间区间的开始时间", example = "2022-7-18 19:52:36") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime beginTime; - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - @ApiModelProperty(value = "更新时间区间的结束时间", example = "2022-7-18 19:52:36") - private LocalDateTime endTime; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/QuestionPageQuery.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/QuestionPageQuery.java deleted file mode 100644 index 095dbd8..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/QuestionPageQuery.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.learning.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "互动问题分页查询条件") -public class QuestionPageQuery extends PageQuery { - // 用户端查询条件 - @ApiModelProperty(value = "课程id") - private Long courseId; - @ApiModelProperty(value = "小节id", example = "1") - private Long sectionId; - @ApiModelProperty(value = "是否只查询我的问题", example = "1") - private Boolean onlyMine = false; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/ReplyPageQuery.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/ReplyPageQuery.java deleted file mode 100644 index e3044fc..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/query/ReplyPageQuery.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.learning.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "互动回答分页查询条件") -public class ReplyPageQuery extends PageQuery { - @ApiModelProperty(value = "问题id,不为空则代表根据问题查询回答") - private Long questionId; - @ApiModelProperty(value = "回答id,不为空则代表根据回答查询评论") - private Long answerId; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningLessonVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningLessonVO.java deleted file mode 100644 index 5623a84..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningLessonVO.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.tianji.learning.domain.vo; - -import com.tianji.learning.enums.LessonStatus; -import com.tianji.learning.enums.PlanStatus; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "课程表信息") -public class LearningLessonVO { - - @ApiModelProperty("主键lessonId") - private Long id; - - @ApiModelProperty("课程id") - private Long courseId; - - @ApiModelProperty("课程名称") - private String courseName; - - @ApiModelProperty("课程封面") - private String courseCoverUrl; - - @ApiModelProperty("课程章节数量") - private Integer sections; - - @ApiModelProperty("课程状态,0-未学习,1-学习中,2-已学完,3-已失效") - private LessonStatus status; - - @ApiModelProperty("总已学习章节数") - private Integer learnedSections; - - @ApiModelProperty("总已报名课程数") - private Integer courseAmount; - - @ApiModelProperty("课程购买时间") - private LocalDateTime createTime; - - @ApiModelProperty("课程过期时间,如果为null代表课程永久有效") - private LocalDateTime expireTime; - - @ApiModelProperty("计划的学习频率") - private Integer weekFreq; - - @ApiModelProperty("习计划状态,0-没有计划,1-计划进行中") - private PlanStatus planStatus; - - @ApiModelProperty("最近学习的小节名") - private String latestSectionName; - - @ApiModelProperty("最近学习的小节编号") - private Integer latestSectionIndex; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningPlanPageVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningPlanPageVO.java deleted file mode 100644 index 8605a4a..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningPlanPageVO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.learning.domain.vo; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.tianji.common.domain.dto.PageDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.util.List; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "学习计划分页统计结果") -public class LearningPlanPageVO extends PageDTO { - @ApiModelProperty("本周积分值") - private Integer weekPoints; - @ApiModelProperty("本周完成的计划数量") - private Integer weekFinished; - @ApiModelProperty("总的计划学习数量") - private Integer weekTotalPlan; - - public LearningPlanPageVO() { - } - - public LearningPlanPageVO pageInfo(Long total, Long pages, List list) { - this.total = total; - this.pages = pages; - this.list = list; - return this; - } - - public LearningPlanPageVO emptyPage(Page page) { - this.total = page.getTotal(); - this.pages = page.getPages(); - return this; - } - -} \ No newline at end of file diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningPlanVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningPlanVO.java deleted file mode 100644 index 4b0af71..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/LearningPlanVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.learning.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "课程计划信息") -public class LearningPlanVO { - - @ApiModelProperty("主键lessonId") - private Long id; - - @ApiModelProperty("课程id") - private Long courseId; - - @ApiModelProperty("课程名称") - private String courseName; - - @ApiModelProperty("每周计划学习章节数") - private Integer weekFreq; - - @ApiModelProperty("课程章节数量") - private Integer sections; - - @ApiModelProperty("本周已学习章节数") - private Integer weekLearnedSections; - - @ApiModelProperty("总已学习章节数") - private Integer learnedSections; - - @ApiModelProperty("最近一次学习时间") - private LocalDateTime latestLearnTime; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardItemVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardItemVO.java deleted file mode 100644 index 65f8347..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardItemVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.learning.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "积分榜单信息") -public class PointsBoardItemVO { - @ApiModelProperty("积分值") - private Integer points; - @ApiModelProperty("名次") - private Integer rank; - @ApiModelProperty("学生姓名") - private String name; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardSeasonVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardSeasonVO.java deleted file mode 100644 index 04cad95..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardSeasonVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.learning.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDate; - -/** - *

- * - *

- * - * @author 虎哥 - * @since 2022-08-02 - */ -@Data -@ApiModel(description = "积分榜赛季信息") -public class PointsBoardSeasonVO { - - @ApiModelProperty("赛季id,1,就是第1赛季") - private Integer id; - - @ApiModelProperty("赛季名称,例如:第1赛季") - private String name; - - @ApiModelProperty("赛季开始时间") - private LocalDate beginTime; - - @ApiModelProperty("赛季结束时间") - private LocalDate endTime; - - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardVO.java deleted file mode 100644 index 175f98d..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsBoardVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.learning.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@Data -@ApiModel(description = "积分榜单汇总信息") -public class PointsBoardVO { - @ApiModelProperty("我的榜单排名") - private Integer rank; - @ApiModelProperty("我的积分值") - private Integer points; - @ApiModelProperty("前100名上榜人信息") - private List boardList; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsStatisticsVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsStatisticsVO.java deleted file mode 100644 index 4e6e5b4..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/PointsStatisticsVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.learning.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "每日积分统计实体") -public class PointsStatisticsVO { - @ApiModelProperty("获取积分方式") - private String type; - @ApiModelProperty("今日已获取积分值") - private Integer points; - @ApiModelProperty("单日积分上限") - private Integer maxPoints; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/QuestionAdminVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/QuestionAdminVO.java deleted file mode 100644 index 0409c33..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/QuestionAdminVO.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.tianji.learning.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "用户端互动问题信息") -public class QuestionAdminVO { - @ApiModelProperty("主键id") - private Long id; - @ApiModelProperty("互动问题名称") - private String title; - @ApiModelProperty("互动问题描述") - private String description; - @ApiModelProperty("回答数量,0表示没有回答") - private Integer answerTimes; - @ApiModelProperty(value = "创建时间", example = "2022-7-18 19:52:36") - private LocalDateTime createTime; - @ApiModelProperty("管理端问题状态:0-未查看,1-已查看") - private Integer status; - @ApiModelProperty("是否被隐藏") - private Boolean hidden; - - @ApiModelProperty("提问者昵称") - private String userName; - @ApiModelProperty("提问者头像") - private String userIcon; - @ApiModelProperty("课程名称") - private String courseName; - @ApiModelProperty("教师名称") - private String teacherName; - @ApiModelProperty("章名称") - private String chapterName; - @ApiModelProperty("节名称") - private String sectionName; - @ApiModelProperty("三级分类名称,中间使用/隔开") - private String categoryName; -} - - - - - - - - - - - - - - - diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/QuestionVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/QuestionVO.java deleted file mode 100644 index 9047a8e..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/QuestionVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.learning.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "用户端互动问题信息") -public class QuestionVO { - @ApiModelProperty("主键id") - private Long id; - @ApiModelProperty("互动问题名称") - private String title; - @ApiModelProperty("互动问题描述") - private String description; - @ApiModelProperty("回答数量,0表示没有回答") - private Integer answerTimes; - @ApiModelProperty(value = "创建时间", example = "2022-7-18 19:52:36") - private LocalDateTime createTime; - @ApiModelProperty("是否匿名提问") - private Boolean anonymity; - @ApiModelProperty("提问者id") - private Long userId; - @ApiModelProperty("提问者昵称") - private String userName; - @ApiModelProperty("提问者头像") - private String userIcon; - @ApiModelProperty("最新的回答信息") - private String latestReplyContent; - @ApiModelProperty("最新的回答者昵称") - private String latestReplyUser; -} \ No newline at end of file diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/ReplyVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/ReplyVO.java deleted file mode 100644 index f9ffd18..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/ReplyVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.learning.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "互动回答信息") -public class ReplyVO { - @ApiModelProperty("id") - private Long id; - @ApiModelProperty("回答内容") - private String content; - @ApiModelProperty("是否匿名提问") - private Boolean anonymity; - @ApiModelProperty("是否隐藏") - private Boolean hidden; - @ApiModelProperty("评论数量") - private Integer replyTimes; - @ApiModelProperty(value = "创建时间,也就是回答时间") - private LocalDateTime createTime; - - @ApiModelProperty("当前回复者id") - private Long userId; - @ApiModelProperty("当前回复者昵称") - private String userName; - @ApiModelProperty("当前回复者头像") - private String userIcon; - @ApiModelProperty("当前回复者类型,2-学员,其它-老师") - private Integer userType; - - @ApiModelProperty("是否点过赞") - private Boolean liked; - @ApiModelProperty("点赞数量") - private Integer likedTimes; - @ApiModelProperty("目标用户名字") - private String targetUserName; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/SignResultVO.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/SignResultVO.java deleted file mode 100644 index a3f8df1..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/domain/vo/SignResultVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.learning.domain.vo; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "签到结果") -public class SignResultVO { - @ApiModelProperty("连续签到天数") - private Integer signDays; - @ApiModelProperty("签到得分") - private Integer signPoints = 1; - @ApiModelProperty("连续签到奖励积分,连续签到超过7天以上才有奖励") - private Integer rewardPoints; - - @JsonIgnore - public int totalPoints(){ - return signPoints + rewardPoints; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/LessonStatus.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/LessonStatus.java deleted file mode 100644 index d197fd2..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/LessonStatus.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.learning.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import com.tianji.common.enums.BaseEnum; -import lombok.Getter; - -@Getter -public enum LessonStatus implements BaseEnum { - NOT_BEGIN(0, "未学习"), - LEARNING(1, "学习中"), - FINISHED(2, "已学完"), - EXPIRED(3, "已过期"), - ; - @JsonValue - @EnumValue - int value; - String desc; - - LessonStatus(int value, String desc) { - this.value = value; - this.desc = desc; - } - - @JsonCreator(mode = JsonCreator.Mode.DELEGATING) - public static LessonStatus of(Integer value){ - if (value == null) { - return null; - } - for (LessonStatus status : values()) { - if (status.equalsValue(value)) { - return status; - } - } - return null; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/PlanStatus.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/PlanStatus.java deleted file mode 100644 index c4e5956..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/PlanStatus.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tianji.learning.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import com.tianji.common.enums.BaseEnum; -import lombok.Getter; - -@Getter -public enum PlanStatus implements BaseEnum { - NO_PLAN(0, "没有计划"), - PLAN_RUNNING(1, "计划进行中"), - ; - @JsonValue - @EnumValue - int value; - String desc; - - PlanStatus(int value, String desc) { - this.value = value; - this.desc = desc; - } - - - @JsonCreator(mode = JsonCreator.Mode.DELEGATING) - public static PlanStatus of(Integer value){ - if (value == null) { - return null; - } - for (PlanStatus status : values()) { - if (status.equalsValue(value)) { - return status; - } - } - return null; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/PointsRecordType.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/PointsRecordType.java deleted file mode 100644 index 85d1f31..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/PointsRecordType.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.learning.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import com.tianji.common.enums.BaseEnum; -import lombok.Getter; - -@Getter -public enum PointsRecordType implements BaseEnum { - LEARNING(1, "课程学习", 50), - SIGN(2, "每日签到", 0), - QA(3, "课程问答", 20), - NOTE(4, "课程笔记", 20), - COMMENT(5, "课程评价", 0), - ; - @EnumValue - @JsonValue - int value; - String desc; - int maxPoints; - - PointsRecordType(int value, String desc, int maxPoints) { - this.value = value; - this.desc = desc; - this.maxPoints = maxPoints; - } - - @JsonCreator(mode = JsonCreator.Mode.DELEGATING) - public static PointsRecordType of(Integer value){ - if (value == null) { - return null; - } - for (PointsRecordType status : values()) { - if (status.equalsValue(value)) { - return status; - } - } - return null; - } -} \ No newline at end of file diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/QuestionStatus.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/QuestionStatus.java deleted file mode 100644 index 028d942..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/QuestionStatus.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.learning.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import com.tianji.common.enums.BaseEnum; -import lombok.Getter; - -@Getter -public enum QuestionStatus implements BaseEnum { - UN_CHECK(0, "未查看"), - CHECKED(1, "已查看"), - ; - @JsonValue - @EnumValue - int value; - String desc; - - QuestionStatus(int value, String desc) { - this.value = value; - this.desc = desc; - } - - @JsonCreator(mode = JsonCreator.Mode.DELEGATING) - public static QuestionStatus of(Integer value){ - if (value == null) { - return null; - } - for (QuestionStatus status : values()) { - if (status.equalsValue(value)) { - return status; - } - } - return null; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/SectionType.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/SectionType.java deleted file mode 100644 index 7738ba1..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/enums/SectionType.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tianji.learning.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import com.tianji.common.enums.BaseEnum; -import lombok.Getter; - -@Getter -public enum SectionType implements BaseEnum { - VIDEO(1, "视频"), - EXAM(2, "考试"), - ; - @JsonValue - @EnumValue - int value; - String desc; - - SectionType(int value, String desc) { - this.value = value; - this.desc = desc; - } - - - @JsonCreator(mode = JsonCreator.Mode.DELEGATING) - public static SectionType of(Integer value){ - if (value == null) { - return null; - } - for (SectionType status : values()) { - if (status.equalsValue(value)) { - return status; - } - } - return null; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/handler/PointsBoardPersistentHandler.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/handler/PointsBoardPersistentHandler.java deleted file mode 100644 index f5b6964..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/handler/PointsBoardPersistentHandler.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.tianji.learning.handler; - -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.DateUtils; -import com.tianji.learning.constants.RedisConstants; -import com.tianji.learning.domain.po.PointsBoard; -import com.tianji.learning.service.IPointsBoardSeasonService; -import com.tianji.learning.service.IPointsBoardService; -import com.tianji.learning.utils.TableInfoContext; -import com.xxl.job.core.context.XxlJobHelper; -import com.xxl.job.core.handler.annotation.XxlJob; -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.List; - -import static com.tianji.learning.constants.LearningConstants.POINTS_BOARD_TABLE_PREFIX; - -@Component -@RequiredArgsConstructor -public class PointsBoardPersistentHandler { - - private final IPointsBoardSeasonService seasonService; - - private final IPointsBoardService pointsBoardService; - - private final StringRedisTemplate redisTemplate; - - @XxlJob("createTableJob") - public void createPointsBoardTableOfLastSeason(){ - // 1.获取上月时间 - LocalDateTime time = LocalDateTime.now().minusMonths(1); - // 2.查询赛季id - Integer season = seasonService.querySeasonByTime(time); - if (season == null) { - // 赛季不存在 - return; - } - // 3.创建表 - pointsBoardService.createPointsBoardTableBySeason(season); - } - - @XxlJob("savePointsBoard2DB") - public void savePointsBoard2DB(){ - // 1.获取上月时间 - LocalDateTime time = LocalDateTime.now().minusMonths(1); - - // 2.计算动态表名 - // 2.1.查询赛季信息 - Integer season = seasonService.querySeasonByTime(time); - // 2.2.存入ThreadLocal - TableInfoContext.setInfo(POINTS_BOARD_TABLE_PREFIX + season); - - // 3.查询榜单数据 - // 3.1.拼接KEY - String key = RedisConstants.POINTS_BOARD_KEY_PREFIX + time.format(DateUtils.POINTS_BOARD_SUFFIX_FORMATTER); - // 3.2.查询数据 - int index = XxlJobHelper.getShardIndex(); - int total = XxlJobHelper.getShardTotal(); - int pageNo = index + 1; - int pageSize = 10; - while (true) { - List boardList = pointsBoardService.queryCurrentBoardList(key, pageNo, pageSize); - if (CollUtils.isEmpty(boardList)) { - break; - } - // 4.持久化到数据库 - // 4.1.把排名信息写入id - boardList.forEach(b -> { - b.setId(b.getRank().longValue()); - b.setRank(null); - }); - // 4.2.持久化 - pointsBoardService.saveBatch(boardList); - // 5.翻页 - pageNo+=total; - } - - TableInfoContext.remove(); - } - - @XxlJob("clearPointsBoardFromRedis") - public void clearPointsBoardFromRedis(){ - // 1.获取上月时间 - LocalDateTime time = LocalDateTime.now().minusMonths(1); - // 2.计算key - String key = RedisConstants.POINTS_BOARD_KEY_PREFIX + time.format(DateUtils.POINTS_BOARD_SUFFIX_FORMATTER); - // 3.删除 - redisTemplate.unlink(key); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/InteractionQuestionMapper.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/InteractionQuestionMapper.java deleted file mode 100644 index 6dfb7df..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/InteractionQuestionMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.learning.mapper; - -import com.tianji.learning.domain.po.InteractionQuestion; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 互动提问的问题表 Mapper 接口 - *

- * - * @author 虎哥 - */ -public interface InteractionQuestionMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/InteractionReplyMapper.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/InteractionReplyMapper.java deleted file mode 100644 index 32a0269..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/InteractionReplyMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.learning.mapper; - -import com.tianji.learning.domain.po.InteractionReply; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 互动问题的回答或评论 Mapper 接口 - *

- * - * @author 虎哥 - */ -public interface InteractionReplyMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/LearningLessonMapper.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/LearningLessonMapper.java deleted file mode 100644 index 4e9d651..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/LearningLessonMapper.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.learning.mapper; - -import com.tianji.learning.domain.po.LearningLesson; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Param; - -/** - *

- * 学生课程表 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-12-02 - */ -public interface LearningLessonMapper extends BaseMapper { - - Integer queryTotalPlan(@Param("userId") Long userId); -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/LearningRecordMapper.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/LearningRecordMapper.java deleted file mode 100644 index a799508..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/LearningRecordMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.learning.mapper; - -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.learning.domain.po.LearningRecord; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Param; - -import java.time.LocalDateTime; -import java.util.List; - -/** - *

- * 学习记录表 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-12-10 - */ -public interface LearningRecordMapper extends BaseMapper { - - List countLearnedSections( - @Param("userId") Long userId, - @Param("begin") LocalDateTime begin, - @Param("end") LocalDateTime end); -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsBoardMapper.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsBoardMapper.java deleted file mode 100644 index d842557..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsBoardMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.learning.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.learning.domain.po.PointsBoard; -import org.apache.ibatis.annotations.Param; - -/** - *

- * 学霸天梯榜 Mapper 接口 - *

- * - * @author 虎哥 - */ -public interface PointsBoardMapper extends BaseMapper { - - void createPointsBoardTable(@Param("tableName") String tableName); -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsBoardSeasonMapper.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsBoardSeasonMapper.java deleted file mode 100644 index 210f30d..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsBoardSeasonMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.learning.mapper; - -import com.tianji.learning.domain.po.PointsBoardSeason; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * Mapper 接口 - *

- * - * @author 虎哥 - */ -public interface PointsBoardSeasonMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsRecordMapper.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsRecordMapper.java deleted file mode 100644 index 6135b39..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mapper/PointsRecordMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.learning.mapper; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.toolkit.Constants; -import com.tianji.learning.domain.po.PointsRecord; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - *

- * 学习积分记录,每个月底清零 Mapper 接口 - *

- * - * @author 虎哥 - */ -public interface PointsRecordMapper extends BaseMapper { - - @Select("SELECT SUM(points) FROM points_record ${ew.customSqlSegment}") - Integer queryUserPointsByTypeAndDate(@Param(Constants.WRAPPER) QueryWrapper wrapper); - - @Select("SELECT type, SUM(points) AS points FROM points_record ${ew.customSqlSegment} GROUP BY type") - List queryUserPointsByDate(@Param(Constants.WRAPPER) QueryWrapper wrapper); -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LearningPointsListener.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LearningPointsListener.java deleted file mode 100644 index f1b06ef..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LearningPointsListener.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.tianji.learning.mq; - -import com.tianji.common.constants.MqConstants; -import com.tianji.learning.enums.PointsRecordType; -import com.tianji.learning.mq.message.SignInMessage; -import com.tianji.learning.service.IPointsRecordService; -import lombok.RequiredArgsConstructor; -import org.springframework.amqp.core.ExchangeTypes; -import org.springframework.amqp.rabbit.annotation.Exchange; -import org.springframework.amqp.rabbit.annotation.Queue; -import org.springframework.amqp.rabbit.annotation.QueueBinding; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class LearningPointsListener { - - private final IPointsRecordService recordService; - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "qa.points.queue", durable = "true"), - exchange = @Exchange(name = MqConstants.Exchange.LEARNING_EXCHANGE, type = ExchangeTypes.TOPIC), - key = MqConstants.Key.WRITE_REPLY - )) - public void listenWriteReplyMessage(Long userId){ - recordService.addPointsRecord(userId, 5, PointsRecordType.QA); - } - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "sign.points.queue", durable = "true"), - exchange = @Exchange(name = MqConstants.Exchange.LEARNING_EXCHANGE, type = ExchangeTypes.TOPIC), - key = MqConstants.Key.SIGN_IN - )) - public void listenSignInMessage(SignInMessage message){ - recordService.addPointsRecord(message.getUserId(), message.getPoints(), PointsRecordType.SIGN); - } - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "learning.points.queue", durable = "true"), - exchange = @Exchange(name = MqConstants.Exchange.LEARNING_EXCHANGE, type = ExchangeTypes.TOPIC), - key = MqConstants.Key.LEARN_SECTION - )) - public void listenLearnSectionMessage(Long userId){ - recordService.addPointsRecord(userId, 10, PointsRecordType.LEARNING); - } - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "note.new.points.queue", durable = "true"), - exchange = @Exchange(name = MqConstants.Exchange.LEARNING_EXCHANGE, type = ExchangeTypes.TOPIC), - key = MqConstants.Key.WRITE_NOTE - )) - public void listenWriteNodeMessage(Long userId){ - recordService.addPointsRecord(userId, 3, PointsRecordType.NOTE); - } - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "note.gathered.points.queue", durable = "true"), - exchange = @Exchange(name = MqConstants.Exchange.LEARNING_EXCHANGE, type = ExchangeTypes.TOPIC), - key = MqConstants.Key.NOTE_GATHERED - )) - public void listenNodeGatheredMessage(Long userId){ - recordService.addPointsRecord(userId, 2, PointsRecordType.NOTE); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LessonChangeListener.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LessonChangeListener.java deleted file mode 100644 index 0f3b7ad..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LessonChangeListener.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.tianji.learning.mq; - -import com.tianji.api.dto.trade.OrderBasicDTO; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.utils.CollUtils; -import com.tianji.learning.service.ILearningLessonService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.ExchangeTypes; -import org.springframework.amqp.rabbit.annotation.Exchange; -import org.springframework.amqp.rabbit.annotation.Queue; -import org.springframework.amqp.rabbit.annotation.QueueBinding; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class LessonChangeListener { - - private final ILearningLessonService lessonService; - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(value = "learning.lesson.pay.queue", durable = "true"), - exchange = @Exchange(name = MqConstants.Exchange.ORDER_EXCHANGE, type = ExchangeTypes.TOPIC), - key = MqConstants.Key.ORDER_PAY_KEY - )) - public void listenLessonPay(OrderBasicDTO order){ - // 1.健壮性处理 - if(order == null || order.getUserId() == null || CollUtils.isEmpty(order.getCourseIds())){ - // 数据有误,无需处理 - log.error("接收到MQ消息有误,订单数据为空"); - return; - } - // 2.添加课程 - log.debug("监听到用户{}的订单{},需要添加课程{}到课表中", order.getUserId(), order.getOrderId(), order.getCourseIds()); - lessonService.addUserLessons(order.getUserId(), order.getCourseIds()); - } - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(value = "learning.lesson.refund.queue", durable = "true"), - exchange = @Exchange(name = MqConstants.Exchange.ORDER_EXCHANGE, type = ExchangeTypes.TOPIC), - key = MqConstants.Key.ORDER_REFUND_KEY - )) - public void listenLessonRefund(OrderBasicDTO order){ - // 1.健壮性处理 - if(order == null || order.getUserId() == null || CollUtils.isEmpty(order.getCourseIds())){ - // 数据有误,无需处理 - log.error("接收到MQ消息有误,订单数据为空"); - return; - } - // 2.添加课程 - log.debug("监听到用户{}的订单{}要退款,需要删除课程{}", order.getUserId(), order.getOrderId(), order.getCourseIds()); - lessonService.deleteCourseFromLesson(order.getUserId(), order.getCourseIds().get(0)); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LikeTimesChangeListener.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LikeTimesChangeListener.java deleted file mode 100644 index 9e7e356..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/LikeTimesChangeListener.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.tianji.learning.mq; - -import com.tianji.api.dto.remark.LikedTimesDTO; -import com.tianji.learning.domain.po.InteractionReply; -import com.tianji.learning.service.IInteractionReplyService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.ExchangeTypes; -import org.springframework.amqp.rabbit.annotation.Exchange; -import org.springframework.amqp.rabbit.annotation.Queue; -import org.springframework.amqp.rabbit.annotation.QueueBinding; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; - -import static com.tianji.common.constants.MqConstants.Exchange.LIKE_RECORD_EXCHANGE; -import static com.tianji.common.constants.MqConstants.Key.QA_LIKED_TIMES_KEY; - -@Slf4j -@Component -@RequiredArgsConstructor -public class LikeTimesChangeListener { - - private final IInteractionReplyService replyService; - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "qa.liked.times.queue", durable = "true"), - exchange = @Exchange(name = LIKE_RECORD_EXCHANGE, type = ExchangeTypes.TOPIC), - key = QA_LIKED_TIMES_KEY - )) - public void listenReplyLikedTimesChange(List likedTimesDTOs){ - log.debug("监听到回答或评论的点赞数变更"); - - List list = new ArrayList<>(likedTimesDTOs.size()); - for (LikedTimesDTO dto : likedTimesDTOs) { - InteractionReply r = new InteractionReply(); - r.setId(dto.getBizId()); - r.setLikedTimes(dto.getLikedTimes()); - list.add(r); - } - replyService.updateBatchById(list); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/message/SignInMessage.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/message/SignInMessage.java deleted file mode 100644 index d3655ca..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/mq/message/SignInMessage.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tianji.learning.mq.message; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor(staticName = "of") -public class SignInMessage { - private Long userId; - private Integer points; -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IInteractionQuestionService.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IInteractionQuestionService.java deleted file mode 100644 index 8a5639f..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IInteractionQuestionService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.learning.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.learning.domain.dto.QuestionFormDTO; -import com.tianji.learning.domain.po.InteractionQuestion; -import com.tianji.learning.domain.query.QuestionAdminPageQuery; -import com.tianji.learning.domain.query.QuestionPageQuery; -import com.tianji.learning.domain.vo.QuestionAdminVO; -import com.tianji.learning.domain.vo.QuestionVO; - -/** - *

- * 互动提问的问题表 服务类 - *

- * - * @author 虎哥 - */ -public interface IInteractionQuestionService extends IService { - - void saveQuestion(QuestionFormDTO questionDTO); - - PageDTO queryQuestionPage(QuestionPageQuery query); - - QuestionVO queryQuestionById(Long id); - - PageDTO queryQuestionPageAdmin(QuestionAdminPageQuery query); - - QuestionAdminVO queryQuestionByIdAdmin(Long id); - - void hiddenQuestion(Long id, Boolean hidden); - - void updateQuestion(Long id, QuestionFormDTO questionDTO); - - void deleteById(Long id); -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IInteractionReplyService.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IInteractionReplyService.java deleted file mode 100644 index f6563c5..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IInteractionReplyService.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.learning.service; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.learning.domain.dto.ReplyDTO; -import com.tianji.learning.domain.po.InteractionReply; -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.learning.domain.query.ReplyPageQuery; -import com.tianji.learning.domain.vo.ReplyVO; - -/** - *

- * 互动问题的回答或评论 服务类 - *

- * - * @author 虎哥 - */ -public interface IInteractionReplyService extends IService { - - void saveReply(ReplyDTO replyDTO); - - PageDTO queryReplyPage(ReplyPageQuery pageQuery, boolean isStudent); - - void hiddenReply(Long id, Boolean hidden); - - ReplyVO queryReplyById(Long id); -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ILearningLessonService.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ILearningLessonService.java deleted file mode 100644 index 9fcd03e..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ILearningLessonService.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.learning.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.domain.query.PageQuery; -import com.tianji.learning.domain.po.LearningLesson; -import com.tianji.learning.domain.vo.LearningLessonVO; -import com.tianji.learning.domain.vo.LearningPlanPageVO; - -import java.util.List; - -/** - *

- * 学生课程表 服务类 - *

- * - * @author 虎哥 - * @since 2022-12-02 - */ -public interface ILearningLessonService extends IService { - - void addUserLessons(Long userId, List courseIds); - - PageDTO queryMyLessons(PageQuery query); - - LearningLessonVO queryMyCurrentLesson(); - - LearningLessonVO queryLessonByCourseId(Long courseId); - - void deleteCourseFromLesson(Long userId, Long courseId); - - Integer countLearningLessonByCourse(Long courseId); - - Long isLessonValid(Long courseId); - - LearningLesson queryByUserAndCourseId(Long userId, Long courseId); - - void createLearningPlan(Long courseId, Integer freq); - - LearningPlanPageVO queryMyPlans(PageQuery query); -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ILearningRecordService.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ILearningRecordService.java deleted file mode 100644 index b5a6bc0..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ILearningRecordService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.learning.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.api.dto.leanring.LearningLessonDTO; -import com.tianji.learning.domain.dto.LearningRecordFormDTO; -import com.tianji.learning.domain.po.LearningRecord; - -/** - *

- * 学习记录表 服务类 - *

- * - * @author 虎哥 - * @since 2022-12-10 - */ -public interface ILearningRecordService extends IService { - - LearningLessonDTO queryLearningRecordByCourse(Long courseId); - - void addLearningRecord(LearningRecordFormDTO formDTO); -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsBoardSeasonService.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsBoardSeasonService.java deleted file mode 100644 index e2a3d57..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsBoardSeasonService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.learning.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.learning.domain.po.PointsBoardSeason; - -import java.time.LocalDateTime; - -/** - *

- * 服务类 - *

- * - * @author 虎哥 - */ -public interface IPointsBoardSeasonService extends IService { - - Integer querySeasonByTime(LocalDateTime time); -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsBoardService.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsBoardService.java deleted file mode 100644 index cdb6902..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsBoardService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.learning.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.learning.domain.po.PointsBoard; -import com.tianji.learning.domain.query.PointsBoardQuery; -import com.tianji.learning.domain.vo.PointsBoardVO; - -import java.util.List; - -/** - *

- * 学霸天梯榜 服务类 - *

- * - * @author 虎哥 - */ -public interface IPointsBoardService extends IService { - PointsBoardVO queryPointsBoardBySeason(PointsBoardQuery query); - - void createPointsBoardTableBySeason(Integer season); - - List queryCurrentBoardList(String key, Integer pageNo, Integer pageSize); -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsRecordService.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsRecordService.java deleted file mode 100644 index 64e878e..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/IPointsRecordService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.learning.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.learning.domain.po.PointsRecord; -import com.tianji.learning.domain.vo.PointsStatisticsVO; -import com.tianji.learning.enums.PointsRecordType; - -import java.util.List; - -/** - *

- * 学习积分记录,每个月底清零 服务类 - *

- * - * @author 虎哥 - */ -public interface IPointsRecordService extends IService { - void addPointsRecord(Long userId, int points, PointsRecordType type); - - List queryMyPointsToday(); - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ISignRecordService.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ISignRecordService.java deleted file mode 100644 index ab8bcc2..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/ISignRecordService.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.tianji.learning.service; - -import com.tianji.learning.domain.vo.SignResultVO; - -public interface ISignRecordService { - SignResultVO addSignRecords(); - - Byte[] querySignRecords(); - -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/InteractionQuestionServiceImpl.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/InteractionQuestionServiceImpl.java deleted file mode 100644 index d89d3de..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/InteractionQuestionServiceImpl.java +++ /dev/null @@ -1,353 +0,0 @@ -package com.tianji.learning.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.cache.CategoryCache; -import com.tianji.api.client.course.CatalogueClient; -import com.tianji.api.client.course.CourseClient; -import com.tianji.api.client.search.SearchClient; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.course.CataSimpleInfoDTO; -import com.tianji.api.dto.course.CourseFullInfoDTO; -import com.tianji.api.dto.course.CourseSimpleInfoDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.learning.domain.dto.QuestionFormDTO; -import com.tianji.learning.domain.po.InteractionQuestion; -import com.tianji.learning.domain.po.InteractionReply; -import com.tianji.learning.domain.query.QuestionAdminPageQuery; -import com.tianji.learning.domain.query.QuestionPageQuery; -import com.tianji.learning.domain.vo.QuestionAdminVO; -import com.tianji.learning.domain.vo.QuestionVO; -import com.tianji.learning.mapper.InteractionQuestionMapper; -import com.tianji.learning.mapper.InteractionReplyMapper; -import com.tianji.learning.service.IInteractionQuestionService; -import com.tianji.learning.service.IInteractionReplyService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - -/** - *

- * 互动提问的问题表 服务实现类 - *

- * - * @author 虎哥 - */ -@Service -@RequiredArgsConstructor -public class InteractionQuestionServiceImpl extends ServiceImpl implements IInteractionQuestionService { - - private final InteractionReplyMapper replyMapper; - private final UserClient userClient; - private final CourseClient courseClient; - private final SearchClient searchClient; - private final CatalogueClient catalogueClient; - private final CategoryCache categoryCache; - - @Override - public void saveQuestion(QuestionFormDTO questionDTO) { - // 1.获取当前登录的用户id - Long userId = UserContext.getUser(); - // 2.数据封装 - InteractionQuestion question = BeanUtils.copyBean(questionDTO, InteractionQuestion.class); - question.setUserId(userId); - // 3.写入数据库 - save(question); - } - - @Override - public PageDTO queryQuestionPage(QuestionPageQuery query) { - // 1.参数校验,课程id和小节id不能都为空 - Long courseId = query.getCourseId(); - Long sectionId = query.getSectionId(); - if (courseId == null && sectionId == null) { - throw new BadRequestException("课程id和小节id不能都为空"); - } - // 2.分页查询 - Page page = lambdaQuery() - .select(InteractionQuestion.class, info -> !info.getProperty().equals("description")) - .eq(query.getOnlyMine(), InteractionQuestion::getUserId, UserContext.getUser()) - .eq(courseId != null, InteractionQuestion::getCourseId, courseId) - .eq(sectionId != null, InteractionQuestion::getSectionId, sectionId) - .eq(InteractionQuestion::getHidden, false) - .page(query.toMpPageDefaultSortByCreateTimeDesc()); - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(page); - } - // 3.根据id查询提问者和最近一次回答的信息 - Set userIds = new HashSet<>(); - Set answerIds = new HashSet<>(); - // 3.1.得到问题当中的提问者id和最近一次回答的id - for (InteractionQuestion q : records) { - if(!q.getAnonymity()) { // 只查询非匿名的问题 - userIds.add(q.getUserId()); - } - answerIds.add(q.getLatestAnswerId()); - } - // 3.2.根据id查询最近一次回答 - answerIds.remove(null); - Map replyMap = new HashMap<>(answerIds.size()); - if(CollUtils.isNotEmpty(answerIds)) { - List replies = replyMapper.selectBatchIds(answerIds); - for (InteractionReply reply : replies) { - replyMap.put(reply.getId(), reply); - if(!reply.getAnonymity()){ - userIds.add(reply.getUserId()); - } - } - } - - // 3.3.根据id查询用户信息(提问者) - userIds.remove(null); - Map userMap = new HashMap<>(userIds.size()); - if(CollUtils.isNotEmpty(userIds)) { - List users = userClient.queryUserByIds(userIds); - userMap = users.stream() - .collect(Collectors.toMap(UserDTO::getId, u -> u)); - } - - // 4.封装VO - List voList = new ArrayList<>(records.size()); - for (InteractionQuestion r : records) { - // 4.1.将PO转为VO - QuestionVO vo = BeanUtils.copyBean(r, QuestionVO.class); - voList.add(vo); - // 4.2.封装提问者信息 - if(!r.getAnonymity()){ - UserDTO userDTO = userMap.get(r.getUserId()); - if (userDTO != null) { - vo.setUserName(userDTO.getName()); - vo.setUserIcon(userDTO.getIcon()); - } - } - - // 4.3.封装最近一次回答的信息 - InteractionReply reply = replyMap.get(r.getLatestAnswerId()); - if (reply != null) { - vo.setLatestReplyContent(reply.getContent()); - if(!reply.getAnonymity()){ - UserDTO user = userMap.get(reply.getUserId()); - vo.setLatestReplyUser(user.getName()); - } - - } - } - - return PageDTO.of(page, voList); - } - - @Override - public QuestionVO queryQuestionById(Long id) { - // 1.根据id查询数据 - InteractionQuestion question = getById(id); - // 2.数据校验 - if(question == null || question.getHidden()){ - // 没有数据或者是被隐藏了 - return null; - } - // 3.查询提问者信息 - UserDTO user = null; - if(!question.getAnonymity()){ - user = userClient.queryUserById(question.getUserId()); - } - // 4.封装VO - QuestionVO vo = BeanUtils.copyBean(question, QuestionVO.class); - if (user != null) { - vo.setUserName(user.getName()); - vo.setUserIcon(user.getIcon()); - } - return vo; - } - - @Override - public PageDTO queryQuestionPageAdmin(QuestionAdminPageQuery query) { - // 1.处理课程名称,得到课程id - List courseIds = null; - if (StringUtils.isNotBlank(query.getCourseName())) { - courseIds = searchClient.queryCoursesIdByName(query.getCourseName()); - if (CollUtils.isEmpty(courseIds)) { - return PageDTO.empty(0L, 0L); - } - } - // 2.分页查询 - Integer status = query.getStatus(); - LocalDateTime begin = query.getBeginTime(); - LocalDateTime end = query.getEndTime(); - Page page = lambdaQuery() - .in(courseIds != null, InteractionQuestion::getCourseId, courseIds) - .eq(status != null, InteractionQuestion::getStatus, status) - .gt(begin != null, InteractionQuestion::getCreateTime, begin) - .lt(end != null, InteractionQuestion::getCreateTime, end) - .page(query.toMpPageDefaultSortByCreateTimeDesc()); - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(page); - } - - // 3.准备VO需要的数据:用户数据、课程数据、章节数据 - Set userIds = new HashSet<>(); - Set cIds = new HashSet<>(); - Set cataIds = new HashSet<>(); - // 3.1.获取各种数据的id集合 - for (InteractionQuestion q : records) { - userIds.add(q.getUserId()); - cIds.add(q.getCourseId()); - cataIds.add(q.getChapterId()); - cataIds.add(q.getSectionId()); - } - // 3.2.根据id查询用户 - List users = userClient.queryUserByIds(userIds); - Map userMap = new HashMap<>(users.size()); - if (CollUtils.isNotEmpty(users)) { - userMap = users.stream().collect(Collectors.toMap(UserDTO::getId, u -> u)); - } - - // 3.3.根据id查询课程 - List cInfos = courseClient.getSimpleInfoList(cIds); - Map cInfoMap = new HashMap<>(cInfos.size()); - if (CollUtils.isNotEmpty(cInfos)) { - cInfoMap = cInfos.stream().collect(Collectors.toMap(CourseSimpleInfoDTO::getId, c -> c)); - } - - // 3.4.根据id查询章节 - List catas = catalogueClient.batchQueryCatalogue(cataIds); - Map cataMap = new HashMap<>(catas.size()); - if (CollUtils.isNotEmpty(catas)) { - cataMap = catas.stream() - .collect(Collectors.toMap(CataSimpleInfoDTO::getId, CataSimpleInfoDTO::getName)); - } - - - // 4.封装VO - List voList = new ArrayList<>(records.size()); - for (InteractionQuestion q : records) { - // 4.1.将PO转VO,属性拷贝 - QuestionAdminVO vo = BeanUtils.copyBean(q, QuestionAdminVO.class); - voList.add(vo); - // 4.2.用户信息 - UserDTO user = userMap.get(q.getUserId()); - if (user != null) { - vo.setUserName(user.getName()); - } - // 4.3.课程信息以及分类信息 - CourseSimpleInfoDTO cInfo = cInfoMap.get(q.getCourseId()); - if (cInfo != null) { - vo.setCourseName(cInfo.getName()); - vo.setCategoryName(categoryCache.getCategoryNames(cInfo.getCategoryIds())); - } - // 4.4.章节信息 - vo.setChapterName(cataMap.getOrDefault(q.getChapterId(), "")); - vo.setSectionName(cataMap.getOrDefault(q.getSectionId(), "")); - } - return PageDTO.of(page, voList); - } - - @Override - public QuestionAdminVO queryQuestionByIdAdmin(Long id) { - // 1.根据id查询问题 - InteractionQuestion question = getById(id); - if (question == null) { - return null; - } - // 2.转PO为VO - QuestionAdminVO vo = BeanUtils.copyBean(question, QuestionAdminVO.class); - // 3.查询提问者信息 - UserDTO user = userClient.queryUserById(question.getUserId()); - if (user != null) { - vo.setUserName(user.getName()); - vo.setUserIcon(user.getIcon()); - } - // 4.查询课程信息 - CourseFullInfoDTO cInfo = courseClient.getCourseInfoById( - question.getCourseId(), false, true); - if (cInfo != null) { - // 4.1.课程名称信息 - vo.setCourseName(cInfo.getName()); - // 4.2.分类信息 - vo.setCategoryName(categoryCache.getCategoryNames(cInfo.getCategoryIds())); - // 4.3.教师信息 - List teacherIds = cInfo.getTeacherIds(); - List teachers = userClient.queryUserByIds(teacherIds); - if(CollUtils.isNotEmpty(teachers)) { - vo.setTeacherName(teachers.stream() - .map(UserDTO::getName).collect(Collectors.joining("/"))); - } - } - // 5.查询章节信息 - List catas = catalogueClient.batchQueryCatalogue( - List.of(question.getChapterId(), question.getSectionId())); - Map cataMap = new HashMap<>(catas.size()); - if (CollUtils.isNotEmpty(catas)) { - cataMap = catas.stream() - .collect(Collectors.toMap(CataSimpleInfoDTO::getId, CataSimpleInfoDTO::getName)); - } - vo.setChapterName(cataMap.getOrDefault(question.getChapterId(), "")); - vo.setSectionName(cataMap.getOrDefault(question.getSectionId(), "")); - // 6.封装VO - return vo; - } - - @Override - public void hiddenQuestion(Long id, Boolean hidden) { - // 1.更新问题 - InteractionQuestion question = new InteractionQuestion(); - question.setId(id); - question.setHidden(hidden); - updateById(question); - } - - @Override - public void updateQuestion(Long id, QuestionFormDTO questionDTO) { - // 1.获取当前登录用户 - Long userId = UserContext.getUser(); - // 2.查询当前问题 - InteractionQuestion q = getById(id); - if (q == null) { - throw new BadRequestException("问题不存在"); - } - // 3.判断是否是当前用户的问题 - if (!q.getUserId().equals(userId)) { - // 不是,抛出异常 - throw new BadRequestException("无权修改他人的问题"); - } - // 4.修改问题 - InteractionQuestion question = BeanUtils.toBean(questionDTO, InteractionQuestion.class); - question.setId(id); - updateById(question); - } - - @Override - @Transactional - public void deleteById(Long id) { - // 1.获取当前登录用户 - Long userId = UserContext.getUser(); - // 2.查询当前问题 - InteractionQuestion q = getById(id); - if (q == null) { - return; - } - // 3.判断是否是当前用户的问题 - if (!q.getUserId().equals(userId)) { - // 不是,抛出异常 - throw new BadRequestException("无权删除他人的问题"); - } - // 4.删除问题 - removeById(id); - // 5.删除答案 - replyMapper.delete( - new QueryWrapper().lambda().eq(InteractionReply::getQuestionId, id) - ); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/InteractionReplyServiceImpl.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/InteractionReplyServiceImpl.java deleted file mode 100644 index b3c6cea..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/InteractionReplyServiceImpl.java +++ /dev/null @@ -1,241 +0,0 @@ -package com.tianji.learning.service.impl; - -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.remark.RemarkClient; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.learning.domain.dto.ReplyDTO; -import com.tianji.learning.domain.po.InteractionQuestion; -import com.tianji.learning.domain.po.InteractionReply; -import com.tianji.learning.domain.query.ReplyPageQuery; -import com.tianji.learning.domain.vo.ReplyVO; -import com.tianji.learning.enums.QuestionStatus; -import com.tianji.learning.mapper.InteractionReplyMapper; -import com.tianji.learning.service.IInteractionQuestionService; -import com.tianji.learning.service.IInteractionReplyService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import static com.tianji.common.constants.Constant.DATA_FIELD_NAME_CREATE_TIME; -import static com.tianji.common.constants.Constant.DATA_FIELD_NAME_LIKED_TIME; - -/** - *

- * 互动问题的回答或评论 服务实现类 - *

- * - * @author 虎哥 - */ -@Service -@RequiredArgsConstructor -public class InteractionReplyServiceImpl extends ServiceImpl implements IInteractionReplyService { - - private final IInteractionQuestionService questionService; - private final UserClient userClient; - private final RemarkClient remarkClient; - private final RabbitMqHelper mqHelper; - - @Override - @Transactional - public void saveReply(ReplyDTO replyDTO) { - // 1.获取登录用户 - Long userId = UserContext.getUser(); - // 2.新增回答 - InteractionReply reply = BeanUtils.toBean(replyDTO, InteractionReply.class); - reply.setUserId(userId); - save(reply); - // 3.累加评论数或者累加回答数 - // 3.1.判断当前回复的类型是否是回答 - boolean isAnswer = replyDTO.getAnswerId() == null; - if (!isAnswer) { - // 3.2.是评论,则需要更新上级回答的评论数量 - lambdaUpdate() - .setSql("reply_times = reply_times + 1") - .eq(InteractionReply::getId, replyDTO.getAnswerId()) - .update(); - } - // 3.3.尝试更新问题表中的状态、 最近一次回答、回答数量 - questionService.lambdaUpdate() - .set(isAnswer, InteractionQuestion::getLatestAnswerId, reply.getAnswerId()) - .setSql(isAnswer, "answer_times = answer_times + 1") - .set(replyDTO.getIsStudent(), InteractionQuestion::getStatus, QuestionStatus.UN_CHECK.getValue()) - .eq(InteractionQuestion::getId, replyDTO.getQuestionId()) - .update(); - - // 4.尝试累加积分 - if(replyDTO.getIsStudent()) { - // 学生才需要累加积分 - mqHelper.send( - MqConstants.Exchange.LEARNING_EXCHANGE, - MqConstants.Key.WRITE_REPLY, - 5); - } - } - - @Override - public PageDTO queryReplyPage(ReplyPageQuery query, boolean forAdmin) { - // 1.问题id和回答id至少要有一个,先做参数判断 - Long questionId = query.getQuestionId(); - Long answerId = query.getAnswerId(); - if (questionId == null && answerId == null) { - throw new BadRequestException("问题或回答id不能都为空"); - } - // 标记当前是查询问题下的回答 - boolean isQueryAnswer = questionId != null; - // 2.分页查询reply - Page page = lambdaQuery() - .eq(isQueryAnswer, InteractionReply::getQuestionId, questionId) - .eq(InteractionReply::getAnswerId, isQueryAnswer ? 0L : answerId) - .eq(!forAdmin, InteractionReply::getHidden, false) - .page(query.toMpPage( // 先根据点赞数排序,点赞数相同,再按照创建时间排序 - new OrderItem(DATA_FIELD_NAME_LIKED_TIME, false), - new OrderItem(DATA_FIELD_NAME_CREATE_TIME, true)) - ); - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(page); - } - // 3.数据处理,需要查询:提问者信息、回复目标信息、当前用户是否点赞 - Set userIds = new HashSet<>(); - Set answerIds = new HashSet<>(); - Set targetReplyIds = new HashSet<>(); - // 3.1.获取提问者id 、回复的目标id、当前回答或评论id(统计点赞信息) - for (InteractionReply r : records) { - if(!r.getAnonymity() || forAdmin) { - // 非匿名 - userIds.add(r.getUserId()); - } - targetReplyIds.add(r.getTargetReplyId()); - answerIds.add(r.getId()); - } - // 3.2.查询目标回复,如果目标回复不是匿名,则需要查询出目标回复的用户信息 - targetReplyIds.remove(0L); - targetReplyIds.remove(null); - if(targetReplyIds.size() > 0) { - List targetReplies = listByIds(targetReplyIds); - Set targetUserIds = targetReplies.stream() - .filter(Predicate.not(InteractionReply::getAnonymity).or(r -> forAdmin)) - .map(InteractionReply::getUserId) - .collect(Collectors.toSet()); - userIds.addAll(targetUserIds); - } - // 3.3.查询用户 - Map userMap = new HashMap<>(userIds.size()); - if(userIds.size() > 0) { - List users = userClient.queryUserByIds(userIds); - userMap = users.stream().collect(Collectors.toMap(UserDTO::getId, u -> u)); - } - // 3.4.查询用户点赞状态 - Set bizLiked = remarkClient.isBizLiked(answerIds); - // 4.处理VO - List list = new ArrayList<>(records.size()); - for (InteractionReply r : records) { - // 4.1.拷贝基础属性 - ReplyVO v = BeanUtils.toBean(r, ReplyVO.class); - list.add(v); - // 4.2.回复人信息 - if(!r.getAnonymity() || forAdmin){ - UserDTO userDTO = userMap.get(r.getUserId()); - if (userDTO != null) { - v.setUserIcon(userDTO.getIcon()); - v.setUserName(userDTO.getName()); - v.setUserType(userDTO.getType()); - } - } - // 4.3.如果存在评论的目标,则需要设置目标用户信息 - if(r.getTargetReplyId() != null){ - UserDTO targetUser = userMap.get(r.getTargetUserId()); - if (targetUser != null) { - v.setTargetUserName(targetUser.getName()); - } - } - // 4.4.点赞状态 - v.setLiked(bizLiked.contains(r.getId())); - } - return new PageDTO<>(page.getTotal(), page.getPages(), list); - } - - @Override - @Transactional - public void hiddenReply(Long id, Boolean hidden) { - // 1.查询 - InteractionReply old = getById(id); - if (old == null) { - return; - } - - // 2.隐藏回答 - InteractionReply reply = new InteractionReply(); - reply.setId(id); - reply.setHidden(hidden); - updateById(reply); - - // 3.隐藏评论,先判断是否是回答,回答才需要隐藏下属评论 - if (old.getAnswerId() != null && old.getAnswerId() != 0) { - // 3.1.有answerId,说明自己是评论,无需处理 - return; - } - // 3.2.没有answerId,说明自己是回答,需要隐藏回答下的评论 - lambdaUpdate() - .set(InteractionReply::getHidden, hidden) - .eq(InteractionReply::getAnswerId, id) - .update(); - } - - @Override - public ReplyVO queryReplyById(Long id) { - // 1.根据id查询 - InteractionReply r = getById(id); - // 2.数据处理,需要查询用户信息、评论目标信息、当前用户是否点赞 - Set userIds = new HashSet<>(); - // 2.1.获取用户 id - userIds.add(r.getUserId()); - // 2.2.查询评论目标,如果评论目标不是匿名,则需要查询出目标回复的用户id - if(r.getTargetReplyId() != null && r.getTargetReplyId() != 0) { - InteractionReply target = getById(r.getTargetReplyId()); - if(!target.getAnonymity()) { - userIds.add(target.getUserId()); - } - } - // 2.3.查询用户详细 - Map userMap = new HashMap<>(userIds.size()); - if(userIds.size() > 0) { - List users = userClient.queryUserByIds(userIds); - userMap = users.stream().collect(Collectors.toMap(UserDTO::getId, u -> u)); - } - // 2.4.查询用户点赞状态 - Set bizLiked = remarkClient.isBizLiked(CollUtils.singletonList(id)); - // 4.处理VO - // 4.1.拷贝基础属性 - ReplyVO v = BeanUtils.toBean(r, ReplyVO.class); - // 4.2.回复人信息 - UserDTO userDTO = userMap.get(r.getUserId()); - if (userDTO != null) { - v.setUserIcon(userDTO.getIcon()); - v.setUserName(userDTO.getName()); - v.setUserType(userDTO.getType()); - } - // 4.3.目标用户 - UserDTO targetUser = userMap.get(r.getTargetUserId()); - if (targetUser != null) { - v.setTargetUserName(targetUser.getName()); - } - // 4.4.点赞状态 - v.setLiked(bizLiked.contains(id)); - return v; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/LearningLessonServiceImpl.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/LearningLessonServiceImpl.java deleted file mode 100644 index 0d7a1bf..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/LearningLessonServiceImpl.java +++ /dev/null @@ -1,311 +0,0 @@ -package com.tianji.learning.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.course.CatalogueClient; -import com.tianji.api.client.course.CourseClient; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.api.dto.course.CataSimpleInfoDTO; -import com.tianji.api.dto.course.CourseFullInfoDTO; -import com.tianji.api.dto.course.CourseSimpleInfoDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.domain.query.PageQuery; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.*; -import com.tianji.learning.domain.po.LearningLesson; -import com.tianji.learning.domain.po.LearningRecord; -import com.tianji.learning.domain.vo.LearningLessonVO; -import com.tianji.learning.domain.vo.LearningPlanPageVO; -import com.tianji.learning.domain.vo.LearningPlanVO; -import com.tianji.learning.enums.LessonStatus; -import com.tianji.learning.enums.PlanStatus; -import com.tianji.learning.mapper.LearningLessonMapper; -import com.tianji.learning.mapper.LearningRecordMapper; -import com.tianji.learning.service.ILearningLessonService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -/** - *

- * 学生课程表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-12-02 - */ -@SuppressWarnings("ALL") -@Service -@RequiredArgsConstructor -@Slf4j -public class LearningLessonServiceImpl extends ServiceImpl implements ILearningLessonService { - - private final CourseClient courseClient; - private final CatalogueClient catalogueClient; - private final LearningRecordMapper recordMapper; - - @Override - @Transactional - public void addUserLessons(Long userId, List courseIds) { - // 1.查询课程有效期 - List cInfoList = courseClient.getSimpleInfoList(courseIds); - if (CollUtils.isEmpty(cInfoList)) { - // 课程不存在,无法添加 - log.error("课程信息不存在,无法添加到课表"); - return; - } - // 2.循环遍历,处理LearningLesson数据 - List list = new ArrayList<>(cInfoList.size()); - for (CourseSimpleInfoDTO cInfo : cInfoList) { - LearningLesson lesson = new LearningLesson(); - // 2.1.获取过期时间 - Integer validDuration = cInfo.getValidDuration(); - if (validDuration != null && validDuration > 0) { - LocalDateTime now = LocalDateTime.now(); - lesson.setCreateTime(now); - lesson.setExpireTime(now.plusMonths(validDuration)); - } - // 2.2.填充userId和courseId - lesson.setUserId(userId); - lesson.setCourseId(cInfo.getId()); - list.add(lesson); - } - // 3.批量新增 - saveBatch(list); - } - - @Override - public PageDTO queryMyLessons(PageQuery query) { - // 1.获取当前登录用户 - Long userId = UserContext.getUser(); - // 2.分页查询 - // select * from learning_lesson where user_id = #{userId} order by latest_learn_time limit 0, 5 - Page page = lambdaQuery() - .eq(LearningLesson::getUserId, userId) // where user_id = #{userId} - .page(query.toMpPage("latest_learn_time", false)); - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(page); - } - // 3.查询课程信息 - Map cMap = queryCourseSimpleInfoList(records); - - // 4.封装VO返回 - List list = new ArrayList<>(records.size()); - // 4.1.循环遍历,把LearningLesson转为VO - for (LearningLesson r : records) { - // 4.2.拷贝基础属性到vo - LearningLessonVO vo = BeanUtils.copyBean(r, LearningLessonVO.class); - // 4.3.获取课程信息,填充到vo - CourseSimpleInfoDTO cInfo = cMap.get(r.getCourseId()); - vo.setCourseName(cInfo.getName()); - vo.setCourseCoverUrl(cInfo.getCoverUrl()); - vo.setSections(cInfo.getSectionNum()); - list.add(vo); - } - return PageDTO.of(page, list); - } - - private Map queryCourseSimpleInfoList(List records) { - // 3.1.获取课程id - Set cIds = records.stream().map(LearningLesson::getCourseId).collect(Collectors.toSet()); - // 3.2.查询课程信息 - List cInfoList = courseClient.getSimpleInfoList(cIds); - if (CollUtils.isEmpty(cInfoList)) { - // 课程不存在,无法添加 - throw new BadRequestException("课程信息不存在!"); - } - // 3.3.把课程集合处理成Map,key是courseId,值是course本身 - Map cMap = cInfoList.stream() - .collect(Collectors.toMap(CourseSimpleInfoDTO::getId, c -> c)); - return cMap; - } - - @Override - public LearningLessonVO queryMyCurrentLesson() { - // 1.获取当前登录的用户 - Long userId = UserContext.getUser(); - // 2.查询正在学习的课程 select * from xx where user_id = #{userId} AND status = 1 order by latest_learn_time limit 1 - LearningLesson lesson = lambdaQuery() - .eq(LearningLesson::getUserId, userId) - .eq(LearningLesson::getStatus, LessonStatus.LEARNING.getValue()) - .orderByDesc(LearningLesson::getLatestLearnTime) - .last("limit 1") - .one(); - if (lesson == null) { - return null; - } - // 3.拷贝PO基础属性到VO - LearningLessonVO vo = BeanUtils.copyBean(lesson, LearningLessonVO.class); - // 4.查询课程信息 - CourseFullInfoDTO cInfo = courseClient.getCourseInfoById(lesson.getCourseId(), false, false); - if (cInfo == null) { - throw new BadRequestException("课程不存在"); - } - vo.setCourseName(cInfo.getName()); - vo.setCourseCoverUrl(cInfo.getCoverUrl()); - vo.setSections(cInfo.getSectionNum()); - // 5.统计课表中的课程数量 select count(1) from xxx where user_id = #{userId} - Integer courseAmount = lambdaQuery() - .eq(LearningLesson::getUserId, userId) - .count(); - vo.setCourseAmount(courseAmount); - // 6.查询小节信息 - List cataInfos = - catalogueClient.batchQueryCatalogue(CollUtils.singletonList(lesson.getLatestSectionId())); - if (!CollUtils.isEmpty(cataInfos)) { - CataSimpleInfoDTO cataInfo = cataInfos.get(0); - vo.setLatestSectionName(cataInfo.getName()); - vo.setLatestSectionIndex(cataInfo.getCIndex()); - } - return vo; - } - - @Override - public LearningLessonVO queryLessonByCourseId(Long courseId) { - // 1.获取当前登录用户 - Long userId = UserContext.getUser(); - // 2.查询课程信息 select * from xx where user_id = #{userId} AND course_id = #{courseId} - LearningLesson lesson = getOne(buildUserIdAndCourseIdWrapper(userId, courseId)); - if (lesson == null) { - return null; - } - // 3.处理VO - return BeanUtils.copyBean(lesson, LearningLessonVO.class); - } - - @Override - public void deleteCourseFromLesson(Long userId, Long courseId) { - // 1.获取当前登录用户 - if (userId == null) { - userId = UserContext.getUser(); - } - // 2.删除课程 - remove(buildUserIdAndCourseIdWrapper(userId, courseId)); - } - - @Override - public Integer countLearningLessonByCourse(Long courseId) { - // select count(1) from xx where course_id = #{cc} AND status in (0, 1, 2) - return lambdaQuery() - .eq(LearningLesson::getCourseId, courseId) - .in(LearningLesson::getStatus, - LessonStatus.NOT_BEGIN.getValue(), - LessonStatus.LEARNING.getValue(), - LessonStatus.FINISHED.getValue()) - .count(); - } - - @Override - public Long isLessonValid(Long courseId) { - // 1.获取登录用户 - Long userId = UserContext.getUser(); - if (userId == null) { - return null; - } - // 2.查询课程 - LearningLesson lesson = getOne(buildUserIdAndCourseIdWrapper(userId, courseId)); - if (lesson == null) { - return null; - } - return lesson.getId(); - } - - @Override - public LearningLesson queryByUserAndCourseId(Long userId, Long courseId) { - return getOne(buildUserIdAndCourseIdWrapper(userId, courseId)); - } - - @Override - public void createLearningPlan(Long courseId, Integer freq) { - // 1.获取当前登录的用户 - Long userId = UserContext.getUser(); - // 2.查询课表中的指定课程有关的数据 - LearningLesson lesson = queryByUserAndCourseId(userId, courseId); - AssertUtils.isNotNull(lesson, "课程信息不存在!"); - // 3.修改数据 - LearningLesson l = new LearningLesson(); - l.setId(lesson.getId()); - l.setWeekFreq(freq); - if(lesson.getPlanStatus() == PlanStatus.NO_PLAN) { - l.setPlanStatus(PlanStatus.PLAN_RUNNING); - } - updateById(l); - } - - @Override - public LearningPlanPageVO queryMyPlans(PageQuery query) { - LearningPlanPageVO result = new LearningPlanPageVO(); - // 1.获取当前登录用户 - Long userId = UserContext.getUser(); - // 2.获取本周起始时间 - LocalDate now = LocalDate.now(); - LocalDateTime begin = DateUtils.getWeekBeginTime(now); - LocalDateTime end = DateUtils.getWeekEndTime(now); - // 3.查询总的统计数据 - // 3.1.本周总的已学习小节数量 - Integer weekFinished = recordMapper.selectCount(new LambdaQueryWrapper() - .eq(LearningRecord::getUserId, userId) - .eq(LearningRecord::getFinished, true) - .gt(LearningRecord::getFinishTime, begin) - .lt(LearningRecord::getFinishTime, end) - ); - result.setWeekFinished(weekFinished); - // 3.2.本周总的计划学习小节数量 - Integer weekTotalPlan = getBaseMapper().queryTotalPlan(userId); - result.setWeekTotalPlan(weekTotalPlan); - // TODO 3.3.本周学习积分 - - // 4.查询分页数据 - // 4.1.分页查询课表信息以及学习计划信息 - Page p = lambdaQuery() - .eq(LearningLesson::getUserId, userId) - .eq(LearningLesson::getPlanStatus, PlanStatus.PLAN_RUNNING) - .in(LearningLesson::getStatus, LessonStatus.NOT_BEGIN, LessonStatus.LEARNING) - .page(query.toMpPage("latest_learn_time", false)); - List records = p.getRecords(); - if (CollUtils.isEmpty(records)) { - return result.emptyPage(p); - } - // 4.2.查询课表对应的课程信息 - Map cMap = queryCourseSimpleInfoList(records); - // 4.3.统计每一个课程本周已学习小节数量 - List list = recordMapper.countLearnedSections(userId, begin, end); - Map countMap = IdAndNumDTO.toMap(list); - // 4.4.组装数据VO - List voList = new ArrayList<>(records.size()); - for (LearningLesson r : records) { - // 4.4.1.拷贝基础属性到vo - LearningPlanVO vo = BeanUtils.copyBean(r, LearningPlanVO.class); - // 4.4.2.填充课程详细信息 - CourseSimpleInfoDTO cInfo = cMap.get(r.getCourseId()); - if (cInfo != null) { - vo.setCourseName(cInfo.getName()); - vo.setSections(cInfo.getSectionNum()); - } - // 4.4.3.每个课程的本周已学习小节数量 - vo.setWeekLearnedSections(countMap.getOrDefault(r.getId(), 0)); - voList.add(vo); - } - return result.pageInfo(p.getTotal(), p.getPages(), voList); - } - - private LambdaQueryWrapper buildUserIdAndCourseIdWrapper(Long userId, Long courseId) { - LambdaQueryWrapper queryWrapper = new QueryWrapper() - .lambda() - .eq(LearningLesson::getUserId, userId) - .eq(LearningLesson::getCourseId, courseId); - return queryWrapper; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/LearningRecordServiceImpl.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/LearningRecordServiceImpl.java deleted file mode 100644 index af49ed6..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/LearningRecordServiceImpl.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.tianji.learning.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.course.CourseClient; -import com.tianji.api.dto.course.CourseFullInfoDTO; -import com.tianji.api.dto.leanring.LearningLessonDTO; -import com.tianji.api.dto.leanring.LearningRecordDTO; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.learning.domain.dto.LearningRecordFormDTO; -import com.tianji.learning.domain.po.LearningLesson; -import com.tianji.learning.domain.po.LearningRecord; -import com.tianji.learning.enums.LessonStatus; -import com.tianji.learning.enums.SectionType; -import com.tianji.learning.mapper.LearningRecordMapper; -import com.tianji.learning.service.ILearningLessonService; -import com.tianji.learning.service.ILearningRecordService; -import com.tianji.learning.utils.LearningRecordDelayTaskHandler; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - *

- * 学习记录表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-12-10 - */ -@Service -@RequiredArgsConstructor -public class LearningRecordServiceImpl extends ServiceImpl implements ILearningRecordService { - - private final ILearningLessonService lessonService; - - private final CourseClient courseClient; - - private final LearningRecordDelayTaskHandler taskHandler; - - @Override - public LearningLessonDTO queryLearningRecordByCourse(Long courseId) { - // 1.获取登录用户 - Long userId = UserContext.getUser(); - // 2.查询课表 - LearningLesson lesson = lessonService.queryByUserAndCourseId(userId, courseId); - // 3.查询学习记录 - // select * from xx where lesson_id = #{lessonId} - List records = lambdaQuery().eq(LearningRecord::getLessonId, lesson.getId()).list(); - // 4.封装结果 - LearningLessonDTO dto = new LearningLessonDTO(); - dto.setId(lesson.getId()); - dto.setLatestSectionId(lesson.getLatestSectionId()); - dto.setRecords(BeanUtils.copyList(records, LearningRecordDTO.class)); - return dto; - } - - @Override - @Transactional - public void addLearningRecord(LearningRecordFormDTO recordDTO) { - // 1.获取登录用户 - Long userId = UserContext.getUser(); - // 2.处理学习记录 - boolean finished = false; - if (recordDTO.getSectionType() == SectionType.VIDEO) { - // 2.1.处理视频 - finished = handleVideoRecord(userId, recordDTO); - }else{ - // 2.2.处理考试 - finished = handleExamRecord(userId, recordDTO); - } - if(!finished){ - // 没有新学完的小节,无需更新课表中的学习进度 - return; - } - // 3.处理课表数据 - handleLearningLessonsChanges(recordDTO); - } - - private void handleLearningLessonsChanges(LearningRecordFormDTO recordDTO) { - // 1.查询课表 - LearningLesson lesson = lessonService.getById(recordDTO.getLessonId()); - if (lesson == null) { - throw new BizIllegalException("课程不存在,无法更新数据!"); - } - // 2.判断是否有新的完成小节 - boolean allLearned = false; - - // 3.如果有新完成的小节,则需要查询课程数据 - CourseFullInfoDTO cInfo = courseClient.getCourseInfoById(lesson.getCourseId(), false, false); - if (cInfo == null) { - throw new BizIllegalException("课程不存在,无法更新数据!"); - } - // 4.比较课程是否全部学完:已学习小节 >= 课程总小节 - allLearned = lesson.getLearnedSections() + 1 >= cInfo.getSectionNum(); - - // 5.更新课表 - lessonService.lambdaUpdate() - .set(lesson.getLearnedSections() == 0, LearningLesson::getStatus, LessonStatus.LEARNING.getValue()) - .set(allLearned, LearningLesson::getStatus, LessonStatus.FINISHED.getValue()) - .setSql("learned_sections = learned_sections + 1") - .eq(LearningLesson::getId, lesson.getId()) - .update(); - } - - private boolean handleVideoRecord(Long userId, LearningRecordFormDTO recordDTO) { - // 1.查询旧的学习记录 - LearningRecord old = queryOldRecord(recordDTO.getLessonId(), recordDTO.getSectionId()); - // 2.判断是否存在 - if (old == null) { - // 3.不存在,则新增 - // 3.1.转换PO - LearningRecord record = BeanUtils.copyBean(recordDTO, LearningRecord.class); - // 3.2.填充数据 - record.setUserId(userId); - // 3.3.写入数据库 - boolean success = save(record); - if (!success) { - throw new DbException("新增学习记录失败!"); - } - return false; - } - // 4.存在,则更新 - // 4.1.判断是否是第一次完成 - boolean finished = !old.getFinished() && recordDTO.getMoment() * 2 >= recordDTO.getDuration(); - if(!finished){ - LearningRecord record = new LearningRecord(); - record.setLessonId(recordDTO.getLessonId()); - record.setSectionId(recordDTO.getSectionId()); - record.setMoment(recordDTO.getMoment()); - record.setId(old.getId()); - record.setFinished(old.getFinished()); - taskHandler.addLearningRecordTask(record); - return false; - } - // 4.2.更新数据 - boolean success = lambdaUpdate() - .set(LearningRecord::getMoment, recordDTO.getMoment()) - .set(LearningRecord::getFinished, true) - .set(LearningRecord::getFinishTime, recordDTO.getCommitTime()) - .eq(LearningRecord::getId, old.getId()) - .update(); - if(!success){ - throw new DbException("更新学习记录失败!"); - } - // 4.3.清理缓存 - taskHandler.cleanRecordCache(recordDTO.getLessonId(), recordDTO.getSectionId()); - return true; - } - - private LearningRecord queryOldRecord(Long lessonId, Long sectionId) { - // 1.查询缓存 - LearningRecord record = taskHandler.readRecordCache(lessonId, sectionId); - // 2.如果命中,直接返回 - if (record != null) { - return record; - } - // 3.未命中,查询数据库 - record = lambdaQuery() - .eq(LearningRecord::getLessonId, lessonId) - .eq(LearningRecord::getSectionId, sectionId) - .one(); - // 4.写入缓存 - taskHandler.writeRecordCache(record); - return record; - } - - private boolean handleExamRecord(Long userId, LearningRecordFormDTO recordDTO) { - // 1.转换DTO为PO - LearningRecord record = BeanUtils.copyBean(recordDTO, LearningRecord.class); - // 2.填充数据 - record.setUserId(userId); - record.setFinished(true); - record.setFinishTime(recordDTO.getCommitTime()); - // 3.写入数据库 - boolean success = save(record); - if (!success) { - throw new DbException("新增考试记录失败!"); - } - return true; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsBoardSeasonServiceImpl.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsBoardSeasonServiceImpl.java deleted file mode 100644 index c2a31c3..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsBoardSeasonServiceImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tianji.learning.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.learning.domain.po.PointsBoardSeason; -import com.tianji.learning.mapper.PointsBoardSeasonMapper; -import com.tianji.learning.service.IPointsBoardSeasonService; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.Optional; - -/** - *

- * 服务实现类 - *

- * - * @author 虎哥 - */ -@Service -public class PointsBoardSeasonServiceImpl extends ServiceImpl implements IPointsBoardSeasonService { - - @Override - public Integer querySeasonByTime(LocalDateTime time) { - Optional optional = lambdaQuery() - .le(PointsBoardSeason::getBeginTime, time) - .ge(PointsBoardSeason::getEndTime, time) - .oneOpt(); - return optional.map(PointsBoardSeason::getId).orElse(null); - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsBoardServiceImpl.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsBoardServiceImpl.java deleted file mode 100644 index 881912d..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsBoardServiceImpl.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.tianji.learning.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.DateUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.learning.constants.RedisConstants; -import com.tianji.learning.domain.po.PointsBoard; -import com.tianji.learning.domain.query.PointsBoardQuery; -import com.tianji.learning.domain.vo.PointsBoardItemVO; -import com.tianji.learning.domain.vo.PointsBoardVO; -import com.tianji.learning.mapper.PointsBoardMapper; -import com.tianji.learning.service.IPointsBoardService; -import com.tianji.learning.utils.TableInfoContext; -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.core.BoundZSetOperations; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.core.ZSetOperations; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - -import static com.tianji.learning.constants.LearningConstants.POINTS_BOARD_TABLE_PREFIX; - -/** - *

- * 学霸天梯榜 服务实现类 - *

- * - * @author 虎哥 - */ -@Service -@RequiredArgsConstructor -public class PointsBoardServiceImpl extends ServiceImpl implements IPointsBoardService { - - private final StringRedisTemplate redisTemplate; - - private final UserClient userClient; - - @Override - public PointsBoardVO queryPointsBoardBySeason(PointsBoardQuery query) { - // 1.判断是否是查询当前赛季 - Long season = query.getSeason(); - boolean isCurrent = season == null || season == 0; - // 2.获取Redis的Key - LocalDateTime now = LocalDateTime.now(); - String key = RedisConstants.POINTS_BOARD_KEY_PREFIX + now.format(DateUtils.POINTS_BOARD_SUFFIX_FORMATTER); - // 2.查询我的积分和排名 - PointsBoard myBoard = isCurrent ? - queryMyCurrentBoard(key) : // 查询当前榜单(Redis) - queryMyHistoryBoard(season); // 查询历史榜单(MySQL) - // 3.查询榜单列表 - List list = isCurrent ? - queryCurrentBoardList(key, query.getPageNo(), query.getPageSize()) : - queryHistoryBoardList(query); - // 4.封装VO - PointsBoardVO vo = new PointsBoardVO(); - // 4.1.处理我的信息 - if (myBoard != null) { - vo.setPoints(myBoard.getPoints()); - vo.setRank(myBoard.getRank()); - } - if (CollUtils.isEmpty(list)) { - return vo; - } - // 4.2.查询用户信息 - Set uIds = list.stream().map(PointsBoard::getUserId).collect(Collectors.toSet()); - List users = userClient.queryUserByIds(uIds); - Map userMap = new HashMap<>(uIds.size()); - if(CollUtils.isNotEmpty(users)) { - userMap = users.stream().collect(Collectors.toMap(UserDTO::getId, UserDTO::getName)); - } - // 4.3.转换VO - List items = new ArrayList<>(list.size()); - for (PointsBoard p : list) { - PointsBoardItemVO v = new PointsBoardItemVO(); - v.setPoints(p.getPoints()); - v.setRank(p.getRank()); - v.setName(userMap.get(p.getUserId())); - items.add(v); - } - vo.setBoardList(items); - return vo; - } - - @Override - public void createPointsBoardTableBySeason(Integer season) { - getBaseMapper().createPointsBoardTable(POINTS_BOARD_TABLE_PREFIX + season); - } - - private List queryHistoryBoardList(PointsBoardQuery query) { - // 1.计算表名 - TableInfoContext.setInfo(POINTS_BOARD_TABLE_PREFIX + query.getSeason()); - // 2.查询数据 - Page page = page(query.toMpPage()); - // 3.数据处理 - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return CollUtils.emptyList(); - } - records.forEach(b -> b.setRank(b.getId().intValue())); - return records; - } - - @Override - public List queryCurrentBoardList(String key, Integer pageNo, Integer pageSize) { - // 1.计算分页 - int from = (pageNo - 1) * pageSize; - // 2.查询 - Set> tuples = redisTemplate.opsForZSet() - .reverseRangeWithScores(key, from, from + pageSize - 1); - if (CollUtils.isEmpty(tuples)) { - return CollUtils.emptyList(); - } - // 3.封装 - int rank = from + 1; - List list = new ArrayList<>(tuples.size()); - for (ZSetOperations.TypedTuple tuple : tuples) { - String userId = tuple.getValue(); - Double points = tuple.getScore(); - if (userId == null || points == null) { - continue; - } - PointsBoard p = new PointsBoard(); - p.setUserId(Long.valueOf(userId)); - p.setPoints(points.intValue()); - p.setRank(rank++); - list.add(p); - } - return list; - } - - private PointsBoard queryMyHistoryBoard(Long season) { - // 1.获取登录用户 - Long userId = UserContext.getUser(); - // 2.计算表名 - TableInfoContext.setInfo(POINTS_BOARD_TABLE_PREFIX + season); - // 3.查询数据 - Optional opt = lambdaQuery().eq(PointsBoard::getUserId, userId).oneOpt(); - if (opt.isEmpty()) { - return null; - } - // 4.转换数据 - PointsBoard pointsBoard = opt.get(); - pointsBoard.setRank(pointsBoard.getId().intValue()); - return pointsBoard; - } - - private PointsBoard queryMyCurrentBoard(String key) { - // 1.绑定key - BoundZSetOperations ops = redisTemplate.boundZSetOps(key); - // 2.获取当前用户信息 - String userId = UserContext.getUser().toString(); - // 3.查询积分 - Double points = ops.score(userId); - // 4.查询排名 - Long rank = ops.reverseRank(userId); - // 5.封装返回 - PointsBoard p = new PointsBoard(); - p.setPoints(points == null ? 0 : points.intValue()); - p.setRank(rank == null ? 0 : rank.intValue() + 1); - return p; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsRecordServiceImpl.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsRecordServiceImpl.java deleted file mode 100644 index 706bf93..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/PointsRecordServiceImpl.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.tianji.learning.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.DateUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.learning.constants.RedisConstants; -import com.tianji.learning.domain.po.PointsRecord; -import com.tianji.learning.domain.vo.PointsStatisticsVO; -import com.tianji.learning.enums.PointsRecordType; -import com.tianji.learning.mapper.PointsRecordMapper; -import com.tianji.learning.service.IPointsRecordService; -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -/** - *

- * 学习积分记录,每个月底清零 服务实现类 - *

- * - * @author 虎哥 - */ -@Service -@RequiredArgsConstructor -public class PointsRecordServiceImpl extends ServiceImpl implements IPointsRecordService { - - private final StringRedisTemplate redisTemplate; - - @Override - public void addPointsRecord(Long userId, int points, PointsRecordType type) { - LocalDateTime now = LocalDateTime.now(); - int maxPoints = type.getMaxPoints(); - // 1.判断当前方式有没有积分上限 - int realPoints = points; - if(maxPoints > 0) { - // 2.有,则需要判断是否超过上限 - LocalDateTime begin = DateUtils.getDayStartTime(now); - LocalDateTime end = DateUtils.getDayEndTime(now); - // 2.1.查询今日已得积分 - int currentPoints = queryUserPointsByTypeAndDate(userId, type, begin, end); - // 2.2.判断是否超过上限 - if(currentPoints >= maxPoints) { - // 2.3.超过,直接结束 - return; - } - // 2.4.没超过,保存积分记录 - if(currentPoints + points > maxPoints){ - realPoints = maxPoints - currentPoints; - } - } - // 3.没有,直接保存积分记录 - PointsRecord p = new PointsRecord(); - p.setPoints(realPoints); - p.setUserId(userId); - p.setType(type); - save(p); - // 4.更新总积分到Redis - String key = RedisConstants.POINTS_BOARD_KEY_PREFIX + now.format(DateUtils.POINTS_BOARD_SUFFIX_FORMATTER); - redisTemplate.opsForZSet().incrementScore(key, userId.toString(), realPoints); - } - - @Override - public List queryMyPointsToday() { - // 1.获取用户 - Long userId = UserContext.getUser(); - // 2.获取日期 - LocalDateTime now = LocalDateTime.now(); - LocalDateTime begin = DateUtils.getDayStartTime(now); - LocalDateTime end = DateUtils.getDayEndTime(now); - // 3.构建查询条件 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda() - .eq(PointsRecord::getUserId, userId) - .between(PointsRecord::getCreateTime, begin, end); - // 4.查询 - List list = getBaseMapper().queryUserPointsByDate(wrapper); - if (CollUtils.isEmpty(list)) { - return CollUtils.emptyList(); - } - // 5.封装返回 - List vos = new ArrayList<>(list.size()); - for (PointsRecord p : list) { - PointsStatisticsVO vo = new PointsStatisticsVO(); - vo.setType(p.getType().getDesc()); - vo.setMaxPoints(p.getType().getMaxPoints()); - vo.setPoints(p.getPoints()); - vos.add(vo); - } - return vos; - } - - private int queryUserPointsByTypeAndDate( - Long userId, PointsRecordType type, LocalDateTime begin, LocalDateTime end) { - // 1.查询条件 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda() - .eq(PointsRecord::getUserId, userId) - .eq(type != null, PointsRecord::getType, type) - .between(begin != null && end != null, PointsRecord::getCreateTime, begin, end); - // 2.调用mapper,查询结果 - Integer points = getBaseMapper().queryUserPointsByTypeAndDate(wrapper); - // 3.判断并返回 - return points == null ? 0 : points; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/SignRecordServiceImpl.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/SignRecordServiceImpl.java deleted file mode 100644 index 601d76f..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/service/impl/SignRecordServiceImpl.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.tianji.learning.service.impl; - -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.BooleanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.DateUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.learning.constants.RedisConstants; -import com.tianji.learning.domain.vo.SignResultVO; -import com.tianji.learning.mq.message.SignInMessage; -import com.tianji.learning.service.ISignRecordService; -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.connection.BitFieldSubCommands; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; - -import java.time.LocalDate; -import java.util.List; - -@Service -@RequiredArgsConstructor -public class SignRecordServiceImpl implements ISignRecordService { - - private final StringRedisTemplate redisTemplate; - - private final RabbitMqHelper mqHelper; - - @Override - public SignResultVO addSignRecords() { - // 1.签到 - // 1.1.获取登录用户 - Long userId = UserContext.getUser(); - // 1.2.获取日期 - LocalDate now = LocalDate.now(); - // 1.3.拼接key - String key = RedisConstants.SIGN_RECORD_KEY_PREFIX - + userId - + now.format(DateUtils.SIGN_DATE_SUFFIX_FORMATTER); - // 1.4.计算offset - int offset = now.getDayOfMonth() - 1; - // 1.5.保存签到信息 - Boolean exists = redisTemplate.opsForValue().setBit(key, offset, true); - if (BooleanUtils.isTrue(exists)) { - throw new BizIllegalException("不允许重复签到!"); - } - // 2.计算连续签到天数 - int signDays = countSignDays(key, now.getDayOfMonth()); - // 3.计算签到得分 - int rewardPoints = 0; - switch (signDays) { - case 7: - rewardPoints = 10; - break; - case 14: - rewardPoints = 20; - break; - case 28: - rewardPoints = 40; - break; - } - // 4.保存积分明细记录 - mqHelper.send( - MqConstants.Exchange.LEARNING_EXCHANGE, - MqConstants.Key.SIGN_IN, - SignInMessage.of(userId, rewardPoints + 1)); - // 5.封装返回 - SignResultVO vo = new SignResultVO(); - vo.setSignDays(signDays); - vo.setRewardPoints(rewardPoints); - return vo; - } - - @Override - public Byte[] querySignRecords() { - // 1.获取登录用户 - Long userId = UserContext.getUser(); - // 2.获取日期 - LocalDate now = LocalDate.now(); - int dayOfMonth = now.getDayOfMonth(); - // 3.拼接key - String key = RedisConstants.SIGN_RECORD_KEY_PREFIX - + userId - + now.format(DateUtils.SIGN_DATE_SUFFIX_FORMATTER); - // 4.读取 - List result = redisTemplate.opsForValue() - .bitField(key, BitFieldSubCommands.create().get( - BitFieldSubCommands.BitFieldType.unsigned(dayOfMonth)).valueAt(0)); - if (CollUtils.isEmpty(result)) { - return new Byte[0]; - } - int num = result.get(0).intValue(); - - Byte[] arr = new Byte[dayOfMonth]; - int pos = dayOfMonth - 1; - while (pos >= 0){ - arr[pos--] = (byte)(num & 1); - // 把数字右移一位,抛弃最后一个bit位,继续下一个bit位 - num >>>= 1; - } - return arr; - } - - private int countSignDays(String key, int len) { - // 1.获取本月从第一天开始,到今天为止的所有签到记录 - List result = redisTemplate.opsForValue() - .bitField(key, BitFieldSubCommands.create().get( - BitFieldSubCommands.BitFieldType.unsigned(len)).valueAt(0)); - if (CollUtils.isEmpty(result)) { - return 0; - } - int num = result.get(0).intValue(); - // 2.定义一个计数器 - int count = 0; - // 3.循环,与1做与运算,得到最后一个bit,判断是否为0,为0则终止,为1则继续 - while ((num & 1) == 1) { - // 4.计数器+1 - count++; - // 5.把数字右移一位,最后一位被舍弃,倒数第二位成了最后一位 - num >>>= 1; - } - return count; - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/DelayTask.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/DelayTask.java deleted file mode 100644 index 1d14838..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/DelayTask.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tianji.learning.utils; - -import lombok.Data; - -import java.time.Duration; -import java.util.concurrent.Delayed; -import java.util.concurrent.TimeUnit; - -@Data -public class DelayTask implements Delayed { - private D data; - private long deadlineNanos; - - public DelayTask(D data, Duration delayTime) { - this.data = data; - this.deadlineNanos = System.nanoTime() + delayTime.toNanos(); - } - - @Override - public long getDelay(TimeUnit unit) { - return unit.convert(Math.max(0, deadlineNanos - System.nanoTime()), TimeUnit.NANOSECONDS); - } - - @Override - public int compareTo(Delayed o) { - long l = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS); - if(l > 0){ - return 1; - }else if(l < 0){ - return -1; - }else { - return 0; - } - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/LearningRecordDelayTaskHandler.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/LearningRecordDelayTaskHandler.java deleted file mode 100644 index a28f873..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/LearningRecordDelayTaskHandler.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.tianji.learning.utils; - -import com.tianji.common.utils.JsonUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.learning.domain.po.LearningLesson; -import com.tianji.learning.domain.po.LearningRecord; -import com.tianji.learning.mapper.LearningRecordMapper; -import com.tianji.learning.service.ILearningLessonService; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.Objects; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.DelayQueue; - -@Slf4j -@Component -@RequiredArgsConstructor -public class LearningRecordDelayTaskHandler { - - private final StringRedisTemplate redisTemplate; - private final LearningRecordMapper recordMapper; - private final ILearningLessonService lessonService; - private final DelayQueue> queue = new DelayQueue<>(); - private final static String RECORD_KEY_TEMPLATE = "learning:record:{}"; - private static volatile boolean begin = true; - - @PostConstruct - public void init(){ - CompletableFuture.runAsync(this::handleDelayTask); - } - @PreDestroy - public void destroy(){ - begin = false; - log.debug("延迟任务停止执行!"); - } - - public void handleDelayTask(){ - while (begin) { - try { - // 1.获取到期的延迟任务 - DelayTask task = queue.take(); - RecordTaskData data = task.getData(); - // 2.查询Redis缓存 - LearningRecord record = readRecordCache(data.getLessonId(), data.getSectionId()); - if (record == null) { - continue; - } - // 3.比较数据,moment值 - if(!Objects.equals(data.getMoment(), record.getMoment())) { - // 不一致,说明用户还在持续提交播放进度,放弃旧数据 - continue; - } - - // 4.一致,持久化播放进度数据到数据库 - // 4.1.更新学习记录的moment - record.setFinished(null); - recordMapper.updateById(record); - // 4.2.更新课表最近学习信息 - LearningLesson lesson = new LearningLesson(); - lesson.setId(data.getLessonId()); - lesson.setLatestSectionId(data.getSectionId()); - lesson.setLatestLearnTime(LocalDateTime.now()); - lessonService.updateById(lesson); - } catch (Exception e) { - log.error("处理延迟任务发生异常", e); - } - } - } - - public void addLearningRecordTask(LearningRecord record){ - // 1.添加数据到Redis缓存 - writeRecordCache(record); - // 2.提交延迟任务到延迟队列 DelayQueue - queue.add(new DelayTask<>(new RecordTaskData(record), Duration.ofSeconds(20))); - } - - public void writeRecordCache(LearningRecord record) { - log.debug("更新学习记录的缓存数据"); - try { - // 1.数据转换 - String json = JsonUtils.toJsonStr(new RecordCacheData(record)); - // 2.写入Redis - String key = StringUtils.format(RECORD_KEY_TEMPLATE, record.getLessonId()); - redisTemplate.opsForHash().put(key, record.getSectionId().toString(), json); - // 3.添加缓存过期时间 - redisTemplate.expire(key, Duration.ofMinutes(1)); - } catch (Exception e) { - log.error("更新学习记录缓存异常", e); - } - } - - public LearningRecord readRecordCache(Long lessonId, Long sectionId){ - try { - // 1.读取Redis数据 - String key = StringUtils.format(RECORD_KEY_TEMPLATE, lessonId); - Object cacheData = redisTemplate.opsForHash().get(key, sectionId.toString()); - if (cacheData == null) { - return null; - } - // 2.数据检查和转换 - return JsonUtils.toBean(cacheData.toString(), LearningRecord.class); - } catch (Exception e) { - log.error("缓存读取异常", e); - return null; - } - } - - public void cleanRecordCache(Long lessonId, Long sectionId){ - // 删除数据 - String key = StringUtils.format(RECORD_KEY_TEMPLATE, lessonId); - redisTemplate.opsForHash().delete(key, sectionId.toString()); - } - - @Data - @NoArgsConstructor - private static class RecordCacheData{ - private Long id; - private Integer moment; - private Boolean finished; - - public RecordCacheData(LearningRecord record) { - this.id = record.getId(); - this.moment = record.getMoment(); - this.finished = record.getFinished(); - } - } - @Data - @NoArgsConstructor - private static class RecordTaskData{ - private Long lessonId; - private Long sectionId; - private Integer moment; - - public RecordTaskData(LearningRecord record) { - this.lessonId = record.getLessonId(); - this.sectionId = record.getSectionId(); - this.moment = record.getMoment(); - } - } -} diff --git a/tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/TableInfoContext.java b/tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/TableInfoContext.java deleted file mode 100644 index c6a095a..0000000 --- a/tianji-master/tj-learning/src/main/java/com/tianji/learning/utils/TableInfoContext.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.learning.utils; - -public class TableInfoContext { - private static final ThreadLocal TL = new ThreadLocal<>(); - - public static void setInfo(String info) { - TL.set(info); - } - - public static String getInfo() { - return TL.get(); - } - - public static void remove() { - TL.remove(); - } -} diff --git a/tianji-master/tj-learning/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-learning/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-learning/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-learning/src/main/resources/bootstrap-local.yml b/tianji-master/tj-learning/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-learning/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-learning/src/main/resources/bootstrap.yml b/tianji-master/tj-learning/src/main/resources/bootstrap.yml deleted file mode 100644 index 10b28f1..0000000 --- a/tianji-master/tj-learning/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,44 +0,0 @@ -server: - port: 8090 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: learning-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - data-id: shared-spring.yaml # 共享spring配置 - refresh: false - - data-id: shared-redis.yaml # 共享redis配置 - refresh: false - - data-id: shared-mybatis.yaml # 共享mybatis配置 - refresh: false - - data-id: shared-logs.yaml # 共享日志配置 - refresh: false - - data-id: shared-feign.yaml # 共享feign配置 - refresh: false - - data-id: shared-mq.yaml # 共享mq配置 - refresh: false - - data-id: shared-xxljob.yaml # 共享mq配置 - refresh: false -tj: - swagger: - enable: true - enableResponseWrap: true - package-path: com.tianji.learning.controller - title: 智汇云课堂 - 学习中心接口文档 - description: 该服务包含用户学习的各种辅助功能 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - jdbc: - database: tj_learning - auth: - resource: - enable: true diff --git a/tianji-master/tj-learning/src/main/resources/mapper/InteractionQuestionMapper.xml b/tianji-master/tj-learning/src/main/resources/mapper/InteractionQuestionMapper.xml deleted file mode 100644 index 9442306..0000000 --- a/tianji-master/tj-learning/src/main/resources/mapper/InteractionQuestionMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-learning/src/main/resources/mapper/InteractionReplyMapper.xml b/tianji-master/tj-learning/src/main/resources/mapper/InteractionReplyMapper.xml deleted file mode 100644 index 99f11ef..0000000 --- a/tianji-master/tj-learning/src/main/resources/mapper/InteractionReplyMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-learning/src/main/resources/mapper/LearningLessonMapper.xml b/tianji-master/tj-learning/src/main/resources/mapper/LearningLessonMapper.xml deleted file mode 100644 index 59796d0..0000000 --- a/tianji-master/tj-learning/src/main/resources/mapper/LearningLessonMapper.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/tianji-master/tj-learning/src/main/resources/mapper/LearningRecordMapper.xml b/tianji-master/tj-learning/src/main/resources/mapper/LearningRecordMapper.xml deleted file mode 100644 index 0c9ba51..0000000 --- a/tianji-master/tj-learning/src/main/resources/mapper/LearningRecordMapper.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/tianji-master/tj-learning/src/main/resources/mapper/PointsBoardMapper.xml b/tianji-master/tj-learning/src/main/resources/mapper/PointsBoardMapper.xml deleted file mode 100644 index a1a54ab..0000000 --- a/tianji-master/tj-learning/src/main/resources/mapper/PointsBoardMapper.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - CREATE TABLE `${tableName}` - ( - `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '榜单id', - `user_id` BIGINT NOT NULL COMMENT '学生id', - `points` INT NOT NULL COMMENT '积分值', - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_user_id` (`user_id`) USING BTREE - ) - COMMENT ='学霸天梯榜' - COLLATE = 'utf8mb4_0900_ai_ci' - ENGINE = InnoDB - ROW_FORMAT = DYNAMIC - - diff --git a/tianji-master/tj-learning/src/main/resources/mapper/PointsBoardSeasonMapper.xml b/tianji-master/tj-learning/src/main/resources/mapper/PointsBoardSeasonMapper.xml deleted file mode 100644 index 2b32bcd..0000000 --- a/tianji-master/tj-learning/src/main/resources/mapper/PointsBoardSeasonMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-learning/src/main/resources/mapper/PointsRecordMapper.xml b/tianji-master/tj-learning/src/main/resources/mapper/PointsRecordMapper.xml deleted file mode 100644 index 466712c..0000000 --- a/tianji-master/tj-learning/src/main/resources/mapper/PointsRecordMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-learning/src/test/java/com/tianji/learning/utils/DelayTaskTest.java b/tianji-master/tj-learning/src/test/java/com/tianji/learning/utils/DelayTaskTest.java deleted file mode 100644 index 577f1c4..0000000 --- a/tianji-master/tj-learning/src/test/java/com/tianji/learning/utils/DelayTaskTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.learning.utils; - -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.Test; - -import java.time.Duration; -import java.util.concurrent.DelayQueue; - -@Slf4j -class DelayTaskTest { - @Test - void testDelayQueue() throws InterruptedException { - // 1.初始化延迟队列 - DelayQueue> queue = new DelayQueue<>(); - // 2.向队列中添加延迟执行的任务 - log.info("开始初始化延迟任务。。。。"); - queue.add(new DelayTask<>("延迟任务3", Duration.ofSeconds(3))); - queue.add(new DelayTask<>("延迟任务1", Duration.ofSeconds(1))); - queue.add(new DelayTask<>("延迟任务2", Duration.ofSeconds(2))); - // 3.尝试执行任务 - while (true) { - DelayTask task = queue.take(); - log.info("开始执行延迟任务:{}", task.getData()); - } - } -} \ No newline at end of file diff --git a/tianji-master/tj-media/pom.xml b/tianji-master/tj-media/pom.xml deleted file mode 100644 index a01dfe0..0000000 --- a/tianji-master/tj-media/pom.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-media - - - 11 - 11 - - - - - com.tianji - tj-api - 1.0.0 - - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-web - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - com.baomidou - mybatis-plus-boot-starter - - - mysql - mysql-connector-java - - - - com.tencentcloudapi - tencentcloud-sdk-java - - - com.qcloud - cos_api - - - com.qcloud - vod_api - - - slf4j-log4j12 - org.slf4j - - - - - - com.aliyun.oss - aliyun-sdk-oss - - - bcprov-jdk15on - org.bouncycastle - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - com.tianji.media.MediaApplication - - - - - \ No newline at end of file diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/MediaApplication.java b/tianji-master/tj-media/src/main/java/com/tianji/media/MediaApplication.java deleted file mode 100644 index 67757cc..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/MediaApplication.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.media; - - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.annotation.EnableScheduling; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@MapperScan("com.tianji.media.mapper") -@EnableScheduling -@SpringBootApplication -@Slf4j -public class MediaApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(MediaApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/config/AliConfig.java b/tianji-master/tj-media/src/main/java/com/tianji/media/config/AliConfig.java deleted file mode 100644 index 8b92240..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/config/AliConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.media.config; - -import com.aliyun.oss.OSS; -import com.aliyun.oss.OSSClientBuilder; -import com.tianji.media.storage.IFileStorage; -import com.tianji.media.storage.ali.AliFileStorage; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableConfigurationProperties(AliProperties.class) -public class AliConfig { - - @Bean - @ConditionalOnProperty(prefix = "tj.file", name = "platform", havingValue = "ALI") - public OSS aliOssClient(AliProperties prop){ - return new OSSClientBuilder() - .build(prop.getOos().getEndpoint(), prop.getAccessId(), prop.getAccessKey()); - } - - @Bean - @ConditionalOnProperty(prefix = "tj.file", name = "platform", havingValue = "ALI") - public IFileStorage aliFileStorage(OSS aliOssClient, AliProperties prop) { - return new AliFileStorage(aliOssClient, prop.getOos().getBucket()); - } -} \ No newline at end of file diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/config/AliProperties.java b/tianji-master/tj-media/src/main/java/com/tianji/media/config/AliProperties.java deleted file mode 100644 index ff29bbd..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/config/AliProperties.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.media.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@Data -@ConfigurationProperties(prefix = "tj.ali") -public class AliProperties { - private String accessId; - private String accessKey; - - private OssProperties oos; - - @Data - public static class OssProperties { - /*区域*/ - private String region; - /*域名*/ - private String endpoint; - /*桶名称*/ - private String bucket; - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/config/PlatformProperties.java b/tianji-master/tj-media/src/main/java/com/tianji/media/config/PlatformProperties.java deleted file mode 100644 index 6682468..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/config/PlatformProperties.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.media.config; - -import com.tianji.media.enums.Platform; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Data -@Component -@ConfigurationProperties(prefix = "tj.platform") -public class PlatformProperties { - private Platform file; - private Platform media; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/config/TencentConfig.java b/tianji-master/tj-media/src/main/java/com/tianji/media/config/TencentConfig.java deleted file mode 100644 index 52421f9..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/config/TencentConfig.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.tianji.media.config; - -import com.qcloud.cos.COSClient; -import com.qcloud.cos.ClientConfig; -import com.qcloud.cos.auth.BasicCOSCredentials; -import com.qcloud.cos.auth.COSCredentials; -import com.qcloud.cos.region.Region; -import com.qcloud.cos.transfer.TransferManager; -import com.qcloud.cos.transfer.TransferManagerConfiguration; -import com.qcloud.vod.VodUploadClient; -import com.tencentcloudapi.common.Credential; -import com.tencentcloudapi.common.profile.ClientProfile; -import com.tencentcloudapi.common.profile.HttpProfile; -import com.tencentcloudapi.vod.v20180717.VodClient; -import com.tianji.media.storage.IFileStorage; -import com.tianji.media.storage.IMediaStorage; -import com.tianji.media.storage.tencent.TencentFileStorage; -import com.tianji.media.storage.tencent.TencentMediaStorage; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -@Configuration -@EnableConfigurationProperties({TencentProperties.class}) -public class TencentConfig { - - @Bean - @ConditionalOnProperty(prefix = "tj.platform", name = "media", havingValue = "TENCENT") - public VodClient tencentVodClient(TencentProperties properties){ - // 1.授权信息 - Credential cred = new Credential( - properties.getSecretId(), properties.getSecretKey()); - // 2.配置超时时间 - HttpProfile httpProfile = new HttpProfile(); - httpProfile.setConnTimeout(1); - httpProfile.setReadTimeout(10); - httpProfile.setWriteTimeout(10); - ClientProfile clientProfile = new ClientProfile(); - clientProfile.setHttpProfile(httpProfile); - // 2.初始化客户端 - return new VodClient(cred, properties.getVod().getRegion()); - } - - @Bean - @ConditionalOnProperty(prefix = "tj.platform", name = "media", havingValue = "TENCENT") - public VodUploadClient tencentVodUploadClient(TencentProperties properties){ - // 1.初始化客户端 - return new VodUploadClient(properties.getSecretId(), properties.getSecretKey()); - } - - @Bean - @ConditionalOnProperty(prefix = "tj.platform", name = "media", havingValue = "TENCENT") - public IMediaStorage tencentMediaStorage(VodClient tencentVodClient, TencentProperties properties){ - return new TencentMediaStorage(tencentVodClient, properties); - } - - @Bean - @ConditionalOnProperty(prefix = "tj.platform", name = "file", havingValue = "TENCENT") - public COSClient tencentCosClient(TencentProperties properties){ - // 1.授权信息 - COSCredentials cred = new BasicCOSCredentials(properties.getSecretId(), properties.getSecretKey()); - // 2.基本配置 - Region region = new Region(properties.getCos().getRegion()); - ClientConfig clientConfig = new ClientConfig(region); - // 3.初始化客户端 - return new COSClient(cred, clientConfig); - } - - @Bean - @ConditionalOnProperty(prefix = "tj.platform", name = "file", havingValue = "TENCENT") - public TransferManager transferManager(COSClient tencentCosClient, TencentProperties properties){ - // 自定义线程池大小,建议在客户端与 COS 网络充足(例如使用腾讯云的 CVM,同地域上传 COS)的情况下,设置成16或32即可,可较充分的利用网络资源 - // 对于使用公网传输且网络带宽质量不高的情况,建议减小该值,避免因网速过慢,造成请求超时。 - ExecutorService threadPool = Executors.newFixedThreadPool(4); - - // 传入一个 threadPool, 若不传入线程池,默认 TransferManager 中会生成一个单线程的线程池。 - TransferManager transferManager = new TransferManager(tencentCosClient, threadPool); - - // 设置高级接口的配置项 - // 分块上传阈值和分块大小分别为 5MB 和 1MB - TransferManagerConfiguration transferManagerConfiguration = new TransferManagerConfiguration(); - transferManagerConfiguration.setMultipartUploadThreshold(properties.getCos().getMultipartUploadThreshold()); - transferManagerConfiguration.setMinimumUploadPartSize(properties.getCos().getMinimumUploadPartSize()); - transferManager.setConfiguration(transferManagerConfiguration); - - return transferManager; - } - - @Bean - @ConditionalOnProperty(prefix = "tj.platform", name = "file", havingValue = "TENCENT") - public IFileStorage tencentFileStorage( - COSClient tencentCosClient, TransferManager transferManager, TencentProperties properties){ - return new TencentFileStorage(tencentCosClient, transferManager, properties); - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/config/TencentProperties.java b/tianji-master/tj-media/src/main/java/com/tianji/media/config/TencentProperties.java deleted file mode 100644 index a32a082..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/config/TencentProperties.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.media.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@Data -@ConfigurationProperties(prefix = "tj.tencent") -public class TencentProperties { - private Long appId; - private String secretId; - private String secretKey; - private VodProperties vod; - private CosProperties cos; - @Data - public static class VodProperties{ - /*是否启用腾讯VOD*/ - private boolean enable; - /*签名有效期*/ - private long vodValidSeconds; - /*区域*/ - private String region; - /*任务流*/ - private String procedure; - /*防盗链秘钥*/ - private String urlKey; - /*播放器配置*/ - private String pfcg; - } - @Data - public static class CosProperties{ - /*区域*/ - private String region; - /*存储桶*/ - private String bucket; - /*触发分块上传的阈值*/ - private long multipartUploadThreshold; - /*分块上传的最小分块大小*/ - private long minimumUploadPartSize; - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/constants/FileConstants.java b/tianji-master/tj-media/src/main/java/com/tianji/media/constants/FileConstants.java deleted file mode 100644 index 76d16bb..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/constants/FileConstants.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.media.constants; - -public interface FileConstants { - - long MEDIA_FREE_SECONDS = 300; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/constants/FileErrorInfo.java b/tianji-master/tj-media/src/main/java/com/tianji/media/constants/FileErrorInfo.java deleted file mode 100644 index ccb108a..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/constants/FileErrorInfo.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.tianji.media.constants; - -public interface FileErrorInfo { - String MEDIA_NOT_EXISTS = "媒资不存在"; - String MEDIA_NOT_FREE = "课程不支持试看"; - String USER_NOT_EXISTS = "用户信息不存在"; - String MEDIA_QUOTE_NOT_EXISTS = "媒资引用信息查询异常"; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/controller/FileController.java b/tianji-master/tj-media/src/main/java/com/tianji/media/controller/FileController.java deleted file mode 100644 index 1e8c529..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/controller/FileController.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.tianji.media.controller; - - -import com.tianji.media.domain.dto.FileDTO; -import com.tianji.media.service.IFileService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -/** - *

- * 文件表,可以是普通文件、图片等 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-06-30 - */ -@RestController -@RequestMapping("/files") -@Api(tags = "媒资管理相关接口") -@RequiredArgsConstructor -public class FileController { - - private final IFileService fileService; - - @ApiOperation("上传文件") - @PostMapping - public FileDTO uploadFile( - @ApiParam(value = "文件数据") @RequestParam("file")MultipartFile file){ - return fileService.uploadFile(file); - } - - @ApiOperation("获取文件信息") - @GetMapping("/{id}") - public FileDTO getFileInfo( - @ApiParam(value = "文件id", example = "1") @PathVariable("id") Long id){ - return fileService.getFileInfo(id); - } - - @ApiOperation("删除文件") - @DeleteMapping("/{id}") - public void deleteFileById( - @ApiParam(value = "文件id", example = "1") @PathVariable("id") Long id) { - fileService.removeById(id); - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/controller/MediaController.java b/tianji-master/tj-media/src/main/java/com/tianji/media/controller/MediaController.java deleted file mode 100644 index 412e470..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/controller/MediaController.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.tianji.media.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.media.domain.dto.MediaDTO; -import com.tianji.media.domain.dto.MediaUploadResultDTO; -import com.tianji.media.domain.query.MediaQuery; -import com.tianji.media.domain.vo.MediaVO; -import com.tianji.media.domain.vo.VideoPlayVO; -import com.tianji.media.service.IMediaService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - *

- * 媒资表,主要是视频文件 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-06-30 - */ -@RestController -@RequestMapping("/medias") -@Api(tags = "媒资管理相关接口") -@RequiredArgsConstructor -public class MediaController { - - private final IMediaService mediaService; - - @ApiOperation("分页搜索已上传媒资信息") - @GetMapping - public PageDTO queryMediaPage(MediaQuery query){ - return mediaService.queryMediaPage(query); - } - - @ApiOperation("上传视频后保存媒资信息") - @PostMapping - public MediaDTO saveMedia(@RequestBody MediaUploadResultDTO result) { - return mediaService.save(result); - } - - @ApiOperation("获取上传视频的授权签名") - @GetMapping("/signature/upload") - public String getUploadSignature(){ - return mediaService.getUploadSignature(); - } - - @ApiOperation("获取播放视频的授权签名") - @GetMapping("/signature/play") - public VideoPlayVO getPlaySignature( - @ApiParam(value = "小节id", example = "1", required = true) @RequestParam("sectionId") Long sectionId){ - return mediaService.getPlaySignatureBySectionId(sectionId); - } - - @ApiOperation("管理端获取预览视频的授权签名") - @GetMapping("/signature/preview") - public VideoPlayVO getPreviewSignature( - @ApiParam(value = "媒资id", example = "1", required = true) @RequestParam("mediaId") Long mediaId){ - return mediaService.getPlaySignatureByMediaId(mediaId); - } - - @ApiOperation("删除媒资视频") - @DeleteMapping("{mediaId}") - public void deleteMedia( - @ApiParam(value = "媒资id", example = "1", required = true) @PathVariable("mediaId") Long mediaId){ - mediaService.removeById(mediaId); - } - - @ApiOperation("批量删除媒资视频") - @DeleteMapping - public void deleteMedias( - @ApiParam(value = "媒资id集合,例如1,2,3", required = true) @RequestParam("ids") List mediaIds){ - mediaService.removeByIds(mediaIds); - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/FileDTO.java b/tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/FileDTO.java deleted file mode 100644 index 4cb643c..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/FileDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.media.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@ApiModel(description = "文件信息实体") -@NoArgsConstructor -@AllArgsConstructor -public class FileDTO { - @ApiModelProperty(value = "文件id", example = "1") - private Long id; - @ApiModelProperty(value = "文件名称", example = "图片.jpg") - private String filename; - @ApiModelProperty(value = "文件访问路径", example = "a.jpg") - private String path; - - public static FileDTO of(Long id, String filename, String path){ - return new FileDTO(id, filename, path); - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/MediaDTO.java b/tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/MediaDTO.java deleted file mode 100644 index 8c17c17..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/MediaDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.media.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "视频文件信息") -public class MediaDTO { - @ApiModelProperty(value = "数据库mediaId", example = "1") - private Long id; - - @ApiModelProperty(value = "文件名称", example = "Redis实战课.mp4") - private String filename; - - @ApiModelProperty(value = "视频时长,单位秒", example = "57.23") - private Float duration; - - @ApiModelProperty(value = "视频大小,单位字节", example = "1024") - private Long size; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/MediaUploadResultDTO.java b/tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/MediaUploadResultDTO.java deleted file mode 100644 index 4a4fd6d..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/dto/MediaUploadResultDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.media.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "媒体上传的结果") -public class MediaUploadResultDTO { - - @ApiModelProperty(value = "文件在云端的唯一标示", example = "387702302659783576") - private String fileId; -/* - @ApiModelProperty(value = "媒体播放地址", example = "http://xxx.mp4") - private String mediaUrl; - - @ApiModelProperty(value = "媒体封面地址", example = "http://xxx.jpg") - private String coverUrl; - - @ApiModelProperty(value = "文件名称", example = "Redis最佳实践.mp4") - // TODO 限制文件名长度 - private String filename;*/ -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/po/File.java b/tianji-master/tj-media/src/main/java/com/tianji/media/domain/po/File.java deleted file mode 100644 index 65000cf..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/po/File.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.tianji.media.domain.po; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.media.enums.FileStatus; -import com.tianji.media.enums.Platform; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 文件表,可以是普通文件、图片等 - *

- * - * @author 虎哥 - * @since 2022-07-01 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("file") -public class File implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键,文件id - */ - @TableId(value = "id") - private Long id; - - /** - * 文件在云端的唯一标示,例如:aaa.jpg - */ - @TableField("`key`") - private String key; - - /** - * 文件上传时的名称 - */ - private String filename; - - /** - * 请求id - */ - private String requestId; - - /** - * 状态:1-待上传 2-已上传,未使用 3-已使用 - */ - private FileStatus status; - /** - * 状态:1-腾讯 2-阿里 - */ - private Platform platform; - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建者 - */ - - private Long creater; - - /** - * 更新者 - */ - - private Long updater; - - /** - * 逻辑删除 - */ - private Integer deleted; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/po/Media.java b/tianji-master/tj-media/src/main/java/com/tianji/media/domain/po/Media.java deleted file mode 100644 index 4f2c8d5..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/po/Media.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.tianji.media.domain.po; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.media.enums.FileStatus; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 媒资表,主要是视频文件 - *

- * - * @author 虎哥 - * @since 2022-07-01 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("media") -public class Media implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 文件在云端的唯一标示,例如:387702302659783576 - */ - private String fileId; - - /** - * 文件名称 - */ - private String filename; - - /** - * 媒体播放地址 - */ - private String mediaUrl; - - /** - * 媒体封面地址 - */ - private String coverUrl; - - /** - * 视频时长,单位秒 - */ - private Float duration; - - /** - * 请求id - */ - private String requestId; - - /** - * 状态:1-上传中,2-已上传 - */ - private FileStatus status; - /** - * 媒资大小,单位字节 - */ - private Long size; - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建者 - */ - - private Long creater; - - /** - * 更新者 - */ - - private Long updater; - - /** - * 逻辑删除 - */ - private Integer deleted; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/query/MediaQuery.java b/tianji-master/tj-media/src/main/java/com/tianji/media/domain/query/MediaQuery.java deleted file mode 100644 index ae4745a..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/query/MediaQuery.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.media.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "媒资搜索条件") -public class MediaQuery extends PageQuery { - @ApiModelProperty("媒资名称关键字") - private String name; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/vo/MediaVO.java b/tianji-master/tj-media/src/main/java/com/tianji/media/domain/vo/MediaVO.java deleted file mode 100644 index 1411d52..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/vo/MediaVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tianji.media.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "视频文件信息") -public class MediaVO { - @ApiModelProperty(value = "id", example = "1") - private Long id; - @ApiModelProperty(value = "文件名称", example = "文件名.avi") - private String filename; - @ApiModelProperty(value = "视频封面", example = "default-cover-url.jpg") - private String coverUrl; - @ApiModelProperty(value = "视频时长,单位秒", example = "57.23") - private Float duration; - @ApiModelProperty(value = "视频大小,单位字节", example = "1024") - private Long size; - @ApiModelProperty(value = "被引用次数", example = "10") - private Integer useTimes; - @ApiModelProperty(value = "视频状态:1-上传中,2-已上传,3-处理中", example = "2") - private Integer status; - @ApiModelProperty(value = "创建时间", example = "2022-7-18 16:54:30") - private LocalDateTime createTime; - @ApiModelProperty(value = "创建者名称", example = "张三") - private String creater; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/vo/VideoPlayVO.java b/tianji-master/tj-media/src/main/java/com/tianji/media/domain/vo/VideoPlayVO.java deleted file mode 100644 index 317aadb..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/domain/vo/VideoPlayVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.media.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "视频播放的签名信息") -public class VideoPlayVO { - @ApiModelProperty(value = "视频唯一标示", example = "12412534535143242") - private String fileId; - @ApiModelProperty(value = "视频封面", example = "xxx.xxx.xxx") - private String signature; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/enums/FileErrorInfo.java b/tianji-master/tj-media/src/main/java/com/tianji/media/enums/FileErrorInfo.java deleted file mode 100644 index 5b66e26..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/enums/FileErrorInfo.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.media.enums; - -public interface FileErrorInfo { - interface Msg { - String FILE_KEY_TOO_MANY = "文件key不能超过1000"; - String BUCKET_NAME_IS_NULL = "桶名称不能为空"; - String FILE_KEY_IS_NULL = "文件key不能为空"; - String INVALID_FILE_STATUS = "无效的文件状态"; - - String FILE_UPLOAD_ERROR = "上传文件失败"; - - - String MEDIA_APPLY_UPLOAD_ERROR = "申请上传视频失败"; - String MEDIA_UPLOAD_ERROR = "上传视频失败"; - String MEDIA_COMMIT_UPLOAD_ERROR = "确认上传视频失败"; - String MEDIA_DELETE_ERROR = "删除视频失败"; - - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/enums/FilePlatform.java b/tianji-master/tj-media/src/main/java/com/tianji/media/enums/FilePlatform.java deleted file mode 100644 index abaaf19..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/enums/FilePlatform.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.media.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import lombok.Getter; - -@Getter -public enum FilePlatform { - TENCENT(1, "/img-tx/"), - ALI(2, "/img-ali/"), - ; - @EnumValue - int value; - String path; - - FilePlatform(int value, String path) { - this.value = value; - this.path = path; - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/enums/FileStatus.java b/tianji-master/tj-media/src/main/java/com/tianji/media/enums/FileStatus.java deleted file mode 100644 index 8b40c5a..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/enums/FileStatus.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.tianji.media.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.tianji.common.exceptions.BadRequestException; - -import static com.tianji.media.enums.FileErrorInfo.Msg.INVALID_FILE_STATUS; - - -public enum FileStatus { - UPLOADING(1, "上传中"), - UPLOADED(2, "已上传"), - PROCESSED(3, "已处理"), - ; - @EnumValue - private int value; - private String desc; - - FileStatus(int value, String desc) { - this.value = value; - this.desc = desc; - } - - public int getValue() { - return value; - } - - public String getDesc() { - return desc; - } - - public static FileStatus of(int value) { - switch (value) { - case 1: - return UPLOADING; - case 2: - return UPLOADED; - case 3: - return PROCESSED; - default: - throw new BadRequestException(INVALID_FILE_STATUS); - } - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/enums/Platform.java b/tianji-master/tj-media/src/main/java/com/tianji/media/enums/Platform.java deleted file mode 100644 index 09da11a..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/enums/Platform.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.media.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import lombok.Getter; - -@Getter -public enum Platform { - TENCENT(1, "腾讯云", "/img-tx/"), - ALI(2, "阿里云", "/img-ali/"), - QI_NIU(3, "七牛云", "/img-qn/"), - ; - @EnumValue - private final int value; - private final String desc; - private final String path; - - Platform(int value, String desc, String path) { - this.value = value; - this.desc = desc; - this.path = path; - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/mapper/FileMapper.java b/tianji-master/tj-media/src/main/java/com/tianji/media/mapper/FileMapper.java deleted file mode 100644 index a8a6c7d..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/mapper/FileMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.media.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.media.domain.po.File; - -/** - *

- * 文件表,可以是普通文件、图片等 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-06-30 - */ -public interface FileMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/mapper/MediaMapper.java b/tianji-master/tj-media/src/main/java/com/tianji/media/mapper/MediaMapper.java deleted file mode 100644 index 375b733..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/mapper/MediaMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.media.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.media.domain.po.Media; - -/** - *

- * 媒资表,主要是视频文件 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-06-30 - */ -public interface MediaMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/service/IFileService.java b/tianji-master/tj-media/src/main/java/com/tianji/media/service/IFileService.java deleted file mode 100644 index f4e3939..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/service/IFileService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.media.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.media.domain.dto.FileDTO; -import com.tianji.media.domain.po.File; -import org.springframework.web.multipart.MultipartFile; - -/** - *

- * 文件表,可以是普通文件、图片等 服务类 - *

- * - * @author 虎哥 - * @since 2022-06-30 - */ -public interface IFileService extends IService { - - FileDTO uploadFile(MultipartFile file); - - FileDTO getFileInfo(Long id); -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/service/IMediaService.java b/tianji-master/tj-media/src/main/java/com/tianji/media/service/IMediaService.java deleted file mode 100644 index a142b64..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/service/IMediaService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tianji.media.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.media.domain.dto.MediaDTO; -import com.tianji.media.domain.dto.MediaUploadResultDTO; -import com.tianji.media.domain.po.Media; -import com.tianji.media.domain.query.MediaQuery; -import com.tianji.media.domain.vo.MediaVO; -import com.tianji.media.domain.vo.VideoPlayVO; - -/** - *

- * 媒资表,主要是视频文件 服务类 - *

- * - * @author 虎哥 - * @since 2022-06-30 - */ -public interface IMediaService extends IService { - - String getUploadSignature(); - - VideoPlayVO getPlaySignatureBySectionId(Long fileId); - - MediaDTO save(MediaUploadResultDTO mediaResult); - - void updateMediaProcedureResult(Media media); - - void deleteMedia(String fileId); - - VideoPlayVO getPlaySignatureByMediaId(Long mediaId); - - PageDTO queryMediaPage(MediaQuery query); -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/service/impl/FileServiceImpl.java b/tianji-master/tj-media/src/main/java/com/tianji/media/service/impl/FileServiceImpl.java deleted file mode 100644 index c56f6ae..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/service/impl/FileServiceImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.tianji.media.service.impl; - -import cn.hutool.core.lang.UUID; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.StringUtils; -import com.tianji.media.config.PlatformProperties; -import com.tianji.media.domain.dto.FileDTO; -import com.tianji.media.domain.po.File; -import com.tianji.media.enums.FileErrorInfo; -import com.tianji.media.enums.FileStatus; -import com.tianji.media.mapper.FileMapper; -import com.tianji.media.service.IFileService; -import com.tianji.media.storage.IFileStorage; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.io.InputStream; - -/** - *

- * 文件表,可以是普通文件、图片等 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-06-30 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class FileServiceImpl extends ServiceImpl implements IFileService { - - private final IFileStorage fileStorage; - private final PlatformProperties properties; - - @Override - public FileDTO uploadFile(MultipartFile file) { - // 1.获取文件名称 - String originalFilename = file.getOriginalFilename(); - // 2.生成新文件名 - String filename = generateNewFileName(originalFilename); - // 3.获取文件流 - InputStream inputStream; - try { - inputStream = file.getInputStream(); - } catch (IOException e) { - throw new CommonException("文件读取异常", e); - } - // 4.上传文件 - String requestId = fileStorage.uploadFile(filename, inputStream, file.getSize()); - // 5.写入数据库 - File fileInfo = null; - try { - fileInfo = new File(); - fileInfo.setFilename(originalFilename); - fileInfo.setKey(filename); - fileInfo.setStatus(FileStatus.UPLOADED); - fileInfo.setRequestId(requestId); - fileInfo.setPlatform(properties.getFile()); - save(fileInfo); - } catch (Exception e) { - log.error("文件信息保存异常", e); - fileStorage.deleteFile(filename); - throw new DbException(FileErrorInfo.Msg.FILE_UPLOAD_ERROR); - } - // 6.返回 - FileDTO fileDTO = new FileDTO(); - fileDTO.setId(fileInfo.getId()); - fileDTO.setPath(fileInfo.getPlatform().getPath() + filename); - fileDTO.setFilename(originalFilename); - return fileDTO; - } - - @Override - public FileDTO getFileInfo(Long id) { - File file = getById(id); - if (file == null) { - return null; - } - return FileDTO.of(file.getId(), file.getFilename(), file.getPlatform().getPath() + file.getKey()); - } - - private String generateNewFileName(String originalFilename) { - // 1.获取后缀 - String suffix = StringUtils.subAfter(originalFilename, ".", true); - // 2.生成新文件名 - return UUID.randomUUID().toString(true) + "." + suffix; - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/service/impl/MediaServiceImpl.java b/tianji-master/tj-media/src/main/java/com/tianji/media/service/impl/MediaServiceImpl.java deleted file mode 100644 index 7e23576..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/service/impl/MediaServiceImpl.java +++ /dev/null @@ -1,208 +0,0 @@ -package com.tianji.media.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.course.CourseClient; -import com.tianji.api.client.learning.LearningClient; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.course.MediaQuoteDTO; -import com.tianji.api.dto.course.SectionInfoDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.ForbiddenException; -import com.tianji.common.utils.*; -import com.tianji.media.constants.FileErrorInfo; -import com.tianji.media.domain.dto.MediaDTO; -import com.tianji.media.domain.dto.MediaUploadResultDTO; -import com.tianji.media.domain.po.Media; -import com.tianji.media.domain.query.MediaQuery; -import com.tianji.media.domain.vo.MediaVO; -import com.tianji.media.domain.vo.VideoPlayVO; -import com.tianji.media.enums.FileStatus; -import com.tianji.media.mapper.MediaMapper; -import com.tianji.media.service.IMediaService; -import com.tianji.media.storage.IMediaStorage; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.stream.Collectors; - -import static com.tianji.media.constants.FileErrorInfo.MEDIA_NOT_EXISTS; - -/** - *

- * 媒资表,主要是视频文件 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-06-30 - */ -@Service -@RequiredArgsConstructor -public class MediaServiceImpl extends ServiceImpl implements IMediaService { - - private final IMediaStorage mediaStorage; - - private final CourseClient courseClient; - - private final LearningClient learningClient; - - private final UserClient userClient; - - @Override - public String getUploadSignature() { - return mediaStorage.getUploadSignature(); - } - - @Override - public VideoPlayVO getPlaySignatureBySectionId(Long sectionId) { - // 1.根据sectionId查询媒课程信息 - SectionInfoDTO sectionInfo = courseClient.sectionInfo(sectionId); - Long courseId = sectionInfo.getCourseId(); - // 2.查询用户课程表,是否是购买过的课程 - Long lessonId = learningClient.isLessonValid(courseId); - - if(lessonId != null){ - // 2.1.是,查询媒资信息,直接获取签名 - Media media = getById(sectionInfo.getMediaId()); - AssertUtils.isNotNull(media, MEDIA_NOT_EXISTS); - // 1)获取签名 - String signature = mediaStorage.getPlaySignature(media.getFileId(), UserContext.getUser(), null); - // 2)返回 - VideoPlayVO vo = new VideoPlayVO(); - vo.setSignature(signature); - vo.setFileId(media.getFileId()); - return vo; - } - // 2.2.否,判断课程章节是否免费 - Boolean trailer = sectionInfo.getTrailer(); - if(BooleanUtils.isFalse(trailer)) { - // 2.3.不免费,抛出异常 - throw new ForbiddenException(FileErrorInfo.MEDIA_NOT_FREE); - } - - // 3.免费,获取课程信息 - Media media = getById(sectionInfo.getMediaId()); - AssertUtils.isNotNull(media, MEDIA_NOT_EXISTS); - // 4.获取签名 - String signature = mediaStorage.getPlaySignature( - media.getFileId(), UserContext.getUser(), sectionInfo.getFreeDuration()); - // 5.返回 - VideoPlayVO vo = new VideoPlayVO(); - vo.setSignature(signature); - vo.setFileId(media.getFileId()); - return vo; - } - - - @Override - public VideoPlayVO getPlaySignatureByMediaId(Long mediaId) { - // 1.根据id查询媒资信息 - Media media = getById(mediaId); - // 2.获取签名 - String signature = mediaStorage.getPlaySignature(media.getFileId(), UserContext.getUser(), null); - // 3.返回 - VideoPlayVO vo = new VideoPlayVO(); - vo.setSignature(signature); - vo.setFileId(media.getFileId()); - return vo; - } - - @Override - public PageDTO queryMediaPage(MediaQuery query) { - // 1.分页条件 - Page mediaPage = new Page<>(query.getPageNo(), query.getPageSize()); - if(StringUtils.isNotBlank(query.getSortBy())){ - mediaPage.addOrder(new OrderItem(query.getSortBy(), query.getIsAsc())); - } - // 2.分页搜索 - lambdaQuery() - .like(StringUtils.isNotBlank(query.getName()), Media::getFilename, query.getName()) - .page(mediaPage); - // 3.解析数据 - List records = mediaPage.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(mediaPage); - } - List ids = new ArrayList<>(records.size()); - Set createIds = new HashSet<>(); - for (Media m : records) { - ids.add(m.getId()); - createIds.add(m.getCreater()); - } - createIds.remove(0L); - // 4.查询引用次数 - List mediaQuoteDTOS = courseClient.mediaUserInfo(ids); - AssertUtils.isNotEmpty(mediaQuoteDTOS, FileErrorInfo.MEDIA_QUOTE_NOT_EXISTS); - Map quoteMap = mediaQuoteDTOS - .stream() - .collect(Collectors.toMap(MediaQuoteDTO::getMediaId, MediaQuoteDTO::getQuoteNum)); - - // 5.查询创建者信息 - Map userMap = null; - if(CollUtils.isNotEmpty(createIds)) { - List users = userClient.queryUserByIds(createIds); - AssertUtils.isNotEmpty(users, FileErrorInfo.USER_NOT_EXISTS); - userMap = users.stream().collect(Collectors.toMap(UserDTO::getId, UserDTO::getName)); - } - // 6.数据转换 - List list = new ArrayList<>(records.size()); - for (Media m : records) { - MediaVO v = BeanUtils.toBean(m, MediaVO.class); - v.setUseTimes(quoteMap.get(m.getId())); - if(userMap != null) { - v.setCreater(userMap.get(m.getCreater())); - } - list.add(v); - } - return new PageDTO<>(mediaPage.getTotal(), mediaPage.getPages(), list); - } - - @Override - public MediaDTO save(MediaUploadResultDTO result) { - // 1.查询视频信息 - List list = mediaStorage.queryMediaInfos(result.getFileId()); - AssertUtils.isNotEmpty(list, MEDIA_NOT_EXISTS); - // 2.判断是否存在,幂等处理 - Media media = lambdaQuery().eq(Media::getFileId, result.getFileId()).one(); - if (media != null) { - // 已经存在并且处理过 - return BeanUtils.toBean(media, MediaDTO.class); - } - // 3.查询视频信息 - media = list.get(0); - // 4.直接保存数据库 - save(list.get(0)); - return BeanUtils.toBean(media, MediaDTO.class); - } - - @Override - public void updateMediaProcedureResult(Media media) { - // 1.查询fileId是否已经存在 - Media old = lambdaQuery().eq(Media::getFileId, media.getFileId()).one(); - if (old == null) { - // 2.如果不存在,新增 - save(media); - }else { - // 3.存在,则更新 - lambdaUpdate() - .set(Media::getStatus, FileStatus.PROCESSED.getValue()) - .set(Media::getCoverUrl, media.getCoverUrl()) - .eq(Media::getId, old.getId()) - .update(); - } - } - - @Override - @Transactional - public void deleteMedia(String fileId) { - // 1.删除云端文件 - mediaStorage.deleteFile(fileId); - // 2.删除本地信息 - remove(new LambdaQueryWrapper().eq(Media::getFileId, fileId)); - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/IFileStorage.java b/tianji-master/tj-media/src/main/java/com/tianji/media/storage/IFileStorage.java deleted file mode 100644 index 6f0a7b1..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/IFileStorage.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.media.storage; - -import java.io.InputStream; -import java.util.List; - -public interface IFileStorage { - - /** - * 上传文件 - * @param key 文件唯一标识(a.jpg) - * @param inputStream 文件流 - * @return requestId - */ - String uploadFile(String key, InputStream inputStream, long contentLength); - - /** - * 下载文件 - * @param key 文件唯一标识(a.jpg) - * @return 文件流 - */ - InputStream downloadFile(String key); - - /** - * 删除指定文件 - * @param key 文件唯一标识(a.jpg) - */ - void deleteFile(String key); - - /** - * 删除指定文件 - * @param keys 文件唯一标识(a.jpg)的集合 - */ - void deleteFiles(List keys); -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/IMediaStorage.java b/tianji-master/tj-media/src/main/java/com/tianji/media/storage/IMediaStorage.java deleted file mode 100644 index 6ee12ec..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/IMediaStorage.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.tianji.media.storage; - -import com.tianji.media.domain.po.Media; - -import java.io.InputStream; -import java.util.List; - -public interface IMediaStorage { - - /** - * 获取临时上传授权签名 - * @return 签名信息 - */ - String getUploadSignature(); - - /** - * 获取临时上传授权签名 - * @param fieldId 视频文件id - * @param userId 查看视频的用户的id,用于生成水印 - * @param freeExpire 免费试看时长,null则表示不限制时长 - * @return 签名信息 - */ - String getPlaySignature(String fieldId,Long userId, Integer freeExpire); - - /** - * 上传文件 - * @param filename 文件名称(a.mp4) - * @param inputStream 文件流 - * @return requestId - */ - MediaUploadResult uploadFile(String filename, InputStream inputStream, long contentLength); - - /** - * 删除指定文件 - * @param fileId 文件唯一标识 - */ - void deleteFile(String fileId); - - /** - * 删除指定文件 - * @param fileIds 文件唯一标识的集合 - */ - void deleteFiles(List fileIds); - - /** - * 根据fileId查询文件信息 - * @param fileIds 多个文件标示 - * @return 文件信息列表 - */ - List queryMediaInfos(String ... fileIds); -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/MediaUploadResult.java b/tianji-master/tj-media/src/main/java/com/tianji/media/storage/MediaUploadResult.java deleted file mode 100644 index 6315f06..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/MediaUploadResult.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.media.storage; - -import lombok.Data; - -@Data -public class MediaUploadResult { - - private String fileId; - - private String mediaUrl; - - private String coverUrl; - - private String requestId; - - private String filename; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/ali/AliFileStorage.java b/tianji-master/tj-media/src/main/java/com/tianji/media/storage/ali/AliFileStorage.java deleted file mode 100644 index 2e90263..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/ali/AliFileStorage.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.tianji.media.storage.ali; - -import com.aliyun.oss.OSS; -import com.aliyun.oss.common.comm.ResponseMessage; -import com.aliyun.oss.model.*; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.utils.AssertUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.media.storage.IFileStorage; -import lombok.extern.slf4j.Slf4j; - -import java.io.InputStream; -import java.util.List; - -import static com.tianji.media.enums.FileErrorInfo.Msg.*; - -@Slf4j -public class AliFileStorage implements IFileStorage { - - private final OSS ossClient; - private final String bucketName; - - public AliFileStorage(OSS aliOssClient, String bucketName) { - this.ossClient = aliOssClient; - this.bucketName = bucketName; - } - - @Override - public String uploadFile(String key, InputStream inputStream, long contentLength) { - // 1.数据校验 - AssertUtils.isNotBlank(bucketName, BUCKET_NAME_IS_NULL); - AssertUtils.isNotBlank(key, FILE_KEY_IS_NULL); - AssertUtils.isNotNull(inputStream); - try { - // 2.上传文件元数据处理 - ObjectMetadata objectMeta = new ObjectMetadata(); - objectMeta.setContentLength(contentLength); - // 3.请求参数 - PutObjectRequest request = new PutObjectRequest(bucketName, key, inputStream, objectMeta); - // 4.上传 - PutObjectResult result = ossClient.putObject(request); - ResponseMessage response = result.getResponse(); - if (!response.isSuccessful()) { - log.info("上传文件[{}]失败, 原因:{}", key, response.getErrorResponseAsString()); - throw new CommonException("上传文件失败!"); - } - return result.getRequestId(); - } catch (Exception e) { - log.error("上传文件[{}]失败 ", key, e); - throw new CommonException("上传文件失败!", e); - } - } - - @Override - public InputStream downloadFile(String key) { - // 1.数据校验 - AssertUtils.isNotBlank(bucketName, BUCKET_NAME_IS_NULL); - AssertUtils.isNotBlank(key, FILE_KEY_IS_NULL); - try { - GetObjectRequest request = new GetObjectRequest(bucketName, key); - return ossClient.getObject(request).getObjectContent(); - } catch (Exception e) { - log.error("下载文件[{}]时发生异常:", key, e); - throw new CommonException("文件下载异常。", e); - } - } - - @Override - public void deleteFile(String key) { - // 1.数据校验 - AssertUtils.isNotBlank(bucketName, BUCKET_NAME_IS_NULL); - AssertUtils.isNotBlank(key, FILE_KEY_IS_NULL); - try { - // 2.删除 - ossClient.deleteObject(bucketName, key); - } catch (Exception e) { - log.error("删除文件[{}]时发生异常:", key, e); - throw new CommonException("删除异常。", e); - } - } - - @Override - public void deleteFiles(List keys) { - // 1.数据校验 - if(CollUtils.isEmpty(keys)){ - return; - } - AssertUtils.isNotBlank(bucketName, BUCKET_NAME_IS_NULL); - if(keys.size() > 1000){ - throw new BadRequestException(FILE_KEY_TOO_MANY); - } - // 2.准备request - DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName).withKeys(keys); - try { - // 3.删除 - ossClient.deleteObjects(request); - } catch (Exception e) { - log.error("批量删除文件[{}]时发生异常:", keys, e); - throw new CommonException("删除异常。", e); - } - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/TencentFileStorage.java b/tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/TencentFileStorage.java deleted file mode 100644 index 0e476ff..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/TencentFileStorage.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.tianji.media.storage.tencent; - -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.utils.AssertUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.media.config.TencentProperties; -import com.tianji.media.storage.IFileStorage; -import com.qcloud.cos.COSClient; -import com.qcloud.cos.model.*; -import com.qcloud.cos.model.DeleteObjectsRequest.KeyVersion; -import com.qcloud.cos.transfer.TransferManager; -import com.qcloud.cos.transfer.Upload; -import lombok.extern.slf4j.Slf4j; - -import java.io.InputStream; -import java.util.List; -import java.util.stream.Collectors; - -import static com.tianji.media.enums.FileErrorInfo.Msg.*; - -@Slf4j -public class TencentFileStorage implements IFileStorage { - - private final COSClient cosClient; - private final TransferManager transferManager; - private final String bucketName; - - public TencentFileStorage(COSClient tencentCosClient, TransferManager transferManager, TencentProperties properties) { - this.cosClient = tencentCosClient; - this.transferManager = transferManager; - this.bucketName = properties.getCos().getBucket() + "-" + properties.getAppId(); - } - - @Override - public String uploadFile(String key, InputStream inputStream, long contentLength) { - // 1.数据校验 - AssertUtils.isNotBlank(bucketName, BUCKET_NAME_IS_NULL); - AssertUtils.isNotBlank(key, FILE_KEY_IS_NULL); - AssertUtils.isNotNull(inputStream); - - // 2.元信息,主要是文件大小,这样才可以利用分片上传功能 - ObjectMetadata objectMetadata = new ObjectMetadata(); - objectMetadata.setContentLength(contentLength); - - // 3.请求对象 - PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, inputStream, objectMetadata); - - try { - // 4.异步发起上传,返回异步结果upload - Upload upload = transferManager.upload(putObjectRequest); - // 5.等待结果 - UploadResult result = upload.waitForUploadResult(); - // 6.返回信息 - return result.getRequestId(); - } catch (Exception e) { - log.error("上传文件[{}]时发生异常:", key, e); - throw new CommonException("文件上传异常。", e); - } - } - - @Override - public InputStream downloadFile(String key) { - // 1.数据校验 - AssertUtils.isNotBlank(bucketName, BUCKET_NAME_IS_NULL); - AssertUtils.isNotBlank(key, FILE_KEY_IS_NULL); - // 2.准备请求参数 - GetObjectRequest request = new GetObjectRequest(bucketName, key); - try { - // 3.下载 - COSObject cosObject = cosClient.getObject(request); - return cosObject.getObjectContent(); - } catch (Exception e) { - log.error("下载文件[{}]时发生异常:", key, e); - throw new CommonException("文件下载异常。", e); - } - } - - @Override - public void deleteFile(String key) { - // 1.数据校验 - AssertUtils.isNotBlank(bucketName, BUCKET_NAME_IS_NULL); - AssertUtils.isNotBlank(key, FILE_KEY_IS_NULL); - try { - // 2.删除 - cosClient.deleteObject(bucketName, key); - } catch (Exception e) { - log.error("删除文件[{}]时发生异常:", key, e); - throw new CommonException("删除异常。", e); - } - - } - - @Override - public void deleteFiles(List keys) { - // 1.数据校验 - if(CollUtils.isEmpty(keys)){ - return; - } - AssertUtils.isNotBlank(bucketName, BUCKET_NAME_IS_NULL); - if(keys.size() > 1000){ - throw new BadRequestException(FILE_KEY_TOO_MANY); - } - // 2.准备request - DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName); - // 3.设置要删除的key列表, 最多一次删除1000个 - List keyList = keys.stream().map(KeyVersion::new).collect(Collectors.toList()); - request.setKeys(keyList); - try { - // 4.删除 - cosClient.deleteObjects(request); - } catch (Exception e) { - log.error("批量删除文件[{}]时发生异常:", keys, e); - throw new CommonException("删除异常。", e); - } - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/TencentMediaStorage.java b/tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/TencentMediaStorage.java deleted file mode 100644 index 52d2bcf..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/TencentMediaStorage.java +++ /dev/null @@ -1,260 +0,0 @@ -package com.tianji.media.storage.tencent; - -import cn.hutool.core.codec.Base64; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.crypto.digest.HMac; -import cn.hutool.crypto.digest.HmacAlgorithm; -import cn.hutool.jwt.JWT; -import com.qcloud.cos.COSClient; -import com.qcloud.cos.ClientConfig; -import com.qcloud.cos.auth.BasicCOSCredentials; -import com.qcloud.cos.auth.BasicSessionCredentials; -import com.qcloud.cos.auth.COSCredentials; -import com.qcloud.cos.http.HttpProtocol; -import com.qcloud.cos.model.ObjectMetadata; -import com.qcloud.cos.region.Region; -import com.qcloud.cos.transfer.TransferManager; -import com.qcloud.cos.transfer.Upload; -import com.qcloud.vod.common.FileUtil; -import com.qcloud.vod.common.StringUtil; -import com.tencentcloudapi.common.exception.TencentCloudSDKException; -import com.tencentcloudapi.vod.v20180717.VodClient; -import com.tencentcloudapi.vod.v20180717.models.*; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.utils.StringUtils; -import com.tianji.media.config.TencentProperties; -import com.tianji.media.domain.po.Media; -import com.tianji.media.enums.FileStatus; -import com.tianji.media.storage.IMediaStorage; -import com.tianji.media.storage.MediaUploadResult; -import lombok.extern.slf4j.Slf4j; - -import java.io.InputStream; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; - -import static com.tianji.media.enums.FileErrorInfo.Msg.*; - -@Slf4j -public class TencentMediaStorage implements IMediaStorage { - private final VodClient vodClient; - private final TencentProperties tencentProperties; - - public TencentMediaStorage(VodClient vodClient, TencentProperties tencentProperties) { - this.vodClient = vodClient; - this.tencentProperties = tencentProperties; - } - - private static final String CONTEXT_TEMPLATE = - "secretId=%s¤tTimeStamp=%d&expireTime=%d&random=%d"; - private static final String CONTEXT_TEMPLATE_WITH_PROCEDURE = - "secretId=%s¤tTimeStamp=%d&expireTime=%d&random=%d&procedure=%s"; - private static final String[] MEDIA_INFO_FILTERS = new String[]{"basicInfo", "metaData"}; - @Override - public String getUploadSignature() { - // 1.获取加密工具 - HMac mac = new HMac(HmacAlgorithm.HmacSHA1, tencentProperties.getSecretKey().getBytes(StandardCharsets.UTF_8)); - // 2.准备加密数据 - long now = System.currentTimeMillis() / 1000; - long endTime = now + tencentProperties.getVod().getVodValidSeconds(); - String procedure = tencentProperties.getVod().getProcedure(); - String context; - if (StringUtils.isBlank(procedure)) { - context = String.format(CONTEXT_TEMPLATE, - URLEncoder.encode(tencentProperties.getSecretId(), StandardCharsets.UTF_8), - now, - endTime, - RandomUtil.randomInt(0, Integer.MAX_VALUE) - ); - }else{ - context = String.format(CONTEXT_TEMPLATE_WITH_PROCEDURE, - URLEncoder.encode(tencentProperties.getSecretId(), StandardCharsets.UTF_8), - now, - endTime, - RandomUtil.randomInt(0, Integer.MAX_VALUE), - procedure - ); - } - - // 3.加密返回 - byte[] bytes = ArrayUtil.addAll(mac.digest(context), context.getBytes(StandardCharsets.UTF_8)); - return Base64.encode(bytes); - } - - @Override - public String getPlaySignature(String fieldId, Long userId, Integer freeExpired) { - long currentTime = System.currentTimeMillis() / 1000; - - HashMap urlAccessInfo = new HashMap<>(2); - /* if (userId != null) { - urlAccessInfo.put("uid", String.valueOf(userId)); - }*/ - if (freeExpired != null) { - urlAccessInfo.put("exper", freeExpired * 60); - } - return JWT.create() - .setKey(tencentProperties.getVod().getUrlKey().getBytes(StandardCharsets.UTF_8)) - .setPayload("appId", tencentProperties.getAppId()) - .setPayload("fileId", fieldId) - .setPayload("currentTimeStamp", currentTime) - .setPayload("pcfg", tencentProperties.getVod().getPfcg()) - .setPayload("urlAccessInfo", urlAccessInfo) - .sign(); - } - - @Override - public MediaUploadResult uploadFile(String filename, InputStream inputStream, long contentLength) { - CommitUploadResponse response = null; - try { - // 1.申请上传 - ApplyUploadResponse applyUploadResponse = applyUpload(filename); - // 2.开始上传 - handleUpload(inputStream, contentLength, applyUploadResponse); - // 3.确认上传 - response = commitUpload(applyUploadResponse); - } catch (Exception e) { - log.error("上传视频文件【{}】失败。", filename, e); - throw new CommonException(MEDIA_UPLOAD_ERROR, e); - } - // 3.解析结果 - MediaUploadResult result = new MediaUploadResult(); - result.setFileId(response.getFileId()); - result.setMediaUrl(response.getMediaUrl()); - result.setCoverUrl(response.getCoverUrl()); - result.setRequestId(response.getRequestId()); - return result; - } - - private CommitUploadResponse commitUpload(ApplyUploadResponse applyUploadResponse) { - CommitUploadRequest request = new CommitUploadRequest(); - request.setVodSessionKey(applyUploadResponse.getVodSessionKey()); - TencentCloudSDKException err = null; - int i = 0; - while (i < 4) { - try { - return vodClient.CommitUpload(request); - } catch (TencentCloudSDKException e) { - if (StringUtil.isEmpty(e.getRequestId())) { - err = e; - ++i; - continue; - } - - throw new CommonException(MEDIA_COMMIT_UPLOAD_ERROR, e); - } - - } - throw new CommonException(MEDIA_COMMIT_UPLOAD_ERROR, err); - } - - private void handleUpload(InputStream inputStream, long contentLength, ApplyUploadResponse applyUploadResponse) { - // 1.整理授权上传的凭证 - COSCredentials credentials = null; - if (applyUploadResponse.getTempCertificate() != null) { - TempCertificate certificate = applyUploadResponse.getTempCertificate(); - credentials = new BasicSessionCredentials(certificate.getSecretId(), certificate.getSecretKey(), certificate.getToken()); - } else { - credentials = new BasicCOSCredentials(tencentProperties.getSecretId(), tencentProperties.getSecretKey()); - } - // 2.准备上传客户端 - ClientConfig clientConfig = new ClientConfig(new Region(applyUploadResponse.getStorageRegion())); - clientConfig.setHttpProtocol(HttpProtocol.https); - COSClient cosClient = new COSClient(credentials, clientConfig); - TransferManager transferManager = new TransferManager(cosClient); - try { - // 3.开始上传 - ObjectMetadata metadata = new ObjectMetadata(); - metadata.setContentLength(contentLength); - Upload upload = transferManager.upload(applyUploadResponse.getStorageBucket(), applyUploadResponse.getMediaStoragePath(), inputStream, metadata); - // 4.等待上传完成 - upload.waitForCompletion(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } finally { - // 5.关闭客户端 - transferManager.shutdownNow(); - } - } - - private ApplyUploadResponse applyUpload(String filename) { - ApplyUploadRequest req = new ApplyUploadRequest(); - req.setMediaName(filename); - req.setMediaType(FileUtil.getFileType(filename)); - req.setProcedure(tencentProperties.getVod().getProcedure()); - TencentCloudSDKException err = null; - int i = 0; - while (i < 4) { - try { - // 返回的resp是一个ApplyUploadResponse的实例,与请求对象对应 - return vodClient.ApplyUpload(req); - } catch (TencentCloudSDKException e) { - if (StringUtil.isEmpty(e.getRequestId())) { - err = e; - ++i; - continue; - } - throw new CommonException(MEDIA_APPLY_UPLOAD_ERROR, e); - } - } - throw new RuntimeException(MEDIA_APPLY_UPLOAD_ERROR, err); - } - - @Override - public void deleteFile(String fileId) { - try { - DeleteMediaRequest request = new DeleteMediaRequest(); - request.setFileId(fileId); - vodClient.DeleteMedia(request); - } catch (TencentCloudSDKException e) { - throw new CommonException(MEDIA_DELETE_ERROR, e); - } - } - - @Override - public void deleteFiles(List fileIds) { - for (String fileId : fileIds) { - deleteFile(fileId); - } - } - - @Override - public List queryMediaInfos(String ... fileIds) { - // 1.请求参数 - DescribeMediaInfosRequest req = new DescribeMediaInfosRequest(); - req.setFileIds(fileIds); - req.setFilters(MEDIA_INFO_FILTERS); - // 2.发送请求 - DescribeMediaInfosResponse resp = null; - try { - resp = vodClient.DescribeMediaInfos(req); - } catch (TencentCloudSDKException e) { - throw new RuntimeException("获取媒资信息异常", e); - } - - // 3.解析结果 - MediaInfo[] mediaInfoSet = resp.getMediaInfoSet(); - if (mediaInfoSet == null || mediaInfoSet.length == 0) { - return Collections.emptyList(); - } - // 4.数据转换 - List list = new ArrayList<>(mediaInfoSet.length); - for (MediaInfo info : mediaInfoSet) { - Media media = new Media(); - media.setFileId(info.getFileId()); - MediaMetaData md = info.getMetaData(); - MediaBasicInfo bi = info.getBasicInfo(); - media.setMediaUrl(bi.getMediaUrl()); - media.setFilename(bi.getName()); - media.setSize(md.getSize()); - media.setDuration(md.getDuration()); - media.setStatus(FileStatus.UPLOADED); - list.add(media); - } - return list; - } -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/UserAccessInfo.java b/tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/UserAccessInfo.java deleted file mode 100644 index 42b957c..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/storage/tencent/UserAccessInfo.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.tianji.media.storage.tencent; - -import lombok.Data; - -@Data -public class UserAccessInfo { - private Long exper; - private String uid; -} diff --git a/tianji-master/tj-media/src/main/java/com/tianji/media/task/PullEventTask.java b/tianji-master/tj-media/src/main/java/com/tianji/media/task/PullEventTask.java deleted file mode 100644 index 4941c1f..0000000 --- a/tianji-master/tj-media/src/main/java/com/tianji/media/task/PullEventTask.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.tianji.media.task; - -import com.tencentcloudapi.common.exception.TencentCloudSDKException; -import com.tencentcloudapi.vod.v20180717.VodClient; -import com.tencentcloudapi.vod.v20180717.models.*; -import com.tianji.media.domain.po.Media; -import com.tianji.media.enums.FileStatus; -import com.tianji.media.service.IMediaService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PullEventTask { - - private static final String PROCEDURE_EVENT = "ProcedureStateChanged"; - private static final String UPLOAD_EVENT = "NewFileUpload"; - private static final String PROCEDURE_EVENT_FINISH = "FINISH"; - - private final VodClient vodClient; - private final IMediaService mediaService; - - @Scheduled(fixedDelay = 10000) - public void pullEvent() { - // 1.准备请求参数 - PullEventsRequest req = new PullEventsRequest(); - try { - // 2.发出请求,拉取事件通知 - log.debug("准备拉取vod事件"); - PullEventsResponse response = vodClient.PullEvents(req); - // 3.解析响应 - EventContent[] eventSet = response.getEventSet(); - // 3.1.遍历 - List ehs = new ArrayList<>(); - for (EventContent ec : eventSet) { - // 3.2.获取事件类型 - String eventType = ec.getEventType(); - // 3.3.处理事件 - if (PROCEDURE_EVENT.equals(eventType)) { - handleProcedureStateChangeEvent(ec); - } /*else if(UPLOAD_EVENT.equals(eventType)){ - handleUploadEvent(ec); - }*/ - ehs.add(ec.getEventHandle()); - } - ConfirmEventsRequest confirmReq = new ConfirmEventsRequest(); - confirmReq.setEventHandles(ehs.toArray(new String[0])); - vodClient.ConfirmEvents(confirmReq); - log.info("事件处理完毕"); - } catch (TencentCloudSDKException e) { - if(e.getMessage().equals("no event")){ - log.debug("暂无event事件"); - }else{ - log.error("VOD事件处理异常", e); - } - } - } - - private void handleUploadEvent(EventContent ec) { - // 1.文件上传事件 - FileUploadTask fut = ec.getFileUploadEvent(); - String fileId = fut.getFileId(); - // 2.获取文件详情 - MediaMetaData md = fut.getMetaData(); - MediaBasicInfo info = fut.getMediaBasicInfo(); - // 3.组织结果 - Media media = new Media(); - media.setFileId(fut.getFileId()); - media.setFilename(info.getName()); - media.setMediaUrl(info.getMediaUrl()); - media.setCoverUrl(info.getCoverUrl()); - media.setDuration(md.getDuration()); - media.setSize(md.getSize()); - media.setStatus(FileStatus.UPLOADED); - mediaService.updateMediaProcedureResult(media); - } - - private void handleProcedureStateChangeEvent(EventContent ec) { - // 3.3.1.任务流状态变更,判断是否结束 - ProcedureTask pt = ec.getProcedureStateChangeEvent(); - if (PROCEDURE_EVENT_FINISH.equals(pt.getStatus())) { - // 3.3.2.任务流已经结束,获取视频元信息 - MediaMetaData md = pt.getMetaData(); - Optional optional = Arrays.stream(pt.getMediaProcessResultSet()) - .filter(r -> "CoverBySnapshot".equals(r.getType())) - .findFirst(); - String coverUrl = null; - if (optional.isPresent()) { - coverUrl = optional.get().getCoverBySnapshotTask().getOutput().getCoverUrl(); - } - // 3.3.3.保存到数据库 - Media media = new Media(); - media.setFileId(pt.getFileId()); - media.setFilename(pt.getFileName()); - media.setMediaUrl(pt.getFileUrl()); - media.setCoverUrl(coverUrl); - media.setDuration(md.getDuration()); - media.setSize(md.getSize()); - media.setStatus(FileStatus.PROCESSED); - mediaService.updateMediaProcedureResult(media); - } - } -} diff --git a/tianji-master/tj-media/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-media/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-media/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-media/src/main/resources/bootstrap-local.yml b/tianji-master/tj-media/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-media/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-media/src/main/resources/bootstrap.yml b/tianji-master/tj-media/src/main/resources/bootstrap.yml deleted file mode 100644 index 2103a1d..0000000 --- a/tianji-master/tj-media/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,62 +0,0 @@ -server: - port: 8084 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: media-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - data-id: shared-spring.yaml # 共享spring配置 - refresh: false - - data-id: shared-redis.yaml # 共享redis配置 - refresh: false - - data-id: shared-logs.yaml # 共享日志配置 - refresh: false - - data-id: shared-mybatis.yaml # 共享mybatis配置 - refresh: false - - data-id: shared-feign.yaml # 共享feign配置 - refresh: false -tj: - swagger: - enable: true - package-path: com.tianji.media.controller - title: 智汇云课堂 - 媒资中心接口文档 - description: 该服务包含图片管理、媒资管理等 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - enableResponseWrap: true - auth: - resource: - enable: true - excludeLoginPaths: - - /medias/signature/play - jdbc: - database: tj_media - platform: - file: TENCENT - media: TENCENT - tencent: - appId: 1312394356 - secretId: AKIDDG3arrZ0B42sXzEOM8h182jDVbVDiAPS - secretKey: uc7RaXIqDPOAk9MAnAG5duvf8LHvIODl - vod: - enable: true - vodValidSeconds: 7776000 - region: "ap-shanghai" - procedure: "wisehub-base" - urlKey: "HZFlxjPYoOm5AfShupOx" - pfcg: "basicDrmPreset" - cos: - enable: true - region: "ap-shanghai" - bucket: wisehub - multipartUploadThreshold: 5242880 # 5mb,触发分片上传的阈值 - minimumUploadPartSize: 1048576 # 1mb,分片的最小大小 \ No newline at end of file diff --git a/tianji-master/tj-message/pom.xml b/tianji-master/tj-message/pom.xml deleted file mode 100644 index 366ecdd..0000000 --- a/tianji-master/tj-message/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-message - pom - - tj-message-domain - tj-message-api - tj-message-service - - - - 11 - 11 - - - \ No newline at end of file diff --git a/tianji-master/tj-message/tj-message-api/pom.xml b/tianji-master/tj-message/tj-message-api/pom.xml deleted file mode 100644 index 77fef25..0000000 --- a/tianji-master/tj-message/tj-message-api/pom.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - tj-message - com.tianji - 1.0.0 - - 4.0.0 - - tj-message-api - - - 11 - 11 - - - - com.tianji - tj-message-domain - 1.0.0 - - - org.springframework.boot - spring-boot-starter-amqp - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - \ No newline at end of file diff --git a/tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/client/AsyncSmsClient.java b/tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/client/AsyncSmsClient.java deleted file mode 100644 index 1e88115..0000000 --- a/tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/client/AsyncSmsClient.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.message.api.client; - -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.constants.MqConstants; -import com.tianji.message.domain.dto.SmsInfoDTO; - -public class AsyncSmsClient { - private final RabbitMqHelper mqHelper; - - public AsyncSmsClient(RabbitMqHelper mqHelper) { - this.mqHelper = mqHelper; - } - - /** - * 基于 MQ 异步发送短信 - * @param smsInfoDTO 短信相关信息 - */ - public void sendMessage(SmsInfoDTO smsInfoDTO){ - mqHelper.send(MqConstants.Exchange.SMS_EXCHANGE, MqConstants.Key.SMS_MESSAGE, smsInfoDTO); - } -} diff --git a/tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/client/MessageClient.java b/tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/client/MessageClient.java deleted file mode 100644 index 36c7b79..0000000 --- a/tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/client/MessageClient.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.message.api.client; - -import com.tianji.message.domain.dto.SmsInfoDTO; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -@FeignClient("message-service") -public interface MessageClient { - - /** - * 同步发送短信 - * @param smsInfoDTO 短信相关信息 - */ - @PostMapping("message") - void sendMessage(@RequestBody SmsInfoDTO smsInfoDTO); - -} diff --git a/tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/config/MessageClientConfiguration.java b/tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/config/MessageClientConfiguration.java deleted file mode 100644 index cdf98a6..0000000 --- a/tianji-master/tj-message/tj-message-api/src/main/java/com/tianji/message/api/config/MessageClientConfiguration.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.message.api.config; - - -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.message.api.client.AsyncSmsClient; -import feign.RequestInterceptor; -import org.slf4j.MDC; -import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import static com.tianji.common.constants.Constant.*; - -@Configuration -@EnableFeignClients(basePackages = "com.tianji.message.api.client") -public class MessageClientConfiguration { - - @Bean - @ConditionalOnMissingBean - public RequestInterceptor requestIdInterceptor(){ - return template -> template - .header(REQUEST_ID_HEADER, MDC.get(REQUEST_ID_HEADER)) - .header(REQUEST_FROM_HEADER, FEIGN_ORIGIN_NAME); - } - - @Bean - public AsyncSmsClient smsClient(RabbitMqHelper mqHelper){ - return new AsyncSmsClient(mqHelper); - } -} \ No newline at end of file diff --git a/tianji-master/tj-message/tj-message-api/src/main/resources/META-INF/spring.factories b/tianji-master/tj-message/tj-message-api/src/main/resources/META-INF/spring.factories deleted file mode 100644 index bb1aa62..0000000 --- a/tianji-master/tj-message/tj-message-api/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.tianji.message.api.config.MessageClientConfiguration \ No newline at end of file diff --git a/tianji-master/tj-message/tj-message-domain/pom.xml b/tianji-master/tj-message/tj-message-domain/pom.xml deleted file mode 100644 index 8a6f1d7..0000000 --- a/tianji-master/tj-message/tj-message-domain/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - tj-message - com.tianji - 1.0.0 - - 4.0.0 - - tj-message-domain - - - 11 - 11 - - - - - com.tianji - tj-common - 1.0.0 - - - \ No newline at end of file diff --git a/tianji-master/tj-message/tj-message-domain/src/main/java/com/tianji/message/domain/dto/SmsInfoDTO.java b/tianji-master/tj-message/tj-message-domain/src/main/java/com/tianji/message/domain/dto/SmsInfoDTO.java deleted file mode 100644 index bdfe1fd..0000000 --- a/tianji-master/tj-message/tj-message-domain/src/main/java/com/tianji/message/domain/dto/SmsInfoDTO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.message.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.Map; - -@Data -@ApiModel(description = "短信发送参数") -public class SmsInfoDTO { - @ApiModelProperty("模板代号") - private String templateCode; - @ApiModelProperty("手机号码") - private Iterable phones; - @ApiModelProperty("模板参数") - private Map templateParams; -} diff --git a/tianji-master/tj-message/tj-message-domain/src/main/java/com/tianji/message/domain/enums/SmsTemplate.java b/tianji-master/tj-message/tj-message-domain/src/main/java/com/tianji/message/domain/enums/SmsTemplate.java deleted file mode 100644 index a36797f..0000000 --- a/tianji-master/tj-message/tj-message-domain/src/main/java/com/tianji/message/domain/enums/SmsTemplate.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.message.domain.enums; - -import lombok.Getter; - -@Getter -public enum SmsTemplate { - VERIFY_CODE("短信验证码"), - ; - private String desc; - - SmsTemplate( String desc) { - this.desc = desc; - } -} diff --git a/tianji-master/tj-message/tj-message-service/pom.xml b/tianji-master/tj-message/tj-message-service/pom.xml deleted file mode 100644 index aaf9e84..0000000 --- a/tianji-master/tj-message/tj-message-service/pom.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - tj-message - com.tianji - 1.0.0 - - 4.0.0 - - tj-message-service - - - 11 - 11 - - - - org.springframework.boot - spring-boot-starter-web - - - com.baomidou - mybatis-plus-boot-starter - - - mysql - mysql-connector-java - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - com.github.xiaoymin - knife4j-spring-boot-starter - - - - com.tianji - tj-api - 1.0.0 - - - com.tianji - tj-message-domain - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-amqp - - - - com.github.ben-manes.caffeine - caffeine - - - - com.xuxueli - xxl-job-core - - - - com.aliyun - alibabacloud-dysmsapi20170525 - 1.0.1 - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - com.tianji.message.MessageApplication - - - - - \ No newline at end of file diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/MessageApplication.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/MessageApplication.java deleted file mode 100644 index 7e0d5ef..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/MessageApplication.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.tianji.message; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** - * - * @author wusongsong - * @since 2022/6/23 11:05 - * @version 1.0.0 1.0.0 - **/ -@SpringBootApplication -@MapperScan("com.tianji.message.mapper") -@Slf4j -public class MessageApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(MessageApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - - - } -} \ No newline at end of file diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/config/MessageConfig.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/config/MessageConfig.java deleted file mode 100644 index 3c63bcb..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/config/MessageConfig.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.tianji.message.config; - -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.tianji.message.domain.po.SmsThirdPlatform; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.time.Duration; -import java.util.List; -import java.util.concurrent.Executor; -import java.util.concurrent.ThreadPoolExecutor; - -@Slf4j -@Configuration -@EnableConfigurationProperties(MessageProperties.class) -public class MessageConfig { - @Bean("asyncNoticeExecutor") - public Executor asyncNoticeExecutor() { - log.info("开始初始化执行通知任务的线程池...."); - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - //配置核心线程数 - executor.setCorePoolSize(10); - //配置最大线程数 - executor.setMaxPoolSize(15); - //配置队列大小 - executor.setQueueCapacity(99999); - //配置线程池中的线程的名称前缀 - executor.setThreadNamePrefix("pd-user-async-service-"); - - // 设置拒绝策略:当pool已经达到max size的时候,如何处理新任务 - // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - //执行初始化 - executor.initialize(); - log.info("初始化执行通知任务的线程池结束..."); - return executor; - } - @Bean("asyncSmsExecutor") - public Executor asyncSmsExecutor() { - log.info("开始初始化短信发送任务的线程池...."); - ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); - //配置核心线程数 - executor.setCorePoolSize(50); - //配置最大线程数 - executor.setMaxPoolSize(100); - //配置队列大小 - executor.setQueueCapacity(99999); - //配置线程池中的线程的名称前缀 - executor.setThreadNamePrefix("pd-user-async-service-"); - - // 设置拒绝策略:当pool已经达到max size的时候,如何处理新任务 - // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行 - executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - //执行初始化 - executor.initialize(); - log.info("初始化执行短信发送的线程池结束..."); - return executor; - } - - @Bean - public Cache> platformCache(){ - return Caffeine.newBuilder() - .initialCapacity(1) - .maximumSize(20_00) - .expireAfterWrite(Duration.ofMinutes(30)) - .build(); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/config/MessageProperties.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/config/MessageProperties.java deleted file mode 100644 index 6bb2679..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/config/MessageProperties.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.message.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@Data -@ConfigurationProperties(prefix = "tj.message") -public class MessageProperties { - /** - * 通知的最大有效期,默认1个月 - */ - private Integer noticeTtlMonths = 1; - /** - * 私信的最大有效期,默认6个月 - */ - private Integer messageTtlMonths = 6; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/constants/MessageErrorInfo.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/constants/MessageErrorInfo.java deleted file mode 100644 index 95ec5fa..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/constants/MessageErrorInfo.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.tianji.message.constants; - -public interface MessageErrorInfo { - String NOTICE_TEMPLATE_CANNOT_USE = "通知模板已停用"; - String NOTICE_TEMPLATE_NOT_EXISTS = "通知模板不存在"; - String NOTICE_NOT_MESSAGE_TEMPLATE = "通知模板不是短信模板"; - String PLATFORM_IS_EMPTY = "短信平台信息为空"; - String NO_SUITABLE_TEMPLATE = "找不到可用的消息模板"; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/MessageTemplateController.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/MessageTemplateController.java deleted file mode 100644 index 68dc936..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/MessageTemplateController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.tianji.message.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.message.domain.dto.MessageTemplateDTO; -import com.tianji.message.domain.dto.MessageTemplateFormDTO; -import com.tianji.message.domain.query.MessageTemplatePageQuery; -import com.tianji.message.service.IMessageTemplateService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 第三方短信平台模板信息管理 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Api(tags = "短信模板管理接口") -@RestController -@RequestMapping("/message-templates") -@RequiredArgsConstructor -public class MessageTemplateController { - - private final IMessageTemplateService messageTemplateService; - - @PostMapping - @ApiOperation("新增短信模板") - public Long saveMessageTemplate(@RequestBody MessageTemplateFormDTO messageTemplateDTO){ - return messageTemplateService.saveMessageTemplate(messageTemplateDTO); - } - - @PutMapping("/{id}") - @ApiOperation("更新短信模板") - public void updateMessageTemplate( - @RequestBody MessageTemplateFormDTO messageTemplateDTO, - @ApiParam(value = "短信模板id", example = "1") @PathVariable("id") Long id){ - messageTemplateDTO.setId(id); - messageTemplateService.updateMessageTemplate(messageTemplateDTO); - } - - @GetMapping - @ApiOperation("分页查询短信模板") - public PageDTO queryMessageTemplates(MessageTemplatePageQuery pageQuery){ - return messageTemplateService.queryMessageTemplates(pageQuery); - } - - @GetMapping("/{id}") - @ApiOperation("根据id查询短信模板") - public MessageTemplateDTO queryMessageTemplate(@ApiParam(value = "模板id", example = "1") @PathVariable("id") Long id){ - return messageTemplateService.queryMessageTemplate(id); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/NoticeTaskController.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/NoticeTaskController.java deleted file mode 100644 index 1f82ec3..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/NoticeTaskController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.tianji.message.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.message.domain.dto.NoticeTaskDTO; -import com.tianji.message.domain.dto.NoticeTaskFormDTO; -import com.tianji.message.domain.query.NoticeTaskPageQuery; -import com.tianji.message.service.INoticeTaskService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 系统通告的任务表,可以延期或定期发送通告 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Api(tags = "短信任务管理接口") -@RestController -@RequestMapping("/notice-tasks") -@RequiredArgsConstructor -public class NoticeTaskController { - - private final INoticeTaskService noticeTaskService; - - @PostMapping - @ApiOperation("新增通知任务") - public Long saveNoticeTask(@RequestBody NoticeTaskFormDTO noticeTaskFormDTO){ - return noticeTaskService.saveNoticeTask(noticeTaskFormDTO); - } - - @PutMapping("/{id}") - @ApiOperation("更新通知任务") - public void updateNoticeTask( - @RequestBody NoticeTaskFormDTO noticeTaskFormDTO, - @ApiParam(value = "任务id", example = "1") @PathVariable("id") Long id){ - noticeTaskFormDTO.setId(id); - noticeTaskService.updateNoticeTask(noticeTaskFormDTO); - } - - @GetMapping - @ApiOperation("分页查询通知任务") - public PageDTO queryNoticeTasks(NoticeTaskPageQuery pageQuery){ - return noticeTaskService.queryNoticeTasks(pageQuery); - } - - @GetMapping("/{id}") - @ApiOperation("根据id查询任务") - public NoticeTaskDTO queryNoticeTask(@ApiParam(value = "任务id", example = "1") @PathVariable("id") Long id){ - return noticeTaskService.queryNoticeTask(id); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/NoticeTemplateController.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/NoticeTemplateController.java deleted file mode 100644 index cdd5490..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/NoticeTemplateController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.tianji.message.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.message.domain.dto.NoticeTemplateDTO; -import com.tianji.message.domain.dto.NoticeTemplateFormDTO; -import com.tianji.message.domain.query.NoticeTemplatePageQuery; -import com.tianji.message.service.INoticeTemplateService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 通知模板 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@RestController -@RequestMapping("/notice-templates") -@Api(tags = "通知模板管理接口") -@RequiredArgsConstructor -public class NoticeTemplateController { - - private final INoticeTemplateService noticeTemplateService; - - @PostMapping - @ApiOperation("新增通知模板") - public Long saveNoticeTemplate(@RequestBody NoticeTemplateFormDTO noticeTemplateFormDTO){ - return noticeTemplateService.saveNoticeTemplate(noticeTemplateFormDTO); - } - - @PutMapping("/{id}") - @ApiOperation("更新通知模板") - public void updateNoticeTemplate( - @RequestBody NoticeTemplateFormDTO noticeTemplateFormDTO, - @ApiParam(value = "模板id", example = "1") @PathVariable("id") Long id){ - noticeTemplateFormDTO.setId(id); - noticeTemplateService.updateNoticeTemplate(noticeTemplateFormDTO); - } - - @GetMapping - @ApiOperation("分页查询通知模板") - public PageDTO queryNoticeTemplates(NoticeTemplatePageQuery pageQuery){ - return noticeTemplateService.queryNoticeTemplates(pageQuery); - } - - @GetMapping("/{id}") - @ApiOperation("根据id查询模板") - public NoticeTemplateDTO queryNoticeTemplate(@ApiParam(value = "模板id", example = "1") @PathVariable("id") Long id){ - return noticeTemplateService.queryNoticeTemplate(id); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/SmsController.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/SmsController.java deleted file mode 100644 index f972ece..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/SmsController.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.message.controller; - -import com.tianji.api.dto.sms.SmsInfoDTO; -import com.tianji.message.service.ISmsService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Api(tags = "短信发送控制器") -@RestController -@RequestMapping("sms") -@RequiredArgsConstructor -public class SmsController { - - private final ISmsService smsService; - - @ApiOperation("同步发送短信") - @PostMapping("message") - public void sendMessage(@RequestBody SmsInfoDTO smsInfoDTO){ - smsService.sendMessageAsync(smsInfoDTO); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/SmsThirdPlatformController.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/SmsThirdPlatformController.java deleted file mode 100644 index 425300f..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/SmsThirdPlatformController.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.tianji.message.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.message.domain.dto.SmsThirdPlatformDTO; -import com.tianji.message.domain.dto.SmsThirdPlatformFormDTO; -import com.tianji.message.domain.query.SmsThirdPlatformPageQuery; -import com.tianji.message.service.ISmsThirdPlatformService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 第三方云通讯平台 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Api(tags = "短信平台管理接口") -@RestController -@RequestMapping("/sms-platforms") -@RequiredArgsConstructor -public class SmsThirdPlatformController { - - private final ISmsThirdPlatformService smsThirdPlatformService; - - @PostMapping - @ApiOperation("新增短信平台信息") - public Long saveSmsThirdPlatform(@RequestBody SmsThirdPlatformFormDTO smsThirdPlatformDTO){ - return smsThirdPlatformService.saveSmsThirdPlatform(smsThirdPlatformDTO); - } - - @PutMapping("/{id}") - @ApiOperation("更新短信平台信息") - public void updateSmsThirdPlatform( - @RequestBody SmsThirdPlatformFormDTO smsThirdPlatformDTO, - @ApiParam(value = "短信平台id", example = "1") @PathVariable("id") Long id){ - smsThirdPlatformDTO.setId(id); - smsThirdPlatformService.updateSmsThirdPlatform(smsThirdPlatformDTO); - } - - @GetMapping - @ApiOperation("分页查询短信平台信息") - public PageDTO querySmsThirdPlatforms(SmsThirdPlatformPageQuery pageQuery){ - return smsThirdPlatformService.querySmsThirdPlatforms(pageQuery); - } - - @GetMapping("/{id}") - @ApiOperation("根据id查询短信平台信息") - public SmsThirdPlatformDTO querySmsThirdPlatform( - @ApiParam(value = "短信平台id", example = "1") @PathVariable("id") Long id){ - return smsThirdPlatformService.querySmsThirdPlatform(id); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/UserInboxController.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/UserInboxController.java deleted file mode 100644 index fb1744e..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/controller/UserInboxController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.message.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.message.domain.dto.UserInboxDTO; -import com.tianji.message.domain.dto.UserInboxFormDTO; -import com.tianji.message.domain.query.UserInboxQuery; -import com.tianji.message.service.IUserInboxService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 用户通知记录 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Api(tags = "用户收件箱接口") -@RestController -@RequestMapping("/inboxes") -@RequiredArgsConstructor -public class UserInboxController { - - private final IUserInboxService inboxService; - - @PostMapping - @ApiOperation("发送私信") - public Long sentMessageToUser(@RequestBody UserInboxFormDTO userInboxFormDTO){ - return inboxService.sentMessageToUser(userInboxFormDTO); - } - - @ApiOperation("分页查询收件箱") - @GetMapping - public PageDTO queryUserInBoxesPage(UserInboxQuery query){ - return inboxService.queryUserInBoxesPage(query); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/MessageTemplateDTO.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/MessageTemplateDTO.java deleted file mode 100644 index 11f741e..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/MessageTemplateDTO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.tianji.message.domain.dto; - -import com.tianji.common.domain.dto.BaseDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - *

- * 第三方短信平台 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "短信模板") -public class MessageTemplateDTO extends BaseDTO { - - @ApiModelProperty("信发送模板id,新增时无需填写") - private Long id; - - @ApiModelProperty("第三方短信推送渠道id") - private Long platformCode; - - @ApiModelProperty("第三方短信推送渠道名称") - private String platformName; - - @ApiModelProperty("短信模板名称") - private String name; - - @ApiModelProperty("短信模板预览内容") - private String content; - - @ApiModelProperty("第三方平台短信签名") - private String signName; - - @ApiModelProperty("第三方平台短信模板code") - private String thirdTemplateCode; - - @ApiModelProperty("模板状态: 0-草稿,1-使用中,2-停用") - private Integer status; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/MessageTemplateFormDTO.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/MessageTemplateFormDTO.java deleted file mode 100644 index ac653eb..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/MessageTemplateFormDTO.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.message.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - *

- * 第三方短信平台 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Data -@ApiModel(description = "短信模板表单实体") -public class MessageTemplateFormDTO { - - @ApiModelProperty("信发送模板id,新增时无需填写") - private Long id; - - @ApiModelProperty("第三方短信平台代号") - private String platformCode; - - @ApiModelProperty("第三方平台短信签名") - private String signName; - - @ApiModelProperty("第三方平台短信模板code") - private String thirdTemplateCode; - - @ApiModelProperty("模板状态: 0-草稿,1-使用中,2-停用") - private Integer status; - - @ApiModelProperty("短信模板名称,如果是通知模板下的短信模板,则无需填写") - private String name; - - @ApiModelProperty("短信模板内容预览,如果是通知模板下的短信模板,则无需填写") - private String content; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTaskDTO.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTaskDTO.java deleted file mode 100644 index 85b28d0..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTaskDTO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tianji.message.domain.dto; - -import com.tianji.common.domain.dto.BaseDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; - -/** - *

- * 公告消息模板 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "通知任务") -public class NoticeTaskDTO extends BaseDTO { - - @ApiModelProperty("任务id,新增时无需填写") - private Long id; - @ApiModelProperty("任务要发送的通知模板id") - private Long templateId; - @ApiModelProperty("任务名称") - private String name; - @ApiModelProperty("true-通知所有人;false-通知部分人。默认false") - private Boolean partial; - @ApiModelProperty("任务预期执行时间") - private LocalDateTime pushTime; - @ApiModelProperty("任务重复执行次数上限,0则不重复") - private Integer maxTimes; - @ApiModelProperty("任务重复执行时间间隔,单位是分钟") - private Long interval; - @ApiModelProperty("任务失效时间") - private LocalDateTime expireTime; - @ApiModelProperty("任务是否已经完成。默认false") - private Boolean finished; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTaskFormDTO.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTaskFormDTO.java deleted file mode 100644 index e446376..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTaskFormDTO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tianji.message.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - *

- * 公告消息模板 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Data -@ApiModel(description = "通知任务的表单实体") -public class NoticeTaskFormDTO { - - @ApiModelProperty("任务id,新增时无需填写") - private Long id; - @ApiModelProperty("任务要发送的通知模板id") - private Long templateId; - @ApiModelProperty("任务名称") - private String name; - @ApiModelProperty("true-通知所有人;false-通知部分人。默认false") - private Boolean partial; - @ApiModelProperty("任务预期执行时间,如果为null,或者小于等于当前时间,则立刻执行") - private LocalDateTime pushTime; - @ApiModelProperty("任务重复执行次数上限,0则不重复") - private Integer maxTimes; - @ApiModelProperty("任务重复执行时间间隔,单位是分钟") - private Long interval; - @ApiModelProperty("任务失效时间") - private LocalDateTime expireTime; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTemplateDTO.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTemplateDTO.java deleted file mode 100644 index c5352b0..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTemplateDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.message.domain.dto; - -import com.tianji.common.domain.dto.BaseDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "通知模板实体") -public class NoticeTemplateDTO extends BaseDTO { - @ApiModelProperty("主键id,新增时无需填写") - private Long id; - @ApiModelProperty("模板名称") - private String name; - @ApiModelProperty("模板代号,例如:VERIFY_CODE") - private String code; - @ApiModelProperty("通知类型:0-系统通知,1-笔记通知,2-问答通知,3-其它通知") - private Integer type; - @ApiModelProperty("模板状态: 0-草稿,1-使用中,2-停用") - private Integer status; - @ApiModelProperty("通知标题") - private String title; - @ApiModelProperty("通知内容") - private String content; - @ApiModelProperty("是否是短信模板,默认false") - private Boolean isSmsTemplate; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTemplateFormDTO.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTemplateFormDTO.java deleted file mode 100644 index 50ae4ba..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/NoticeTemplateFormDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.message.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.util.List; - -@Data -@ApiModel(description = "通知模板表单实体") -public class NoticeTemplateFormDTO { - @ApiModelProperty("主键id,新增时无需填写") - private Long id; - @ApiModelProperty("模板名称") - private String name; - @ApiModelProperty("模板代号,例如:VERIFY_CODE") - private String code; - @ApiModelProperty("通知类型:0-系统通知,1-笔记通知,2-问答通知,3-其它通知") - private Integer type; - @ApiModelProperty("模板状态: 0-草稿,1-使用中,2-停用") - private Integer status; - @ApiModelProperty("通知标题") - private String title; - @ApiModelProperty("通知内容") - private String content; - @ApiModelProperty("是否是短信模板,默认false") - private Boolean isSmsTemplate; - @ApiModelProperty("如果需要添加短信模板时填写这个,可以包含不同短信渠道") - private List messageTemplates; - @ApiModelProperty("如果需要删除已添加的短信模板时填写这个,只填id") - private List deleteMessageTemplates; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/SmsThirdPlatformDTO.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/SmsThirdPlatformDTO.java deleted file mode 100644 index 05e0454..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/SmsThirdPlatformDTO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.message.domain.dto; - -import com.tianji.common.domain.dto.BaseDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - *

- * 第三方云通讯平台 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "短信第三方平台信息") -public class SmsThirdPlatformDTO extends BaseDTO { - - @ApiModelProperty("短信平台id,新增时无需填写") - private Long id; - @ApiModelProperty("短信平台名称") - private String name; - @ApiModelProperty("短信平台代码,例如:ali") - private String code; - @ApiModelProperty("数字越小优先级越高,最小为0") - private Integer priority; - @ApiModelProperty("短信平台状态:0-禁用,1-启用") - private Integer status; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/SmsThirdPlatformFormDTO.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/SmsThirdPlatformFormDTO.java deleted file mode 100644 index 4b68913..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/SmsThirdPlatformFormDTO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.message.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - *

- * 第三方云通讯平台 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -@Data -@ApiModel(description = "短信第三方平台信息的表单实体") -public class SmsThirdPlatformFormDTO { - - @ApiModelProperty("短信平台id,新增时无需填写") - private Long id; - @ApiModelProperty("短信平台名称") - private String name; - @ApiModelProperty("短信平台代码,例如:ali") - private String code; - @ApiModelProperty("数字越小优先级越高,最小为0") - private Integer priority; - @ApiModelProperty("短信平台状态:0-禁用,1-启用") - private Integer status; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/UserInboxDTO.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/UserInboxDTO.java deleted file mode 100644 index 5cf9889..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/UserInboxDTO.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.message.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -/** - *

- * 用户通知记录 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -@Data -@ApiModel(description = "用户收件箱消息") -public class UserInboxDTO{ - - @ApiModelProperty("收件箱消息id") - private Long id; - - @ApiModelProperty("通知类型:0-系统通知,1-笔记通知,2-问答通知,3-其它通知,4-私信") - private Integer type; - - @ApiModelProperty("通知标题") - private String title; - - @ApiModelProperty("通知或私信内容") - private String content; - - @ApiModelProperty("是否已读") - private Boolean isRead; - - @ApiModelProperty("消息发送者id") - private Long publisher; - - @ApiModelProperty("收件箱消息id") - private LocalDateTime pushTime; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/UserInboxFormDTO.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/UserInboxFormDTO.java deleted file mode 100644 index 4b0abd5..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/dto/UserInboxFormDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.message.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - *

- * 用户通知记录 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -@Data -@ApiModel(description = "用户私信表单实体") -public class UserInboxFormDTO { - - @ApiModelProperty("目标用户id") - private Long userId; - - @ApiModelProperty("私信内容") - private String content; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/MessageTemplate.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/MessageTemplate.java deleted file mode 100644 index b8fbbbc..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/MessageTemplate.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.tianji.message.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 第三方短信平台签名和模板信息 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("message_template") -public class MessageTemplate implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 短信发送模板id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 模板名称 - */ - private String name; - - /** - * 第三方短信推送渠道id - */ - private String platformCode; - - /** - * 签名 - */ - private String signName; - - /** - * 第三方短信模板code - */ - private String thirdTemplateCode; - - /** - * 第三方短信模板内容预览 - */ - private String content; - - /** - * 通知模板id,统用系统公告类短信会关联这个id - */ - private Long templateId; - - /** - * 短信模板状态,0-禁用,1-启用 - */ - private Integer status; - /** - * 创建人 - */ - - private Long creater; - - /** - * 更新人 - */ - - private Long updater; - - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/NoticeTask.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/NoticeTask.java deleted file mode 100644 index 0902bb7..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/NoticeTask.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.tianji.message.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 系统通告的任务表,可以延期或定期发送通告 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("notice_task") -public class NoticeTask implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 公告任务id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 任务对应的通知模板id - */ - private Long templateId; - - /** - * 任务名称 - */ - private String name; - - /** - * true-通知所有人;false-通知部分人。默认false - */ - private Boolean partial; - - /** - * 任务预期执行时间 - */ - private LocalDateTime pushTime; - - /** - * 任务重复执行次数上限,0则不重复 - */ - private Integer maxTimes; - - /** - * 任务延迟执行时间间隔,单位是分钟 - */ - private Integer interval; - - /** - * 任务失效时间 - */ - private LocalDateTime expireTime; - - /** - * 任务是否已经完成 - */ - private Boolean finished; - - /** - * 创建人 - */ - - private Long creater; - - /** - * 更新人 - */ - - private Long updater; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/NoticeTemplate.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/NoticeTemplate.java deleted file mode 100644 index b208be6..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/NoticeTemplate.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.tianji.message.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 通知模板 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("notice_template") -public class NoticeTemplate implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 通知模板id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 通知模板名称 - */ - private String name; - - /** - * 通知模板代号,例如verify-code - */ - private String code; - - /** - * 通知类型:0-系统通知,1-笔记通知,2-问答通知,3-其它通知 - */ - private Integer type; - - /** - * 模板状态: 0-草稿,1-使用中,2-停用 - */ - private Integer status; - - /** - * 通知标题 - */ - private String title; - - /** - * 通知内容模板 - */ - private String content; - - /** - * 是否包含第三方短信模板,默认false - */ - private Boolean isSmsTemplate; - - /** - * 创建人 - */ - - private Long creater; - - /** - * 更新人 - */ - - private Long updater; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/PublicNotice.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/PublicNotice.java deleted file mode 100644 index bc12f07..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/PublicNotice.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.tianji.message.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 公告消息模板 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("public_notice") -public class PublicNotice implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 公告id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 公告类型 - */ - private Integer type; - /** - * 公告标题 - */ - private String title; - - /** - * 公告通知内容,可以存放公告消息模板 - */ - private String content; - - /** - * 公告预期发送时间 - */ - private LocalDateTime pushTime; - - /** - * 通知发布时间 - */ - private LocalDateTime createTime; - - /** - * 通知失效时间 - */ - private LocalDateTime expireTime; - - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/SmsThirdPlatform.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/SmsThirdPlatform.java deleted file mode 100644 index 93b4f84..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/SmsThirdPlatform.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.tianji.message.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 第三方云通讯平台 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("sms_third_platform") -public class SmsThirdPlatform implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 短信平台id - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 短信平台名称 - */ - private String name; - - /** - * 短信平台代码,例如:ali - */ - private String code; - - /** - * 数字越小优先级越高,最小为0 - */ - private Integer priority; - - /** - * 短信平台状态:0-禁用,1-启用 - */ - private Integer status; - - /** - * 创建人 - */ - - private Long creater; - - /** - * 更新人 - */ - - private Long updater; - - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/UserInbox.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/UserInbox.java deleted file mode 100644 index 788cdf2..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/po/UserInbox.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.tianji.message.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 用户通知记录 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("user_inbox") -public class UserInbox implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 用户通知id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 用户id - */ - private Long userId; - - /** - * 通知类型:0-系统通知,1-笔记通知,2-问答通知,3-其它通知 - */ - private Integer type; - - /** - * 通知标题 - */ - private String title; - - /** - * 通知或私信内容 - */ - private String content; - - /** - * 公告是否已读 - */ - private Boolean isRead; - - /** - * 通知的发送者id,0则代表是系统 - */ - private Long publisher; - - /** - * 消息推送时间 - */ - private LocalDateTime pushTime; - - /** - * 过期时间,一旦过期用户端不在展示 - */ - private LocalDateTime expireTime; - - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/MessageTemplatePageQuery.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/MessageTemplatePageQuery.java deleted file mode 100644 index 58f3ca3..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/MessageTemplatePageQuery.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.message.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@ApiModel(description = "通知模板查询对象") -@Data -public class MessageTemplatePageQuery extends PageQuery { - private Long thirdPlatformId; - private Integer status; - private String keyword; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/NoticeTaskPageQuery.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/NoticeTaskPageQuery.java deleted file mode 100644 index 937167e..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/NoticeTaskPageQuery.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.message.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.time.LocalDateTime; - -@EqualsAndHashCode(callSuper = true) -@ApiModel(description = "通知模板查询对象") -@Data -public class NoticeTaskPageQuery extends PageQuery { - private Boolean finished; - private String keyword; - private LocalDateTime minPushTime; - private LocalDateTime maxPushTime; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/NoticeTemplatePageQuery.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/NoticeTemplatePageQuery.java deleted file mode 100644 index 3cfbaad..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/NoticeTemplatePageQuery.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.message.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@ApiModel(description = "通知模板查询对象") -@Data -public class NoticeTemplatePageQuery extends PageQuery { - private Integer status; - private String keyword; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/SmsThirdPlatformPageQuery.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/SmsThirdPlatformPageQuery.java deleted file mode 100644 index fd24288..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/SmsThirdPlatformPageQuery.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.message.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@ApiModel(description = "通知模板查询对象") -@Data -public class SmsThirdPlatformPageQuery extends PageQuery { - private Integer status; - private String keyword; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/UserInboxQuery.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/UserInboxQuery.java deleted file mode 100644 index d4f60f2..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/domain/query/UserInboxQuery.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.message.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@ApiModel(description = "通知模板查询对象") -@Data -public class UserInboxQuery extends PageQuery { - private Boolean isRead; - private Integer type; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/enums/NoticeType.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/enums/NoticeType.java deleted file mode 100644 index c54e8b4..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/enums/NoticeType.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.message.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@AllArgsConstructor -@Getter -public enum NoticeType { - SYSTEM(0, "系统通知"), - NOTE(1, "笔记通知"), - QA(2, "问答通知"), - OTHER(3, "其它通知"), - PRIVATE_MESSAGE(4, "私信"), - ; - - private final int value; - private final String desc; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/enums/TemplateStatus.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/enums/TemplateStatus.java deleted file mode 100644 index 9243a3b..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/enums/TemplateStatus.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.message.enums; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -@AllArgsConstructor -@Getter -public enum TemplateStatus { - DRAFT(0, "草稿"), - IN_SERVICE(1, "使用中"), - OUT_OF_SERVICE(2, "停用"), - ; - - private final int value; - private final String desc; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/handler/NoticeJobHandler.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/handler/NoticeJobHandler.java deleted file mode 100644 index f484537..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/handler/NoticeJobHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.message.handler; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.utils.StringUtils; -import com.tianji.message.domain.po.NoticeTask; -import com.tianji.message.service.INoticeTaskService; -import com.xxl.job.core.context.XxlJobHelper; -import com.xxl.job.core.handler.annotation.XxlJob; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -@RequiredArgsConstructor -public class NoticeJobHandler { - - private final INoticeTaskService taskService; - - @XxlJob("publishNoticeJob") - public void publishNotice(){ - // 1.获取分片参数,作为数据查询的分页参数,分片数+1作为页码,jobParam作为每页大小,默认size为10 - int index = XxlJobHelper.getShardIndex() + 1; - String jobParam = XxlJobHelper.getJobParam(); - int size = StringUtils.isNumeric(jobParam) ? Integer.parseInt(jobParam) : 10; - // 2.查询待处理的任务:发布时间已经超时,并且尚未完成的任务 - PageDTO page = taskService.queryTodoNoticeTaskByPage(index, size); - if (page.isEmpty()) { - // 没有待处理任务,直接结束 - return; - } - // 3.有待处理任务,开搞 - List list = page.getList(); - for (NoticeTask noticeTask : list) { - taskService.handleTask(noticeTask); - } - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/handler/SmsMessageHandler.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/handler/SmsMessageHandler.java deleted file mode 100644 index d7053c9..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/handler/SmsMessageHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.tianji.message.handler; - -import com.tianji.api.dto.sms.SmsInfoDTO; -import com.tianji.common.constants.MqConstants; -import com.tianji.message.service.ISmsService; -import lombok.RequiredArgsConstructor; -import org.springframework.amqp.rabbit.annotation.Exchange; -import org.springframework.amqp.rabbit.annotation.Queue; -import org.springframework.amqp.rabbit.annotation.QueueBinding; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class SmsMessageHandler { - - private final ISmsService smsService; - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "sms.message.queue", durable = "true"), - exchange = @Exchange(MqConstants.Exchange.SMS_EXCHANGE), - key = MqConstants.Key.SMS_MESSAGE - )) - public void listenSmsMessage(SmsInfoDTO smsInfoDTO){ - smsService.sendMessage(smsInfoDTO); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/MessageTemplateMapper.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/MessageTemplateMapper.java deleted file mode 100644 index 213ce8a..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/MessageTemplateMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.message.mapper; - -import com.tianji.message.domain.po.MessageTemplate; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 第三方短信平台签名和模板信息 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -public interface MessageTemplateMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/NoticeTaskMapper.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/NoticeTaskMapper.java deleted file mode 100644 index c3a73e3..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/NoticeTaskMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.message.mapper; - -import com.tianji.message.domain.po.NoticeTask; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - *

- * 系统通告的任务表,可以延期或定期发送通告 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -public interface NoticeTaskMapper extends BaseMapper { - - @Select("SELECT user_id FROM notice_task_target WHERE task_id = #{task_id}") - List queryTaskTargetByTaskId(Long taskId); -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/NoticeTemplateMapper.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/NoticeTemplateMapper.java deleted file mode 100644 index 94302b8..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/NoticeTemplateMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.message.mapper; - -import com.tianji.message.domain.po.NoticeTemplate; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 通知模板 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -public interface NoticeTemplateMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/PublicNoticeMapper.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/PublicNoticeMapper.java deleted file mode 100644 index 6082439..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/PublicNoticeMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.message.mapper; - -import com.tianji.message.domain.po.PublicNotice; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 公告消息模板 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -public interface PublicNoticeMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/SmsThirdPlatformMapper.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/SmsThirdPlatformMapper.java deleted file mode 100644 index 2e36f46..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/SmsThirdPlatformMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.message.mapper; - -import com.tianji.message.domain.po.SmsThirdPlatform; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 第三方云通讯平台 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -public interface SmsThirdPlatformMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/UserInboxMapper.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/UserInboxMapper.java deleted file mode 100644 index bdf887d..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/mapper/UserInboxMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.message.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.message.domain.po.UserInbox; - -/** - *

- * 用户通知记录 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-20 - */ -public interface UserInboxMapper extends BaseMapper { - - UserInbox queryLatestPublicNotice(Long userId); -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/properties/ThreadPoolProperties.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/properties/ThreadPoolProperties.java deleted file mode 100644 index 1ea44a4..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/properties/ThreadPoolProperties.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.message.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.NestedConfigurationProperty; -import org.springframework.context.annotation.Configuration; - -import java.util.Map; - -/** - * 线程池配置 - * @ClassName ThreadPoolProperties - * @author wusongsong - * @since 2022/6/23 15:36 - * @version 1.0.0 - **/ -@Configuration -@Data -public class ThreadPoolProperties { - - @NestedConfigurationProperty - private Map threadPools; - - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IMessageTemplateService.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IMessageTemplateService.java deleted file mode 100644 index 4f3a0ad..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IMessageTemplateService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.message.service; - -import com.tianji.message.domain.dto.MessageTemplateDTO; -import com.tianji.message.domain.dto.MessageTemplateFormDTO; -import com.tianji.message.domain.query.MessageTemplatePageQuery; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.message.domain.po.MessageTemplate; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; - -/** - *

- * 第三方短信平台签名和模板信息 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -public interface IMessageTemplateService extends IService { - - List queryByNoticeTemplateId(Long id); - - Long saveMessageTemplate(MessageTemplateFormDTO messageTemplateDTO); - - void updateMessageTemplate(MessageTemplateFormDTO messageTemplateDTO); - - PageDTO queryMessageTemplates(MessageTemplatePageQuery pageQuery); - - MessageTemplateDTO queryMessageTemplate(Long id); -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/INoticeTaskService.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/INoticeTaskService.java deleted file mode 100644 index e87b105..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/INoticeTaskService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.message.service; - -import com.tianji.message.domain.dto.NoticeTaskDTO; -import com.tianji.message.domain.dto.NoticeTaskFormDTO; -import com.tianji.message.domain.query.NoticeTaskPageQuery; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.message.domain.po.NoticeTask; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 系统通告的任务表,可以延期或定期发送通告 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -public interface INoticeTaskService extends IService { - - Long saveNoticeTask(NoticeTaskFormDTO noticeTaskFormDTO); - - void handleTask(NoticeTask noticeTask); - - void updateNoticeTask(NoticeTaskFormDTO noticeTaskFormDTO); - - PageDTO queryNoticeTasks(NoticeTaskPageQuery pageQuery); - - NoticeTaskDTO queryNoticeTask(Long id); - - PageDTO queryTodoNoticeTaskByPage(int pageNo, int size); -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/INoticeTemplateService.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/INoticeTemplateService.java deleted file mode 100644 index 527da27..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/INoticeTemplateService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.message.service; - -import com.tianji.message.domain.dto.NoticeTemplateDTO; -import com.tianji.message.domain.dto.NoticeTemplateFormDTO; -import com.tianji.message.domain.query.NoticeTemplatePageQuery; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.message.domain.po.NoticeTemplate; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 通知模板 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -public interface INoticeTemplateService extends IService { - - Long saveNoticeTemplate(NoticeTemplateFormDTO noticeTemplateFormDTO); - - void updateNoticeTemplate(NoticeTemplateFormDTO noticeTemplateFormDTO); - - PageDTO queryNoticeTemplates(NoticeTemplatePageQuery pageQuery); - - NoticeTemplateDTO queryNoticeTemplate(Long id); - - NoticeTemplate queryByCode(String code); -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IPublicNoticeService.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IPublicNoticeService.java deleted file mode 100644 index ef8dd51..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IPublicNoticeService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.message.service; - -import com.tianji.message.domain.po.NoticeTemplate; -import com.tianji.message.domain.po.PublicNotice; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 公告消息模板 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -public interface IPublicNoticeService extends IService { - - void saveNoticeOfTemplate(NoticeTemplate noticeTemplate); -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/ISmsService.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/ISmsService.java deleted file mode 100644 index 4387d18..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/ISmsService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.message.service; - -import com.tianji.api.dto.sms.SmsInfoDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.message.domain.po.NoticeTemplate; - -import java.util.List; - -public interface ISmsService { - void sendMessageByTemplate(NoticeTemplate noticeTemplate, List users); - - void sendMessage(SmsInfoDTO smsInfoDTO); - - void sendMessageAsync(SmsInfoDTO smsInfoDTO); -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/ISmsThirdPlatformService.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/ISmsThirdPlatformService.java deleted file mode 100644 index a3ff8f7..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/ISmsThirdPlatformService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.message.service; - -import com.tianji.message.domain.dto.SmsThirdPlatformDTO; -import com.tianji.message.domain.dto.SmsThirdPlatformFormDTO; -import com.tianji.message.domain.query.SmsThirdPlatformPageQuery; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.message.domain.po.SmsThirdPlatform; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; - -/** - *

- * 第三方云通讯平台 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -public interface ISmsThirdPlatformService extends IService { - - List queryAllPlatform(); - - Long saveSmsThirdPlatform(SmsThirdPlatformFormDTO thirdPlatformDTO); - - void updateSmsThirdPlatform(SmsThirdPlatformFormDTO thirdPlatformDTO); - - PageDTO querySmsThirdPlatforms(SmsThirdPlatformPageQuery query); - - SmsThirdPlatformDTO querySmsThirdPlatform(Long id); -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IUserInboxService.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IUserInboxService.java deleted file mode 100644 index e82957d..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/IUserInboxService.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.message.service; - -import com.tianji.message.domain.dto.UserInboxDTO; -import com.tianji.message.domain.dto.UserInboxFormDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.message.domain.query.UserInboxQuery; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.message.domain.po.NoticeTemplate; -import com.tianji.message.domain.po.UserInbox; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; - -/** - *

- * 用户通知记录 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -public interface IUserInboxService extends IService { - - void saveNoticeToInbox(NoticeTemplate noticeTemplate, List users); - - PageDTO queryUserInBoxesPage(UserInboxQuery query); - - Long sentMessageToUser(UserInboxFormDTO userInboxFormDTO); -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/MessageTemplateServiceImpl.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/MessageTemplateServiceImpl.java deleted file mode 100644 index c1ed42b..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/MessageTemplateServiceImpl.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.tianji.message.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.message.domain.dto.MessageTemplateDTO; -import com.tianji.message.domain.dto.MessageTemplateFormDTO; -import com.tianji.message.domain.query.MessageTemplatePageQuery; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.message.domain.po.MessageTemplate; -import com.tianji.message.mapper.MessageTemplateMapper; -import com.tianji.message.service.IMessageTemplateService; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - *

- * 第三方短信平台签名和模板信息 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Service -public class MessageTemplateServiceImpl extends ServiceImpl implements IMessageTemplateService { - - @Override - public List queryByNoticeTemplateId(Long templateId) { - return lambdaQuery() - .eq(MessageTemplate::getTemplateId, templateId) - .list(); - } - - @Override - public Long saveMessageTemplate(MessageTemplateFormDTO messageTemplateDTO) { - // 1.数据转换 - MessageTemplate messageTemplate = BeanUtils.copyBean(messageTemplateDTO, MessageTemplate.class); - // 2.新增 - save(messageTemplate); - return messageTemplate.getId(); - } - - @Override - public void updateMessageTemplate(MessageTemplateFormDTO messageTemplateDTO) { - // 1.数据转换 - MessageTemplate messageTemplate = BeanUtils.copyBean(messageTemplateDTO, MessageTemplate.class); - // 2.新增 - updateById(messageTemplate); - } - - @Override - public PageDTO queryMessageTemplates(MessageTemplatePageQuery query) { - // 1.分页条件 - Page page = query.toMpPage(); - // 2.过滤条件 - page = lambdaQuery() - .eq(query.getStatus() != null, MessageTemplate::getStatus, query.getStatus()) - .eq(query.getThirdPlatformId() != null, MessageTemplate::getPlatformCode, query.getThirdPlatformId()) - .like(StringUtils.isNotBlank(query.getKeyword()), MessageTemplate::getName, query.getKeyword()) - .page(page); - // 3.数据转换 - return PageDTO.of(page, MessageTemplateDTO.class); - } - - @Override - public MessageTemplateDTO queryMessageTemplate(Long id) { - return BeanUtils.copyBean( getById(id), MessageTemplateDTO.class); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/NoticeTaskServiceImpl.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/NoticeTaskServiceImpl.java deleted file mode 100644 index 9fae8db..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/NoticeTaskServiceImpl.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.tianji.message.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.MarkedRunnable; -import com.tianji.common.utils.StringUtils; -import com.tianji.message.constants.MessageErrorInfo; -import com.tianji.message.domain.dto.NoticeTaskDTO; -import com.tianji.message.domain.dto.NoticeTaskFormDTO; -import com.tianji.message.domain.po.NoticeTask; -import com.tianji.message.domain.po.NoticeTemplate; -import com.tianji.message.domain.query.NoticeTaskPageQuery; -import com.tianji.message.enums.TemplateStatus; -import com.tianji.message.mapper.NoticeTaskMapper; -import com.tianji.message.service.*; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.concurrent.Executor; - -/** - *

- * 系统通告的任务表,可以延期或定期发送通告 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class NoticeTaskServiceImpl extends ServiceImpl implements INoticeTaskService { - - private final Executor asyncNoticeExecutor; - private final INoticeTemplateService noticeTemplateService; - private final UserClient userClient; - private final IPublicNoticeService publicNoticeService; - private final IUserInboxService inboxService; - private final ISmsService smsService; - - @Override - public Long saveNoticeTask(NoticeTaskFormDTO noticeTaskFormDTO) { - // 1.保存任务 - NoticeTask noticeTask = BeanUtils.copyBean(noticeTaskFormDTO, NoticeTask.class); - save(noticeTask); - Long taskId = noticeTask.getId(); - // 2.判断是否有执行时间 - LocalDateTime pushTime = noticeTask.getPushTime(); - if(pushTime == null || pushTime.isBefore(LocalDateTime.now())){ - // 没有执行时间,或者执行时间小于当前时间,立刻执行任务 - asyncNoticeExecutor.execute(new MarkedRunnable(() -> handleTask(noticeTask))); - } - return taskId; - } - - @Override - @Transactional - public void handleTask(NoticeTask task) { - // 1.获取任务要发送的通知模板 - Long templateId = task.getTemplateId(); - NoticeTemplate noticeTemplate = noticeTemplateService.getById(templateId); - if(noticeTemplate == null){ - // 模板不存在或者无法使用 - log.error("通知任务无法执行,模板id【{}】,原因:{}", templateId, MessageErrorInfo.NOTICE_TEMPLATE_NOT_EXISTS); - return; - } - if(noticeTemplate.getStatus() != TemplateStatus.IN_SERVICE.getValue()){ - // 模板不存在或者无法使用 - log.error("通知任务无法执行,模板id【{}】,原因:{}", templateId, MessageErrorInfo.NOTICE_TEMPLATE_CANNOT_USE); - return; - } - // 2.获取通知对应的目标用户 - List users = null; - if (task.getPartial()) { - // 针对部分用户,需要查询用户信息 - List userIds = getBaseMapper().queryTaskTargetByTaskId(task.getId()); - if(CollUtils.isNotEmpty(userIds)){ - users = userClient.queryUserByIds(userIds); - } - } - - // 3.判断是全部用户还是部分 - if (CollUtils.isEmpty(users)) { - // 3.1.全部用户,直接存入公告箱,用户查看消息时才拉取(pull mode) - publicNoticeService.saveNoticeOfTemplate(noticeTemplate); - }else{ - // 3.2.部分用户,需要写入用户信箱 - inboxService.saveNoticeToInbox(noticeTemplate, users); - // 3.3.判断是否需要发短信通知 - if(noticeTemplate.getIsSmsTemplate()){ - // 需要发送短信通知 - smsService.sendMessageByTemplate(noticeTemplate, users); - } - } - // 4.到这里说明任务完成,更新任务状态 - boolean shouldRepeat = task.getMaxTimes() > 0; - lambdaUpdate() - .set(!shouldRepeat, NoticeTask::getFinished, true) - .set(shouldRepeat, NoticeTask::getPushTime, task.getPushTime().plusMinutes(task.getInterval())) - .setSql(shouldRepeat, "max_times = max_times - 1") - .eq(NoticeTask::getId, task.getId()) - .update(); - task = null; - } - - @Override - public void updateNoticeTask(NoticeTaskFormDTO noticeTaskFormDTO) { - NoticeTask noticeTask = BeanUtils.copyBean(noticeTaskFormDTO, NoticeTask.class); - updateById(noticeTask); - } - - @Override - public PageDTO queryNoticeTasks(NoticeTaskPageQuery query) { - // 1.分页条件 - Page page = query.toMpPage(); - // 2.过滤条件 - page = lambdaQuery() - .eq(query.getFinished() != null, NoticeTask::getFinished, query.getFinished()) - .like(StringUtils.isNotBlank(query.getKeyword()), NoticeTask::getName, query.getKeyword()) - .ge(query.getMinPushTime() != null, NoticeTask::getPushTime, query.getMinPushTime()) - .le(query.getMaxPushTime() != null, NoticeTask::getPushTime, query.getMaxPushTime()) - .page(page); - // 3.数据转换 - return PageDTO.of(page, NoticeTaskDTO.class); - } - - @Override - public NoticeTaskDTO queryNoticeTask(Long id) { - return BeanUtils.copyBean(getById(id), NoticeTaskDTO.class); - } - - @Override - public PageDTO queryTodoNoticeTaskByPage(int pageNo, int size) { - // 1.分页查询待发布任务:未完成,发布时间早于当前时间 - Page page = lambdaQuery() - .eq(NoticeTask::getFinished, false) - .le(NoticeTask::getPushTime, LocalDateTime.now()) - .page(new Page<>(pageNo, size)); - return PageDTO.of(page); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/NoticeTemplateServiceImpl.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/NoticeTemplateServiceImpl.java deleted file mode 100644 index 6452300..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/NoticeTemplateServiceImpl.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.tianji.message.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.message.constants.MessageErrorInfo; -import com.tianji.message.domain.dto.MessageTemplateFormDTO; -import com.tianji.message.domain.dto.NoticeTemplateDTO; -import com.tianji.message.domain.dto.NoticeTemplateFormDTO; -import com.tianji.message.domain.po.MessageTemplate; -import com.tianji.message.domain.po.NoticeTemplate; -import com.tianji.message.domain.query.NoticeTemplatePageQuery; -import com.tianji.message.enums.TemplateStatus; -import com.tianji.message.mapper.NoticeTemplateMapper; -import com.tianji.message.service.IMessageTemplateService; -import com.tianji.message.service.INoticeTemplateService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - *

- * 通知模板 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Service -@RequiredArgsConstructor -public class NoticeTemplateServiceImpl extends ServiceImpl implements INoticeTemplateService { - - private final IMessageTemplateService messageTemplateService; - - @Override - @Transactional - public Long saveNoticeTemplate(NoticeTemplateFormDTO noticeTemplateFormDTO) { - // 1.保存通知模板 - NoticeTemplate noticeTemplate = BeanUtils.copyBean(noticeTemplateFormDTO, NoticeTemplate.class); - save(noticeTemplate); - Long id = noticeTemplate.getId(); - // 2.判断是否有短信模板 - if(!noticeTemplate.getIsSmsTemplate()){ - return id; - } - // 3.保存短信模板 - List messageTemplateDTOs = noticeTemplateFormDTO.getMessageTemplates(); - List messageTemplates = new ArrayList<>(); - for (MessageTemplateFormDTO dto : messageTemplateDTOs) { - MessageTemplate template = BeanUtils.copyBean(dto, MessageTemplate.class); - template.setTemplateId(id); - template.setName(noticeTemplate.getName()); - template.setContent(noticeTemplate.getContent()); - messageTemplates.add(template); - } - messageTemplateService.saveBatch(messageTemplates); - return id; - } - - @Override - @Transactional - public void updateNoticeTemplate(NoticeTemplateFormDTO noticeTemplateDTO) { - // 1.查询旧数据 - Long id = noticeTemplateDTO.getId(); - NoticeTemplate oldNT = getById(id); - if (oldNT == null) { - throw new BadRequestException(MessageErrorInfo.NOTICE_TEMPLATE_NOT_EXISTS); - } - // 2.首先更新通知模板数据 - NoticeTemplate noticeTemplate = BeanUtils.copyBean(noticeTemplateDTO, NoticeTemplate.class); - updateById(noticeTemplate); - // 3.是否需要删除短信模板 - List deleteMessageTemplates = noticeTemplateDTO.getDeleteMessageTemplates(); - if(CollUtils.isNotEmpty(deleteMessageTemplates)){ - messageTemplateService.removeByIds(deleteMessageTemplates); - } - // 4.是否有 新增或修改的短信模板 - List templateDTOS = noticeTemplateDTO.getMessageTemplates(); - if(CollUtils.isEmpty(templateDTOS)){ - return; - } - // 5.数据处理 - List saveList = new ArrayList<>(); - List updateList = new ArrayList<>(); - // 5.1.先查询当前通知模板有哪些平台的短信模板 - List list = messageTemplateService.queryByNoticeTemplateId(id); - Map mtMap = null; - if(CollUtils.isNotEmpty(list)){ - mtMap = list.stream().collect(Collectors.toMap(MessageTemplate::getPlatformCode, MessageTemplate::getId)); - } - // 5.2.判断是新增还是修改短信模板 - noticeTemplate = getById(id); - for (MessageTemplateFormDTO dto : templateDTOS) { - MessageTemplate template = BeanUtils.copyBean(dto, MessageTemplate.class); - template.setTemplateId(id); - template.setName(noticeTemplate.getName()); - template.setContent(noticeTemplate.getContent()); - if(template.getId() == null){ - // 判断当前短信模板是否已经存在 - if(mtMap != null && mtMap.containsKey(template.getPlatformCode())){ - // 若已经存在,则改为更新 - template.setId(mtMap.get(template.getPlatformCode())); - updateList.add(template); - }else { - // 不存在则新增 - saveList.add(template); - } - }else{ - updateList.add(template); - } - } - // 5.3.新增短信模板 - if(CollUtils.isNotEmpty(saveList)) { - messageTemplateService.saveBatch(saveList); - } - // 5.4.更新短信模板 - if(CollUtils.isNotEmpty(updateList)) { - messageTemplateService.updateBatchById(updateList); - } - } - - @Override - public PageDTO queryNoticeTemplates(NoticeTemplatePageQuery query) { - // 1.分页条件 - Page page = query.toMpPage(); - // 2.过滤条件 - page = lambdaQuery() - .eq(query.getStatus() != null, NoticeTemplate::getStatus, query.getStatus()) - .like(StringUtils.isNotBlank(query.getKeyword()), NoticeTemplate::getName, query.getKeyword()) - .page(page); - // 3.数据转换 - return PageDTO.of(page, NoticeTemplateDTO.class); - } - - @Override - public NoticeTemplateDTO queryNoticeTemplate(Long id) { - return BeanUtils.copyBean( getById(id), NoticeTemplateDTO.class); - } - - @Override - public NoticeTemplate queryByCode(String code) { - return lambdaQuery() - .eq(NoticeTemplate::getCode, code) - .eq(NoticeTemplate::getStatus, TemplateStatus.IN_SERVICE.getValue()) - .one(); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/PublicNoticeServiceImpl.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/PublicNoticeServiceImpl.java deleted file mode 100644 index 11c95ca..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/PublicNoticeServiceImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.message.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.message.config.MessageProperties; -import com.tianji.message.domain.po.NoticeTemplate; -import com.tianji.message.domain.po.PublicNotice; -import com.tianji.message.mapper.PublicNoticeMapper; -import com.tianji.message.service.IPublicNoticeService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; - -/** - *

- * 公告消息模板 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Service -@RequiredArgsConstructor -public class PublicNoticeServiceImpl extends ServiceImpl implements IPublicNoticeService { - - private final MessageProperties messageProperties; - @Override - public void saveNoticeOfTemplate(NoticeTemplate noticeTemplate) { - LocalDateTime now = LocalDateTime.now(); - PublicNotice notice = new PublicNotice(); - notice.setTitle(noticeTemplate.getTitle()); - notice.setContent(noticeTemplate.getContent()); - notice.setPushTime(now); - notice.setType(noticeTemplate.getType()); - notice.setExpireTime(now.plusMonths(messageProperties.getNoticeTtlMonths())); - save(notice); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/SmsServiceImpl.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/SmsServiceImpl.java deleted file mode 100644 index d0faba9..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/SmsServiceImpl.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.tianji.message.service.impl; - -import com.tianji.api.dto.sms.SmsInfoDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.utils.AssertUtils; -import com.tianji.common.utils.MarkedRunnable; -import com.tianji.message.constants.MessageErrorInfo; -import com.tianji.message.domain.po.MessageTemplate; -import com.tianji.message.domain.po.NoticeTemplate; -import com.tianji.message.domain.po.SmsThirdPlatform; -import com.tianji.message.service.IMessageTemplateService; -import com.tianji.message.service.INoticeTemplateService; -import com.tianji.message.service.ISmsService; -import com.tianji.message.service.ISmsThirdPlatformService; -import com.tianji.message.thirdparty.ISmsHandler; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.Executor; -import java.util.stream.Collectors; - -@Slf4j -@Service -@RequiredArgsConstructor -public class SmsServiceImpl implements ISmsService { - - @Resource - private Map smsHandlers; - private final Executor asyncSmsExecutor; - private final ISmsThirdPlatformService platformService; - private final INoticeTemplateService noticeTemplateService; - private final IMessageTemplateService messageTemplateService; - - @Override - public void sendMessageByTemplate(NoticeTemplate noticeTemplate, List users) { - // 1.获取用户手机号 - Set phones = users.stream().map(UserDTO::getCellPhone).collect(Collectors.toSet()); - // 2.组织数据,公告默认是无参的 - SmsInfoDTO info = new SmsInfoDTO(); - info.setPhones(phones); - info.setTemplateCode(noticeTemplate.getCode()); - // 3.发送 - sendMessage(info); - } - - @Override - public void sendMessage(SmsInfoDTO smsInfoDTO) { - // 1.获取通知模板信息 - String code = smsInfoDTO.getTemplateCode(); - NoticeTemplate noticeTemplate = noticeTemplateService.queryByCode(code); - AssertUtils.isNotNull(noticeTemplate, MessageErrorInfo.NOTICE_TEMPLATE_NOT_EXISTS); - AssertUtils.isTrue(noticeTemplate.getIsSmsTemplate(), MessageErrorInfo.NOTICE_NOT_MESSAGE_TEMPLATE); - // 2.查询短信模板 - List messageTemplates = messageTemplateService.queryByNoticeTemplateId(noticeTemplate.getId()); - AssertUtils.isNotEmpty(messageTemplates, MessageErrorInfo.NOTICE_NOT_MESSAGE_TEMPLATE); - - // 3.按照平台优先级来排序并筛选模板 - List sortedTemplates = sortMessageTemplate(messageTemplates); - if (sortedTemplates.isEmpty()) { - throw new CommonException(MessageErrorInfo.NO_SUITABLE_TEMPLATE); - } - // 4.基于模板发送短信 - for (MessageTemplate template : sortedTemplates) { - try { - ISmsHandler smsHandler = smsHandlers.get(template.getPlatformCode()); - smsHandler.send(smsInfoDTO, template); - return; - } catch (Exception e) { - log.error("短信发送异常,平台{}, 原因{}, 稍后重试", template.getPlatformCode(), e.getMessage(), e); - } - } - log.error("短信发送失败,所有平台都已尝试,放弃发送"); - } - - private List sortMessageTemplate(List messageTemplates) { - // 1.查询平台集合,按照优先级排序 - List platforms = platformService.queryAllPlatform(); - AssertUtils.isNotEmpty(platforms, MessageErrorInfo.PLATFORM_IS_EMPTY); - // 2.以平台code为key,以template为value,组织map - Map mtMap = messageTemplates.stream() - .collect(Collectors.toMap(MessageTemplate::getPlatformCode, m -> m)); - // 3.排序数据 - List list = new ArrayList<>(messageTemplates.size()); - for (SmsThirdPlatform platform : platforms) { - MessageTemplate mt = mtMap.get(platform.getCode()); - if (mt != null) { - list.add(mt); - } - } - return list; - } - - @Override - public void sendMessageAsync(SmsInfoDTO smsInfoDTO) { - asyncSmsExecutor.execute( - new MarkedRunnable(() -> this.sendMessage(smsInfoDTO)) - ); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/SmsThirdPlatformServiceImpl.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/SmsThirdPlatformServiceImpl.java deleted file mode 100644 index 69a283e..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/SmsThirdPlatformServiceImpl.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.tianji.message.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.github.benmanes.caffeine.cache.Cache; -import com.tianji.message.domain.dto.SmsThirdPlatformDTO; -import com.tianji.message.domain.dto.SmsThirdPlatformFormDTO; -import com.tianji.message.domain.query.SmsThirdPlatformPageQuery; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.message.domain.po.SmsThirdPlatform; -import com.tianji.message.mapper.SmsThirdPlatformMapper; -import com.tianji.message.service.ISmsThirdPlatformService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - -/** - *

- * 第三方云通讯平台 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Service -public class SmsThirdPlatformServiceImpl extends ServiceImpl implements ISmsThirdPlatformService { - - @Resource - private Cache> platformCache; - - @Override - public List queryAllPlatform(){ - return platformCache.get("PLATFORM", key -> lambdaQuery().orderByAsc(SmsThirdPlatform::getPriority).list()); - } - - @Override - public Long saveSmsThirdPlatform(SmsThirdPlatformFormDTO thirdPlatformDTO) { - SmsThirdPlatform thirdPlatform = BeanUtils.copyBean(thirdPlatformDTO, SmsThirdPlatform.class); - save(thirdPlatform); - return thirdPlatform.getId(); - } - - @Override - public void updateSmsThirdPlatform(SmsThirdPlatformFormDTO thirdPlatformDTO) { - updateById(BeanUtils.copyBean(thirdPlatformDTO, SmsThirdPlatform.class)); - } - - @Override - public PageDTO querySmsThirdPlatforms(SmsThirdPlatformPageQuery query) { - // 1.分页条件 - Page page = query.toMpPage(); - // 2.过滤条件 - page = lambdaQuery() - .eq(query.getStatus() != null, SmsThirdPlatform::getStatus, query.getStatus()) - .like(StringUtils.isNotBlank(query.getKeyword()), SmsThirdPlatform::getName, query.getKeyword()) - .page(page); - // 3.数据转换 - return PageDTO.of(page, SmsThirdPlatformDTO.class); - } - - @Override - public SmsThirdPlatformDTO querySmsThirdPlatform(Long id) { - return BeanUtils.copyProperties(getById(id), SmsThirdPlatformDTO.class); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/UserInboxServiceImpl.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/UserInboxServiceImpl.java deleted file mode 100644 index dca6b0b..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/service/impl/UserInboxServiceImpl.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.tianji.message.service.impl; - -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.message.config.MessageProperties; -import com.tianji.message.domain.dto.UserInboxDTO; -import com.tianji.message.domain.dto.UserInboxFormDTO; -import com.tianji.message.domain.po.NoticeTemplate; -import com.tianji.message.domain.po.PublicNotice; -import com.tianji.message.domain.po.UserInbox; -import com.tianji.message.domain.query.UserInboxQuery; -import com.tianji.message.enums.NoticeType; -import com.tianji.message.mapper.UserInboxMapper; -import com.tianji.message.service.IPublicNoticeService; -import com.tianji.message.service.IUserInboxService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -/** - *

- * 用户通知记录 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-19 - */ -@Service -@RequiredArgsConstructor -public class UserInboxServiceImpl extends ServiceImpl implements IUserInboxService { - - private final MessageProperties properties; - private final IPublicNoticeService publicNoticeService; - - @Override - public void saveNoticeToInbox(NoticeTemplate notice, List users) { - LocalDateTime pushTime = LocalDateTime.now(); - LocalDateTime expireTime = pushTime.plusMonths(properties.getMessageTtlMonths()); - // 1.初始化信箱数据 - List list = new ArrayList<>(users.size()); - // 2.组装 - for (UserDTO user : users) { - UserInbox box = new UserInbox(); - box.setTitle(notice.getTitle()); - box.setContent(notice.getContent()); - box.setUserId(user.getId()); - box.setType(notice.getType()); - box.setPushTime(pushTime); - box.setExpireTime(expireTime); - list.add(box); - } - // 3.保存 - saveBatch(list); - } - - @Override - @Transactional - public PageDTO queryUserInBoxesPage(UserInboxQuery query) { - // 1.获取用户信息 - Long userId = UserContext.getUser(); - // 2.查询用户信箱中的最后一条公告,确认本次加载公告的最早时间点 - UserInbox latest = getBaseMapper().queryLatestPublicNotice(userId); - // 2.1.默认时间点是当前时间减去公告的最大有效期时间(未过期的最早公告时间) - LocalDateTime now = LocalDateTime.now(); - LocalDateTime minTime = now.minusMonths(properties.getNoticeTtlMonths()); - // 2.2.如果有最后一条公告,判断公告时间是不是比最早时间要晚 - if(latest != null && latest.getPushTime().isAfter(minTime)){ - // 用户上次加载时间比最早时间晚,更新一下时间 - minTime = latest.getPushTime(); - } - // 3.按照发布时间倒序,查看公告箱中的消息,最多加载200条 - Page page = new Page(1, 200) - .addOrder(new OrderItem("push_time", false)); - page = publicNoticeService.lambdaQuery() - .ge(PublicNotice::getPushTime, minTime) - .page(page); - // 4.将公告写入用户收件箱 - if (CollUtils.isNotEmpty(page.getRecords())) { - saveNoticeListToInbox(page.getRecords(), userId); - } - // 5.分页查询收件箱信息并返回 - Page userInboxPage = query.toMpPage("push_time", false); - userInboxPage = lambdaQuery() - .eq(UserInbox::getUserId, userId) - .eq(query.getIsRead() != null, UserInbox::getIsRead, query.getIsRead()) - .eq(query.getType() != null, UserInbox::getType, query.getType()) - .page(userInboxPage); - return PageDTO.of(userInboxPage, UserInboxDTO.class); - } - - private void saveNoticeListToInbox(List notices, Long userId) { - List list = new ArrayList<>(notices.size()); - for (PublicNotice notice : notices) { - UserInbox box = new UserInbox(); - box.setTitle(notice.getTitle()); - box.setContent(notice.getContent()); - box.setUserId(userId); - box.setType(notice.getType()); - box.setPushTime(notice.getPushTime()); - box.setExpireTime(notice.getExpireTime()); - list.add(box); - } - saveBatch(list); - } - - @Override - public Long sentMessageToUser(UserInboxFormDTO userInboxFormDTO) { - // 1.计算时间 - LocalDateTime pushTime = LocalDateTime.now(); - LocalDateTime expireTime = pushTime.plusMonths(properties.getMessageTtlMonths()); - // 2.获取当前用户 - Long userId = UserContext.getUser(); - // 3.组织数据 - UserInbox inbox = new UserInbox(); - inbox.setUserId(userInboxFormDTO.getUserId()); - inbox.setContent(userInboxFormDTO.getContent()); - inbox.setType(NoticeType.PRIVATE_MESSAGE.getValue()); - inbox.setPushTime(pushTime); - inbox.setExpireTime(expireTime); - inbox.setPublisher(userId); - save(inbox); - return inbox.getId(); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ISmsHandler.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ISmsHandler.java deleted file mode 100644 index 507b2fd..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ISmsHandler.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.message.thirdparty; - -import com.tianji.api.dto.sms.SmsInfoDTO; -import com.tianji.message.domain.po.MessageTemplate; - -/** - * 第三方接口对接平台 - */ -public interface ISmsHandler { - - /** - * 发送短信 - */ - void send(SmsInfoDTO platformSmsInfoDTO, MessageTemplate template); - - -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliProperties.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliProperties.java deleted file mode 100644 index 90e8c12..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliProperties.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.tianji.message.thirdparty.ali; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@Data -@ConfigurationProperties(prefix = "tj.sms.ali") -public class AliProperties { - private String accessId; - private String accessSecret; -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliSmsConfig.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliSmsConfig.java deleted file mode 100644 index 40cc742..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliSmsConfig.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.message.thirdparty.ali; - -import com.aliyun.auth.credentials.Credential; -import com.aliyun.auth.credentials.provider.StaticCredentialProvider; -import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient; -import darabonba.core.client.ClientOverrideConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableConfigurationProperties(AliProperties.class) -public class AliSmsConfig { - @Bean - public AsyncClient asyncClient(AliProperties prop){ - // 1.访问凭证 - StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder() - .accessKeyId(prop.getAccessId()) - .accessKeySecret(prop.getAccessSecret()) - .build()); - // 2.创建客户端 - return AsyncClient.builder() - .region("cn-shanghai") // Region ID - .credentialsProvider(provider) - .overrideConfiguration( - ClientOverrideConfiguration.create() - .setEndpointOverride("dysmsapi.aliyuncs.com") - ) - .build(); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliSmsHandler.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliSmsHandler.java deleted file mode 100644 index 5aea182..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/ali/AliSmsHandler.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.tianji.message.thirdparty.ali; - -import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient; -import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest; -import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse; -import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponseBody; -import com.tianji.api.dto.sms.SmsInfoDTO; -import com.tianji.common.utils.JsonUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.message.domain.po.MessageTemplate; -import com.tianji.message.thirdparty.ISmsHandler; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.concurrent.CompletableFuture; - -@Service("aliYun") -@Slf4j -@RequiredArgsConstructor -public class AliSmsHandler implements ISmsHandler { - - private final AsyncClient asyncClient; - - @Override - public void send(SmsInfoDTO platformSmsInfoDTO, MessageTemplate template) { - log.info("aliYun平台,准备发送短信:{}", platformSmsInfoDTO); - // 1.准备请求参数 - String phones = StringUtils.join(",", platformSmsInfoDTO.getPhones()); - SendSmsRequest request = SendSmsRequest.builder() - .phoneNumbers(phones) - .templateCode(template.getThirdTemplateCode()) - .signName(template.getSignName()) - .templateParam(JsonUtils.toJsonStr(platformSmsInfoDTO.getTemplateParams())) - .build(); - // 2.发送短信验证码 - CompletableFuture responseFuture = asyncClient.sendSms(request); - log.info("aliYun平台,短信发送请求发出 ..."); - // 3.结果处理 - responseFuture.thenAccept(response -> { - SendSmsResponseBody body = response.getBody(); - String code = body.getCode(); - if("OK".equals(code)){ - log.debug("aliYun短信发送成功,手机号:{}", phones); - }else{ - log.error("aliYun短信发送失败,code:{}, 原因:{}", code, body.getMessage()); - } - }); - responseFuture.exceptionally(e -> { - log.error("aliYun短信发送异常", e); - return null; - }); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/tencent/TencentSmsHandler.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/tencent/TencentSmsHandler.java deleted file mode 100644 index 038eec1..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/tencent/TencentSmsHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.message.thirdparty.tencent; - -import com.tianji.api.dto.sms.SmsInfoDTO; -import com.tianji.message.domain.po.MessageTemplate; -import com.tianji.message.thirdparty.ISmsHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@Service("tencent") -@Slf4j -public class TencentSmsHandler implements ISmsHandler { - @Override - public void send(SmsInfoDTO platformSmsInfoDTO, MessageTemplate template) { - //第三方发送短信验证码 - log.info("tencent平台,短信发送成功 ..."); - log.info("platformSmsInfoDTO:{}", platformSmsInfoDTO); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/uc/UcSmsHandler.java b/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/uc/UcSmsHandler.java deleted file mode 100644 index fded981..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/java/com/tianji/message/thirdparty/uc/UcSmsHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.message.thirdparty.uc; - -import com.tianji.api.dto.sms.SmsInfoDTO; -import com.tianji.message.domain.po.MessageTemplate; -import com.tianji.message.thirdparty.ISmsHandler; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -/** - * uCloud平台短信发送功能 - */ -@Service("uCloud") -@Slf4j -public class UcSmsHandler implements ISmsHandler { - @Override - public void send(SmsInfoDTO platformSmsInfoDTO, MessageTemplate template) { - //第三方发送短信验证码 - log.info("短信发送成功 ..."); - log.info("platformSmsInfoDTO:{}", platformSmsInfoDTO); - } -} diff --git a/tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap-local.yml b/tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap.yml b/tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap.yml deleted file mode 100644 index b9753c1..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,53 +0,0 @@ -server: - port: 8085 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: message-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - data-id: shared-spring.yaml # 共享spring配置 - refresh: false - - data-id: shared-redis.yaml # 共享redis配置 - refresh: false - - data-id: shared-mybatis.yaml # 共享mybatis配置 - refresh: false - - data-id: shared-logs.yaml # 共享日志配置 - refresh: false - - data-id: shared-feign.yaml # 共享feign配置 - refresh: false - - data-id: shared-mq.yaml # 共享mq配置 - refresh: false -tj: - swagger: - enable: true - enableResponseWrap: true - package-path: com.tianji.message.controller - title: 智汇云课堂 - 消息中心接口文档 - description: 该服务用于站内信、通知管理、短信发送等功能 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - auth: - resource: - enable: true - excludeLoginPaths: - - /students/register - - /users/detail/{isStaff} - - /users/list - - GET:/users/{id} - - /users/{id}/type - - /users/ids - jdbc: - database: tj_message - sms: - ali: - accessId: LTAI5tHyKqhaN6k3u2jVeiX6 - accessSecret: aEQn9qWGLzZPFHcnfHALS474VeiTSY diff --git a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/IExamService.xml b/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/IExamService.xml deleted file mode 100644 index 15a7010..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/IExamService.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/ISmsHandler.xml b/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/ISmsHandler.xml deleted file mode 100644 index c809cdc..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/ISmsHandler.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/NoticeTaskMapper.xml b/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/NoticeTaskMapper.xml deleted file mode 100644 index 9527a84..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/NoticeTaskMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/NoticeTemplateMapper.xml b/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/NoticeTemplateMapper.xml deleted file mode 100644 index 1bb8902..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/NoticeTemplateMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/PublicNoticeMapper.xml b/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/PublicNoticeMapper.xml deleted file mode 100644 index ff18968..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/PublicNoticeMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/SmsThirdPlatformMapper.xml b/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/SmsThirdPlatformMapper.xml deleted file mode 100644 index 3cf1861..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/SmsThirdPlatformMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/TemplateMapper.xml b/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/TemplateMapper.xml deleted file mode 100644 index 76c032d..0000000 --- a/tianji-master/tj-message/tj-message-service/src/main/resources/mapper/TemplateMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-message/tj-message-service/src/test/java/com/tianji/message/thirdparty/ISmsHandlerTest.java b/tianji-master/tj-message/tj-message-service/src/test/java/com/tianji/message/thirdparty/ISmsHandlerTest.java deleted file mode 100644 index 4735cbe..0000000 --- a/tianji-master/tj-message/tj-message-service/src/test/java/com/tianji/message/thirdparty/ISmsHandlerTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.message.thirdparty; - -import com.tianji.api.dto.sms.SmsInfoDTO; -import com.tianji.message.domain.enums.SmsTemplate; -import com.tianji.message.service.ISmsService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.HashMap; -import java.util.List; - -@SpringBootTest -class ISmsHandlerTest { - - @Autowired - private ISmsService smsService; - - @Test - void send() { - SmsInfoDTO dto = new SmsInfoDTO(); - dto.setPhones(List.of("13901517624", "15162153483")); - dto.setTemplateCode(SmsTemplate.VERIFY_CODE.name()); - HashMap params = new HashMap<>(1); - params.put("code", "518518"); - dto.setTemplateParams(params); - smsService.sendMessage(dto); - } -} \ No newline at end of file diff --git a/tianji-master/tj-pay/pom.xml b/tianji-master/tj-pay/pom.xml deleted file mode 100644 index 8ae05a5..0000000 --- a/tianji-master/tj-pay/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-pay - pom - - tj-pay-service - tj-pay-domain - tj-pay-api - - - - 11 - 11 - - - \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-api/pom.xml b/tianji-master/tj-pay/tj-pay-api/pom.xml deleted file mode 100644 index e996455..0000000 --- a/tianji-master/tj-pay/tj-pay-api/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - tj-pay - com.tianji - 1.0.0 - - 4.0.0 - - tj-pay-api - - - 11 - 11 - - - - - com.tianji - tj-pay-domain - 1.0.0 - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - io.github.openfeign - feign-httpclient - - - \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-api/src/main/java/com/tianji/pay/sdk/client/PayClient.java b/tianji-master/tj-pay/tj-pay-api/src/main/java/com/tianji/pay/sdk/client/PayClient.java deleted file mode 100644 index 0db24f1..0000000 --- a/tianji-master/tj-pay/tj-pay-api/src/main/java/com/tianji/pay/sdk/client/PayClient.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.tianji.pay.sdk.client; - -import com.tianji.pay.sdk.dto.*; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import java.util.List; - -@FeignClient("pay-service") -public interface PayClient { - /** - * 查询支付渠道 - * @return 支付渠道列表 - */ - @GetMapping("/pay-channels/list") - List listAllPayChannels(); - /** - * 扫码支付申请支付单,返回支付url地址,用于生产二维码 - * - * @param payApplyDTO 申请支付单的参数信息 - * @return 支付链接,需要前端生成二维码 - */ - @PostMapping("/pay-orders") - String applyPayOrder(@RequestBody PayApplyDTO payApplyDTO); - - /** - * 根据业务端订单id查询支付结果 - * - * @param bizOrderId 业务订单id - * @return 支付结果 - */ - @GetMapping("/pay-orders/{bizOrderId}/status") - PayResultDTO queryPayResult(@PathVariable("bizOrderId") Long bizOrderId); - - /** - * 申请退款接口 - * - * @param refundApplyDTO 退款参数 - * @return 退款结果 - */ - @PostMapping("/refund-orders") - RefundResultDTO applyRefund(@RequestBody RefundApplyDTO refundApplyDTO); - - /** - * 查询退款结果 - * - * @param bizRefundOrderId 要退款的订单id - * @return 退款结果 - */ - @GetMapping("/refund-orders/{bizRefundOrderId}/status") - RefundResultDTO queryRefundResult(@PathVariable("bizRefundOrderId") Long bizRefundOrderId); -} diff --git a/tianji-master/tj-pay/tj-pay-api/src/main/java/com/tianji/pay/sdk/config/PayApiImportConfiguration.java b/tianji-master/tj-pay/tj-pay-api/src/main/java/com/tianji/pay/sdk/config/PayApiImportConfiguration.java deleted file mode 100644 index 3c3518c..0000000 --- a/tianji-master/tj-pay/tj-pay-api/src/main/java/com/tianji/pay/sdk/config/PayApiImportConfiguration.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.tianji.pay.sdk.config; - - -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableFeignClients(basePackages = "com.tianji.pay.sdk.client") -public class PayApiImportConfiguration { - -} \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-api/src/main/resources/META-INF/spring.factories b/tianji-master/tj-pay/tj-pay-api/src/main/resources/META-INF/spring.factories deleted file mode 100644 index a6ae34e..0000000 --- a/tianji-master/tj-pay/tj-pay-api/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.tianji.pay.sdk.config.PayApiImportConfiguration \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-domain/pom.xml b/tianji-master/tj-pay/tj-pay-domain/pom.xml deleted file mode 100644 index 4f815e8..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - tj-pay - com.tianji - 1.0.0 - - 4.0.0 - - tj-pay-domain - - - - 11 - 11 - - - - io.swagger - swagger-annotations - 1.5.22 - compile - - - org.hibernate.validator - hibernate-validator - - - com.tianji - tj-common - 1.0.0 - - - \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayChannel.java b/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayChannel.java deleted file mode 100644 index 4fab851..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayChannel.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.pay.sdk.constants; - -import com.tianji.common.utils.StringUtils; -import lombok.Getter; - -@Getter -public enum PayChannel { - wxPay("微信支付"), - aliPay("支付宝支付"), - ; - - private final String desc; - - PayChannel(String desc) { - this.desc = desc; - } - - public static String desc(String value){ - if (StringUtils.isBlank(value)) { - return ""; - } - return PayChannel.valueOf(value).getDesc(); - } -} diff --git a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayConstants.java b/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayConstants.java deleted file mode 100644 index 875f2d4..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayConstants.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.pay.sdk.constants; - -public interface PayConstants { - String ALI_CHANNEL_CODE = "aliPay"; - String WX_CHANNEL_CODE = "wxPay"; - - /** - * redis key前缀 - */ - interface RedisKeyFormatter { - String PAY_APPLY = "pay:apply:bizOrderNo:#{payApplyDTO.bizOrderNo}"; - String PAY_NOTIFY = "pay:notify:payOrderNo:#{tradingOrderNo}"; - String PAY_ORDER_CHECK_TASK = "pay:notify:payOrderNo:#{payOrder.payOrderNo}"; - - String REFUND_APPLY = "pay:refund:bizOrderNo:#{refundApplyDTO.bizOrderNo}"; - - String PAY_GET_NOTIFY_LOCK = "PAY:GET_NOTIFY_ORDERS"; - String REFUND_NOTIFY = "REFUND:NOTIFY_#{refundOrder.id}"; - String REFUND_GET_NOFIGY_LOCK = "REFUND:GET_NOTIFY_ORDERS"; - String REFUND_QUERY_TASK = "PAY:QUERY_#{refundOrderId}"; - } -} diff --git a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayErrorInfo.java b/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayErrorInfo.java deleted file mode 100644 index dfbeeb1..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayErrorInfo.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.pay.sdk.constants; - -public interface PayErrorInfo { - String PAY_ORDER_ALREADY_PAY = "支付单已经支付"; - String PAY_ORDER_ALREADY_CLOSE = "支付单已经关闭"; - String PAY_ORDER_NOT_FOUND = "支付单不存在"; - - String PAY_ORDER_NOT_SUCCESS = "未支付订单无法退款"; - - String INVALID_PAY_CHANNEL = "支付渠道码无效"; - String INVALID_PAY_TYPE = "不支持的支付类型"; - - String CREATE_PAY_ORDER_FAILED = "创建支付单失败"; - - String INVALID_NOTIFY_PARAM = "无效的通知参数"; - - String REPEAT_REFUND_ORDER = "不能重复退款"; - String REFUND_FAILED = "退款已经失败"; - - String REFUND_ORDER_NOT_FOUND = "退款单不存在"; - - - int PAY_ORDER_ALREADY_PAY_CODE = 1000; - int PAY_ORDER_ALREADY_CLOSE_CODE = 2000; -} diff --git a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayType.java b/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayType.java deleted file mode 100644 index 0c41694..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/PayType.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.pay.sdk.constants; - -import com.tianji.common.enums.BaseEnum; -import lombok.Getter; - -@Getter -public enum PayType implements BaseEnum { - JSAPI(1, "网页支付JS"), - MINI_APP(2, "小程序支付"), - APP(3, "APP支付"), - NATIVE(4, "扫码支付"), - ; - private final int value; - private final String desc; - - PayType(int value, String desc) { - this.value = value; - this.desc = desc; - } -} diff --git a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/RefundChannelEnum.java b/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/RefundChannelEnum.java deleted file mode 100644 index 3e6e0ca..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/constants/RefundChannelEnum.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tianji.pay.sdk.constants; - -import com.tianji.common.utils.StringUtils; -import lombok.Getter; - -@Getter -public enum RefundChannelEnum { - COUPON("支付宝红包"), - ALIPAYACCOUNT("支付宝账户"), - POINT("集分宝"), - DISCOUNT("折扣券"), - PCARD("预付卡"), - MCARD("商家储值卡"), - MDISCOUNT("商户优惠券"), - MCOUPON("商户红包"), - PCREDIT("蚂蚁花呗"), - BANKCARD("银行卡"), - MONEYFUND("余额宝"), - VOUCHER("券"), - ORIGINAL("原路退款"), - BALANCE("退回到余额"), - OTHER_BALANCE("其他余额账户"), - OTHER_BANKCARD("其他银行卡"), - ; - private final String desc; - - RefundChannelEnum(String desc) { - this.desc = desc; - } - - public static String desc(String value){ - if(StringUtils.isBlank(value)){ - return ""; - } - return RefundChannelEnum.valueOf(value).getDesc(); - } -} diff --git a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayApplyDTO.java b/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayApplyDTO.java deleted file mode 100644 index 022711e..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayApplyDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.tianji.pay.sdk.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Builder; -import lombok.Data; - -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; - -@Data -@Builder -@ApiModel(description = "支付申请参数") -public class PayApplyDTO { - @ApiModelProperty("业务订单号") - @NotNull(message = "业务订单id不能为空") - private Long bizOrderNo; - @ApiModelProperty("下单用户id") - @NotNull(message = "下单用户id不能为空") - private Long bizUserId; - @Min(value = 1, message = "支付金额必须为正数") - @ApiModelProperty("支付金额,以分为单位") - private Integer amount; - @NotNull(message = "支付渠道编码不能为空") - @ApiModelProperty("支付渠道编码,例如:aliPay") - private String payChannelCode; - @ApiModelProperty("支付方式: 1-h5;2-小程序;3-公众号;4-扫码") - @NotNull(message = "支付方式不能为空") - private Integer payType; - @ApiModelProperty("订单中的商品信息") - @NotNull(message = "订单中的商品信息不能为空") - private String orderInfo; -} diff --git a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayChannelDTO.java b/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayChannelDTO.java deleted file mode 100644 index 10c1e41..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayChannelDTO.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tianji.pay.sdk.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; - -/** - *

- * 支付渠道vo对象 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@Data -@ApiModel(description = "支付渠道信息") -public class PayChannelDTO { - - @ApiModelProperty("支付渠道id") - private Long id; - @NotNull(message = "渠道名称不能为空") - @Length(min = 1, max = 50, message = "渠道名称过长") - @ApiModelProperty("支付渠道名称") - private String name; - @NotNull(message = "渠道编码不能为空") - @Pattern(regexp = "\\w{1,30}", message = "渠道编码格式错误") - @ApiModelProperty("支付渠道编码,唯一标示") - private String channelCode; - @NotNull(message = "渠道优先级不能为空") - @ApiModelProperty("渠道优先级,数字越小优先级越高") - private Integer channelPriority; - @NotNull(message = "渠道图标不能为空") - @Length(min = 1, max = 255, message = "渠道图标地址过长") - @ApiModelProperty("渠道图标") - private String channelIcon; - @ApiModelProperty("支付渠道状态,1:使用中,2:停用。新增时默认为1") - private Integer status; -} diff --git a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayResultDTO.java b/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayResultDTO.java deleted file mode 100644 index 746a14e..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/PayResultDTO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.pay.sdk.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@Builder -@ApiModel(description = "支付结果") -@AllArgsConstructor -public class PayResultDTO { - - public static final int PAYING = 1; - public static final int FAILED = 2; - public static final int SUCCESS = 3; - public static final String OK = "ok"; - - @ApiModelProperty("支付结果,1:支付中,2:支付失败,3:支付成功") - private final int status; - @ApiModelProperty("支付失败原因") - private final String msg; - @ApiModelProperty("业务订单号") - private final Long bizOrderId; - @ApiModelProperty("业务订单号") - private final Long payOrderNo; - @ApiModelProperty("支付渠道") - private final String payChannel; - @ApiModelProperty("支付成功时间") - private final LocalDateTime successTime; -} diff --git a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/RefundApplyDTO.java b/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/RefundApplyDTO.java deleted file mode 100644 index 2a9942c..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/RefundApplyDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.pay.sdk.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -@ApiModel(description = "退款请求参数") -public class RefundApplyDTO { - - @ApiModelProperty("支付时传入的业务订单id") - private Long bizOrderNo; - @ApiModelProperty("本次要退款的业务订单id,因为有拆单,这里是子订单id") - private Long bizRefundOrderNo; - @ApiModelProperty("子订单的退款金额,单位为分") - private Integer refundAmount; -} \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/RefundResultDTO.java b/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/RefundResultDTO.java deleted file mode 100644 index 3323d2e..0000000 --- a/tianji-master/tj-pay/tj-pay-domain/src/main/java/com/tianji/pay/sdk/dto/RefundResultDTO.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.tianji.pay.sdk.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -@Data -@ApiModel(description = "支付结果") -@AllArgsConstructor -@Builder -public class RefundResultDTO { - - public static final int RUNNING = 1; - public static final int FAILED = 2; - public static final int SUCCESS = 3; - public static final String OK = "ok"; - - @ApiModelProperty("退款状态,1:退款中,2:退款失败,3:退款成功") - private int status; - @ApiModelProperty("支付失败原因") - private String msg; - @ApiModelProperty("业务端支付订单号") - private Long bizPayOrderId; - @ApiModelProperty("业务端退款订单号") - private Long bizRefundOrderId; - @ApiModelProperty("支付流水交易单号") - private Long payOrderNo; - @ApiModelProperty("退款交易单号") - private Long refundOrderNo; - @ApiModelProperty("支付渠道") - private String payChannel; - @ApiModelProperty("退款渠道") - private String refundChannel; - - public static RefundResultDTOBuilder success() { - return builder().status(SUCCESS).msg(OK); - } - - public static RefundResultDTOBuilder running() { - return builder().status(RUNNING); - } - - public static RefundResultDTOBuilder failed() { - return builder().status(FAILED); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/pom.xml b/tianji-master/tj-pay/tj-pay-service/pom.xml deleted file mode 100644 index 75d04e4..0000000 --- a/tianji-master/tj-pay/tj-pay-service/pom.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - tj-pay - com.tianji - 1.0.0 - - 4.0.0 - - tj-pay-service - - - 11 - 11 - - - - - com.tianji - tj-pay-domain - 1.0.0 - - - com.tianji - tj-common - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-web - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-sentinel - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.redisson - redisson - - - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus.version} - - - mysql - mysql-connector-java - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - com.alipay.sdk - alipay-easysdk - 2.2.2 - - - - com.github.wechatpay-apiv3 - wechatpay-apache-httpclient - 0.4.8 - - - - org.springframework.boot - spring-boot-starter-amqp - - - - com.xuxueli - xxl-job-core - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - - - \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/PayApplication.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/PayApplication.java deleted file mode 100644 index 54d493d..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/PayApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.pay; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@MapperScan("com.tianji.pay.mapper") -@SpringBootApplication -@Slf4j -public class PayApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(PayApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - - } -} \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/constants/NotifyStatus.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/constants/NotifyStatus.java deleted file mode 100644 index 744ba49..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/constants/NotifyStatus.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.pay.constants; - -import com.tianji.common.enums.BaseEnum; -import lombok.Getter; - -@Getter -public enum NotifyStatus implements BaseEnum { - UN_CALL(0, "未开始回调"), - CALLING(1, "回调进行中"), - SUCCESS(2, "回调成功"), - FAILED(3, "所有回调都已失败"), - ; - private final int value; - private final String desc; - - NotifyStatus(int value, String desc) { - this.value = value; - this.desc = desc; - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/NotifyController.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/NotifyController.java deleted file mode 100644 index 08856c6..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/NotifyController.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.tianji.pay.controller; - -import com.tianji.common.utils.StringUtils; -import com.tianji.pay.sdk.constants.PayConstants; -import com.tianji.pay.service.INotifyService; -import com.wechat.pay.contrib.apache.httpclient.notification.NotificationRequest; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import springfox.documentation.annotations.ApiIgnore; - -import javax.servlet.http.HttpServletRequest; -import java.util.Map; -import java.util.stream.Collectors; - -@ApiIgnore -@RestController -@RequestMapping("notify") -@RequiredArgsConstructor -public class NotifyController { - - private final INotifyService notifyService; - /** - * 支付宝支付的回调接口 - * @param httpRequest 回调参数 - * @return 处理结果 - */ - @PostMapping(PayConstants.ALI_CHANNEL_CODE) - public ResponseEntity handleAliPayNotify(HttpServletRequest httpRequest){ - // 1.处理请求参数为一个Map - Map parameterMap = httpRequest.getParameterMap(); - Map request = parameterMap.entrySet().stream().collect( - Collectors.toMap(Map.Entry::getKey, e -> StringUtils.join(",", e.getValue()))); - // 2.处理通知 - notifyService.handleAliPayNotify(request); - return ResponseEntity.ok("success"); - } - - /** - * 微信支付的回调接口 - * @return 处理结果 - */ - @PostMapping(PayConstants.WX_CHANNEL_CODE) - public ResponseEntity handleWxPayNotify(HttpEntity httpEntity){ - try { - // 1.将请求信息写入 NotificationRequest - NotificationRequest request = transformHttpEntityToNotificationRequest(httpEntity); - // 2.处理通知 - notifyService.handleWxPayNotify(request); - } catch (Exception e){ - return ResponseEntity.status(500).body(Map.of("code", "FAIL", "message", e.getMessage())); - } - // 3.返回成功 - return ResponseEntity.ok().build(); - } - - /** - * 微信支付的回调接口 - * @return 处理结果 - */ - @PostMapping("/refund/" + PayConstants.WX_CHANNEL_CODE) - public ResponseEntity handleWxPayRefundNotify(HttpEntity httpEntity){ - try { - // 1.将请求信息写入 NotificationRequest - NotificationRequest request = transformHttpEntityToNotificationRequest(httpEntity); - // 2.处理通知 - notifyService.handleWxPayRefundNotify(request); - } catch (Exception e){ - return ResponseEntity.status(500).body(Map.of("code", "FAIL", "message", e.getMessage())); - } - // 3.返回成功 - return ResponseEntity.ok().build(); - } - - - private NotificationRequest transformHttpEntityToNotificationRequest(HttpEntity httpEntity) { - HttpHeaders headers = httpEntity.getHeaders(); - // 1.构建通知请求信息 - return new NotificationRequest.Builder() - .withSerialNumber(headers.getFirst("Wechatpay-Serial")) - .withNonce(headers.getFirst("Wechatpay-Nonce")) - .withTimestamp(headers.getFirst("Wechatpay-Timestamp")) - .withSignature(headers.getFirst("Wechatpay-Signature")) - .withBody(httpEntity.getBody()) - .build(); - } - -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/PayChannelController.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/PayChannelController.java deleted file mode 100644 index 5e86f0d..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/PayChannelController.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.tianji.pay.controller; - - -import com.tianji.common.utils.BeanUtils; -import com.tianji.pay.sdk.dto.PayChannelDTO; -import com.tianji.pay.service.IPayChannelService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - *

- * 支付渠道 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@Api(tags = "支付相关接口") -@RestController -@RequiredArgsConstructor -@RequestMapping("/pay-channels") -public class PayChannelController { - - private final IPayChannelService channelService; - - @ApiOperation("查询支付渠道列表") - @GetMapping("/list") - public List listAllPayChannels(){ - return BeanUtils.copyList(channelService.list(), PayChannelDTO.class); - } - - @ApiOperation("添加支付渠道") - @PostMapping - public Long addPayChannel(@Valid @RequestBody PayChannelDTO channelDTO){ - return channelService.addPayChannel(channelDTO); - } - - @ApiOperation("修改支付渠道") - @PutMapping("/{id}") - public void updatePayChannel( - @ApiParam("支付渠道id") @PathVariable("id") Long id, - @RequestBody PayChannelDTO channelDTO){ - channelDTO.setId(id); - channelService.updatePayChannel(channelDTO); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/PayOrderController.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/PayOrderController.java deleted file mode 100644 index 63a5838..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/PayOrderController.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.tianji.pay.controller; - - -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.pay.sdk.constants.PayErrorInfo; -import com.tianji.pay.sdk.constants.PayType; -import com.tianji.pay.sdk.dto.PayApplyDTO; -import com.tianji.pay.sdk.dto.PayResultDTO; -import com.tianji.pay.service.IPayOrderService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 支付订单 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@Api(tags = "支付相关接口") -@RestController -@RequestMapping("/pay-orders") -@RequiredArgsConstructor -public class PayOrderController { - - private final IPayOrderService payOrderService; - - @ApiOperation("扫码支付申请支付单,返回支付url地址,用于生产二维码") - @PostMapping - public String applyPayOrder(@RequestBody PayApplyDTO payApplyDTO){ - if(!PayType.NATIVE.equalsValue(payApplyDTO.getPayType())){ - throw new BadRequestException(PayErrorInfo.INVALID_PAY_TYPE); - } - return payOrderService.applyPayOrder(payApplyDTO); - } - - @ApiOperation("根据业务端订单id查询支付结果") - @GetMapping("/{bizOrderId}/status") - public PayResultDTO queryPayResult( - @ApiParam("业务订单id") @PathVariable("bizOrderId") Long bizOrderId - ){ - return payOrderService.queryPayResult(bizOrderId); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/RefundOrderController.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/RefundOrderController.java deleted file mode 100644 index d5a4bcd..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/controller/RefundOrderController.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.tianji.pay.controller; - - -import com.tianji.pay.sdk.dto.RefundApplyDTO; -import com.tianji.pay.sdk.dto.RefundResultDTO; -import com.tianji.pay.service.IRefundOrderService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 退款订单 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@RestController -@RequestMapping("/refund-orders") -@RequiredArgsConstructor -@Api(tags = "支付相关接口") -public class RefundOrderController { - - private final IRefundOrderService refundOrderService; - - @PostMapping - @ApiOperation("申请退款接口") - public RefundResultDTO applyRefund(@RequestBody RefundApplyDTO refundApplyDTO) { - return refundOrderService.applyRefund(refundApplyDTO); - } - - @GetMapping("{bizRefundOrderId}/status") - @ApiOperation("查询退款结果") - public RefundResultDTO queryRefundResult( - @ApiParam("业务端退款的子订单id") @PathVariable("bizRefundOrderId") Long bizRefundOrderId) { - return refundOrderService.queryRefundResult(bizRefundOrderId); - } - -/* @GetMapping("{bizRefundOrderId}/detail") - @ApiOperation("查询退款详情") - public RefundResultDTO queryRefundDetail( - @ApiParam("业务端退款的子订单id") @PathVariable("bizRefundOrderId") Long bizRefundOrderId) { - return refundOrderService.queryRefundDetail(bizRefundOrderId); - }*/ -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/PayChannel.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/PayChannel.java deleted file mode 100644 index c2c645b..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/PayChannel.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.tianji.pay.domain.po; - -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import java.io.Serializable; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -/** - *

- * 支付渠道 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("pay_channel") -public class PayChannel implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 支付渠道id - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 50 - */ - private String name; - - /** - * 支付渠道编码,用于获取支付实现 - */ - private String channelCode; - - /** - * 渠道优先级,数字越小优先级越高 - */ - private Integer channelPriority; - - /** - * 渠道图标 - */ - private String channelIcon; - - /** - * 支付渠道状态,1:使用中,2:停用 - */ - private Integer status; - - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/PayOrder.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/PayOrder.java deleted file mode 100644 index d181859..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/PayOrder.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.tianji.pay.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import com.tianji.pay.third.model.PayStatus; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 支付订单 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("pay_order") -public class PayOrder implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 业务订单号 - */ - private Long bizOrderNo; - - /** - * 支付单号 - */ - private Long payOrderNo; - - /** - * 支付用户id - */ - private Long bizUserId; - - /** - * 支付渠道id - */ - private String payChannelCode; - - /** - * 支付金额,单位位分 - */ - private Integer amount; - - /** - * 支付类型,1:h5,2:小程序,3:公众号,4:扫码 - */ - private Integer payType; - - /** - * 支付状态,0:待提交,1:待支付,2:支付成功,3:支付超时或取消 - */ - private Integer status; - - /** - * 拓展字段,用于传递不同渠道单独处理的字段 - */ - private String expandJson; - - /** - * 业务端回调接口 - */ - private String notifyUrl; - - /** - * 业务端回调次数 - */ - private Integer notifyTimes; - - /** - * 回调状态,0:待回调,1:回调成功,2:回调失败 - */ - private Integer notifyStatus; - - /** - * 第三方返回业务码 - */ - private String resultCode; - - /** - * 第三方返回提示信息 - */ - private String resultMsg; - - /** - * 支付成功时间 - */ - private LocalDateTime paySuccessTime; - - /** - * 支付超时时间 - */ - private LocalDateTime payOverTime; - - /** - * 支付二维码 - */ - private String qrCodeUrl; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - private Long creater; - - /** - * 更新人 - */ - private Long updater; - - /** - * 逻辑删除 - */ - @TableLogic - private Boolean deleted; - - - public boolean success(){ - return PayStatus.TRADE_SUCCESS.equalsValue(status); - } - - public boolean closed(){ - return PayStatus.TRADE_CLOSED.equalsValue(status); - } - - public boolean waitBuyerPay(){ - return PayStatus.WAIT_BUYER_PAY.equalsValue(status); - } - - public boolean notCommit(){ - return PayStatus.NOT_COMMIT.equalsValue(status); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/RefundOrder.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/RefundOrder.java deleted file mode 100644 index b1ce821..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/domain/po/RefundOrder.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.tianji.pay.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.pay.third.model.RefundStatus; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 退款订单 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("refund_order") -public class RefundOrder implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 业务端已支付的订单id - */ - private Long bizOrderNo; - - /** - * 业务端要退款的订单id - */ - private Long bizRefundOrderNo; - - /** - * 支付单号,提交给第三方的那个 - */ - private Long payOrderNo; - - /** - * 退款单号,每次退款的唯一标示 - */ - private Long refundOrderNo; - - /** - * 本次退款金额,单位分 - */ - private Integer refundAmount; - - /** - * 总金额,单位分 - */ - private Integer totalAmount; - - /** - * 是否是部分退款 - */ - private Boolean isSplit; - - /** - * 支付渠道id - */ - private String payChannelCode; - /** - * 第三方交易编码 - */ - private String resultCode; - - /** - * 第三方交易信息 - */ - private String resultMsg; - - /** - * 退款状态,1:退款中,2:退款成功,3:退款失败 - */ - private Integer status; - - /** - * 退款渠道 - */ - private String refundChannel; - - /** - * 业务端退款通知失败次数 - */ - private Integer notifyFailedTimes; - - /** - * 退款接口通知状态,0:待通知,1:通知成功,2:通知中,3:通知失败 - */ - private Integer notifyStatus; - - /** - * 退款单据创建时间 - */ - private LocalDateTime createTime; - - /** - * 退款单据修改时间 - */ - private LocalDateTime updateTime; - - /** - * 单据创建人,一般手动对账产生的单据才有值 - */ - private Long creater; - - /** - * 单据修改人,一般手动对账产生的单据才有值 - */ - private Long updater; - - /** - * 逻辑删除 - */ - @TableLogic - private Boolean deleted; - - - public boolean success(){ - return RefundStatus.SUCCESS.equalsValue(status); - } - - public boolean failed(){ - return RefundStatus.FAILED.equalsValue(status); - } - - public boolean unknown(){ - return RefundStatus.UN_KNOWN.equalsValue(status); - } - - public boolean notCommit(){ - return RefundStatus.NOT_COMMIT.equalsValue(status); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/PayChannelMapper.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/PayChannelMapper.java deleted file mode 100644 index fb4b86c..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/PayChannelMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.pay.mapper; - -import com.tianji.pay.domain.po.PayChannel; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 支付渠道 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -public interface PayChannelMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/PayOrderMapper.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/PayOrderMapper.java deleted file mode 100644 index 58a38f0..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/PayOrderMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.pay.mapper; - -import com.tianji.pay.domain.po.PayOrder; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 支付订单 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -public interface PayOrderMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/RefundOrderMapper.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/RefundOrderMapper.java deleted file mode 100644 index b6da528..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/mapper/RefundOrderMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.pay.mapper; - -import com.tianji.pay.domain.po.RefundOrder; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 退款订单 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -public interface RefundOrderMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/INotifyService.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/INotifyService.java deleted file mode 100644 index 1a8fc97..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/INotifyService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.tianji.pay.service; - -import com.wechat.pay.contrib.apache.httpclient.notification.NotificationRequest; - -import java.util.Map; - -public interface INotifyService { - void handleWxPayNotify(NotificationRequest request); - - void handleWxPayRefundNotify(NotificationRequest request); - - void handleAliPayNotify(Map request); -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IPayChannelService.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IPayChannelService.java deleted file mode 100644 index 02c458c..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IPayChannelService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.pay.service; - -import com.tianji.pay.sdk.dto.PayChannelDTO; -import com.tianji.pay.domain.po.PayChannel; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 支付渠道 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -public interface IPayChannelService extends IService { - - Long addPayChannel(PayChannelDTO channelDTO); - - void updatePayChannel(PayChannelDTO channelDTO); -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IPayOrderService.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IPayOrderService.java deleted file mode 100644 index 3e39a7e..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IPayOrderService.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.pay.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.pay.domain.po.PayOrder; -import com.tianji.pay.sdk.dto.PayApplyDTO; -import com.tianji.pay.sdk.dto.PayResultDTO; - -import java.time.LocalDateTime; - -/** - *

- * 支付订单 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -public interface IPayOrderService extends IService { - - String applyPayOrder(PayApplyDTO payApplyDTO); - - PayOrder queryByBizOrderNo(Long bizOrderNo); - - PayResultDTO queryPayResult(Long bizOrderId); - - PayOrder queryByPayOrderNo(Long payOrderNo); - - boolean markPayOrderSuccess(Long id, LocalDateTime successTime); - - PageDTO queryPayingOrderByPage(int page, int size); - - void checkPayOrder(PayOrder payOrder); -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IRefundOrderService.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IRefundOrderService.java deleted file mode 100644 index b14b8f4..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/IRefundOrderService.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tianji.pay.service; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.pay.domain.po.RefundOrder; -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.pay.sdk.dto.RefundApplyDTO; -import com.tianji.pay.sdk.dto.RefundResultDTO; - -/** - *

- * 退款订单 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -public interface IRefundOrderService extends IService { - - RefundResultDTO applyRefund(RefundApplyDTO refundApplyDTO); - - RefundResultDTO queryRefundResult(Long bizRefundOrderId); - - RefundOrder queryByRefundOrderNo(Long refundOrderNo); - - PageDTO queryRefundingOrderByPage(int pageNo, int size); - - void checkRefundOrder(RefundOrder refundOrder); - - RefundResultDTO queryRefundDetail(Long bizRefundOrderId); -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/NotifyServiceImpl.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/NotifyServiceImpl.java deleted file mode 100644 index 5933443..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/NotifyServiceImpl.java +++ /dev/null @@ -1,294 +0,0 @@ -package com.tianji.pay.service.impl; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONObject; -import com.alipay.easysdk.factory.Factory; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.autoconfigure.redisson.annotations.Lock; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.utils.DateUtils; -import com.tianji.common.utils.JsonUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.pay.domain.po.PayOrder; -import com.tianji.pay.domain.po.RefundOrder; -import com.tianji.pay.sdk.constants.PayConstants; -import com.tianji.pay.sdk.constants.PayErrorInfo; -import com.tianji.pay.sdk.dto.PayResultDTO; -import com.tianji.pay.sdk.dto.RefundResultDTO; -import com.tianji.pay.service.INotifyService; -import com.tianji.pay.service.IPayOrderService; -import com.tianji.pay.service.IRefundOrderService; -import com.tianji.pay.third.ali.AliPayService; -import com.tianji.pay.third.model.RefundStatus; -import com.tianji.pay.third.wx.config.WxPayProperties; -import com.wechat.pay.contrib.apache.httpclient.auth.Verifier; -import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager; -import com.wechat.pay.contrib.apache.httpclient.exception.NotFoundException; -import com.wechat.pay.contrib.apache.httpclient.exception.ParseException; -import com.wechat.pay.contrib.apache.httpclient.exception.ValidationException; -import com.wechat.pay.contrib.apache.httpclient.notification.Notification; -import com.wechat.pay.contrib.apache.httpclient.notification.NotificationHandler; -import com.wechat.pay.contrib.apache.httpclient.notification.NotificationRequest; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.lang.Nullable; -import org.springframework.stereotype.Service; - -import java.nio.charset.StandardCharsets; -import java.time.LocalDateTime; -import java.util.Map; - -@Slf4j -@Service -@RequiredArgsConstructor -public class NotifyServiceImpl implements INotifyService { - private final CertificatesManager certificatesManager; - private final WxPayProperties properties; - private final IPayOrderService payOrderService; - private final RabbitMqHelper rabbitMqHelper; - private final IRefundOrderService refundOrderService; - - @Override - public void handleWxPayNotify(NotificationRequest request) { - log.info("收到微信支付通知:{}", request.getBody()); - // 1.尝试校验微信通知请求参数,安全校验 - Notification notification = checkWxNotifyRequest(request); - if (notification == null || !StringUtils.equals(notification.getEventType(), "TRANSACTION.SUCCESS")) { - // 通知类型不是支付成功,不做处理 - return; - } - // 2.解析回调加密的数据 - String decryptData = notification.getDecryptData(); - JSONObject data = JsonUtils.parseObj(decryptData); - - // 3.获取用于业务校验的基本信息 - // 3.1.交易单号 - Long tradingOrderNo = data.getLong("out_trade_no"); - // 3.2.订单金额 - JSONObject amountObject = data.getJSONObject("amount"); - Integer amount = amountObject == null ? null : amountObject.getInt("total"); - // 3.3.订单支付时间 - LocalDateTime successTime = data.getLocalDateTime("success_time", LocalDateTime.now()); - - // 4.校验通知数据,主要是业务校验、幂等校验 - PayOrder payOrder = checkNotifyData(tradingOrderNo, amount, successTime); - if (payOrder == null) return; - - // 5.通知业务服务 - rabbitMqHelper.send( - MqConstants.Exchange.PAY_EXCHANGE, - MqConstants.Key.PAY_SUCCESS, - PayResultDTO.builder() - .payChannel(payOrder.getPayChannelCode()) - .payOrderNo(payOrder.getPayOrderNo()) - .bizOrderId(payOrder.getBizOrderNo()) - .successTime(successTime) - .build()); - } - - - @Override - public void handleWxPayRefundNotify(NotificationRequest request) { - log.info("收到微信退款通知:{}", request.getBody()); - // 1.尝试校验微信通知请求参数,安全校验 - Notification notification = checkWxNotifyRequest(request); - if (notification == null || !StringUtils.equalsAny( - notification.getEventType(), "REFUND.SUCCESS", "REFUND.ABNORMAL", "REFUND.CLOSED")) { - // 通知类型错误,直接返回 - log.debug("微信退款通知类型异常"); - return; - } - - // 2.解析通知数据 - String decryptData = notification.getDecryptData(); - JSONObject data = JsonUtils.parseObj(decryptData); - // 2.1.退款单号 - Long refundOrderNo = data.getLong("out_refund_no"); - if (refundOrderNo == null) { - log.error("微信通知数据有误,缺少退款单号"); - throw new BadRequestException("微信通知数据有误,缺少退款单号"); - } - // 2.2.退款状态 - String statusStr = notification.getEventType(); - RefundStatus status = handleWxRefundStatus(statusStr); - - // 3.幂等性校验 - RefundOrder refundOrder = checkRefundData(refundOrderNo, status, null); - if (refundOrder == null) return; - - // 4.发送MQ通知业务端 - rabbitMqHelper.send( - MqConstants.Exchange.PAY_EXCHANGE, - MqConstants.Key.REFUND_CHANGE, - RefundResultDTO.builder() - .status(status == RefundStatus.SUCCESS ? RefundResultDTO.SUCCESS : RefundResultDTO.FAILED) - .bizPayOrderId(refundOrder.getBizOrderNo()) - .bizRefundOrderId(refundOrder.getBizRefundOrderNo()) - .refundChannel(refundOrder.getRefundChannel()) - .refundOrderNo(refundOrder.getRefundOrderNo()) - .msg(data.getStr("msg")) - .build() - ); - } - - @Override - public void handleAliPayNotify(Map request) { - log.error("收到阿里支付通知信息,request = {}", request); - // 1.判断是否是成功通知 - String tradeStatus = request.get("trade_status"); - if (!StrUtil.equals(tradeStatus, "TRADE_SUCCESS")) { - // 通知结果不是成功,直接结束 - return; - } - // 2.验签 - checkAliNotifyRequest(request); - - // 3.获取用于业务校验的基本信息 - // 3.1.交易单号 - String out_trade_no = request.get("out_trade_no"); - Long tradingOrderNo = StringUtils.isNumeric(out_trade_no) ? Long.valueOf(out_trade_no) : null; - // 3.2.订单金额,阿里返回的订单金额要乘100 - String total_amount = request.get("total_amount"); - Integer amount = StringUtils.isNotBlank(total_amount) ? AliPayService.transferStringAmount2Int(total_amount) : null; - // 3.3.订单支付时间 - String success_time = request.get("notify_time"); - LocalDateTime successTime = StringUtils.isBlank(success_time) ? - LocalDateTime.now() : DateUtils.parse(success_time, DateUtils.DEFAULT_DATE_TIME_FORMAT); - - // 4.校验通知数据,主要是业务校验、幂等校验 - PayOrder payOrder = checkNotifyData(tradingOrderNo, amount, successTime); - if (payOrder == null) return; - - // 5.通知业务服务 - rabbitMqHelper.send( - MqConstants.Exchange.PAY_EXCHANGE, - MqConstants.Key.PAY_SUCCESS, - PayResultDTO.builder() - .payOrderNo(payOrder.getPayOrderNo()) - .payChannel(payOrder.getPayChannelCode()) - .bizOrderId(payOrder.getBizOrderNo()) - .successTime(successTime) - .build() - ); - } - - - private RefundOrder checkRefundData(Long refundOrderNo, RefundStatus status, String channel) { - // 1.查询退款单 - RefundOrder refundOrder = refundOrderService.queryByRefundOrderNo(refundOrderNo); - // 2.判断是否为空 - if (refundOrder == null) { - throw new BadRequestException("通知数据有误,退款单不存在"); - } - // 3.判断状态是否变更 - if (status.equalsValue(refundOrder.getStatus())) { - // 订单状态没有变化,属于重复通知 - return null; - } - // 4.更新退款单状态 - boolean success = refundOrderService.lambdaUpdate() - .set(RefundOrder::getStatus, status.getValue()) - .set(StringUtils.isNotBlank(channel), RefundOrder::getRefundChannel, channel) - .eq(RefundOrder::getId, refundOrder.getId()) - .eq(RefundOrder::getStatus, refundOrder.getStatus()) - .update(); - if(!success){ - return null; - } - return refundOrder; - } - - private RefundStatus handleWxRefundStatus(String statusStr) { - if (StringUtils.equalsAny(statusStr, "REFUND.CLOSED", "REFUND.ABNORMAL")) { - return RefundStatus.FAILED; - } - if ("REFUND.SUCCESS".equals(statusStr)) { - return RefundStatus.SUCCESS; - } - return RefundStatus.UN_KNOWN; - } - - - private void checkAliNotifyRequest(Map request) { - try { - Boolean isValid = Factory.Payment.Common().verifyNotify(request); - if (!isValid) { - // 通知签名有误 - log.error("阿里支付通知回调验签失败,request = {}", request); - throw new BadRequestException(PayErrorInfo.INVALID_NOTIFY_PARAM); - } - } catch (Exception e) { - log.error("获取阿里验签工具异常", e); - throw new CommonException("获取阿里验签工具异常", e); - } - } - - - @Nullable - private Notification checkWxNotifyRequest(NotificationRequest request) { - try { - Verifier verifier = certificatesManager.getVerifier(properties.getMchId()); - String apiV3Key = properties.getApiV3Key(); - NotificationHandler handler = new NotificationHandler(verifier, apiV3Key.getBytes(StandardCharsets.UTF_8)); - // 验签和解析请求体 - return handler.parse(request); - - } catch (NotFoundException e) { - log.error("找不到商户{}的校验证书", properties.getMchId(), e); - return null; - } catch (ValidationException e) { - log.error("微信回调结果校验失败", e); - throw new BadRequestException(400, "微信回调结果校验失败", e); - } catch (ParseException e) { - log.error("微信回调结果解析失败", e); - throw new BadRequestException(400, "微信回调结果解析失败", e); - } catch (RuntimeException e) { - log.error("微信回调结果处理失败", e); - throw new BadRequestException(400, "微信回调结果处理失败", e); - } - } - - @Nullable - @Lock(formatter = PayConstants.RedisKeyFormatter.PAY_NOTIFY) - private PayOrder checkNotifyData(Long tradingOrderNo, Integer amount, LocalDateTime successTime) { - // 1.数据非空校验 - if (tradingOrderNo == null || amount == null) { - throw new BadRequestException(400, PayErrorInfo.INVALID_NOTIFY_PARAM); - } - log.info("支付回调通知:payOrderNo = {}, amount = {}", tradingOrderNo, amount); - - // 2.查询交易单,幂等校验 - PayOrder payOrder = payOrderService.queryByPayOrderNo(tradingOrderNo); - // 2.1.非空校验 - if (payOrder == null) { - log.error("支付回调通知的支付单{}不存在", tradingOrderNo); - return null; - } - // 2.2.支付单如果是已支付或已关闭,则不能重复处理 - if (payOrder.success() || payOrder.closed()) { - log.error("支付回调通知的支付单{}已经支付或已经关闭,属于重复通知", tradingOrderNo); - return null; - } - - // 3.校验支付金额 - if (!payOrder.getAmount().equals(amount)) { - // 金额有误 - log.error("支付回调通知的金额有误,支付单号:{},通知金额:{}, 实际金额:{}", - tradingOrderNo, amount, payOrder.getAmount()); - throw new BizIllegalException("微信通知的金额有误"); - } - - // 4.更新订单状态,同时基于乐观锁做幂等处理 - boolean success = payOrderService.markPayOrderSuccess(payOrder.getId(), successTime); - if (!success) { - // 如果更新失败,说明是重复通知 - return null; - } - - return payOrder; - } - -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/PayChannelServiceImpl.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/PayChannelServiceImpl.java deleted file mode 100644 index 14458d1..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/PayChannelServiceImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.pay.service.impl; - -import com.tianji.common.utils.BeanUtils; -import com.tianji.pay.sdk.dto.PayChannelDTO; -import com.tianji.pay.domain.po.PayChannel; -import com.tianji.pay.mapper.PayChannelMapper; -import com.tianji.pay.service.IPayChannelService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; - -/** - *

- * 支付渠道 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@Service -public class PayChannelServiceImpl extends ServiceImpl implements IPayChannelService { - - @Override - public Long addPayChannel(PayChannelDTO channelDTO) { - // 1.属性转换 - PayChannel payChannel = BeanUtils.toBean(channelDTO, PayChannel.class); - // 2.保存 - save(payChannel); - return payChannel.getId(); - } - - @Override - public void updatePayChannel(PayChannelDTO channelDTO) { - // 1.属性转换 - PayChannel payChannel = BeanUtils.toBean(channelDTO, PayChannel.class); - // 2.保存 - updateById(payChannel); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/PayOrderServiceImpl.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/PayOrderServiceImpl.java deleted file mode 100644 index bb22d24..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/PayOrderServiceImpl.java +++ /dev/null @@ -1,279 +0,0 @@ -package com.tianji.pay.service.impl; - -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.autoconfigure.redisson.annotations.Lock; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.pay.constants.NotifyStatus; -import com.tianji.pay.domain.po.PayOrder; -import com.tianji.pay.mapper.PayOrderMapper; -import com.tianji.pay.sdk.constants.PayConstants; -import com.tianji.pay.sdk.constants.PayErrorInfo; -import com.tianji.pay.sdk.dto.PayApplyDTO; -import com.tianji.pay.sdk.dto.PayResultDTO; -import com.tianji.pay.service.IPayOrderService; -import com.tianji.pay.third.IPayService; -import com.tianji.pay.third.model.PayStatus; -import com.tianji.pay.third.model.PayStatusResponse; -import com.tianji.pay.third.model.PrepayResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.Map; - -import static com.tianji.pay.sdk.constants.PayErrorInfo.*; - -/** - *

- * 支付订单 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class PayOrderServiceImpl extends ServiceImpl implements IPayOrderService { - - @Resource - private Map payServiceChannels; - private final RabbitMqHelper rabbitMqHelper; - - @Override - @Lock(formatter = PayConstants.RedisKeyFormatter.PAY_APPLY, time = 3) - public String applyPayOrder(PayApplyDTO payApplyDTO) { - log.debug("准备创建支付单,业务订单号:{}", payApplyDTO.getBizOrderNo()); - // 1.选择支付渠道 - IPayService payService = payServiceChannels.get(payApplyDTO.getPayChannelCode()); - if (payService == null) { - log.error("用户选择的支付渠道不存在,业务单号:{}", payApplyDTO.getBizOrderNo()); - throw new BadRequestException(INVALID_PAY_CHANNEL); - } - - // 2.幂等性校验 - PayOrder payOrder = checkIdempotent(payApplyDTO); - if (StringUtils.isNotBlank(payOrder.getQrCodeUrl())) { - log.debug("支付链接已经存在,不再重新创建,直接返回"); - return payOrder.getQrCodeUrl(); - } - - // 3.需要生成新支付链接,调用第三方,完成支付单下单 - PrepayResponse prepayResponse = payService.createPrepayOrder( - payApplyDTO.getOrderInfo(), payOrder.getPayOrderNo().toString(), payOrder.getAmount()); - - // 4.更新支付链接等信息到数据库 - updatePayResult2DB(prepayResponse, payOrder.getId()); - - if (!prepayResponse.isSuccess()) { - log.error("预创建支付单失败,详情:{}", prepayResponse.getDetail()); - throw new BizIllegalException(PayErrorInfo.CREATE_PAY_ORDER_FAILED); - } - // 5.返回支付链接 - log.debug("支付单生成成功,返回支付链接:{}", prepayResponse.getPayUrl()); - return prepayResponse.getPayUrl(); - } - - private void updatePayResult2DB(PrepayResponse prepayResponse, Long payOrderId) { - try { - lambdaUpdate() - .set(prepayResponse.isSuccess(), PayOrder::getQrCodeUrl, prepayResponse.getPayUrl()) - .set(prepayResponse.isSuccess(), PayOrder::getStatus, PayStatus.WAIT_BUYER_PAY.getValue()) - .set(!prepayResponse.isSuccess(), PayOrder::getResultCode, prepayResponse.getCode()) - .set(!prepayResponse.isSuccess(), PayOrder::getResultMsg, prepayResponse.getMsg()) - .eq(PayOrder::getId, payOrderId) - .update(); - } catch (Exception e) { - log.error("更新支付单结果到数据时发生异常", e); - } - } - - private PayOrder buildPayOrder(PayApplyDTO payApplyDTO) { - // 1.数据转换 - PayOrder payOrder = BeanUtils.toBean(payApplyDTO, PayOrder.class); - // 2.初始化数据 - payOrder.setNotifyTimes(0); - payOrder.setNotifyStatus(NotifyStatus.UN_CALL.getValue()); - payOrder.setPayOverTime(LocalDateTime.now().plusMinutes(120L)); - payOrder.setStatus(PayStatus.NOT_COMMIT.getValue()); - return payOrder; - } - - private PayOrder checkIdempotent(PayApplyDTO payApplyDTO) { - // 1.首先查询支付订单 - PayOrder oldOrder = queryByBizOrderNo(payApplyDTO.getBizOrderNo()); - // 2.判断是否存在 - if (oldOrder == null) { - // 不存在支付单,说明是第一次,写入新的支付单并返回 - PayOrder payOrder = buildPayOrder(payApplyDTO); - payOrder.setPayOrderNo(IdWorker.getId()); - save(payOrder); - return payOrder; - } - // 3.旧单已经存在,判断是否支付成功 - if (PayStatus.TRADE_SUCCESS.equalsValue(oldOrder.getStatus())) { - // 已经支付成功,抛出异常 - throw new BizIllegalException(PAY_ORDER_ALREADY_PAY_CODE, PAY_ORDER_ALREADY_PAY); - } - // 4.旧单已经存在,判断是否已经关闭 - if (PayStatus.TRADE_CLOSED.equalsValue(oldOrder.getStatus())) { - // 已经关闭,抛出异常 - throw new BizIllegalException(PAY_ORDER_ALREADY_CLOSE_CODE, PAY_ORDER_ALREADY_CLOSE); - } - // 5.旧单已经存在,判断支付渠道是否一致 - if (!StringUtils.equals(oldOrder.getPayChannelCode(), payApplyDTO.getPayChannelCode())) { - // 支付渠道不一致,需要重置数据,然后重新申请支付单 - PayOrder payOrder = buildPayOrder(payApplyDTO); - payOrder.setId(oldOrder.getId()); - payOrder.setQrCodeUrl(""); - updateById(payOrder); - payOrder.setPayOrderNo(oldOrder.getPayOrderNo()); - return payOrder; - } - // 6.旧单已经存在,且可能是未支付或未提交,且支付渠道一致,直接返回旧数据 - return oldOrder; - } - - @Override - public PayOrder queryByBizOrderNo(Long bizOrderNo) { - return lambdaQuery() - .eq(PayOrder::getBizOrderNo, bizOrderNo) - .one(); - } - - @Override - public PayResultDTO queryPayResult(Long bizOrderNo) { - // 1.查询支付单 - PayOrder payOrder = queryByBizOrderNo(bizOrderNo); - if (payOrder == null) { - throw new BizIllegalException(PAY_ORDER_NOT_FOUND); - } - // 2.判断支付状态 - if (payOrder.success()) { - // 2.1.支付成功 - return PayResultDTO.builder() - .payOrderNo(payOrder.getPayOrderNo()) - .successTime(payOrder.getPaySuccessTime()) - .payChannel(payOrder.getPayChannelCode()) - .build(); - } - // 2.2.未支付 - if (payOrder.notCommit() || payOrder.waitBuyerPay()) { - return PayResultDTO.builder() - .status(PayStatus.WAIT_BUYER_PAY.getValue()) - .build(); - } - // 2.2.支付失败 - return PayResultDTO.builder() - .status(PayStatus.TRADE_CLOSED.getValue()) - .msg(payOrder.getResultMsg()) - .build(); - } - - @Override - public PayOrder queryByPayOrderNo(Long payOrderNo) { - return lambdaQuery().eq(PayOrder::getPayOrderNo, payOrderNo).one(); - } - - @Override - public boolean markPayOrderSuccess(Long id, LocalDateTime successTime) { - return lambdaUpdate() - .set(PayOrder::getStatus, PayStatus.TRADE_SUCCESS.getValue()) - .set(PayOrder::getNotifyStatus, NotifyStatus.CALLING.getValue()) - .set(PayOrder::getPaySuccessTime, successTime) - .eq(PayOrder::getId, id) - // 支付状态的乐观锁判断 - .in(PayOrder::getStatus, PayStatus.NOT_COMMIT.getValue(), PayStatus.WAIT_BUYER_PAY.getValue()) - .update(); - } - - @Override - public PageDTO queryPayingOrderByPage(int pageNo, int size) { - // 1.分页和排序条件 - Page page = new Page<>(pageNo, size); - page.addOrder(new OrderItem("id", true)); - // 2.查询 - Page result = lambdaQuery() - .eq(PayOrder::getStatus, PayStatus.WAIT_BUYER_PAY.getValue()) - .page(page); - return PageDTO.of(result); - } - - @Override - @Lock(formatter = PayConstants.RedisKeyFormatter.PAY_ORDER_CHECK_TASK) - public void checkPayOrder(PayOrder payOrder) { - // 1.选择支付渠道 - IPayService payService = payServiceChannels.get(payOrder.getPayChannelCode()); - if (payService == null) { - log.error("支付渠道不存在,业务单号:{}", payOrder.getBizOrderNo()); - // 异常订单,需要关闭支付单 - closeOrder(payOrder.getId()); - return; - } - // 2.判断订单是否超时 - if (payOrder.getPayOverTime().isBefore(LocalDateTime.now())) { - log.debug("支付单{}已经超时,关闭订单", payOrder.getPayOrderNo()); - closeOrder(payOrder.getId()); - return; - } - // 3.查询支付状态 - PayStatusResponse response = payService.queryPayOrderStatus(payOrder.getPayOrderNo().toString()); - Integer payStatus = response.getPayStatus(); - // 3.1.判断是否查询失败或者正在支付 - if (!response.isSuccess() || PayStatus.WAIT_BUYER_PAY.equalsValue(payStatus)) { - // 查询异常或正在支付,结束 - return; - } - // 3.2.判断支付状态是否变更 - if (payStatus.equals(payOrder.getStatus())) { - // 支付状态没有变更 - return; - } - // 3.3.状态是支付成功或失败,直接更新订单状态 - updatePayStatus2DB(response, payOrder.getId()); - // 3.4.判断状态是否是成功,成功需要发送MQ消息通知 - if (PayStatus.TRADE_SUCCESS.equalsValue(response.getPayStatus())) { - rabbitMqHelper.send( - MqConstants.Exchange.PAY_EXCHANGE, - MqConstants.Key.PAY_SUCCESS, - PayResultDTO.builder() - .payOrderNo(payOrder.getPayOrderNo()) - .bizOrderId(payOrder.getBizOrderNo()) - .payChannel(payOrder.getPayChannelCode()) - .successTime(response.getSuccessTime()) - .build() - ); - } - } - - private void updatePayStatus2DB(PayStatusResponse response, Long id) { - try { - lambdaUpdate() - .set(PayOrder::getStatus, response.getPayStatus()) - .set(PayOrder::getResultCode, response.getCode() == null ? "" : response.getCode()) - .set(PayOrder::getResultMsg, response.getMsg() == null ? "" : response.getMsg()) - .eq(PayOrder::getId, id) - .update(); - } catch (Exception e) { - log.error("更新支付单结果到数据时发生异常", e); - } - } - - private void closeOrder(Long id) { - PayOrder payOrder = new PayOrder(); - payOrder.setId(id); - payOrder.setStatus(PayStatus.TRADE_CLOSED.getValue()); - updateById(payOrder); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/RefundOrderServiceImpl.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/RefundOrderServiceImpl.java deleted file mode 100644 index e22aabb..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/service/impl/RefundOrderServiceImpl.java +++ /dev/null @@ -1,292 +0,0 @@ -package com.tianji.pay.service.impl; - -import com.baomidou.mybatisplus.core.metadata.OrderItem; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.autoconfigure.redisson.annotations.Lock; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.pay.domain.po.PayOrder; -import com.tianji.pay.domain.po.RefundOrder; -import com.tianji.pay.mapper.RefundOrderMapper; -import com.tianji.pay.sdk.constants.PayConstants; -import com.tianji.pay.sdk.constants.PayErrorInfo; -import com.tianji.pay.sdk.dto.RefundApplyDTO; -import com.tianji.pay.sdk.dto.RefundResultDTO; -import com.tianji.pay.service.IPayOrderService; -import com.tianji.pay.service.IRefundOrderService; -import com.tianji.pay.third.IPayService; -import com.tianji.pay.third.model.RefundResponse; -import com.tianji.pay.third.model.RefundStatus; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.Map; - -import static com.tianji.pay.sdk.constants.PayErrorInfo.INVALID_PAY_CHANNEL; - -/** - *

- * 退款订单 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class RefundOrderServiceImpl extends ServiceImpl implements IRefundOrderService { - - private final IPayOrderService payOrderService; - - private final RabbitMqHelper rabbitMqHelper; - - @Resource - private Map payServiceChannels; - - @Override - public RefundResultDTO applyRefund(RefundApplyDTO refundApplyDTO) { - log.debug("准备申请退款,业务端退款订单号:{}", refundApplyDTO.getBizRefundOrderNo()); - // 1.幂等性校验 - RefundOrder refundOrder = checkIdempotent(refundApplyDTO); - if (refundOrder == null) { - // 为 null说明退款处理中,无需重新申请,返回false - return RefundResultDTO.running().msg("退款执行中").build(); - } - // 2.获取支付渠道 - IPayService payService = payServiceChannels.get(refundOrder.getPayChannelCode()); - if (payService == null) { - log.error("退款异常,支付渠道不存在,业务单号:{}", refundApplyDTO.getBizOrderNo()); - throw new BadRequestException(INVALID_PAY_CHANNEL); - } - // 3.尝试退款 - RefundResponse refundResponse = payService.refundOrder( - refundOrder.getPayOrderNo().toString(), refundOrder.getRefundOrderNo().toString(), - refundOrder.getRefundAmount(), refundOrder.getTotalAmount()); - // 4.更新退款结果到数据库 - updateRefundStatus(refundResponse, refundOrder.getId()); - // 5.返回退款申请结果 - RefundResultDTO refundResultDTO = transferRefundResult(refundResponse); - refundResultDTO.setBizRefundOrderId(refundOrder.getBizRefundOrderNo()); - refundResultDTO.setBizPayOrderId(refundOrder.getBizOrderNo()); - refundResultDTO.setRefundOrderNo(refundOrder.getRefundOrderNo()); - return refundResultDTO; - } - - private void updateRefundStatus(RefundResponse refundResponse, Long id) { - try { - lambdaUpdate() - .set(refundResponse.getSuccess(), RefundOrder::getStatus, refundResponse.getStatus()) - .set(refundResponse.getAmount() != null, RefundOrder::getRefundAmount, refundResponse.getAmount()) - .set(refundResponse.getChannel() != null, RefundOrder::getRefundChannel, refundResponse.getChannel()) - .set(RefundOrder::getResultCode, refundResponse.getCode() == null ? "" : refundResponse.getCode()) - .set(RefundOrder::getResultMsg, refundResponse.getMsg() == null ? "" : refundResponse.getMsg()) - .eq(RefundOrder::getId, id) - .update(); - } catch (Exception e) { - log.error("更新退款单状态发生异常", e); - } - } - - @Lock(formatter = PayConstants.RedisKeyFormatter.REFUND_APPLY, time = 10) - private RefundOrder checkIdempotent(RefundApplyDTO refundApplyDTO) { - // 1.查询出退款单对应的支付单 - PayOrder payOrder = payOrderService.queryByBizOrderNo(refundApplyDTO.getBizOrderNo()); - if (payOrder == null) { - // 支付单为空,无法退款 - throw new BizIllegalException(PayErrorInfo.PAY_ORDER_NOT_FOUND); - } - // 2.判断是否已经支付成功 - if (!payOrder.success()) { - // 订单尚未支付,无法退款 - throw new BizIllegalException(PayErrorInfo.PAY_ORDER_NOT_SUCCESS); - } - - // 3.查询当前订单是否已经有退款单 - RefundOrder oldRefundOrder = queryByBizRefundOrder(refundApplyDTO.getBizRefundOrderNo()); - // 3.1.判断是否为空 - if (oldRefundOrder == null) { - // 本订单第一次退款,需要生成新退款单 - RefundOrder refundOrder = BeanUtils.toBean(refundApplyDTO, RefundOrder.class); - refundOrder.setRefundOrderNo(IdWorker.getId()); - refundOrder.setIsSplit(payOrder.getAmount().equals(refundApplyDTO.getRefundAmount())); - refundOrder.setPayOrderNo(payOrder.getPayOrderNo()); - refundOrder.setTotalAmount(payOrder.getAmount()); - refundOrder.setPayChannelCode(payOrder.getPayChannelCode()); - save(refundOrder); - return refundOrder; - } - - // 3.2.判断退款是否已经成功,如果成功不能退款 - if (oldRefundOrder.success()) { - throw new BizIllegalException(PayErrorInfo.REPEAT_REFUND_ORDER); - } - - // 3.3.判断退款是否已经失败,如果失败直接结束 - if (oldRefundOrder.failed()) { - throw new BizIllegalException(PayErrorInfo.REFUND_FAILED); - } - - // 3.4.退款请求未提交,重新提交 - if (oldRefundOrder.notCommit()) { - // 需要先更新退款数据 - oldRefundOrder.setRefundAmount(refundApplyDTO.getRefundAmount()); - updateById(oldRefundOrder); - return oldRefundOrder; - } - - // 3.5.退款正在进行中,什么都不做 - return null; - } - - private RefundOrder queryByBizRefundOrder(Long bizRefundOrderId) { - return lambdaQuery() - .eq(RefundOrder::getBizRefundOrderNo, bizRefundOrderId) - .one(); - } - - @Override - public RefundResultDTO queryRefundResult(Long bizRefundOrderId) { - // 1.查询退款单 - RefundOrder refundOrder = queryByBizRefundOrder(bizRefundOrderId); - // 2.判断是否为空 - if (refundOrder == null) { - return null; - } - // 3.判断退款单是否退款成功 - if (refundOrder.success()) { - return RefundResultDTO.success() - .refundOrderNo(refundOrder.getRefundOrderNo()) - .bizPayOrderId(refundOrder.getBizOrderNo()) - .bizRefundOrderId(refundOrder.getBizRefundOrderNo()) - .refundChannel(refundOrder.getRefundChannel()) - .build(); - } - // 4.判断退款单是否退款失败 - if (refundOrder.failed()) { - return RefundResultDTO.failed() - .msg(refundOrder.getResultMsg()) - .refundOrderNo(refundOrder.getRefundOrderNo()) - .build(); - } - // 5.退款状态未知,需求去第三方查询,选择查询渠道 - IPayService payService = payServiceChannels.get(refundOrder.getPayChannelCode()); - if (payService == null) { - log.error("退款异常,支付渠道不存在,业务单号:{}", bizRefundOrderId); - throw new BadRequestException(INVALID_PAY_CHANNEL); - } - // 6.去第三方查询一下 - RefundResponse refundResponse = payService.queryRefundStatus( - refundOrder.getPayOrderNo().toString(), refundOrder.getRefundOrderNo().toString()); - // 6.1.更新数据库退款单状态 - updateRefundStatus(refundResponse, refundOrder.getId()); - - // 6.2.返回结果 - RefundResultDTO refundResultDTO = transferRefundResult(refundResponse); - refundResultDTO.setRefundOrderNo(refundOrder.getRefundOrderNo()); - refundResultDTO.setBizRefundOrderId(bizRefundOrderId); - return refundResultDTO; - } - - @Override - public RefundOrder queryByRefundOrderNo(Long refundOrderNo) { - return lambdaQuery() - .eq(RefundOrder::getRefundOrderNo, refundOrderNo) - .one(); - } - - @Override - public PageDTO queryRefundingOrderByPage(int pageNo, int size) { - // 1.分页和排序条件 - Page page = new Page<>(pageNo, size); - page.addOrder(new OrderItem("id", true)); - // 2.查询 - Page result = lambdaQuery() - .eq(RefundOrder::getStatus, RefundStatus.UN_KNOWN.getValue()) - .page(page); - return PageDTO.of(result); - } - - @Override - public void checkRefundOrder(RefundOrder refundOrder) { - // 1.获取退款渠道 - String payChannelCode = refundOrder.getPayChannelCode(); - IPayService payService = payServiceChannels.get(payChannelCode); - if (payService == null) { - log.error("支付渠道不存在,退款单号:{}", refundOrder.getId()); - // 异常订单,需要关闭支付单 - closeOrder(refundOrder.getId()); - return; - } - // 2.查询退款状态 - RefundResponse refundResponse = payService.queryRefundStatus( - refundOrder.getPayOrderNo().toString(), refundOrder.getRefundOrderNo().toString()); - - if (refundResponse.getStatus().equals(refundOrder.getStatus())) { - // 退款状态没有变化,不做处理 - return; - } - - // 3.更新数据库退款单状态 - updateRefundStatus(refundResponse, refundOrder.getId()); - - // 4.发送MQ通知业务端 - rabbitMqHelper.send( - MqConstants.Exchange.PAY_EXCHANGE, - MqConstants.Key.REFUND_CHANGE, - RefundResultDTO.success() - .refundOrderNo(refundOrder.getRefundOrderNo()) - .bizPayOrderId(refundOrder.getBizOrderNo()) - .bizRefundOrderId(refundOrder.getBizRefundOrderNo()) - .refundChannel(refundOrder.getRefundChannel()) - .build() - ); - } - - @Override - public RefundResultDTO queryRefundDetail(Long bizRefundOrderId) { - // 1.查询退款单 - RefundOrder refundOrder = queryByBizRefundOrder(bizRefundOrderId); - // 2.判断是否为空 - if (refundOrder == null) { - throw new BadRequestException(PayErrorInfo.REFUND_ORDER_NOT_FOUND); - } - // 3.返回结果 - return RefundResultDTO.builder() - .status(refundOrder.getStatus()) - .msg(refundOrder.getResultMsg()) - .bizRefundOrderId(bizRefundOrderId) - .bizPayOrderId(refundOrder.getBizOrderNo()) - .payOrderNo(refundOrder.getPayOrderNo()) - .refundOrderNo(refundOrder.getRefundOrderNo()) - .payChannel(refundOrder.getRefundChannel()) - .build(); - } - - private void closeOrder(Long id) { - RefundOrder refundOrder = new RefundOrder(); - refundOrder.setId(id); - refundOrder.setStatus(RefundStatus.FAILED.getValue()); - updateById(refundOrder); - } - - private RefundResultDTO transferRefundResult(RefundResponse refundResponse) { - if (!refundResponse.getSuccess()) { - return RefundResultDTO.failed() - .msg(refundResponse.getMsg()).refundChannel(refundResponse.getChannel()).build(); - } - if (refundResponse.refundSuccess()) { - return RefundResultDTO.success().refundChannel(refundResponse.getChannel()).build(); - } - return RefundResultDTO.running() - .msg(refundResponse.getMsg()).refundChannel(refundResponse.getChannel()).build(); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/tasks/PayOrderCheckTask.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/tasks/PayOrderCheckTask.java deleted file mode 100644 index 0fec709..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/tasks/PayOrderCheckTask.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.pay.tasks; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.utils.StringUtils; -import com.tianji.pay.domain.po.PayOrder; -import com.tianji.pay.service.IPayOrderService; -import com.xxl.job.core.context.XxlJobHelper; -import com.xxl.job.core.handler.annotation.XxlJob; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PayOrderCheckTask { - - private final IPayOrderService payOrderService; - - @XxlJob("payOrderCheckHandler") - public void checkPayOrderStatus() { - // 1.获取分片信息 - int index = XxlJobHelper.getShardIndex() + 1; - String jobParam = XxlJobHelper.getJobParam(); - int size = StringUtils.isNumeric(jobParam) ? Integer.parseInt(jobParam) : 10; - // 2.查询需要处理的支付订单 - PageDTO result = payOrderService.queryPayingOrderByPage(index, size); - if (result.isEmpty()) { - return; - } - // 3.逐个检查支付单 - for (PayOrder payOrder : result.getList()) { - try { - payOrderService.checkPayOrder(payOrder); - } catch (Exception e) { - log.error("处理订单支付状态异常:", e); - } - } - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/tasks/RefundOrderCheckTask.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/tasks/RefundOrderCheckTask.java deleted file mode 100644 index 8134989..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/tasks/RefundOrderCheckTask.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.pay.tasks; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.utils.StringUtils; -import com.tianji.pay.domain.po.RefundOrder; -import com.tianji.pay.service.IRefundOrderService; -import com.xxl.job.core.context.XxlJobHelper; -import com.xxl.job.core.handler.annotation.XxlJob; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class RefundOrderCheckTask { - - private final IRefundOrderService refundOrderService; - - @XxlJob("refundOrderCheckHandler") - public void checkRefundOrderStatus() { - // 1.获取分片信息 - int index = XxlJobHelper.getShardIndex() + 1; - String jobParam = XxlJobHelper.getJobParam(); - int size = StringUtils.isNumeric(jobParam) ? Integer.parseInt(jobParam) : 10; - // 2.查询需要处理的退款订单 - PageDTO result = refundOrderService.queryRefundingOrderByPage(index, size); - if (result.isEmpty()) { - return; - } - // 3.逐个检查退款单 - for (RefundOrder refundOrder : result.getList()) { - try { - refundOrderService.checkRefundOrder(refundOrder); - } catch (Exception e) { - log.error("处理退款订单状态异常:", e); - } - } - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/CommonPayProperties.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/CommonPayProperties.java deleted file mode 100644 index a4b90ee..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/CommonPayProperties.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.tianji.pay.third; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Data -@Component -@ConfigurationProperties(prefix = "tj.pay") -public class CommonPayProperties { - private String notifyHost; -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/IPayService.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/IPayService.java deleted file mode 100644 index 0eb9855..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/IPayService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.pay.third; - -import com.tianji.pay.third.model.PayStatusResponse; -import com.tianji.pay.third.model.PrepayResponse; -import com.tianji.pay.third.model.RefundResponse; - -/** - * 统一支付服务接口 - */ -public interface IPayService { - - PrepayResponse createPrepayOrder(String title, String orderNo, Integer amount); - - PayStatusResponse queryPayOrderStatus(String payOrderNo); - - RefundResponse refundOrder(String payOrderNo, String refundOrderNo, Integer refundAmount, Integer totalAmount); - - RefundResponse queryRefundStatus(String orderNo, String refundOrderNo); -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/AliPayService.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/AliPayService.java deleted file mode 100644 index 444af6f..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/AliPayService.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.tianji.pay.third.ali; - -import com.alipay.easysdk.factory.Factory; -import com.alipay.easysdk.kernel.util.ResponseChecker; -import com.alipay.easysdk.payment.common.models.AlipayTradeFastpayRefundQueryResponse; -import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse; -import com.alipay.easysdk.payment.common.models.AlipayTradeRefundResponse; -import com.alipay.easysdk.payment.common.models.TradeFundBill; -import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.DateUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.pay.sdk.constants.PayConstants; -import com.tianji.pay.third.CommonPayProperties; -import com.tianji.pay.third.IPayService; -import com.tianji.pay.third.model.*; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.math.BigDecimal; -import java.math.MathContext; -import java.math.RoundingMode; -import java.time.LocalDateTime; -import java.util.List; - -import static com.tianji.pay.sdk.constants.PayConstants.ALI_CHANNEL_CODE; - -@Slf4j -@Service(ALI_CHANNEL_CODE) -@RequiredArgsConstructor -public class AliPayService implements IPayService { - - private final CommonPayProperties commonPayProperties; - - @Override - public PrepayResponse createPrepayOrder(String title, String orderNo, Integer amount) { - // 1.动态获取回调地址 - String notifyUrl = commonPayProperties.getNotifyHost() + "/notify/" + PayConstants.ALI_CHANNEL_CODE; - - // 2. 发起API调用(以创建当面付收款二维码为例) - AlipayTradePrecreateResponse response = null; - try { - response = Factory.Payment.FaceToFace() - .asyncNotify(notifyUrl) - .preCreate(title, orderNo, transferAmount2String(amount)); - } catch (Exception e) { - log.error("支付宝预下单失败,订单id:{}", orderNo, e); - throw new CommonException("支付宝预下单失败", e); - } - // 3.处理响应 - PrepayResponse.PrepayResponseBuilder builder = PrepayResponse.builder(); - if (ResponseChecker.success(response)) { - // 3.1.响应结果正常 - builder.success(true).payUrl(response.getQrCode()); - } else { - // 3.2.响应结果异常 - builder.success(false).code(response.getCode()).msg(response.getMsg()); - } - return builder.build(); - } - - - - @Override - public PayStatusResponse queryPayOrderStatus(String payOrderNo) { - // 1.发起请求 - AlipayTradeQueryResponse response = null; - try { - response = Factory.Payment.Common().query(payOrderNo); - } catch (Exception e) { - log.error("支付宝查询支付单状态失败,订单id:{}", payOrderNo, e); - throw new CommonException("支付宝查询支付单状态失败", e); - } - // 2.解析 - if (!ResponseChecker.success(response)) { - // 2.1.响应结果异常 - return PayStatusResponse.builder().success(false).code(response.getCode()).msg(response.getMsg()).build(); - } - // 2.2.响应结果正常 - String success_time = response.getSendPayDate(); - LocalDateTime successTime = StringUtils.isBlank(success_time) ? - LocalDateTime.now() : DateUtils.parse(success_time, DateUtils.DEFAULT_DATE_TIME_FORMAT); - return PayStatusResponse.builder().success(true) - .payStatus(PayStatus.valueOf(response.getTradeStatus()).getValue()) - .payOrderNo(response.getOutTradeNo()) - .totalAmount(transferStringAmount2Int(response.getTotalAmount())) - .successTime(successTime) - .build(); - } - - @Override - public RefundResponse refundOrder(String payOrderNo, String refundOrderNo, Integer refundAmount, Integer totalAmount) { - // 1.发起请求 - AlipayTradeRefundResponse response = null; - try { - response = Factory.Payment.Common() - .optional("query_options", List.of("refund_detail_item_list")) - .optional("out_request_no", refundOrderNo) - .refund(payOrderNo, transferAmount2String(refundAmount)); - } catch (Exception e) { - log.error("支付宝申请退款失败,订单id:{} ,退款订单id:{}", payOrderNo, refundOrderNo, e); - throw new CommonException("支付宝申请退款失败", e); - } - // 2.解析响应 - if (!ResponseChecker.success(response)) { - // 2.1.响应结果异常 - return RefundResponse.builder().success(false).code(response.getSubCode()).msg(response.getSubMsg()).build(); - } - // 2.2.响应结果正常,获取响应细节数据 - List refundDetailItemList = response.getRefundDetailItemList(); - boolean hasDetail = CollUtils.isEmpty(refundDetailItemList); - // 2.3.获取退款成功标示 - boolean success = StringUtils.equals(response.getFundChange(), "Y"); - return RefundResponse.builder() - .success(true) - .status(success ? RefundStatus.SUCCESS.getValue(): RefundStatus.UN_KNOWN.getValue()) - .channel(hasDetail ? null : refundDetailItemList.get(0).fundChannel) - .amount(hasDetail ? null : transferStringAmount2Int(refundDetailItemList.get(0).getAmount())) - .build(); - } - - @Override - public RefundResponse queryRefundStatus(String orderNo, String refundOrderNo) { - // 1.发起请求 - AlipayTradeFastpayRefundQueryResponse response = null; - try { - response = Factory.Payment.Common().queryRefund(orderNo, refundOrderNo); - } catch (Exception e) { - log.error("支付宝查询退款单状态失败,订单id:{}", orderNo, e); - throw new CommonException("支付宝查询退款单状态失败", e); - } - // 2.解析 - if (ResponseChecker.success(response)) { - // 2.1.响应结果异常 - return RefundResponse.builder().success(false).code(response.getCode()).msg(response.getMsg()).build(); - } - // 2.2.响应结果正常 - String refundStatus = response.getRefundStatus(); - boolean refundSuccess = "REFUND_SUCCESS".equals(refundStatus); - - List details = response.getRefundDetailItemList(); - return RefundResponse.builder() - .success(true) - .status(refundSuccess ? 2 : 1) - .channel(refundSuccess ? details.get(0).fundChannel : null) - .amount(refundSuccess ? transferStringAmount2Int(details.get(0).getAmount()) : 0) - .build(); - } - - - public static int transferStringAmount2Int(String totalAmount) { - return new BigDecimal(totalAmount).multiply(BigDecimal.valueOf(100)).intValue(); - } - public static String transferAmount2String(Integer amount) { - BigDecimal b = new BigDecimal(amount); - BigDecimal result = b.divide(new BigDecimal(100), new MathContext(2, RoundingMode.HALF_UP)); - return result.toString(); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/config/AliPayConfiguration.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/config/AliPayConfiguration.java deleted file mode 100644 index 6e972b2..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/config/AliPayConfiguration.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.pay.third.ali.config; - -import com.alipay.easysdk.factory.Factory; -import com.alipay.easysdk.kernel.Config; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableConfigurationProperties(AliPayProperties.class) -public class AliPayConfiguration { - - @Bean - public Config aliPayConfig(AliPayProperties properties) { - Config config = new Config(); - config.protocol = properties.getProtocol(); - config.gatewayHost = properties.getGatewayHost(); - config.signType = properties.getSignType(); - config.appId = properties.getAppId(); - config.merchantPrivateKey = properties.getMerchantPrivateKey(); - config.alipayPublicKey = properties.getPublicKey(); - Factory.setOptions(config); - return config; - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/config/AliPayProperties.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/config/AliPayProperties.java deleted file mode 100644 index 27fc97e..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/ali/config/AliPayProperties.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.pay.third.ali.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@Data -@ConfigurationProperties(prefix = "tj.pay.ali") -public class AliPayProperties { - private String protocol = "https"; - private String gatewayHost= "openapi.alipay.com"; - private String signType = "RSA2"; - private String appId; - private String merchantPrivateKey; - private String publicKey; - private String encryptKey; -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PayStatus.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PayStatus.java deleted file mode 100644 index 4abfe5c..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PayStatus.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.pay.third.model; - -import com.tianji.common.enums.BaseEnum; -import lombok.Getter; - -@Getter -public enum PayStatus implements BaseEnum { - NOT_COMMIT(0, "未提交"), - WAIT_BUYER_PAY(1, "待支付"), - TRADE_CLOSED(2, "已关闭"), - TRADE_SUCCESS(3, "支付成功"), - TRADE_FINISHED(3, "支付成功"), - ; - private final int value; - private final String desc; - - PayStatus(int value, String desc) { - this.value = value; - this.desc = desc; - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PayStatusResponse.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PayStatusResponse.java deleted file mode 100644 index c5ab015..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PayStatusResponse.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.pay.third.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Data -public class PayStatusResponse { - private boolean success; - /** - * 业务状态码 - */ - private String code; - /** - * 业务消息 - */ - private String msg; - /** - * 支付单编号 - */ - private String payOrderNo; - /** - * 支付状态:参考: - * @see PayStatus - */ - private Integer payStatus; - /** - * 交易单的金额 - */ - private Integer totalAmount; - /** - * 支付成功时间 - */ - private LocalDateTime successTime; -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PrepayResponse.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PrepayResponse.java deleted file mode 100644 index 426ae1b..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/PrepayResponse.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.pay.third.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 预支付下单的响应结果 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class PrepayResponse { - /** - * 是否成功 - */ - private boolean success; - /** - * 支付链接,用于生产二维码 - */ - private String payUrl; - /** - * 响应状态码 - */ - private String code; - /** - * 响应消息 - */ - private String msg; - /** - * 响应细节 - */ - private String detail; -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/RefundResponse.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/RefundResponse.java deleted file mode 100644 index 9ec79e3..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/RefundResponse.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.pay.third.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@NoArgsConstructor -@AllArgsConstructor -@Builder -@Data -public class RefundResponse { - private Boolean success; - /** - * 退款渠道 - */ - private String channel; - /** - * 退款金额 - */ - private Integer amount; - /** - * 退款状态 - * @see RefundStatus - */ - private Integer status; - - private String code; - - private String msg; - - public boolean refundSuccess(){ - return RefundStatus.SUCCESS.equalsValue(status); - } - public boolean refunding(){ - return RefundStatus.UN_KNOWN.equalsValue(status); - } - public boolean refundFailed(){ - return RefundStatus.FAILED.equalsValue(status); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/RefundStatus.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/RefundStatus.java deleted file mode 100644 index 5ac6f6d..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/model/RefundStatus.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.pay.third.model; - -import com.tianji.common.enums.BaseEnum; -import lombok.Getter; - -@Getter -public enum RefundStatus implements BaseEnum { - NOT_COMMIT(0, "退款请求未提交"), - UN_KNOWN(1, "未知,可能是失败或未完成"), - SUCCESS(2, "退款成功"), - FAILED(3, "退款失败"), - ; - private final int value; - private final String desc; - - RefundStatus(int value, String desc) { - this.value = value; - this.desc = desc; - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/WxPayClient.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/WxPayClient.java deleted file mode 100644 index f9ab641..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/WxPayClient.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.tianji.pay.third.wx; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.CommonException; -import com.tianji.pay.sdk.constants.PayConstants; -import com.tianji.pay.third.CommonPayProperties; -import com.tianji.pay.third.wx.config.WxPayProperties; -import lombok.extern.slf4j.Slf4j; -import org.apache.http.NameValuePair; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.utils.URIBuilder; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.util.EntityUtils; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; - -@Slf4j -@Component -public class WxPayClient { - private final CloseableHttpClient wxPayClient; - private final ObjectMapper objectMapper; - private final CommonPayProperties payProperties; - private final String appId; - private final String mchId; - - public WxPayClient( - CloseableHttpClient wxPayClient, WxPayProperties properties, - ObjectMapper objectMapper, CommonPayProperties commonPayProperties) { - this.wxPayClient = wxPayClient; - this.objectMapper = objectMapper; - this.appId = properties.getAppId(); - this.mchId = properties.getMchId(); - this.payProperties = commonPayProperties; - } - - public String doPostJson(String requestPath, ObjectNode body) { - JsonNode node = body.get("notify_url"); - try { - // 2.准备请求 - HttpPost httpPost = new HttpPost(requestPath); - httpPost.addHeader("Accept", MediaType.APPLICATION_JSON_VALUE); - httpPost.addHeader("Content-type", MediaType.APPLICATION_JSON_UTF8_VALUE); - httpPost.setEntity(new StringEntity(objectMapper.writeValueAsString(body), StandardCharsets.UTF_8)); - // 3.发送请求 - CloseableHttpResponse response = wxPayClient.execute(httpPost); - // 4.解析响应 - return EntityUtils.toString(response.getEntity()); - } catch (JsonProcessingException e) { - throw new BadRequestException(0, "请求参数格式有误", e); - } catch (IOException e) { - log.error("微信支付请求处理异常,请求路径:{}", requestPath); - throw new CommonException("微信支付请求处理异常", e); - } - } - - public String doGetJson(String requestPath, boolean withMch, NameValuePair... params) { - try { - // 1.构建请求路径 - URIBuilder uriBuilder = new URIBuilder(requestPath); - // 2.构建请求参数 - if(withMch) { - uriBuilder.addParameter("mchid", mchId); - } - if (params != null && params.length > 0) { - uriBuilder.addParameters(Arrays.asList(params.clone())); - } - // 3.发送请求 - HttpGet httpGet = new HttpGet(uriBuilder.build()); - httpGet.addHeader("Accept", "application/json"); - CloseableHttpResponse response = wxPayClient.execute(httpGet); - // 4.解析响应 - return EntityUtils.toString(response.getEntity()); - } catch (URISyntaxException e) { - log.error("微信支付请求路径异常,请求路径:{}", requestPath); - throw new CommonException("微信支付请求路径异常", e); - } catch (IOException e) { - log.error("微信支付请求处理异常,请求路径:{}", requestPath); - throw new CommonException("微信支付请求处理异常", e); - } - } - - public ObjectNode baseParam(boolean withApp, boolean withMch, Boolean isRefund) { - ObjectNode objectNode = objectMapper.createObjectNode(); - if(withApp){ - objectNode.put("appid", appId); - } - if(withMch) { - objectNode.put("mchid", mchId); - } - if(isRefund != null) { - String notifyPath = isRefund ? "/notify/refund/" : "/notify/"; - objectNode.put("notify_url", - payProperties.getNotifyHost() + notifyPath + PayConstants.WX_CHANNEL_CODE); - } - return objectNode; - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/WxPayService.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/WxPayService.java deleted file mode 100644 index 83918d4..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/WxPayService.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.tianji.pay.third.wx; - -import cn.hutool.json.JSONObject; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.tianji.common.utils.JsonUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.pay.sdk.constants.PayConstants; -import com.tianji.pay.third.IPayService; -import com.tianji.pay.third.model.PayStatusResponse; -import com.tianji.pay.third.model.PrepayResponse; -import com.tianji.pay.third.model.RefundResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; - -@Slf4j -@Service(PayConstants.WX_CHANNEL_CODE) -@RequiredArgsConstructor -public class WxPayService implements IPayService { - - private final WxPayClient wxPayClient; - - @Override - public PrepayResponse createPrepayOrder(String title, String orderNo, Integer amount) { - // 1.请求地址 - String requestPath = "https://api.mch.weixin.qq.com/v3/pay/transactions/native"; - // 2.请求参数 - ObjectNode baseParam = wxPayClient.baseParam(true, true, false) - .put("out_trade_no", orderNo) - .put("description", title); - baseParam.putObject("amount").put("total", amount); - - // 3.发送请求 - String responseJson = wxPayClient.doPostJson(requestPath, baseParam); - - // 4.解析 - JSONObject result = JsonUtils.parseObj(responseJson); - - String codeUrl = result.getStr("code_url"); - if (codeUrl != null) { - // 4.1.响应正常,返回支付链接 - return PrepayResponse.builder() - .success(true) - .payUrl(codeUrl) - .build(); - } else { - // 4.2.响应异常,返回异常信息 - return PrepayResponse.builder() - .success(false) - .code(result.getStr("code")) - .msg(result.getStr("message")) - .detail(result.getStr("detail")) - .build(); - } - } - - @Override - public PayStatusResponse queryPayOrderStatus(String payOrderNo) { - // 1.请求地址 - String requestPath = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + payOrderNo; - // 2.发送请求 - String responseJson = wxPayClient.doGetJson(requestPath, true); - System.out.println("responseJson = " + responseJson); - // 3.解析响应 - JSONObject result = JsonUtils.parseObj(responseJson); - String code = result.getStr("code"); - String message = result.getStr("message"); - LocalDateTime successTime = result.getLocalDateTime("success_time", LocalDateTime.now()); - // 3.1.请求异常 - if(StringUtils.isNotBlank(code)){ - return PayStatusResponse.builder().success(false).code(code).msg(message).build(); - } - // 3.2.请求成功 - return PayStatusResponse.builder() - .success(true) - .payOrderNo(payOrderNo) - .payStatus(parsePayStatus(result.getStr("trade_state"))) - .msg(result.getStr("trade_state_desc")) - .totalAmount(result.getJSONObject("amount").getInt("total")) - .successTime(successTime) - .build() - ; - } - - @Override - public RefundResponse refundOrder(String payOrderNo, String refundOrderNo, Integer refundAmount, Integer totalAmount) { - // 1.请求地址 - String requestPath = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds"; - // 2.准备请求参数 - ObjectNode baseParam = wxPayClient.baseParam(false, false, true) - .put("out_trade_no", payOrderNo) - .put("out_refund_no", refundOrderNo); - baseParam.putObject("amount") - .put("refund", refundAmount) - .put("total", totalAmount) - .put("currency", "CNY") - ; - // 3.发送请求 - String responseJson = wxPayClient.doPostJson(requestPath, baseParam); - // 4.解析 - JSONObject result = JsonUtils.parseObj(responseJson); - String code = result.getStr("code"); - String message = result.getStr("message"); - // 4.1.请求异常 - if(StringUtils.isNotBlank(code)){ - return RefundResponse.builder().success(false).code(code).msg(message).build(); - } - // 4.2.请求成功 - JSONObject amount = result.getJSONObject("amount"); - String status = result.getStr("status"); - return RefundResponse.builder() - .success(true) - .channel(result.getStr("channel")) - .status(parseRefundStatus(status)) - .amount(amount == null ? 0 : amount.getInt("refund")) - .build(); - } - - @Override - public RefundResponse queryRefundStatus(String orderNo, String refundOrderNo) { - // 1.请求地址 - String requestPath = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/" + refundOrderNo; - // 2.发送请求 - String responseJson = wxPayClient.doGetJson(requestPath, false); - // 3.解析响应 - JSONObject result = JsonUtils.parseObj(responseJson); - String code = result.getStr("code"); - String message = result.getStr("message"); - // 3.1.请求异常 - if(StringUtils.isNotBlank(code)){ - return RefundResponse.builder().success(false).code(code).msg(message).build(); - } - // 3.2.请求成功 - String status = result.getStr("status"); - JSONObject amount = result.getJSONObject("amount"); - return RefundResponse.builder() - .success(true) - .channel(result.getStr("channel")) - .status(parseRefundStatus(status)) - .amount(amount == null ? 0 : amount.getInt("refund")) - .build(); - } - - private Integer parseRefundStatus(String status) { - switch (status) { - case "PROCESSING": - return 1; - case "SUCCESS": - return 2; - default: - return 3; - } - } - - private Integer parsePayStatus(String tradeState) { - switch (tradeState) { - case "REFUND": - case "CLOSED": - case "REVOKED": - return 2; - case "SUCCESS": - return 3; - default: - return 1; - } - } - -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/config/WxConfiguration.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/config/WxConfiguration.java deleted file mode 100644 index 5a05a67..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/config/WxConfiguration.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.tianji.pay.third.wx.config; - -import cn.hutool.crypto.PemUtil; -import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; -import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner; -import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials; -import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Validator; -import com.wechat.pay.contrib.apache.httpclient.cert.CertificatesManager; -import com.wechat.pay.contrib.apache.httpclient.exception.HttpCodeException; -import com.wechat.pay.contrib.apache.httpclient.exception.NotFoundException; -import org.apache.http.impl.client.CloseableHttpClient; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.GeneralSecurityException; -import java.security.PrivateKey; - -@Configuration -@EnableConfigurationProperties(WxPayProperties.class) -public class WxConfiguration { - - /** - * 微信支付证书管理器 - */ - @Bean(destroyMethod = "stop") - public CertificatesManager certificatesManager(WxPayProperties properties) - throws HttpCodeException, GeneralSecurityException, IOException { - // 1.加载私钥 - PrivateKey privateKey = PemUtil.readPemPrivateKey( - new ByteArrayInputStream(properties.getPrivateKey().getBytes(StandardCharsets.UTF_8))); - // 2.签名工具 - PrivateKeySigner privateKeySigner = new PrivateKeySigner(properties.getMchSerialNo(), privateKey); - WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(properties.getMchId(), privateKeySigner); - // 3.平台证书管理器 - CertificatesManager certificatesManager = CertificatesManager.getInstance(); - certificatesManager.putMerchant( - properties.getMchId(), wechatPay2Credentials, properties.getApiV3Key().getBytes(StandardCharsets.UTF_8)); - return certificatesManager; - } - - @Bean - public CloseableHttpClient closeableHttpClient(WxPayProperties properties, CertificatesManager certificatesManager) - throws NotFoundException { - // 1.加载私钥 - PrivateKey privateKey = PemUtil.readPemPrivateKey( - new ByteArrayInputStream(properties.getPrivateKey().getBytes(StandardCharsets.UTF_8))); - // 2.初始化 - WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create() - .withMerchant(properties.getMchId(), properties.getMchSerialNo(), privateKey) - .withValidator(new WechatPay2Validator(certificatesManager.getVerifier(properties.getMchId()))) - ; - - // 3.构建 - return builder.build(); - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/config/WxPayProperties.java b/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/config/WxPayProperties.java deleted file mode 100644 index 3c62509..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/java/com/tianji/pay/third/wx/config/WxPayProperties.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.pay.third.wx.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@Data -@ConfigurationProperties(prefix = "tj.pay.wx") -public class WxPayProperties{ - /** - * appId - */ - private String appId; - /** - * 商户号 - */ - private String mchId; - /** - * 商户证书序号 - */ - private String mchSerialNo; - /** - * 私钥字符串 - */ - private String privateKey; - /** - * APIv3秘钥 - */ - private String apiV3Key; -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap-local.yml b/tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap.yml b/tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap.yml deleted file mode 100644 index b2157c1..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,48 +0,0 @@ -server: - port: 8087 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 - error: - include-message: always #返回的响应体带上message -spring: - profiles: - active: dev - application: - name: pay-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - dataId: shared-spring.yaml # 共享spring配置 - - dataId: shared-redis.yaml # 共享redis配置 - - dataId: shared-mybatis.yaml # 共享mybatis配置 - - dataId: shared-logs.yaml # 共享日志配置 - - dataId: shared-feign.yaml # 共享feign配置 - - dataId: shared-mq.yaml # 共享mq配置 - - dataId: shared-xxljob.yaml # 共享mq配置 -tj: - swagger: - enable: true - enableResponseWrap: true - package-path: com.tianji.pay.controller - title: 智汇云课堂 - 支付中心接口文档 - description: 该服务提供微信、支付宝等各种平台的支付、退款等功能 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - jdbc: - database: tj_pay - pay: - notifyHost: https://6b9f16dd.r2.cpolar.top/ps - ali: - appId: "2021002173680104" - merchantPrivateKey: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCYTgKj2xEIJi7lqjGRuQ/XWNDRuhoMtWvQg1DzF3fDWodh6WMed5V7mi3s4zXLnm4TvHVazgLnVXJlONxG4EsVJRGp3hY1fSGAAcByRC2E8E+NdhIvaOAWUuEid6AeshfNqmePnJyHxpxf9ZYn0Bij0kM8yMwv1izkBmsuydXroQegYfias6HT+CQ9mgU0awb6ZPeGqC6sw9Tv991jOohGv4xgEVjRh69pvB8Eo1vubYJ8mhOEf5xwWkx8/n7tDa4uA7ioUlgLRxhtOkCkpTQXzLAzm8gxoJlEYL/sFR3plaPBRAafWoKdfF55W0SBXDhhNqqce+r1H4pw4IyZxqyrAgMBAAECggEAYAcnoPpZlcLFZObXFCMTutpz5xgonoSwsqppGqxcRZ7Jp1FIvof1hxYiCK8FVxnQG7+CWrtzlzoHw4yDTmjSzkUuCuVNKXJ48cWo+iLEdII0FmQweRXt3AVrj5jPKyts2K6tVx4Oj4kJRXOJthZ9wqSq4iNUooCukyL852Y467P/Me+9Vr2vQb117qLaNTwvR2GV6OZUNQPl7qKNsp86e5lREIBHPk8uhQO3KS+QPPvTDkKBH+bNo7Bu4L4J0ITdvjU9FupaQ6xfFCOrgu7P2bw9Mk2JM6jHp1hEjuoLVGA97sL6CSPhQu9s9KJbup2DGOI1qQoEATBypHFueYv4yQKBgQD57xI1iPUl3tVNH5e3yYa08NLS+mV9N3tRTjIWHbMwQKMbraaO+dGQRGiytjejao3y0EVFuqOuhbXAxtvb1pUukASqY3zW01zzVNNw8nO3zeVPo+xWLAvlnyX3MekKMYjo1dAyWBzXuPgo3D413nMiPZ8oOgtbpTyu/dTeN3NJTQKBgQCcAFWSUinmZ3x9Xr779CeX1MsKG+++C4iLP7vNP8Lf8IcPE8NnHYZTQqDuvq1Itai7UbhZX95itYqjp9SlXT4hSrMGI7qwobJ0vXxXrNN6VwZtz1N75vnIrZNHnTFMWTUBKCySLcpsqs7qCSQEv6luOQUSUH/0gaN6txOq5W4R1wKBgH4GdLIV6zc7U2beJUyBC7G1NTk5FW+8SCxJN6w7MZ2FGjncp/20Ll2GgRyMESYPlp/3MNbmM57OwUUBgN8rJnIiIJgiLlLMpTP1c+CiAIOQCK7Nw1/4Oc+BHk21FwMS0yxElASutWx5UniYBa54CqobVGOeURfXC/BZAbtDTpiJAoGAMR3B03HfE1Xd0jM0emti0+EBlEs7bmB/Oyhz3qmGl69JNqwIR7z5/9johoKuWEgpueB+5FTU1ctGvUQoJXB4EU9Nkk9JhjdC0pKeRZR6ePhRY9108XvFhTNxPYj2bo1frN+TOOsF4rTctL7wAja+B6AYQq3pu3fdmtNtc88Mmr0CgYEAuDD/PzVTLMYgEqq0ruZcCyFd0HwMV8KoC07aXXeLZT/IGtoJASFkWIxcoyK8NVZvDqoGkpaLAw3G7CmzoxpqSvyMWwHGdZy7KDV55g5O9r4Lt/dti7xt6gBYm8XB1X7cLcu0x9lYs6KL01To+Ep8DxSO7LUODQ0Utu3Pkf9W1qc=" - publicKey: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhUnjdAKwZApwZEcfq+5L0pa77Vg3mqcoXv+th8RR0SYotkPsH1f2JkbS48ySaSCM6YNWSMNfqp5qdOla2zUJOBnJ/yaBg7s7fVD6V3M2mEog8kCDYGKt/3P4VII3xYl8lFYMQ3IcFRELkxCBBCA8JDKmf5z2R4F/Z/jFFEuOwxaJvp+7Ke9OzZHYdWGNnU6QP8YYLYUeX7VNZLHEuly34ExAw6A+yJkNDsYEho2Lu31QjT2pLh9g+88MlRfiI92iN25O9NVdeM4f5RcpvBPrBQZQs9tlFmALYSFS3prIf3FAobWM+W7iwxT6J25nFIhst1DdJQfIBpaeRUJVTkn99QIDAQAB" - wx: - appId: "wx0ca99a203b1e9943" - mchId: "1561414331" - mchSerialNo: "4B3B3DC35414AD50B1B755BAF8DE9CC7CF407606" - privateKey: "-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQChXKhMDNcjxTBO\nFF2NOHai5NwChO12f3KQbmqCNEXWImqC5OtTEmcy/8Kzx8i243TtkVFv+Eqvac69\n/gpytl8sK8GFCzzUExgtejrtr3cJS//0eaJURGVG9zDPHrGV5vtXqmUPzAzX5SbM\nsIEKAZoe2bRJRz5zNNx+RMReSOC7F4xn+5tQd3XmZomwFGKO0oryKEocw5IGdYL6\n1zRkUK9yRtyDZKq7hvPv11YQgnD8+EeGgo5/0kk62sbWW545Hw1qVqkQjkOfbdtL\nQjz4BnbakUwdRn3qoCjga8QQp0EKaGbIu4haHReyP8QQZhq0KlRX6XjBbrk8k4yK\nURVkjrxVAgMBAAECggEAT7HjrSvqVdBeOzHzwnvQnENMJjJg1dW8T3k5QXVvyILW\n+C73yt+b+KQ5FXHmv+03It5Sympm+JvZcBy4LE/GUZqKyZrzQAruNgfYcuvmbsEK\neURZ2CSvoI0VnjYan16lZHbT0ymEblzO/Olv0fFYnUQItuho/51sCTENi0OTOtNt\nrWahbOnrBk+WsgmhNen+W/KdFXA9EOFKoFclAPEpCUa/mi1/w7AQecHZUISeRXix\nSZbhHIF4bf7BDXqkgtnWEkBX2hZP61TibGiRUgHvVC6V5+bi07cv7jr6IjJdNvwK\nMjAw2GgwZvyb8HvcQ0M7ULmYC6ZXYfVuvZDXJuMCAQKBgQDTAltDJ3oE1tJtk3qg\nichuWf8OKlvNmN2fxiDG+rxOgTi2gL9N3BKIYWQRo3f2B9C243Z1iM+Q/4LPii6F\niLTSPQYRcNaryB1BtNGjexHMK5NuCfZ2etx3zmYz86YiWY6ZsFuISFttdPq01MKR\nxN/gIfiXvRlv4g1SIK6vy3lpjQKBgQDDxF/Q2xNFZq8WZ4M1DW3r9EcnYgn6U8qK\nfDJFvW4VT9bHOJOxxmZ3oIccSuPky7gm9DlxRC632z1FyPu6buC7pp7X8+JJPmkq\n2c0fKYl5B5boJdBCs8QrRQ89oORFuB3/2on9N6YCMccf1VQ3kspm5GhEkO/mdN7u\nNYBRq1oX6QKBgAT77UPszskGefn0ndTk7EMPBSNEhN6aWcHIYEXS7le8XaaR6/Le\n2+E0y7RO9CpvjNKFFOs5zA1Uu7ZDQU4OKJc+scH/tFJia659ouYFpin4bYcP3S53\nQHXj/i4D90ygaOngbIkPjHlNZg6XZ/EhgVg99S1AXjVyVXY3J2knmTqRAoGAfuht\nyOJMMuBnPpnqB9ll2eFowxIeL8Zj9bSfjnBHzc8NB+cYb9WTFZfeHqw54ldiUPZf\nypqNwqiApx2semZoj51rOcmjdyHbYWkCPWJa+Te/T008HhGVaQuC3svPT5cU84jD\njYCmwKNuV6eeycwCJAOLyG9A5d/7qObMAaWYaQkCgYBge3oRaGlDujnn0UDwLppi\nytsr4TDuDvkaRLCx4OrT86Yr+gWGjo46pBYIPJ8yy59yRTVYTpDiOLLC51qweh2w\nKo6+/qtzNwp41jadphbpEgGRE+mpvUWtlj4yPkojSY83Gh36eWVGISDG95z1DDjj\nsGT8hwQgcQJHrQhWn/cltQ==\n-----END PRIVATE KEY-----" - apiV3Key: "CZBK51236435wxpay435434323FFDuv3" \ No newline at end of file diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/PayChannelMapper.xml b/tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/PayChannelMapper.xml deleted file mode 100644 index 4295ae8..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/PayChannelMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/PayOrderMapper.xml b/tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/PayOrderMapper.xml deleted file mode 100644 index 8721c63..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/PayOrderMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/RefundOrderMapper.xml b/tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/RefundOrderMapper.xml deleted file mode 100644 index ca24390..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/main/resources/mapper/RefundOrderMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-pay/tj-pay-service/src/test/java/com/tianji/pay/AliPayTest.java b/tianji-master/tj-pay/tj-pay-service/src/test/java/com/tianji/pay/AliPayTest.java deleted file mode 100644 index 84c7d25..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/test/java/com/tianji/pay/AliPayTest.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.tianji.pay; - -import com.alipay.easysdk.factory.Factory; -import com.alipay.easysdk.kernel.Config; -import com.alipay.easysdk.kernel.util.ResponseChecker; -import com.alipay.easysdk.payment.common.models.AlipayTradeCloseResponse; -import com.alipay.easysdk.payment.common.models.AlipayTradeFastpayRefundQueryResponse; -import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse; -import com.alipay.easysdk.payment.common.models.AlipayTradeRefundResponse; -import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import java.util.List; - -public class AliPayTest { - @BeforeEach - public void init(){ - Factory.setOptions(getOptions()); - } - - String orderNo = "1564894253014872066"; - String refundOrderNo1 = "21294126713451"; - String refundOrderNo2 = "21294129213452"; - @Test - void testPreCreate() { - try { - // 1. 发起API调用(以创建当面付收款二维码为例) - AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace() - .preCreate("pen lv2", orderNo, "2.00"); - // 2. 处理响应或异常 - if (ResponseChecker.success(response)) { - System.out.println(response.getQrCode()); - System.out.println(response.getHttpBody()); - System.out.println(response.getCode()); - System.out.println(response.getMsg()); - System.out.println(response.getSubCode()); - System.out.println(response.getSubMsg()); - System.out.println("调用成功"); - } else { - System.err.println("调用失败,原因:" + response.msg + "," + response.subMsg); - } - } catch (Exception e) { - System.err.println("调用遭遇异常,原因:" + e.getMessage()); - throw new RuntimeException(e.getMessage(), e); - } - } - - @Test - void testQueryPayStatus() throws Exception { - AlipayTradeQueryResponse response = Factory.Payment.Common().query(orderNo); - System.out.println("responseBody = " + response.getHttpBody()); - System.out.println("response = " + response); - } - - @Test - void testRefund() throws Exception { - AlipayTradeRefundResponse response = Factory.Payment.Common() - .optional("query_options", List.of("refund_detail_item_list")) - .optional("out_request_no", refundOrderNo1) - .refund(orderNo, "1"); - - System.out.println("response = " + response.getHttpBody()); - } - - @Test - void testQueryRefund() throws Exception { - AlipayTradeFastpayRefundQueryResponse response = Factory.Payment.Common() - .queryRefund(orderNo, refundOrderNo1); - - System.out.println("response = " + response.getHttpBody()); - } - - @Test - void testClose() throws Exception { - AlipayTradeCloseResponse response = Factory.Payment.Common().close(orderNo); - System.out.println("response = " + response.getHttpBody()); - } - - - private static Config getOptions() { - Config config = new Config(); - config.protocol = "https"; - config.gatewayHost = "openapi.alipay.com"; - config.signType = "RSA2"; - config.appId = "2021002173680104"; - // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中 - config.merchantPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCYTgKj2xEIJi7lqjGRuQ/XWNDRuhoMtWvQg1DzF3fDWodh6WMed5V7mi3s4zXLnm4TvHVazgLnVXJlONxG4EsVJRGp3hY1fSGAAcByRC2E8E+NdhIvaOAWUuEid6AeshfNqmePnJyHxpxf9ZYn0Bij0kM8yMwv1izkBmsuydXroQegYfias6HT+CQ9mgU0awb6ZPeGqC6sw9Tv991jOohGv4xgEVjRh69pvB8Eo1vubYJ8mhOEf5xwWkx8/n7tDa4uA7ioUlgLRxhtOkCkpTQXzLAzm8gxoJlEYL/sFR3plaPBRAafWoKdfF55W0SBXDhhNqqce+r1H4pw4IyZxqyrAgMBAAECggEAYAcnoPpZlcLFZObXFCMTutpz5xgonoSwsqppGqxcRZ7Jp1FIvof1hxYiCK8FVxnQG7+CWrtzlzoHw4yDTmjSzkUuCuVNKXJ48cWo+iLEdII0FmQweRXt3AVrj5jPKyts2K6tVx4Oj4kJRXOJthZ9wqSq4iNUooCukyL852Y467P/Me+9Vr2vQb117qLaNTwvR2GV6OZUNQPl7qKNsp86e5lREIBHPk8uhQO3KS+QPPvTDkKBH+bNo7Bu4L4J0ITdvjU9FupaQ6xfFCOrgu7P2bw9Mk2JM6jHp1hEjuoLVGA97sL6CSPhQu9s9KJbup2DGOI1qQoEATBypHFueYv4yQKBgQD57xI1iPUl3tVNH5e3yYa08NLS+mV9N3tRTjIWHbMwQKMbraaO+dGQRGiytjejao3y0EVFuqOuhbXAxtvb1pUukASqY3zW01zzVNNw8nO3zeVPo+xWLAvlnyX3MekKMYjo1dAyWBzXuPgo3D413nMiPZ8oOgtbpTyu/dTeN3NJTQKBgQCcAFWSUinmZ3x9Xr779CeX1MsKG+++C4iLP7vNP8Lf8IcPE8NnHYZTQqDuvq1Itai7UbhZX95itYqjp9SlXT4hSrMGI7qwobJ0vXxXrNN6VwZtz1N75vnIrZNHnTFMWTUBKCySLcpsqs7qCSQEv6luOQUSUH/0gaN6txOq5W4R1wKBgH4GdLIV6zc7U2beJUyBC7G1NTk5FW+8SCxJN6w7MZ2FGjncp/20Ll2GgRyMESYPlp/3MNbmM57OwUUBgN8rJnIiIJgiLlLMpTP1c+CiAIOQCK7Nw1/4Oc+BHk21FwMS0yxElASutWx5UniYBa54CqobVGOeURfXC/BZAbtDTpiJAoGAMR3B03HfE1Xd0jM0emti0+EBlEs7bmB/Oyhz3qmGl69JNqwIR7z5/9johoKuWEgpueB+5FTU1ctGvUQoJXB4EU9Nkk9JhjdC0pKeRZR6ePhRY9108XvFhTNxPYj2bo1frN+TOOsF4rTctL7wAja+B6AYQq3pu3fdmtNtc88Mmr0CgYEAuDD/PzVTLMYgEqq0ruZcCyFd0HwMV8KoC07aXXeLZT/IGtoJASFkWIxcoyK8NVZvDqoGkpaLAw3G7CmzoxpqSvyMWwHGdZy7KDV55g5O9r4Lt/dti7xt6gBYm8XB1X7cLcu0x9lYs6KL01To+Ep8DxSO7LUODQ0Utu3Pkf9W1qc="; - config.alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhUnjdAKwZApwZEcfq+5L0pa77Vg3mqcoXv+th8RR0SYotkPsH1f2JkbS48ySaSCM6YNWSMNfqp5qdOla2zUJOBnJ/yaBg7s7fVD6V3M2mEog8kCDYGKt/3P4VII3xYl8lFYMQ3IcFRELkxCBBCA8JDKmf5z2R4F/Z/jFFEuOwxaJvp+7Ke9OzZHYdWGNnU6QP8YYLYUeX7VNZLHEuly34ExAw6A+yJkNDsYEho2Lu31QjT2pLh9g+88MlRfiI92iN25O9NVdeM4f5RcpvBPrBQZQs9tlFmALYSFS3prIf3FAobWM+W7iwxT6J25nFIhst1DdJQfIBpaeRUJVTkn99QIDAQAB"; - //可设置异步通知接收服务地址(可选) - config.notifyUrl = "https://89fde8c.r2.cpolar.top/notify/aliPay"; - return config; - } -} diff --git a/tianji-master/tj-pay/tj-pay-service/src/test/java/com/tianji/pay/WxPayTest.java b/tianji-master/tj-pay/tj-pay-service/src/test/java/com/tianji/pay/WxPayTest.java deleted file mode 100644 index 6f9ee3b..0000000 --- a/tianji-master/tj-pay/tj-pay-service/src/test/java/com/tianji/pay/WxPayTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.tianji.pay; - -import com.tianji.pay.third.model.PayStatusResponse; -import com.tianji.pay.third.model.PrepayResponse; -import com.tianji.pay.third.model.RefundResponse; -import com.tianji.pay.third.wx.WxPayClient; -import com.tianji.pay.third.wx.WxPayService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -public class WxPayTest { - @Autowired - private WxPayClient wxPayClient; - @Autowired - private WxPayService payService; - - String orderNo = "21294121545"; - String refundOrderNo1 = "2129412671345"; - String refundOrderNo2 = "2129412921345"; - - @Test - void testPreCreate() { - PrepayResponse response = payService.createPrepayOrder("Iphone 12 128G", orderNo, 200); - System.out.println("response = " + response); - } - - @Test - void testQueryPayStatus() { - PayStatusResponse payStatusResponse = payService.queryPayOrderStatus(orderNo); - System.out.println("payStatusResponse = " + payStatusResponse); - } - - @Test - void testRefund() { - RefundResponse refundResponse = payService.refundOrder(orderNo, refundOrderNo1, 100, 200); - System.out.println("refundResponse = " + refundResponse); - } - - @Test - void testQueryRefund() { - RefundResponse refundResponse = payService.queryRefundStatus(orderNo, refundOrderNo1); - System.out.println("refundResponse = " + refundResponse); - } -} diff --git a/tianji-master/tj-promotion/pom.xml b/tianji-master/tj-promotion/pom.xml deleted file mode 100644 index 3102592..0000000 --- a/tianji-master/tj-promotion/pom.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-promotion - - - 11 - 11 - - - - com.tianji - tj-api - 1.0.0 - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.redisson - redisson - - - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus.version} - - - mysql - mysql-connector-java - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - - org.springframework.boot - spring-boot-starter-amqp - - - - - com.xuxueli - xxl-job-core - - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - - - \ No newline at end of file diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/PromotionApplication.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/PromotionApplication.java deleted file mode 100644 index 5d6ff61..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/PromotionApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.promotion; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@MapperScan("com.tianji.promotion.mapper") -@SpringBootApplication -@Slf4j -public class PromotionApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(PromotionApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - - } -} \ No newline at end of file diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/config/ExchangeCodeConfig.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/config/ExchangeCodeConfig.java deleted file mode 100644 index ff0c3a6..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/config/ExchangeCodeConfig.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.promotion.config; - -import com.tianji.promotion.utils.AESUtil; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class ExchangeCodeConfig { - /** - * 加密密钥,长度必须是256字节 - */ - @Value("${tj.promotion.aes.key}") - private String key; - /** - * 初始向量,长度必须是16字节 - */ - @Value("${tj.promotion.aes.iv}") - private String iv; - - @Bean - public AESUtil aesUtil(){ - return new AESUtil(key, iv); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/CouponStatus.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/CouponStatus.java deleted file mode 100644 index ae0ba6f..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/CouponStatus.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.promotion.constants; - -import com.tianji.common.enums.BaseEnum; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum CouponStatus implements BaseEnum { - DRAFT(1, "待发放"), - UN_ISSUE(2, "未开始"), - ISSUING(3, "发放中"), - FINISHED(4, "发放结束"), - PAUSE(5, "暂停"); - private final int value; - private final String desc; - - public static CouponStatus of(Integer value) { - if (value == null) { - return null; - } - for (CouponStatus status : values()) { - if (status.value == value) { - return status; - } - } - return null; - } - - public static String desc(Integer value) { - CouponStatus status = of(value); - return status == null ? "" : status.desc; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/DiscountType.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/DiscountType.java deleted file mode 100644 index 6546cda..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/DiscountType.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.tianji.promotion.constants; - -import com.tianji.common.enums.BaseEnum; -import com.tianji.promotion.domain.po.Coupon; -import com.tianji.promotion.strategy.discount.*; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum DiscountType implements BaseEnum { - PER_PRICE_DISCOUNT(1, "每满减"){ - @Override - public Discount getDiscount(Coupon coupon) { - return new PerPriceDiscount( - coupon.getDiscountValue(), coupon.getThresholdAmount(), coupon.getMaxDiscountAmount()); - } - }, - RATE_DISCOUNT(2, "折扣"){ - @Override - public Discount getDiscount(Coupon coupon) { - return new RateDiscount( - coupon.getDiscountValue(), coupon.getThresholdAmount(), coupon.getMaxDiscountAmount()); - } - }, - NO_THRESHOLD(3, "无门槛"){ - @Override - public Discount getDiscount(Coupon coupon) { - return new NoThresholdDiscount(coupon.getDiscountValue()); - } - }, - PRICE_DISCOUNT(4, "满减"){ - @Override - public Discount getDiscount(Coupon coupon) { - return new PriceDiscount(coupon.getDiscountValue(), coupon.getThresholdAmount()); - } - }, - ; - private final int value; - private final String desc; - - public static DiscountType of(Integer value) { - if (value == null) { - return null; - } - for (DiscountType status : values()) { - if (status.value == value) { - return status; - } - } - return null; - } - - public abstract Discount getDiscount(Coupon coupon); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ExchangeCodeStatus.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ExchangeCodeStatus.java deleted file mode 100644 index d74da38..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ExchangeCodeStatus.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.tianji.promotion.constants; - -import com.tianji.common.enums.BaseEnum; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum ExchangeCodeStatus implements BaseEnum { - UNUSED(1, "待兑换"), - USED(2, "已兑换"), - EXPIRED(3, "兑换活动已结束"), - ; - private final int value; - private final String desc; - - public static ExchangeCodeStatus of(Integer value) { - if (value == null) { - return null; - } - for (ExchangeCodeStatus status : values()) { - if (status.value == value) { - return status; - } - } - return null; - } - - public static String desc(Integer value) { - ExchangeCodeStatus status = of(value); - return status == null ? "" : status.desc; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ObtainType.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ObtainType.java deleted file mode 100644 index 93577b1..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ObtainType.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.promotion.constants; - -import com.fasterxml.jackson.annotation.JsonValue; -import com.tianji.common.enums.BaseEnum; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum ObtainType implements BaseEnum { - PUBLIC(1, "手动领取"), - ISSUE(2, "发放兑换码"), - ; - private final int value; - @JsonValue - private final String desc; - - public static ObtainType of(Integer value) { - if (value == null) { - return null; - } - for (ObtainType status : values()) { - if (status.value == value) { - return status; - } - } - return null; - } - - public static String desc(Integer value) { - ObtainType status = of(value); - return status == null ? "" : status.desc; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/PromotionErrorInfo.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/PromotionErrorInfo.java deleted file mode 100644 index 3cb6814..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/PromotionErrorInfo.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.tianji.promotion.constants; - -public interface PromotionErrorInfo { - String COUPON_NOT_EXISTS = "优惠券不存在或活动已结束"; - String COUPON_EXPIRED = "优惠券已经过期"; - String COUPON_NOT_ENOUGH = "优惠券被领完了"; - - String INVALID_COUPON_CODE = "兑换码无效或格式错误"; - String COUPON_ISSUE_EXPIRED = "优惠券已经停止发放"; - String INVALID_USER_COUPON = "用户优惠券不存在或已过期"; -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ScopeType.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ScopeType.java deleted file mode 100644 index 8775c83..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/ScopeType.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.tianji.promotion.constants; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.tianji.common.enums.BaseEnum; -import com.tianji.promotion.strategy.scope.CategoryScope; -import com.tianji.promotion.strategy.scope.CourseScope; -import com.tianji.promotion.strategy.scope.NoScope; -import com.tianji.promotion.strategy.scope.Scope; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.List; - -@Getter -@AllArgsConstructor -@JsonFormat(shape = JsonFormat.Shape.OBJECT) -public enum ScopeType implements BaseEnum { - ALL(0, "全部"){ - @Override - public Scope buildScope(List scopeIds) { - return new NoScope(); - } - }, - CATEGORY(1, "指定分类"){ - @Override - public Scope buildScope(List scopeIds) { - return new CategoryScope(scopeIds); - } - }, - COURSE(2, "指定课程") { - @Override - public Scope buildScope(List scopeIds) { - return new CourseScope(scopeIds); - } - }, - ; - private final int value; - private final String desc; - - public static final String CATEGORY_HANDLER_NAME = "CATEGORY"; - public static final String COURSE_HANDLER_NAME = "COURSE"; - - @JsonCreator - public static ScopeType of(Integer value) { - if (value == null) { - return null; - } - for (ScopeType status : values()) { - if (status.value == value) { - return status; - } - } - return null; - } - - public static String desc(Integer value) { - ScopeType status = of(value); - return status == null ? "" : status.desc; - } - - public abstract Scope buildScope(List scopeIds); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/UserCouponStatus.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/UserCouponStatus.java deleted file mode 100644 index debc489..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/constants/UserCouponStatus.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.tianji.promotion.constants; - -import com.tianji.common.enums.BaseEnum; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum UserCouponStatus implements BaseEnum { - UNUSED(1, "未使用"), - USED(2, "已使用"), - EXPIRED(3, "已过期"), - ; - private final int value; - private final String desc; - - public static UserCouponStatus of(Integer value) { - if (value == null) { - return null; - } - for (UserCouponStatus status : values()) { - if (status.value == value) { - return status; - } - } - return null; - } - - public static String desc(Integer value) { - UserCouponStatus status = of(value); - return status == null ? "" : status.desc; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/CouponController.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/CouponController.java deleted file mode 100644 index 6eb62ef..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/CouponController.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.tianji.promotion.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.promotion.domain.dto.CouponFormDTO; -import com.tianji.promotion.domain.dto.CouponIssueFormDTO; -import com.tianji.promotion.domain.query.CouponQuery; -import com.tianji.promotion.domain.vo.CouponDetailVO; -import com.tianji.promotion.domain.vo.CouponPageVO; -import com.tianji.promotion.service.ICouponService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - *

- * 优惠券的规则信息 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Api(tags = "优惠券相关接口") -@RequiredArgsConstructor -@RestController -@RequestMapping("/coupons") -public class CouponController { - - private final ICouponService couponService; - - @ApiOperation("新增优惠券") - @PostMapping - public void saveCoupon(@Valid @RequestBody CouponFormDTO couponDTO){ - couponService.saveCoupon(couponDTO); - } - - @ApiOperation("修改优惠券") - @PutMapping("{id}") - public void updateCoupon( - @ApiParam("优惠券id") @PathVariable("id") Long id, - @RequestBody CouponFormDTO couponDTO){ - couponDTO.setId(id); - couponService.updateCoupon(couponDTO); - } - - @ApiOperation("删除优惠券") - @DeleteMapping("{id}") - public void deleteById(@ApiParam("优惠券id") @PathVariable("id") Long id) { - couponService.deleteById(id); - } - - @ApiOperation("暂停优惠券发放") - @PutMapping("/{id}/pause") - public void pauseIssue(@ApiParam("优惠券id") @PathVariable("id") Long id) { - couponService.pauseIssue(id); - } - - - @ApiOperation("发放优惠券") - @PutMapping("/{id}/begin") - public void beginIssue(@Valid @RequestBody CouponIssueFormDTO couponIssueDTO) { - couponService.beginIssue(couponIssueDTO); - } - - @ApiOperation("分页查询优惠券") - @GetMapping("page") - public PageDTO queryCouponPage(CouponQuery query){ - return couponService.queryCouponPage(query); - } - - @ApiOperation("根据id查询优惠券") - @GetMapping("{id}") - public CouponDetailVO queryCouponById(@ApiParam("优惠券id") @PathVariable("id") Long id){ - return couponService.queryCouponById(id); - } - - @ApiOperation("用户领取指定优惠券") - @PostMapping("{couponId}/user") - public void snapUpCoupon(@ApiParam("优惠券id") @PathVariable("couponId") Long couponId){ - couponService.snapUpCoupon(couponId); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/ExchangeCodeController.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/ExchangeCodeController.java deleted file mode 100644 index a8044a5..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/ExchangeCodeController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.promotion.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.promotion.domain.query.CodeQuery; -import com.tianji.promotion.service.IExchangeCodeService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - *

- * 兑换码 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@RequiredArgsConstructor -@RestController -@Api(tags = "优惠券相关接口") -@RequestMapping("/codes") -public class ExchangeCodeController { - - private final IExchangeCodeService codeService; - - @ApiOperation("分页查询兑换码") - @GetMapping("page") - public PageDTO queryCodePage(@Valid CodeQuery query){ - return codeService.queryCodePage(query); - } - - @ApiOperation("兑换优惠券") - @PostMapping("/{code}/exchange") - public void exchangeCoupon(@PathVariable("code") String code){ - codeService.exchangeCoupon(code); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/UserCouponController.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/UserCouponController.java deleted file mode 100644 index 97e6b62..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/controller/UserCouponController.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.tianji.promotion.controller; - - -import com.tianji.api.dto.promotion.CouponDiscountDTO; -import com.tianji.api.dto.promotion.OrderCouponDTO; -import com.tianji.api.dto.promotion.OrderCourseDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.promotion.domain.query.UserCouponQuery; -import com.tianji.promotion.domain.vo.UserCouponVO; -import com.tianji.promotion.service.IUserCouponService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - *

- * 用户领取优惠券的记录,是真正使用的优惠券信息 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Api(tags = "优惠券相关接口") -@RequiredArgsConstructor -@RestController -@RequestMapping("/coupon/user") -public class UserCouponController { - - private final IUserCouponService userCouponService; - - @ApiOperation("分页查询我的优惠券") - @GetMapping("/page") - public PageDTO queryUserCouponPage(UserCouponQuery query){ - return userCouponService.queryUserCouponPage(query); - } - - @ApiOperation("查询指定课程的可用优惠券") - @PostMapping("/available") - public List queryAvailableCoupon(@RequestBody List orderCourses){ - return userCouponService.queryAvailableCoupon(orderCourses); - } - - @ApiOperation("根据指定课程和优惠券计算折扣") - @PostMapping("/discount") - public CouponDiscountDTO queryDiscountByCouponId( - @RequestBody OrderCouponDTO orderCouponDTO){ - return userCouponService.queryDiscountByCouponId(orderCouponDTO); - } - - @ApiOperation("核销指定优惠券") - @PutMapping("{couponId}/use/{orderId}") - public void writeOffCoupon( - @ApiParam("优惠券id") @PathVariable("couponId") Long couponId, - @ApiParam("订单id") @PathVariable("orderId") Long orderId){ - userCouponService.writeOffCoupon(couponId, orderId); - } - - @ApiOperation("退还指定优惠券") - @PutMapping("{couponId}/refund") - public void refundCoupon(@ApiParam("优惠券id") @PathVariable("couponId") Long couponId){ - userCouponService.refundCoupon(couponId); - } - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponFormDTO.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponFormDTO.java deleted file mode 100644 index cd53ae1..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponFormDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.tianji.promotion.domain.dto; - -import com.tianji.common.validate.annotations.EnumValid; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.List; - -@Data -@ApiModel(description = "优惠券表单数据") -public class CouponFormDTO{ - - @ApiModelProperty("优惠券id,新增不需要添加,更新必填") - private Long id; - - @ApiModelProperty("优惠券名称") - @NotNull(message = "优惠券名称不能为空") - @Size(max = 20, min = 4, message = "优惠券名称长度错误") - private String name; - - @ApiModelProperty("是否添限定使用范围,true:限定了,false:没限定") - private Boolean specific; - - @ApiModelProperty("优惠券使用范围") - private List scopes; - - @ApiModelProperty("优惠券类型,1:每满减,2:折扣,3:无门槛,4:普通满减") - @NotNull(message = "优惠券折扣类型不能为空") - @EnumValid(enumeration = {1,2,3,4}) - private Integer discountType; - - @ApiModelProperty("折扣门槛,0代表无门槛") - private Integer thresholdAmount; - @ApiModelProperty("折扣值,满减填抵扣金额;打折填折扣值:80标示打8折") - private Integer discountValue; - @ApiModelProperty("最大优惠金额") - private Integer maxDiscountAmount; - - @ApiModelProperty("优惠券总量") - private Integer totalNum; - @ApiModelProperty("每人领取的上限") - private Integer userLimit; - @ApiModelProperty("获取方式1:手动领取,2:指定发放(通过兑换码兑换)") - @NotNull(message = "领取方式不能为空") - @EnumValid(enumeration = {1, 2}, message = "领取方式不正确") - private Integer obtainWay; -} \ No newline at end of file diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponIssueFormDTO.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponIssueFormDTO.java deleted file mode 100644 index f0749a1..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponIssueFormDTO.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.tianji.promotion.domain.dto; - -import com.tianji.common.utils.DateUtils; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import javax.validation.constraints.Future; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "优惠券发放的表单实体") -public class CouponIssueFormDTO { - @ApiModelProperty("优惠券id") - private Long id; - @ApiModelProperty("发放开始时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - @Future(message = "发放结束时间必须晚于当前时间") - private LocalDateTime issueBeginTime; - @ApiModelProperty("发放结束时间") - @Future(message = "发放结束时间必须晚于当前时间") - @NotNull(message = "发放结束时间不能为空") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime issueEndTime; - - - @ApiModelProperty("有效天数") - private Integer termDays; - @ApiModelProperty("使用有效期开始时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime termBeginTime; - @ApiModelProperty("使用有效期结束时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime termEndTime; -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponScopeDTO.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponScopeDTO.java deleted file mode 100644 index 047be14..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/dto/CouponScopeDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.promotion.domain.dto; - -import com.tianji.common.validate.annotations.EnumValid; -import com.tianji.promotion.constants.ScopeType; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Builder; -import lombok.Data; - -import java.util.List; - -@Data -@Builder -@ApiModel(description = "优惠券使用范围") -public class CouponScopeDTO { - @ApiModelProperty("范围类型,0-不限范围,1-限定分类,2-限定课程") - @EnumValid(enumeration = {0, 1, 2}, message = "范围类型错误") - private ScopeType scopeType; - @ApiModelProperty("范围id集合") - private List scopeIds; - @ApiModelProperty("范围名称集合,新增时无需添加") - private List scopeNames; -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/Coupon.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/Coupon.java deleted file mode 100644 index 7cf807f..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/Coupon.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.tianji.promotion.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import com.tianji.promotion.constants.DiscountType; -import com.tianji.promotion.strategy.discount.Discount; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 优惠券的规则信息 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Data -@EqualsAndHashCode(callSuper = false, of = "id") -@Accessors(chain = true) -@TableName("coupon") -public class Coupon implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 优惠券id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 优惠券名称,可以和活动名称保持一致 - */ - private String name; - - /** - * 优惠券类型,1:普通券。目前就一种,保留字段 - */ - private Integer type; - - /** - * 折扣类型,1:满减,2:折扣,3:无门槛 - */ - private Integer discountType; - - /** - * 是否限定作用范围,false:不限定,true:限定。默认false - */ - @TableField("`specific`") - private Boolean specific; - - /** - * 折扣值,如果是满减则存满减金额,如果是折扣,则存折扣率,8折就是存80 - */ - private Integer discountValue; - - /** - * 使用门槛,0:表示无门槛,其他值:最低消费金额 - */ - private Integer thresholdAmount; - - /** - * 最高优惠金额,满减最大,0:表示没有限制,不为0,则表示该券有金额的限制 - */ - private Integer maxDiscountAmount; - - /** - * 优惠折扣方案的拓展参数,目前为空 - */ - private String extParam; - - /** - * 获取方式:1:手动领取,2:兑换码 - */ - private Integer obtainWay; - - /** - * 开始发放时间 - */ - private LocalDateTime issueBeginTime; - - /** - * 结束发放时间 - */ - private LocalDateTime issueEndTime; - - /** - * 优惠券有效期天数,0:表示有效期是指定有效期的 - */ - private Integer termDays; - - /** - * 优惠券有效期开始时间 - */ - private LocalDateTime termBeginTime; - - /** - * 优惠券有效期结束时间 - */ - private LocalDateTime termEndTime; - - /** - * 优惠券配置状态,1:待发放,2:未开始 3:进行中,4:已结束,5:暂停 - */ - private Integer status; - - /** - * 总数量,0:表示无限量,其他正数表示最大发放量,不超过5000 - */ - private Integer totalNum; - - /** - * 已发行数量,用于判断是否超发 - */ - private Integer issueNum; - - /** - * 每个人限领的数量,默认1 - */ - private Integer userLimit; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - @TableField(fill = FieldFill.INSERT) - private Long creater; - - /** - * 更新人 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long updater; - - public Discount discount(){ - return DiscountType.of(discountType).getDiscount(this); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/CouponScope.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/CouponScope.java deleted file mode 100644 index be8a149..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/CouponScope.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.tianji.promotion.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -import java.io.Serializable; - -/** - *

- * 优惠券作用范围信息 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("coupon_scope") -@NoArgsConstructor -public class CouponScope implements Serializable { - - private static final long serialVersionUID = 1L; - - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 范围限定类型:1-分类,2-课程,等等 - */ - private Integer type; - /** - * 优惠券id - */ - private Long couponId; - - /** - * 优惠券作用范围的业务id,例如分类id、课程id - */ - private Long bizId; - - public CouponScope(int type, Long couponId, Long bizId) { - this.type = type; - this.couponId = couponId; - this.bizId = bizId; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/ExchangeCode.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/ExchangeCode.java deleted file mode 100644 index 595d77a..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/ExchangeCode.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.tianji.promotion.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 兑换码 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("exchange_code") -public class ExchangeCode implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 兑换码id - */ - @TableId(value = "id", type = IdType.INPUT) - private Long id; - - /** - * 兑换码 - */ - private String code; - - /** - * 兑换码状态,1:待兑换,2:已兑换,3:兑换活动已结束 - */ - private Integer status; - - /** - * 兑换人 - */ - private Long userId; - - /** - * 兑换类型,1:优惠券,以后再添加其它类型 - */ - private Integer type; - - /** - * 兑换码目标id,例如兑换优惠券,该id则是优惠券的配置id - */ - private Long exchangeTargetId; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 兑换码过期时间 - */ - private LocalDateTime expiredTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/Promotion.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/Promotion.java deleted file mode 100644 index b342a51..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/Promotion.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.tianji.promotion.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 促销活动,形式多种多样,例如:优惠券 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("promotion") -public class Promotion implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 促销活动id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 活动名称 - */ - private String name; - - /** - * 促销活动类型:1-优惠券,2-分销 - */ - private Integer type; - - /** - * 是否是热门活动:true或false,默认false - */ - private Integer hot; - - /** - * 活动开始时间 - */ - private LocalDateTime beginTime; - - /** - * 活动结束时间 - */ - private LocalDateTime endTime; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - - /** - * 创建人 - */ - @TableField(fill = FieldFill.INSERT) - private Long creater; - - /** - * 更新人 - */ - @TableField(fill = FieldFill.INSERT_UPDATE) - private Long updater; - - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/UserCoupon.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/UserCoupon.java deleted file mode 100644 index 639321f..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/po/UserCoupon.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.tianji.promotion.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 用户领取优惠券的记录,是真正使用的优惠券信息 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("user_coupon") -public class UserCoupon implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 优惠券id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 优惠券的拥有者 - */ - private Long userId; - - /** - * 优惠券配置id - */ - private Long couponId; - - /** - * 优惠券可以使用结束时间 - */ - private LocalDateTime termBeginTime; - - /** - * 优惠券开始使用时间 - */ - private LocalDateTime termEndTime; - - /** - * 使用时间 - */ - private LocalDateTime usedTime; - - /** - * 使用该券的订单id - */ - private String orderId; - - /** - * 优惠券状态,1:未使用,2:已使用,3:已失效 - */ - private Integer status; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/CodeQuery.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/CodeQuery.java deleted file mode 100644 index d2cc505..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/CodeQuery.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.promotion.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotNull; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "兑换码查询参数") -public class CodeQuery extends PageQuery { - @ApiModelProperty("兑换码对应的优惠券id") - @NotNull - private Long couponId; - @ApiModelProperty("兑换码状态,1:未兑换,2:已兑换") - @NotNull - private Integer status; -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/CouponQuery.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/CouponQuery.java deleted file mode 100644 index e3afd23..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/CouponQuery.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.promotion.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "优惠券查询参数") -@Accessors(chain = true) -public class CouponQuery extends PageQuery { - - @ApiModelProperty("优惠券折扣类型:1:每满减,2:折扣,3:无门槛,4:满减") - private Integer type; - - @ApiModelProperty("优惠券状态,1:待发放,2:发放中,3:已结束, 4:取消/终止") - private Integer status; - - @ApiModelProperty("优惠券名称") - private String name; -} \ No newline at end of file diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/UserCouponQuery.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/UserCouponQuery.java deleted file mode 100644 index 599d065..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/query/UserCouponQuery.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.promotion.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "用户优惠券查询参数") -public class UserCouponQuery extends PageQuery { - @ApiModelProperty("优惠券状态,1:未使用,2:已使用,3:已过期") - private Integer status; -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/CouponDetailVO.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/CouponDetailVO.java deleted file mode 100644 index ded8413..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/CouponDetailVO.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.tianji.promotion.domain.vo; - -import com.tianji.common.utils.DateUtils; -import com.tianji.promotion.domain.dto.CouponScopeDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; -import java.util.List; - -@Data -@ApiModel(description = "优惠券详细数据") -public class CouponDetailVO { - @ApiModelProperty("优惠券id,新增不需要添加,更新必填") - private Long id; - - @ApiModelProperty("优惠券名称") - private String name; - - @ApiModelProperty("优惠券使用范围,key范围类型(0-没有限制,1-限定分类,2-限定课程),值是范围ID") - private List scopes; - - @ApiModelProperty("优惠券折扣规则") - private String rule; - - @ApiModelProperty("发放开始时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime issueBeginTime; - @ApiModelProperty("发放结束时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime issueEndTime; - - @ApiModelProperty("有效天数") - private Integer termDays; - @ApiModelProperty("使用有效期开始时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime termBeginTime; - @ApiModelProperty("使用有效期结束时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime termEndTime; - - @ApiModelProperty("优惠券总量,如果为0代表无上限") - private Integer totalNum; - @ApiModelProperty("每人领取的上限") - private Integer userLimit; - @ApiModelProperty("获取方式1:手动领取,2:指定发放(通过兑换码兑换)") - private Integer obtainWay; -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/CouponPageVO.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/CouponPageVO.java deleted file mode 100644 index 223a2b9..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/CouponPageVO.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.tianji.promotion.domain.vo; - -import com.tianji.promotion.constants.ObtainType; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "优惠券分页数据") -public class CouponPageVO { - @ApiModelProperty("优惠券id,新增不需要添加,更新必填") - private Long id; - @ApiModelProperty("优惠券名称") - private String name; - @ApiModelProperty("使用范围说明") - private String scope; - @ApiModelProperty("优惠券规则") - private String rule; - @ApiModelProperty("获取方式1:手动领取,2:指定发放(通过兑换码兑换)") - private ObtainType obtainWay; - - @ApiModelProperty("已使用") - private Integer used; - @ApiModelProperty("已发放数量") - private Integer issueNum; - @ApiModelProperty("优惠券总量,如果为0代表无上限") - private Integer totalNum; - - @ApiModelProperty("发放开始时间") - private LocalDateTime createTime; - - @ApiModelProperty("发放开始时间") - private LocalDateTime issueBeginTime; - @ApiModelProperty("发放结束时间") - private LocalDateTime issueEndTime; - - @ApiModelProperty("有效天数") - private Integer termDays; - @ApiModelProperty("使用有效期开始时间") - private LocalDateTime termBeginTime; - @ApiModelProperty("使用有效期结束时间") - private LocalDateTime termEndTime; - - @ApiModelProperty("状态") - private Integer status; -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/UserCouponVO.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/UserCouponVO.java deleted file mode 100644 index 5571a68..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/domain/vo/UserCouponVO.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tianji.promotion.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.experimental.Accessors; - -import java.time.LocalDateTime; - -@Data -@Accessors(chain = true) -@ApiModel(description = "用户优惠券") -public class UserCouponVO{ - - @ApiModelProperty("优惠券id") - private Long id; - - @ApiModelProperty("优惠券名称") - private String name; - - @ApiModelProperty("是否限定范围, false: 无限制, true:限定范围") - private Boolean specify; - - @ApiModelProperty("折扣规则") - private String rule; - - @ApiModelProperty("优惠金额") - private Integer discountValue; - - @ApiModelProperty("优惠类型,type:1:每满减,2:折扣 3:无门槛,4:普通满减") - private Integer discountType; - - @ApiModelProperty("优惠券有效期截止时间") - private LocalDateTime termEndTime; -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/handler/CouponJobHandler.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/handler/CouponJobHandler.java deleted file mode 100644 index 51e3256..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/handler/CouponJobHandler.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.promotion.handler; - -import com.tianji.common.utils.NumberUtils; -import com.tianji.promotion.service.ICouponService; -import com.xxl.job.core.context.XxlJobHelper; -import com.xxl.job.core.handler.annotation.XxlJob; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class CouponJobHandler { - - private final ICouponService couponService; - - @XxlJob("couponIssueJobHandler") - public void handleCouponIssueJob() { - // 1.获取分片信息,作为分页信息 - int page = XxlJobHelper.getShardIndex(); - String param = XxlJobHelper.getJobParam(); - int size = NumberUtils.parseInt(param); - log.debug("准备开始处理优惠券发放任务,page={},size={}", page, size); - // 2.分页处理待发放状态的优惠券 - couponService.issueCouponByPage(page, size); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/handler/PromotionMqHandler.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/handler/PromotionMqHandler.java deleted file mode 100644 index 95ec9aa..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/handler/PromotionMqHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.promotion.handler; - -import com.tianji.promotion.domain.po.UserCoupon; -import com.tianji.promotion.service.ICouponService; -import com.tianji.promotion.service.IUserCouponService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.rabbit.annotation.Exchange; -import org.springframework.amqp.rabbit.annotation.Queue; -import org.springframework.amqp.rabbit.annotation.QueueBinding; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.stereotype.Component; - -import static com.tianji.common.constants.MqConstants.Exchange.PROMOTION_EXCHANGE; -import static com.tianji.common.constants.MqConstants.Key.COUPON_RECEIVE; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PromotionMqHandler { - - private final ICouponService couponService; - private final IUserCouponService userCouponService; - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "queue.coupon.receive", durable = "true"), - exchange = @Exchange(name = PROMOTION_EXCHANGE), - key = COUPON_RECEIVE - )) - public void listenCouponReceive(UserCoupon userCoupon){ - if (userCoupon == null) { - return; - } - log.debug("处理优惠券抢购消息,用户id:{}, 券id:{},唯一token:{}", - userCoupon.getUserId(), userCoupon.getCouponId(), userCoupon.getId()); - couponService.snapUpCoupon(userCoupon); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/CouponMapper.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/CouponMapper.java deleted file mode 100644 index 2c045ae..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/CouponMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.promotion.mapper; - -import com.tianji.promotion.domain.po.Coupon; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; -import java.util.Set; - -/** - *

- * 优惠券的规则信息 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -public interface CouponMapper extends BaseMapper { - - List selectByIds(@Param("ids") Set couponIds); - - @Select("UPDATE coupon SET issue_num = issue_num + 1 WHERE id = #{id} AND issue_num < total_num") - void minusCouponIssueAmount(Long id); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/CouponScopeMapper.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/CouponScopeMapper.java deleted file mode 100644 index d250e5c..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/CouponScopeMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.promotion.mapper; - -import com.tianji.promotion.domain.po.CouponScope; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - *

- * 优惠券作用范围信息 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -public interface CouponScopeMapper extends BaseMapper { - - @Select("SELECT type, biz_id FROM coupon_biz WHERE coupon_id = #{couponId}") - List queryBizByCouponId(Long couponId); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/ExchangeCodeMapper.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/ExchangeCodeMapper.java deleted file mode 100644 index 8665731..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/ExchangeCodeMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.promotion.mapper; - -import com.tianji.promotion.domain.po.ExchangeCode; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 兑换码 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -public interface ExchangeCodeMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/PromotionMapper.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/PromotionMapper.java deleted file mode 100644 index a50423c..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/PromotionMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.promotion.mapper; - -import com.tianji.promotion.domain.po.Promotion; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 促销活动,形式多种多样,例如:优惠券 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -public interface PromotionMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/UserCouponMapper.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/UserCouponMapper.java deleted file mode 100644 index 3723d9b..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/mapper/UserCouponMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.promotion.mapper; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.promotion.domain.po.Coupon; -import com.tianji.promotion.domain.po.UserCoupon; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - *

- * 用户领取优惠券的记录,是真正使用的优惠券信息 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -public interface UserCouponMapper extends BaseMapper { - - @Select("SELECT coupon_id AS id, COUNT(1) AS num FROM user_coupon ${ew.customSqlSegment}") - List countUsedTimes(@Param("ew") QueryWrapper wrapper); - - List queryMyCoupon(@Param("userId") Long userId); - - Coupon queryCouponByUserCouponId(@Param("id") Long userCouponId); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/ICouponScopeService.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/ICouponScopeService.java deleted file mode 100644 index 2aeac6a..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/ICouponScopeService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.promotion.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.promotion.domain.po.CouponScope; -import com.tianji.promotion.strategy.scope.Scope; - -import java.util.List; - -/** - *

- * 优惠券作用范围信息 服务类 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -public interface ICouponScopeService extends IService { - - void removeByCouponId(Long couponId); - - List queryScopeByCouponId(Long couponId); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/ICouponService.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/ICouponService.java deleted file mode 100644 index 123b9d2..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/ICouponService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tianji.promotion.service; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.promotion.domain.dto.CouponFormDTO; -import com.tianji.promotion.domain.dto.CouponIssueFormDTO; -import com.tianji.promotion.domain.po.Coupon; -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.promotion.domain.po.UserCoupon; -import com.tianji.promotion.domain.query.CouponQuery; -import com.tianji.promotion.domain.vo.CouponDetailVO; -import com.tianji.promotion.domain.vo.CouponPageVO; - -/** - *

- * 优惠券的规则信息 服务类 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -public interface ICouponService extends IService { - - void saveCoupon(CouponFormDTO couponDTO); - - void deleteById(Long id); - - void updateCoupon(CouponFormDTO couponDTO); - - PageDTO queryCouponPage(CouponQuery query); - - CouponDetailVO queryCouponById(Long id); - - void pauseIssue(Long id); - - void beginIssue(CouponIssueFormDTO couponIssueDTO); - - void snapUpCoupon(Long couponId); - - void snapUpCoupon(UserCoupon userCoupon); - - void issueCouponByPage(int page, int size); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IExchangeCodeService.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IExchangeCodeService.java deleted file mode 100644 index d7add7b..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IExchangeCodeService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.promotion.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.promotion.domain.po.Coupon; -import com.tianji.promotion.domain.po.ExchangeCode; -import com.tianji.promotion.domain.query.CodeQuery; - -/** - *

- * 兑换码 服务类 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -public interface IExchangeCodeService extends IService { - - void generateExchangeCodeAsync(Coupon coupon); - - PageDTO queryCodePage(CodeQuery query); - - void exchangeCoupon(String code); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IPromotionService.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IPromotionService.java deleted file mode 100644 index ee580e8..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IPromotionService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.promotion.service; - -import com.tianji.promotion.domain.po.Promotion; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 促销活动,形式多种多样,例如:优惠券 服务类 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -public interface IPromotionService extends IService { - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IUserCouponService.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IUserCouponService.java deleted file mode 100644 index 96b9ef2..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/IUserCouponService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tianji.promotion.service; - -import com.tianji.api.dto.promotion.CouponDiscountDTO; -import com.tianji.api.dto.promotion.OrderCouponDTO; -import com.tianji.api.dto.promotion.OrderCourseDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.promotion.domain.po.Coupon; -import com.tianji.promotion.domain.po.UserCoupon; -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.promotion.domain.query.UserCouponQuery; -import com.tianji.promotion.domain.vo.UserCouponVO; - -import java.util.List; -import java.util.Map; - -/** - *

- * 用户领取优惠券的记录,是真正使用的优惠券信息 服务类 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -public interface IUserCouponService extends IService { - - Map countUsedTimes(List couponIds); - - PageDTO queryUserCouponPage(UserCouponQuery query); - - List queryAvailableCoupon(List orderCourses); - - CouponDiscountDTO queryDiscountByCouponId(OrderCouponDTO orderCouponDTO); - - int countUserReceiveNum(Long couponId, Long userId); - - void createUserCouponWithId(Coupon coupon, Long id, Long userId); - - void writeOffCoupon(Long couponId, Long orderId); - - void refundCoupon(Long couponId); - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/CouponScopeServiceImpl.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/CouponScopeServiceImpl.java deleted file mode 100644 index 99b635c..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/CouponScopeServiceImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.tianji.promotion.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.utils.CollUtils; -import com.tianji.promotion.constants.ScopeType; -import com.tianji.promotion.domain.po.CouponScope; -import com.tianji.promotion.strategy.scope.Scope; -import com.tianji.promotion.mapper.CouponScopeMapper; -import com.tianji.promotion.service.ICouponScopeService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - *

- * 优惠券作用范围信息 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Service -@RequiredArgsConstructor -public class CouponScopeServiceImpl extends ServiceImpl implements ICouponScopeService { - - @Override - public void removeByCouponId(Long couponId) { - remove(new LambdaQueryWrapper().eq(CouponScope::getCouponId, couponId)); - } - - @Override - public List queryScopeByCouponId(Long couponId) { - // 1.查询范围 - List scopes = lambdaQuery() - .eq(CouponScope::getCouponId, couponId) - .list(); - // 2.非空处理 - if (CollUtils.isEmpty(scopes)) { - return CollUtils.emptyList(); - } - // 3.数据分组 - Map> scopeMap = scopes.stream().collect( - Collectors.groupingBy( - CouponScope::getType, - Collectors.flatMapping(c -> Stream.of(c.getBizId()), Collectors.toList()))); - // 4.查询范围详细数据 - List list = new ArrayList<>(scopeMap.size()); - for (Map.Entry> en : scopeMap.entrySet()) { - list.add(ScopeType.of(en.getKey()).buildScope(en.getValue())); - } - return list; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/CouponServiceImpl.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/CouponServiceImpl.java deleted file mode 100644 index c99549f..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/CouponServiceImpl.java +++ /dev/null @@ -1,458 +0,0 @@ -package com.tianji.promotion.service.impl; - -import cn.hutool.core.bean.copier.CopyOptions; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.autoconfigure.redisson.annotations.Lock; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.*; -import com.tianji.promotion.constants.ObtainType; -import com.tianji.promotion.constants.ScopeType; -import com.tianji.promotion.domain.dto.CouponFormDTO; -import com.tianji.promotion.domain.dto.CouponIssueFormDTO; -import com.tianji.promotion.domain.dto.CouponScopeDTO; -import com.tianji.promotion.domain.po.Coupon; -import com.tianji.promotion.domain.po.CouponScope; -import com.tianji.promotion.domain.po.UserCoupon; -import com.tianji.promotion.domain.query.CouponQuery; -import com.tianji.promotion.domain.vo.CouponDetailVO; -import com.tianji.promotion.domain.vo.CouponPageVO; -import com.tianji.promotion.mapper.CouponMapper; -import com.tianji.promotion.service.ICouponScopeService; -import com.tianji.promotion.service.ICouponService; -import com.tianji.promotion.service.IExchangeCodeService; -import com.tianji.promotion.service.IUserCouponService; -import com.tianji.promotion.strategy.scope.Scope; -import com.tianji.promotion.strategy.scope.ScopeNameHandler; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static com.tianji.promotion.constants.CouponStatus.*; -import static com.tianji.promotion.constants.PromotionErrorInfo.COUPON_ISSUE_EXPIRED; -import static com.tianji.promotion.constants.PromotionErrorInfo.COUPON_NOT_EXISTS; - -/** - *

- * 优惠券的规则信息 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CouponServiceImpl extends ServiceImpl implements ICouponService { - - private final ICouponScopeService scopeService; - private final IUserCouponService userCouponService; - private final IExchangeCodeService codeService; - private final Map scopeNameHandlers; - private final StringRedisTemplate stringRedisTemplate; - private final RabbitMqHelper rabbitMqHelper; - - private final static String COUPON_CACHE_KEY_PREFIX = "promotion:cache:coupon:"; - private final static String COUPON_ORDER_KEY_PREFIX = "promotion:order:coupon:"; - - @Override - @Transactional - public void saveCoupon(CouponFormDTO couponDTO) { - // 1.判断优惠券推广方式,如果是兑换码则需要验证兑换码数量 - checkObtainWay(couponDTO); - - // 2.数据转换 - Coupon coupon = BeanUtils.copyBean(couponDTO, Coupon.class); - // 3.初始化状态 - coupon.setStatus(DRAFT.getValue()); - save(coupon); - - // 4.判断优惠券范围 - if (!coupon.getSpecific()) { - // 说明是没有限定使用范围,直接结束 - return; - } - // 5.需要设置优惠券范围,先判断是否有值 - if (CollUtils.isEmpty(couponDTO.getScopes())) { - throw new BadRequestException("优惠券范围不能为空"); - } - // 6.保存优惠券范围信息 - Long couponId = coupon.getId(); - List couponScopeList = couponDTO.getScopes().stream() - .flatMap(d -> d.getScopeIds().stream() - .map(s -> new CouponScope(d.getScopeType().getValue(), couponId, s))) - .collect(Collectors.toList()); - scopeService.saveBatch(couponScopeList); - } - - private void checkObtainWay(CouponFormDTO couponDTO) { - Integer obtainWay = couponDTO.getObtainWay(); - if (obtainWay != null && ObtainType.PUBLIC.equalsValue(obtainWay)) { - if (couponDTO.getTotalNum() < 1 || couponDTO.getTotalNum() >= 5000) { - // 兑换码数量不正确 - throw new BadRequestException("优惠券数量不正确"); - } - } - } - - @Override - public void deleteById(Long id) { - boolean success = remove(new LambdaQueryWrapper() - .eq(Coupon::getId, id) - .eq(Coupon::getStatus, DRAFT) - ); - if (!success) { - throw new BadRequestException("优惠券不存在或者优惠券正在使用中"); - } - } - - @Override - @Transactional - public void updateCoupon(CouponFormDTO couponDTO) { - // 1.校验优惠券兑换码数量 - checkObtainWay(couponDTO); - // 2.查询旧数据 - Coupon old = getById(couponDTO.getId()); - if (old == null) { - throw new BadRequestException(COUPON_NOT_EXISTS); - } - // 3.更新优惠券 - Coupon coupon = BeanUtils.copyBean(couponDTO, Coupon.class); - // 3.1.避免修改状态 - coupon.setStatus(null); - // 3.2.更新 - updateById(coupon); - - // 4.判断是否要设定新的优惠券范围 - if (couponDTO.getSpecific() == null || (!old.getSpecific() && !couponDTO.getSpecific())) { - // 4.1.本次修改没有指定范围,直接结束 - return; - } - // 4.2.本次修改指定了范围,判断范围数据是否存在 - if (couponDTO.getSpecific() && CollUtils.isEmpty(couponDTO.getScopes())) { - // 没有指定新范围,直接结束 - return; - } - - // 5.删除旧限定范围 - Long couponId = coupon.getId(); - scopeService.removeByCouponId(couponId); - - // 6.添加新范围 - List couponScopeList = couponDTO.getScopes().stream() - .flatMap(d -> d.getScopeIds().stream() - .map(s -> new CouponScope(d.getScopeType().getValue(), couponId, s))) - .collect(Collectors.toList()); - - scopeService.saveBatch(couponScopeList); - } - - @Override - public PageDTO queryCouponPage(CouponQuery query) { - // 1.分页搜索 - Page page = lambdaQuery() - .eq(query.getStatus() != null, Coupon::getStatus, query.getStatus()) - .eq(query.getType() != null, Coupon::getDiscountType, query.getType()) - .like(StringUtils.isNotBlank(query.getName()), Coupon::getName, query.getName()) - .page(query.toMpPageDefaultSortByCreateTimeDesc()); - // 2.数据处理 - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(page); - } - // 2.1.获取优惠券id - List couponIds = records.stream().map(Coupon::getId).collect(Collectors.toList()); - // 2.2.统计优惠券已经使用的数量 - Map usedTimes = userCouponService.countUsedTimes(couponIds); - - // 3.转换vo - List list = new ArrayList<>(records.size()); - for (Coupon r : records) { - CouponPageVO v = BeanUtils.toBean(r, CouponPageVO.class); - list.add(v); - v.setRule(r.discount().getRule()); - v.setUsed(usedTimes.getOrDefault(r.getId(), 0)); - v.setScope(r.getSpecific() ? "部分课程可用" : "全部课程可用"); - v.setObtainWay(ObtainType.of(r.getObtainWay())); - } - return PageDTO.of(page, list); - } - - @Override - public CouponDetailVO queryCouponById(Long id) { - // 1.查询优惠券 - Coupon coupon = getById(id); - if (coupon == null) { - throw new BadRequestException(COUPON_NOT_EXISTS); - } - - // 2.数据转换 - CouponDetailVO vo = BeanUtils.toBean(coupon, CouponDetailVO.class); - - // 3.查询优惠券关联的使用范围 - Boolean specific = coupon.getSpecific(); - // 3.1.没有限定范围,无需额外查询 - if (!specific) { - return vo; - } - // 3.2.限定使用范围,查询范围 - List scopes = scopeService.queryScopeByCouponId(id); - // 3.3.转换Scope为DTO - List scopeDTOS = scopes.stream() - .map(this::transferScopeDTO).collect(Collectors.toList()); - vo.setScopes(scopeDTOS); - - // 4.查看优惠券折扣 - vo.setRule(coupon.discount().getRule()); - return vo; - } - - @Override - public void pauseIssue(Long id) { - // 1.查询旧优惠券 - Coupon coupon = getById(id); - AssertUtils.isNotNull(coupon, COUPON_NOT_EXISTS); - - // 2.当前券状态必须是未开始或进行中 - Integer status = coupon.getStatus(); - if (!UN_ISSUE.equalsValue(status) && !ISSUING.equalsValue(status)) { - // 状态错误,直接结束 - return; - } - - // 3.更新状态 - boolean success = lambdaUpdate() - .set(Coupon::getStatus, PAUSE.getValue()) - .eq(Coupon::getId, id) - .in(Coupon::getStatus, UN_ISSUE.getValue(), ISSUING.getValue()) - .update(); - if (!success) { - // 可能是重复更新,结束 - return; - } - - // 4.删除优惠券缓存 - stringRedisTemplate.delete(COUPON_CACHE_KEY_PREFIX + id); - } - - @Override - @Transactional - public void beginIssue(CouponIssueFormDTO dto) { - // 0.券领取和使用有效期校验 - if(dto.getTermBeginTime() != null){ - // 在设置绝对使用有效期时,使用有效期必须在领取有效期之间 - if(dto.getTermBeginTime().isBefore(dto.getIssueBeginTime()) - || dto.getTermEndTime().isAfter(dto.getIssueEndTime())){ - // 使用有效期超出了领取有效期范围,无效数据 - throw new BadRequestException("使用有效期不能超出领取有效期范围"); - } - } - - Long id = dto.getId(); - // 1.查询旧优惠券 - Coupon coupon = getById(id); - AssertUtils.isNotNull(coupon, COUPON_NOT_EXISTS); - // 2.判断状态,当前券必须是暂停或待发放 - Integer status = coupon.getStatus(); - if (!PAUSE.equalsValue(status) && !DRAFT.equalsValue(status)) { - // 状态错误,直接结束 - return; - } - // 3.修改优惠券信息 - Coupon c = new Coupon(); - c.setId(id); - // 3.1.发放时间信息 - LocalDateTime now = LocalDateTime.now(); - LocalDateTime issueBeginTime = dto.getIssueBeginTime(); - // 如果开始时间为空,说明是立即开始,需要修改优惠券状态为发放中 - boolean isBegin = issueBeginTime == null || now.isAfter(issueBeginTime); - if (isBegin) { - issueBeginTime = now; - c.setStatus(ISSUING.getValue()); - }else{ - c.setStatus(UN_ISSUE.getValue()); - } - c.setIssueBeginTime(issueBeginTime); - c.setIssueEndTime(dto.getIssueEndTime()); - // 3.2.使用有效期信息 - c.setTermDays(dto.getTermDays()); - c.setTermBeginTime(dto.getTermBeginTime()); - c.setTermEndTime(dto.getTermEndTime()); - // 3.3.更新 - updateById(c); - - // 4.判断优惠券发放方式是否是手动发放,如果是的话需要生成兑换码 - if (ObtainType.ISSUE.equalsValue(coupon.getObtainWay())) { - coupon.setIssueEndTime(c.getIssueEndTime()); - codeService.generateExchangeCodeAsync(coupon); - } - - // 5.对于已经处于“进行中”状态的券,需要建立Redis缓存 - if(isBegin){ - c.setTotalNum(coupon.getTotalNum()); - c.setUserLimit(coupon.getUserLimit()); - cacheCouponInfo(c); - } - } - - @Override - @Lock(formatter = "promotion:lock:coupon:#{couponId}", unlock = true, waitTime = 30, block = true) - public void snapUpCoupon(Long couponId) { - // 1.查询优惠券缓存信息 - String key = COUPON_CACHE_KEY_PREFIX + couponId; - Map couponObj = stringRedisTemplate.opsForHash().entries(key); - AssertUtils.isNotEmpty(couponObj, COUPON_NOT_EXISTS); - Coupon coupon = BeanUtils.mapToBean(couponObj, Coupon.class, false, CopyOptions.create()); - - // 2.校验时间,优惠券领取未开始或已经结束抛出异常 - LocalDateTime now = LocalDateTime.now(); - AssertUtils.isTrue(coupon.getIssueBeginTime().isBefore(now) && coupon.getIssueEndTime().isAfter(now), - COUPON_ISSUE_EXPIRED); - - // 3.校验库存,库存不足则抛出异常 - AssertUtils.isTrue(coupon.getTotalNum() > 0, "优惠券库存不足"); - - // 4.校验每人限领数量 - Long userId = UserContext.getUser(); - if (coupon.getUserLimit() != null && coupon.getUserLimit() > 0) { - // 4.1.确认需要校验每人限领数量 - String orderKey = COUPON_ORDER_KEY_PREFIX + couponId; - // 4.2.查询当前券已领数量并验证 - Long userOrderNum = stringRedisTemplate.opsForHash().increment(orderKey, userId.toString(), 1); - AssertUtils.isTrue(userOrderNum <= coupon.getUserLimit(), "超出限领数量"); - // 4.3.未超领取上限,可以领取 - } - - // 5.可以领取,累计优惠券已领取数量 - stringRedisTemplate.opsForHash().increment(key, "totalNum", -1); - - // 6.发送MQ消息,异步修改数据库 - long id = IdWorker.getId(); - UserCoupon uc = new UserCoupon(); - uc.setId(id); - uc.setUserId(userId); - uc.setCouponId(couponId); - rabbitMqHelper.send(MqConstants.Exchange.PROMOTION_EXCHANGE, MqConstants.Key.COUPON_RECEIVE, uc); - } - - @Override - @Transactional - public void snapUpCoupon(UserCoupon userCoupon) { - Long couponId = userCoupon.getCouponId(); - Long ucId = userCoupon.getId(); - // 1.幂等校验,查看id是否已经存在 - UserCoupon c = userCouponService.getById(ucId); - if (c != null) { - // 优惠券存在了,说明是重复业务,结束 - log.error("用户领券重复处理。券:{},token:{}", couponId, ucId); - return; - } - - // 2.查询优惠券 - Coupon coupon = getById(couponId); - if (coupon == null) { - // 优惠券不存在,结束 - log.error("用户领取的优惠券不存在:{}", couponId); - return; - } - - // 3.校验时间 - LocalDateTime now = LocalDateTime.now(); - if (!ISSUING.equalsValue(coupon.getStatus()) || - coupon.getIssueBeginTime().isAfter(now) || coupon.getIssueEndTime().isBefore(now)) { - // 优惠券领取未开始或已经结束,结束 - log.error("用户领取的优惠券未开始或已经结束:{}", couponId); - return; - } - // 4.校验每人限领数量 - Long userId = userCoupon.getUserId(); - if (coupon.getUserLimit() != null && coupon.getUserLimit() > 0) { - // 4.1.需要校验每人限领数量,查询当前用户已经领取的券数量 - int userReceiveNum = userCouponService.countUserReceiveNum(couponId, userId); - if(userReceiveNum >= coupon.getUserLimit()){ - // 4.2.超出上限,结束 - log.error("用户领取的优惠券数量超出限制:券:{},数量:{}", couponId, userReceiveNum); - return; - } - } - // 5.修改券库存数量 - baseMapper.minusCouponIssueAmount(coupon.getId()); - - // 6.写入用户券 - userCouponService.createUserCouponWithId(coupon, ucId, userId); - } - - @Override - public void issueCouponByPage(int page, int size) { - // 1.分页查询“未开始”状态的优惠券 - Page p = lambdaQuery() - .eq(Coupon::getStatus, UN_ISSUE.getValue()) - .page(new Page<>(page, size)); - // 2.判断是否有需要处理的数据 - List records = p.getRecords(); - if (CollUtils.isEmpty(records)) { - // 没有数据,结束本次任务 - return; - } - // 3.找到需要处理的数据(已经过了发送日期的) - LocalDateTime now = LocalDateTime.now(); - List list = records.stream() - .filter(c -> now.isAfter(c.getIssueBeginTime())) - .collect(Collectors.toList()); - if(list.size() < 1){ - // 没有到期的券 - return; - } - log.debug("找到需要处理的优惠券{}条", list.size()); - - // 4.修改券状态 - List ids = list.stream().map(Coupon::getId).collect(Collectors.toList()); - lambdaUpdate() - .set(Coupon::getStatus, ISSUING.getValue()) - .in(Coupon::getId, ids) - .update(); - - // 5.找到手动领取的优惠券,建立Redis缓存 - list.stream().filter(c -> ObtainType.PUBLIC.equalsValue(c.getObtainWay())) - .forEach(this::cacheCouponInfo); - } - - private void cacheCouponInfo(Coupon c) { - Map map = new HashMap<>(); - map.put("issueBeginTime", String.valueOf(DateUtils.toEpochMilli(c.getIssueBeginTime()))); - map.put("issueEndTime", String.valueOf(DateUtils.toEpochMilli(c.getIssueEndTime()))); - map.put("totalNum", String.valueOf(c.getTotalNum())); - map.put("userLimit", String.valueOf(c.getUserLimit())); - stringRedisTemplate.opsForHash().putAll(COUPON_CACHE_KEY_PREFIX + c.getId(), map); - } - - private CouponScopeDTO transferScopeDTO(Scope s) { - if (s.getType() == ScopeType.ALL) { - // 没有范围要求 - return CouponScopeDTO.builder().scopeType(ScopeType.ALL).build(); - } - ScopeNameHandler handler = scopeNameHandlers.get(s.getType().name()); - if (handler == null) { - throw new BadRequestException("错误的范围类型"); - } - return CouponScopeDTO.builder() - .scopeType(s.getType()) - .scopeIds(s.getScopeIds()) - .scopeNames(handler.getNameByIds(s.getScopeIds())) - .build(); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/ExchangeCodeServiceImpl.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/ExchangeCodeServiceImpl.java deleted file mode 100644 index 33e42f5..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/ExchangeCodeServiceImpl.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.tianji.promotion.service.impl; - -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.BooleanUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.promotion.constants.ExchangeCodeStatus; -import com.tianji.promotion.domain.po.Coupon; -import com.tianji.promotion.domain.po.ExchangeCode; -import com.tianji.promotion.domain.query.CodeQuery; -import com.tianji.promotion.mapper.CouponMapper; -import com.tianji.promotion.mapper.ExchangeCodeMapper; -import com.tianji.promotion.service.IExchangeCodeService; -import com.tianji.promotion.service.IUserCouponService; -import com.tianji.promotion.utils.CodeUtil; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.BoundValueOperations; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static com.tianji.promotion.constants.PromotionErrorInfo.*; - -/** - *

- * 兑换码 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Slf4j -@Service -public class ExchangeCodeServiceImpl extends ServiceImpl implements IExchangeCodeService { - - private final static String COUPON_CODE_SERIAL_KEY = "coupon:code:serial"; - private final static String COUPON_CODE_CHECK_KEY = "coupon:code:map"; - private final CodeUtil codeUtil; - private final BoundValueOperations codeOps; - private final StringRedisTemplate stringRedisTemplate; - private final IUserCouponService userCouponService; - private final CouponMapper couponMapper; - - public ExchangeCodeServiceImpl(StringRedisTemplate stringRedisTemplate, CodeUtil codeUtil, - IUserCouponService userCouponService, CouponMapper couponMapper) { - this.codeUtil = codeUtil; - this.codeOps = stringRedisTemplate.boundValueOps(COUPON_CODE_SERIAL_KEY); - this.stringRedisTemplate = stringRedisTemplate; - this.userCouponService = userCouponService; - this.couponMapper = couponMapper; - } - - @Override - @Async("generateExchangeCodeExecutor") - public void generateExchangeCodeAsync(Coupon coupon) { - Long couponId = coupon.getId(); - Integer totalNum = coupon.getTotalNum(); - LocalDateTime issueEndTime = coupon.getIssueEndTime(); - log.debug("准备给优惠券{}生成兑换码,数量:{}", couponId, totalNum); - // 1.获取兑换码的序列号,由Redis递增生成 - Long serialNum = codeOps.increment(totalNum); - if (serialNum == null) { - serialNum = 1L; - } - // 2.准备生成兑换码 - List list = new ArrayList<>(totalNum); - for (long i = serialNum - totalNum + 1; i <= serialNum; i++) { - ExchangeCode code = new ExchangeCode(); - code.setId(i); - code.setExchangeTargetId(couponId); - code.setCode(codeUtil.generateCode(i)); - code.setExpiredTime(issueEndTime); - list.add(code); - } - // 3.写入数据库 - saveBatch(list); - log.debug("优惠券{}成功生成{}个兑换码", couponId, totalNum); - } - - @Override - public PageDTO queryCodePage(CodeQuery query) { - // 1.分页查询兑换码 - Page page = lambdaQuery() - .eq(ExchangeCode::getStatus, query.getStatus()) - .eq(ExchangeCode::getExchangeTargetId, query.getCouponId()) - .page(query.toMpPage()); - // 2.返回数据 - return PageDTO.of(page, ExchangeCode::getCode); - } - - @Override - @Transactional - public void exchangeCoupon(String code) { - // 1.根据兑换码解析信息,如果不正确此处会抛出异常 - long id = codeUtil.parseCode(code); - // 2.先校验兑换码是否已经兑换过,此处利用Redis的BitMap即可 - Boolean exists = stringRedisTemplate.opsForValue().getBit(COUPON_CODE_CHECK_KEY, id); - if (BooleanUtils.isTrue(exists)) { - // 兑换码已经兑换过了,报错 - throw new BizIllegalException("兑换码已经使用过了"); - } - // 3.兑换码未使用,查询数据库 - ExchangeCode exchangeCode = getById(id); - // 4.再次校验兑换码是否一致、兑换码是否已经兑换或过期 - if (!code.equals(exchangeCode.getCode()) - || !ExchangeCodeStatus.UNUSED.equalsValue(exchangeCode.getStatus())) { - // 兑换码与数据库码不一致、或者已经兑换或过期 - throw new BadRequestException(INVALID_COUPON_CODE); - } - - // 5.根据兑换码类型,查询对应的物品信息,目前固定是查询优惠券信息 - Coupon coupon = couponMapper.selectById(exchangeCode.getExchangeTargetId()); - if(coupon == null){ - // 5.1.优惠券不存在 - throw new BizIllegalException(COUPON_NOT_EXISTS); - } - LocalDateTime now = LocalDateTime.now(); - if (coupon.getIssueEndTime().isBefore(now)) { - // 5.2.优惠券过了签发日期 - throw new BizIllegalException(COUPON_ISSUE_EXPIRED); - } - if (coupon.getIssueNum() >= coupon.getTotalNum()) { - // 5.3.优惠券库存不足 - throw new BizIllegalException(COUPON_NOT_ENOUGH); - } - // 5.4.是否有限领数量 - Integer userLimit = coupon.getUserLimit(); - Long userId = UserContext.getUser(); - if(userLimit != null && userLimit > 0){ - // 有限领数量,查询是否已经领取过 - int userReceiveNum = userCouponService.countUserReceiveNum(coupon.getId(), userId); - if (userReceiveNum >= userLimit) { - // 超出领取数量 - throw new BizIllegalException("领取次数过多"); - } - } - - // 6.生成用户券 - userCouponService.createUserCouponWithId(coupon, IdWorker.getId(), userId); - - // 7.修改兑换码状态 - lambdaUpdate() - .set(ExchangeCode::getStatus, ExchangeCodeStatus.USED.getValue()) - .set(ExchangeCode::getUserId, userId) - .eq(ExchangeCode::getId, id) - .update(); - - // 8.减优惠券库存 - couponMapper.minusCouponIssueAmount(coupon.getId()); - // 9.设置BitMap - stringRedisTemplate.opsForValue().setBit(COUPON_CODE_CHECK_KEY, id, true); - } - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/PromotionServiceImpl.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/PromotionServiceImpl.java deleted file mode 100644 index a1cc3ca..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/PromotionServiceImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.tianji.promotion.service.impl; - -import com.tianji.promotion.domain.po.Promotion; -import com.tianji.promotion.mapper.PromotionMapper; -import com.tianji.promotion.service.IPromotionService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; - -/** - *

- * 促销活动,形式多种多样,例如:优惠券 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Service -public class PromotionServiceImpl extends ServiceImpl implements IPromotionService { - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/UserCouponServiceImpl.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/UserCouponServiceImpl.java deleted file mode 100644 index 484b1ad..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/service/impl/UserCouponServiceImpl.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.tianji.promotion.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.api.dto.promotion.CouponDiscountDTO; -import com.tianji.api.dto.promotion.OrderCouponDTO; -import com.tianji.api.dto.promotion.OrderCourseDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.AssertUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.promotion.constants.PromotionErrorInfo; -import com.tianji.promotion.constants.UserCouponStatus; -import com.tianji.promotion.domain.po.Coupon; -import com.tianji.promotion.domain.po.UserCoupon; -import com.tianji.promotion.domain.query.UserCouponQuery; -import com.tianji.promotion.domain.vo.UserCouponVO; -import com.tianji.promotion.strategy.discount.Discount; -import com.tianji.promotion.strategy.scope.Scope; -import com.tianji.promotion.mapper.CouponMapper; -import com.tianji.promotion.mapper.UserCouponMapper; -import com.tianji.promotion.service.ICouponScopeService; -import com.tianji.promotion.service.IUserCouponService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -/** - *

- * 用户领取优惠券的记录,是真正使用的优惠券信息 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-09-06 - */ -@Service -@RequiredArgsConstructor -public class UserCouponServiceImpl extends ServiceImpl implements IUserCouponService { - - private final CouponMapper couponMapper; - private final ICouponScopeService scopeService; - - @Override - @SuppressWarnings("all") - public Map countUsedTimes(List couponIds) { - // 1.查询条件 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda() - .in(UserCoupon::getCouponId, couponIds) - .eq(UserCoupon::getStatus, UserCouponStatus.USED.getValue()) - .groupBy(UserCoupon::getCouponId); - // 2.统计数量 - List list = getBaseMapper().countUsedTimes(wrapper); - // 3.数据转换 - return IdAndNumDTO.toMap(list); - } - - @Override - public PageDTO queryUserCouponPage(UserCouponQuery query) { - // 1.查询数据 - Page page = lambdaQuery() - .eq(query.getStatus() != null, UserCoupon::getStatus, query.getStatus()) - .page(query.toMpPage("term_end_time", true)); - - // 2.非空处理 - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(page); - } - - // 3.查询优惠券规则 - Set couponIds = records.stream().map(UserCoupon::getCouponId).collect(Collectors.toSet()); - List coupons = couponMapper.selectByIds(couponIds); - if (coupons == null || coupons.size() != couponIds.size()) { - // 优惠券信息找不到 - throw new BizIllegalException("优惠券数据异常"); - } - Map couponMap = coupons.stream().collect(Collectors.toMap(Coupon::getId, c -> c)); - // 4.转VO - return PageDTO.of(page, userCoupon -> { - Coupon coupon = couponMap.get(userCoupon.getCouponId()); - UserCouponVO v = new UserCouponVO(); - v.setName(coupon.getName()); - v.setDiscountType(coupon.getDiscountType()); - v.setSpecify(coupon.getSpecific()); - v.setDiscountValue(coupon.getDiscountValue()); - v.setRule(coupon.discount().getRule()); - v.setId(userCoupon.getId()); - v.setTermEndTime(userCoupon.getTermEndTime()); - return v; - }); - } - - @Override - public List queryAvailableCoupon(List courses) { - // 1.查询出用户的所有可用优惠券 - List coupons = baseMapper.queryMyCoupon(UserContext.getUser()); - if (CollUtils.isEmpty(coupons)) { - return CollUtils.emptyList(); - } - - List list = new ArrayList<>(); - // 2.过滤优惠券,判断是否可用(范围判断、金额判断) - for (Coupon coupon : coupons) { - // 2.1.尝试做优惠券计算 - CouponDiscountDTO dto = tryCalculateDiscount(courses, coupon); - // 2.2.如果结果为null,说明该券不能使用,跳过 - if (dto == null) continue; - // 2.3.存入结果 - list.add(dto); - } - // 3.返回 - return list; - } - - private CouponDiscountDTO tryCalculateDiscount(List courses, Coupon coupon) { - // 1.计算优惠券可用课程的总价 - int totalAmount; - // 2.判断是否指定了优惠券范围 - if (coupon.getSpecific()) { - // 指定范围的话,查询优惠券范围,过滤课程,计算总价 - List scopes = scopeService.queryScopeByCouponId(coupon.getId()); - totalAmount = courses.stream() - .filter(c -> scopes.stream().anyMatch(s -> s.canUse(c))) - .mapToInt(OrderCourseDTO::getPrice).sum(); - } else { - // 未指定范围的话,直接计算总价 - totalAmount = courses.stream().mapToInt(OrderCourseDTO::getPrice).sum(); - } - // 3.判断是否达到优惠券是否可对当前课程打折 - Discount discount = coupon.discount(); - if (!discount.canUse(totalAmount)) { - return null; - } - // 4.转为DTO - return new CouponDiscountDTO( - coupon.getId(), discount.getRule(), discount.calculateDiscount(totalAmount)); - } - - @Override - public CouponDiscountDTO queryDiscountByCouponId(OrderCouponDTO orderCouponDTO) { - // 1.查询用户优惠券 - Long userCouponId = orderCouponDTO.getUserCouponId(); - Coupon coupon = baseMapper.queryCouponByUserCouponId(userCouponId); - AssertUtils.isNotNull(coupon, PromotionErrorInfo.INVALID_USER_COUPON); - // 2.查询优惠券规则 - return tryCalculateDiscount(orderCouponDTO.getCourseList(), coupon); - } - - @Override - public int countUserReceiveNum(Long couponId, Long userId) { - return lambdaQuery() - .eq(UserCoupon::getUserId, userId) - .eq(UserCoupon::getCouponId, couponId) - .count(); - } - - @Override - public void createUserCouponWithId(Coupon coupon, Long id, Long userId) { - // 1.组织数据 - UserCoupon userCoupon = new UserCoupon(); - userCoupon.setId(id); - userCoupon.setCouponId(coupon.getId()); - userCoupon.setUserId(userId); - // 2.有效期计算 - Integer termDays = coupon.getTermDays(); - if (termDays == null || termDays == 0) { - // 绝对有效期,由优惠券统一指定 - userCoupon.setTermBeginTime(coupon.getTermBeginTime()); - userCoupon.setTermEndTime(coupon.getTermEndTime()); - } else { - // 相对有效期,从领取之日起的N天 - LocalDateTime now = LocalDateTime.now(); - userCoupon.setTermBeginTime(now); - userCoupon.setTermEndTime(now.plusDays(termDays)); - } - // 3.写入数据库 - save(userCoupon); - } - - @Override - public void writeOffCoupon(Long couponId, Long orderId) { - // 1.查询优惠券 - UserCoupon coupon = getById(couponId); - AssertUtils.isNotNull(coupon, PromotionErrorInfo.COUPON_NOT_EXISTS); - // 2.判断状态 - AssertUtils.isTrue(UserCouponStatus.UNUSED.equalsValue(coupon.getStatus()), - PromotionErrorInfo.INVALID_USER_COUPON); - // 3.判断有效期 - LocalDateTime now = LocalDateTime.now(); - AssertUtils.isTrue(now.isAfter( - coupon.getTermBeginTime()) && now.isBefore(coupon.getTermEndTime()), - PromotionErrorInfo.COUPON_EXPIRED); - // 4.核销,修改优惠券状态 - lambdaUpdate() - .set(UserCoupon::getStatus, UserCouponStatus.USED.getValue()) - .set(UserCoupon::getUsedTime, now) - .set(UserCoupon::getOrderId, orderId) - .eq(UserCoupon::getId, couponId) - .update(); - } - - @Override - public void refundCoupon(Long couponId) { - // 1.查询优惠券 - UserCoupon coupon = getById(couponId); - AssertUtils.isNotNull(coupon, PromotionErrorInfo.COUPON_NOT_EXISTS); - - // 2.判断状态 - if (!UserCouponStatus.USED.equalsValue(coupon.getStatus())) { - // 不是已使用状态,无需处理 - return; - } - - // 3.判断有效期,是否已经过期 - LocalDateTime now = LocalDateTime.now(); - // 如果过期,则状态为过期,否则状态为 未使用 - UserCouponStatus status = now.isAfter(coupon.getTermEndTime()) ? - UserCouponStatus.EXPIRED : UserCouponStatus.UNUSED; - - // 4.修改优惠券状态 - lambdaUpdate() - .set(UserCoupon::getStatus, status) - .eq(UserCoupon::getId, couponId) - .update(); - } - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/Discount.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/Discount.java deleted file mode 100644 index d8a053a..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/Discount.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.promotion.strategy.discount; - -/** - *

优惠券折扣功能接口

- */ -public interface Discount { - /** - * 判断当前价格是否满足优惠券使用限制 - * @param totalAmount 订单总价 - * @return 是否可以使用优惠券 - */ - boolean canUse(int totalAmount); - - /** - * 计算折扣金额 - * @param totalAmount 总金额 - * @return 折扣金额 - */ - int calculateDiscount(int totalAmount); - - /** - * 根据优惠券规则返回规则描述信息 - * @return 规则描述信息 - */ - String getRule(); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/NoThresholdDiscount.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/NoThresholdDiscount.java deleted file mode 100644 index 7f8158c..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/NoThresholdDiscount.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.promotion.strategy.discount; - -import com.tianji.common.utils.StringUtils; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class NoThresholdDiscount implements Discount{ - /** - * 折扣值,如果是满减则存满减金额,如果是折扣,则存折扣率,8折就是存80 - */ - private final int discountValue; - - private static final String RULE_TEMPLATE = "无门槛抵扣{}元"; - - @Override - public boolean canUse(int totalAmount) { - return true; - } - - @Override - public int calculateDiscount(int totalAmount) { - return discountValue; - } - - @Override - public String getRule() { - return StringUtils.format(RULE_TEMPLATE, discountValue); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/PerPriceDiscount.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/PerPriceDiscount.java deleted file mode 100644 index 602faf6..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/PerPriceDiscount.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.tianji.promotion.strategy.discount; - -import com.tianji.common.utils.StringUtils; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class PerPriceDiscount implements Discount{ - /** - * 折扣值,如果是满减则存满减金额,如果是折扣,则存折扣率,8折就是存80 - */ - private final int discountValue; - - /** - * 使用门槛,0:表示无门槛,其他值:最低消费金额 - */ - private final int thresholdAmount; - - /** - * 最高优惠金额,满减最大,0:表示没有限制,不为0,则表示该券有金额的限制 - */ - private final int maxDiscountAmount; - - private final static String RULE_TEMPLATE = "每满{}元减{}元,不超过{}元"; - - @Override - public boolean canUse(int totalAmount) { - return totalAmount >= thresholdAmount; - } - - @Override - public int calculateDiscount(int totalAmount) { - int discount = 0; - while (totalAmount >= thresholdAmount){ - discount += discountValue; - totalAmount -= thresholdAmount; - } - return Math.min(discount, maxDiscountAmount); - } - - @Override - public String getRule() { - return StringUtils.format(RULE_TEMPLATE, thresholdAmount, discountValue, maxDiscountAmount); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/PriceDiscount.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/PriceDiscount.java deleted file mode 100644 index 958ceb0..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/PriceDiscount.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.promotion.strategy.discount; - -import com.tianji.common.utils.StringUtils; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class PriceDiscount implements Discount{ - - /** - * 折扣值,如果是满减则存满减金额,如果是折扣,则存折扣率,8折就是存80 - */ - private final int discountValue; - - /** - * 使用门槛,0:表示无门槛,其他值:最低消费金额 - */ - private final int thresholdAmount; - - private static final String RULE_TEMPLATE = "满{}元减{}元"; - - - @Override - public boolean canUse(int totalAmount) { - return totalAmount >= thresholdAmount; - } - - @Override - public int calculateDiscount(int totalAmount) { - return discountValue; - } - - @Override - public String getRule() { - return StringUtils.format(RULE_TEMPLATE, thresholdAmount, discountValue); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/RateDiscount.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/RateDiscount.java deleted file mode 100644 index 295570b..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/discount/RateDiscount.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.promotion.strategy.discount; - -import com.tianji.common.utils.StringUtils; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class RateDiscount implements Discount { - /** - * 折扣值,如果是满减则存满减金额,如果是折扣,则存折扣率,8折就是存80 - */ - private final int discountValue; - - /** - * 使用门槛,0:表示无门槛,其他值:最低消费金额 - */ - private final int thresholdAmount; - - /** - * 最高优惠金额,满减最大,0:表示没有限制,不为0,则表示该券有金额的限制 - */ - private final int maxDiscountAmount; - - - private static final String RULE_TEMPLATE = "满{}元打{}折,不超过{}元"; - - @Override - public boolean canUse(int totalAmount) { - return totalAmount >= thresholdAmount; - } - - @Override - public int calculateDiscount(int totalAmount) { - // 计算折扣,扩大100倍计算,向下取整,单位是分 - return Math.min(maxDiscountAmount, totalAmount * (100 - discountValue) / 100); - } - - @Override - public String getRule() { - return StringUtils.format(RULE_TEMPLATE, thresholdAmount, discountValue, maxDiscountAmount); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CategoryScope.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CategoryScope.java deleted file mode 100644 index 31563ce..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CategoryScope.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.promotion.strategy.scope; - -import com.tianji.api.dto.promotion.OrderCourseDTO; -import com.tianji.promotion.constants.ScopeType; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.List; - -@Getter -@RequiredArgsConstructor -public class CategoryScope implements Scope { - - private final List scopeIds; - - @Override - public boolean canUse(OrderCourseDTO course) { - return scopeIds.contains(course.getCateId()); - } - - @Override - public ScopeType getType() { - return ScopeType.CATEGORY; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CategoryScopeNameHandler.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CategoryScopeNameHandler.java deleted file mode 100644 index bb00488..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CategoryScopeNameHandler.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.promotion.strategy.scope; - -import com.tianji.api.cache.CategoryCache; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.CollUtils; -import com.tianji.promotion.constants.ScopeType; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.List; - -@RequiredArgsConstructor -@Component(ScopeType.CATEGORY_HANDLER_NAME) -public class CategoryScopeNameHandler implements ScopeNameHandler { - - private final CategoryCache categoryCache; - - @Override - public List getNameByIds(List scopeIds) { - List names = categoryCache.getNameByLv3Ids(scopeIds); - if (CollUtils.isEmpty(names)) { - throw new BizIllegalException("分类信息不存在"); - } - return names; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CourseScope.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CourseScope.java deleted file mode 100644 index 208fc58..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CourseScope.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.promotion.strategy.scope; - -import com.tianji.api.dto.promotion.OrderCourseDTO; -import com.tianji.promotion.constants.ScopeType; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -import java.util.List; - -@Getter -@RequiredArgsConstructor -public class CourseScope implements Scope { - - private final List scopeIds; - - @Override - public boolean canUse(OrderCourseDTO course) { - return scopeIds.contains(course.getId()); - } - - @Override - public ScopeType getType() { - return ScopeType.COURSE; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CourseScopeNameHandler.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CourseScopeNameHandler.java deleted file mode 100644 index d6a9a5b..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/CourseScopeNameHandler.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.promotion.strategy.scope; - -import com.tianji.api.client.course.CourseClient; -import com.tianji.api.dto.course.CourseSimpleInfoDTO; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.CollUtils; -import com.tianji.promotion.constants.ScopeType; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.stream.Collectors; - -@RequiredArgsConstructor -@Component(ScopeType.COURSE_HANDLER_NAME) -public class CourseScopeNameHandler implements ScopeNameHandler { - - private final CourseClient courseClient; - - @Override - public List getNameByIds(List scopeIds) { - List infos = courseClient.getSimpleInfoList(scopeIds); - if (CollUtils.isEmpty(infos)) { - throw new BizIllegalException("课程信息不存在"); - } - return infos.stream().map(CourseSimpleInfoDTO::getName).collect(Collectors.toList()); - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/NoScope.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/NoScope.java deleted file mode 100644 index 43ce687..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/NoScope.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.promotion.strategy.scope; - -import com.tianji.api.dto.promotion.OrderCourseDTO; -import com.tianji.promotion.constants.ScopeType; - -import java.util.List; - -public class NoScope implements Scope{ - - @Override - public boolean canUse(OrderCourseDTO course) { - return true; - } - - @Override - public ScopeType getType() { - return ScopeType.ALL; - } - - @Override - public List getScopeIds() { - return null; - } - -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/Scope.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/Scope.java deleted file mode 100644 index d9c3bbd..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/Scope.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.promotion.strategy.scope; - -import com.tianji.api.dto.promotion.OrderCourseDTO; -import com.tianji.promotion.constants.ScopeType; - -import java.util.List; - -public interface Scope { - - boolean canUse(OrderCourseDTO course); - - ScopeType getType(); - - List getScopeIds(); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/ScopeNameHandler.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/ScopeNameHandler.java deleted file mode 100644 index 51aeaac..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/strategy/scope/ScopeNameHandler.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.tianji.promotion.strategy.scope; - -import java.util.List; - -public interface ScopeNameHandler { - List getNameByIds(List scopeIds); -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/AESUtil.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/AESUtil.java deleted file mode 100644 index bc96393..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/AESUtil.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.tianji.promotion.utils; - -import cn.hutool.core.util.RandomUtil; -import com.tianji.common.exceptions.CommonException; - -import javax.crypto.Cipher; -import javax.crypto.KeyGenerator; -import javax.crypto.spec.IvParameterSpec; -import java.nio.charset.StandardCharsets; -import java.security.Key; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; - -/** - * Encryption and Decryption using AES 256 Algorithm - */ -public class AESUtil { - - private static final String CIPHER_ALGORITHM = "AES/CTR/NoPadding"; - private static final String KEY_ALGORITHM = "AES"; - - private final Key secretKey; - private final IvParameterSpec ivSpec; - - public AESUtil() { - this(RandomUtil.randomString(16), RandomUtil.randomString(16)); - } - - public AESUtil(String key, String iv) { - try { - KeyGenerator generator = KeyGenerator.getInstance(KEY_ALGORITHM); - // 生成秘钥 - generator.init(256, new SecureRandom(key.getBytes(StandardCharsets.UTF_8))); - this.secretKey = generator.generateKey(); - // 生成向量 - this.ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8)); - } catch (NoSuchAlgorithmException e) { - throw new CommonException("初始化AES工具失败", e); - } - } - - public byte[] encrypt(byte[] plainBytes) { - try { - Cipher aes = Cipher.getInstance(CIPHER_ALGORITHM); - aes.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); - return aes.doFinal(plainBytes); - } catch (Exception e) { - throw new CommonException("数据加密异常", e); - } - } - - public byte[] decrypt(byte[] encryptBytes) { - try { - Cipher aes = Cipher.getInstance(CIPHER_ALGORITHM); - aes.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); - return aes.doFinal(encryptBytes); - } catch (Exception e) { - throw new CommonException("数据解密异常", e); - } - } -} \ No newline at end of file diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/Base32.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/Base32.java deleted file mode 100644 index 443db25..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/Base32.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.tianji.promotion.utils; - -import cn.hutool.core.text.StrBuilder; - -/** - * 将整数转为base32字符的工具,因为是32进制,所以每5个bit位转一次 - */ -public class Base32 { - private final static String baseChars = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; - - public static String encode(long raw) { - StrBuilder sb = new StrBuilder(); - while (raw != 0) { - int i = (int) (raw & 0b11111); - sb.append(baseChars.charAt(i)); - raw = raw >>> 5; - } - return sb.toString(); - } - - public static long decode(String code) { - long r = 0; - char[] chars = code.toCharArray(); - for (int i = chars.length - 1; i >= 0; i--) { - long n = baseChars.indexOf(chars[i]); - r = r | (n << (5*i)); - } - return r; - } - - public static String encode(byte[] raw) { - StrBuilder sb = new StrBuilder(); - int size = 0; - int temp = 0; - for (byte b : raw) { - if (size == 0) { - // 取5个bit - int index = (b >>> 3) & 0b11111; - sb.append(baseChars.charAt(index)); - // 还剩下3位 - size = 3; - temp = b & 0b111; - } else { - int index = temp << (5 - size) | (b >>> (3 + size) & ((1 << 5 - size) - 1)) ; - sb.append(baseChars.charAt(index)); - int left = 3 + size; - size = 0; - if(left >= 5){ - index = b >>> (left - 5) & ((1 << 5) - 1); - sb.append(baseChars.charAt(index)); - left = left - 5; - } - if(left == 0){ - continue; - } - temp = b & ((1 << left) - 1); - size = left; - } - } - return sb.toString(); - } - - public static byte[] decode2Byte(String code) { - char[] chars = code.toCharArray(); - byte[] bytes = new byte[(code.length() * 5 + 7 )/ 8]; - byte tmp = 0; - byte byteSize = 0; - int index = 0; - for (char c : chars) { - byte n = (byte) baseChars.indexOf(c); - if (byteSize == 0) { - tmp = n; - byteSize = 5; - } else { - int left = Math.min(8 - byteSize, 5); - tmp = (byte) (tmp << left | (n >>> (5 - left))); - byteSize += left; - if (byteSize >= 8) { - bytes[index++] = tmp; - byteSize = (byte) (5 - left); - if (byteSize == 0) { - tmp = 0; - } else { - tmp = (byte) (n & ((1 << byteSize) - 1)); - } - } - } - - } - return bytes; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/BitConverter.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/BitConverter.java deleted file mode 100644 index 3e4d146..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/BitConverter.java +++ /dev/null @@ -1,379 +0,0 @@ -package com.tianji.promotion.utils; - -import java.nio.ByteOrder; -import java.nio.charset.Charset; - -/** - * 数字转字节数组工具类 - */ -public class BitConverter { - - /** - * 以字节数组的形式返回指定的布尔值 - * @param data 一个布尔值 - * @return 长度为 1 的字节数组 - */ - public static byte[] getBytes(boolean data) { - byte[] bytes = new byte[1]; - bytes[0] = (byte) (data ? 1 : 0); - return bytes; - } - - /** - * 以字节数组的形式返回指定的 16 位有符号整数值 - * @param data 要转换的数字 - * @return 长度为 2 的字节数组 - */ - public static byte[] getBytes(short data) { - byte[] bytes = new byte[2]; - if (isLittleEndian()) { - bytes[0] = (byte) (data & 0xff); - bytes[1] = (byte) ((data & 0xff00) >> 8); - } else { - bytes[1] = (byte) (data & 0xff); - bytes[0] = (byte) ((data & 0xff00) >> 8); - } - return bytes; - } - - /** - * 以字节数组的形式返回指定的 Unicode 字符值 - * @param data 要转换的字符 - * @return 长度为 2 的字节数组 - */ - public static byte[] getBytes(char data) { - byte[] bytes = new byte[2]; - if (isLittleEndian()) { - bytes[0] = (byte) (data); - bytes[1] = (byte) (data >> 8); - } else { - bytes[1] = (byte) (data); - bytes[0] = (byte) (data >> 8); - } - return bytes; - } - - /** - * 以字节数组的形式返回指定的 32 位有符号整数值 - * @param data 要转换的数字 - * @return 长度为 4 的字节数组 - */ - public static byte[] getBytes(int data) { - byte[] bytes = new byte[4]; - if (isLittleEndian()) { - bytes[0] = (byte) (data & 0xff); - bytes[1] = (byte) ((data & 0xff00) >> 8); - bytes[2] = (byte) ((data & 0xff0000) >> 16); - bytes[3] = (byte) ((data & 0xff000000) >> 24); - } else { - bytes[3] = (byte) (data & 0xff); - bytes[2] = (byte) ((data & 0xff00) >> 8); - bytes[1] = (byte) ((data & 0xff0000) >> 16); - bytes[0] = (byte) ((data & 0xff000000) >> 24); - } - return bytes; - } - - /** - * 以字节数组的形式返回指定的 64 位有符号整数值 - * @param data 要转换的数字 - * @return 长度为 8 的字节数组 - */ - public static byte[] getBytes(long data) { - byte[] bytes = new byte[8]; - if (isLittleEndian()) { - bytes[0] = (byte) (data & 0xff); - bytes[1] = (byte) ((data >> 8) & 0xff); - bytes[2] = (byte) ((data >> 16) & 0xff); - bytes[3] = (byte) ((data >> 24) & 0xff); - bytes[4] = (byte) ((data >> 32) & 0xff); - bytes[5] = (byte) ((data >> 40) & 0xff); - bytes[6] = (byte) ((data >> 48) & 0xff); - bytes[7] = (byte) ((data >> 56) & 0xff); - } else { - bytes[7] = (byte) (data & 0xff); - bytes[6] = (byte) ((data >> 8) & 0xff); - bytes[5] = (byte) ((data >> 16) & 0xff); - bytes[4] = (byte) ((data >> 24) & 0xff); - bytes[3] = (byte) ((data >> 32) & 0xff); - bytes[2] = (byte) ((data >> 40) & 0xff); - bytes[1] = (byte) ((data >> 48) & 0xff); - bytes[0] = (byte) ((data >> 56) & 0xff); - } - return bytes; - } - - /** - * 以字节数组的形式返回指定的单精度浮点值 - * @param data 要转换的数字 - * @return 长度为 4 的字节数组 - */ - public static byte[] getBytes(float data) { - return getBytes(Float.floatToIntBits(data)); - } - - /** - * 以字节数组的形式返回指定的双精度浮点值 - * @param data 要转换的数字 - * @return 长度为 8 的字节数组 - */ - public static byte[] getBytes(double data) { - return getBytes(Double.doubleToLongBits(data)); - } - - /** - * 将指定字符串中的所有字符编码为一个字节序列 - * @param data 包含要编码的字符的字符串 - * @return 一个字节数组,包含对指定的字符集进行编码的结果 - */ - public static byte[] getBytes(String data) { - return data.getBytes(Charset.forName("UTF-8")); - } - - /** - * 将指定字符串中的所有字符编码为一个字节序列 - * @param data 包含要编码的字符的字符串 - * @param charsetName 字符集编码 - * @return 一个字节数组,包含对指定的字符集进行编码的结果 - */ - public static byte[] getBytes(String data, String charsetName) { - return data.getBytes(Charset.forName(charsetName)); - } - - /** - * 返回由字节数组转换来的布尔值 - * @param bytes 字节数组 - * @return 布尔值 - */ - public static boolean toBoolean(byte[] bytes) { - return bytes[0] == 0 ? false : true; - } - - /** - * 返回由字节数组中的指定的一个字节转换来的布尔值 - * @param bytes 字节数组 - * @param startIndex 起始下标 - * @return 布尔值 - */ - public static boolean toBoolean(byte[] bytes, int startIndex) { - return toBoolean(copyFrom(bytes, startIndex, 1)); - } - - /** - * 返回由字节数组转换来的 16 位有符号整数 - * @param bytes 字节数组 - * @return 由两个字节构成的 16 位有符号整数 - */ - public static short toShort(byte[] bytes) { - if (isLittleEndian()) { - return (short) ((0xff & bytes[0]) | (0xff00 & (bytes[1] << 8))); - } else { - return (short) ((0xff & bytes[1]) | (0xff00 & (bytes[0] << 8))); - } - } - - /** - * 返回由字节数组中的指定的两个字节转换来的 16 位有符号整数 - * @param bytes 字节数组 - * @param startIndex 起始下标 - * @return 由两个字节构成的 16 位有符号整数 - */ - public static short toShort(byte[] bytes, int startIndex) { - return toShort(copyFrom(bytes, startIndex, 2)); - } - - /** - * 返回由字节数组转换来的 Unicode 字符 - * @param bytes 字节数组 - * @return 由两个字节构成的字符 - */ - public static char toChar(byte[] bytes) { - if (isLittleEndian()) { - return (char) ((0xff & bytes[0]) | (0xff00 & (bytes[1] << 8))); - } else { - return (char) ((0xff & bytes[1]) | (0xff00 & (bytes[0] << 8))); - } - } - - /** - * 返回由字节数组中的指定的两个字节转换来的 Unicode 字符 - * @param bytes 字节数组 - * @param startIndex 起始下标 - * @return 由两个字节构成的字符 - */ - public static char toChar(byte[] bytes, int startIndex) { - return toChar(copyFrom(bytes, startIndex, 2)); - } - - /** - * 返回由字节数组转换来的 32 位有符号整数 - * @param bytes 字节数组 - * @return 由四个字节构成的 32 位有符号整数 - */ - public static int toInt(byte[] bytes) { - if (isLittleEndian()) { - return (0xff & bytes[0]) - | (0xff00 & (bytes[1] << 8)) - | (0xff0000 & (bytes[2] << 16)) - | (0xff000000 & (bytes[3] << 24)); - } else { - return (0xff & bytes[3]) - | (0xff00 & (bytes[2] << 8)) - | (0xff0000 & (bytes[1] << 16)) - | (0xff000000 & (bytes[0] << 24)); - } - } - - /** - * 返回由字节数组中的指定的四个字节转换来的 32 位有符号整数 - * @param bytes 字节数组 - * @param startIndex 起始下标 - * @return 由四个字节构成的 32 位有符号整数 - */ - public static int toInt(byte[] bytes, int startIndex) { - return toInt(copyFrom(bytes, startIndex, 4)); - } - - /** - * 返回由字节数组转换来的 64 位有符号整数 - * @param bytes 字节数组 - * @return 由八个字节构成的 64 位有符号整数 - */ - public static long toLong(byte[] bytes) { - if (isLittleEndian()) { - return (0xffL & (long) bytes[0]) - | (0xff00L & ((long) bytes[1] << 8)) - | (0xff0000L & ((long) bytes[2] << 16)) - | (0xff000000L & ((long) bytes[3] << 24)) - | (0xff00000000L & ((long) bytes[4] << 32)) - | (0xff0000000000L & ((long) bytes[5] << 40)) - | (0xff000000000000L & ((long) bytes[6] << 48)) - | (0xff00000000000000L & ((long) bytes[7] << 56)); - } else { - return (0xffL & (long) bytes[7]) - | (0xff00L & ((long) bytes[6] << 8)) - | (0xff0000L & ((long) bytes[5] << 16)) - | (0xff000000L & ((long) bytes[4] << 24)) - | (0xff00000000L & ((long) bytes[3] << 32)) - | (0xff0000000000L & ((long) bytes[2] << 40)) - | (0xff000000000000L & ((long) bytes[1] << 48)) - | (0xff00000000000000L & ((long) bytes[0] << 56)); - } - } - - /** - * 返回由字节数组中的指定的八个字节转换来的 64 位有符号整数 - * @param bytes 字节数组 - * @param startIndex 起始下标 - * @return 由八个字节构成的 64 位有符号整数 - */ - public static long toLong(byte[] bytes, int startIndex) { - return toLong(copyFrom(bytes, startIndex, 8)); - } - - /** - * 返回由字节数组转换来的单精度浮点数 - * @param bytes 字节数组 - * @return 由四个字节构成的单精度浮点数 - */ - public static float toFloat(byte[] bytes) { - return Float.intBitsToFloat(toInt(bytes)); - } - - /** - * 返回由字节数组中的指定的四个字节转换来的单精度浮点数 - * @param bytes 字节数组 - * @param startIndex 起始下标 - * @return 由四个字节构成的单精度浮点数 - */ - public static float toFloat(byte[] bytes, int startIndex) { - return Float.intBitsToFloat(toInt(copyFrom(bytes, startIndex, 4))); - } - - /** - * 返回由字节数组转换来的双精度浮点数 - * @param bytes 字节数组 - * @return 由八个字节构成的双精度浮点数 - */ - public static double toDouble(byte[] bytes) { - return Double.longBitsToDouble(toLong(bytes)); - } - - /** - * 返回由字节数组中的指定的八个字节转换来的双精度浮点数 - * @param bytes 字节数组 - * @param startIndex 起始下标 - * @return 由八个字节构成的双精度浮点数 - */ - public static double toDouble(byte[] bytes, int startIndex) { - return Double.longBitsToDouble(toLong(copyFrom(bytes, startIndex, 8))); - } - - /** - * 返回由字节数组转换来的字符串 - * @param bytes 字节数组 - * @return 字符串 - */ - public static String toString(byte[] bytes) { - return new String(bytes, Charset.forName("UTF-8")); - } - - /** - * 返回由字节数组转换来的字符串 - * @param bytes 字节数组 - * @param charsetName 字符集编码 - * @return 字符串 - */ - public static String toString(byte[] bytes, String charsetName) { - return new String(bytes, Charset.forName(charsetName)); - } - - /** - * 以字符串表示形式返回字节数组的内容 - * @param bytes 字节数组 - * @return 字符串形式的 bytes - */ - public static String toHexString(byte[] bytes) { - if (bytes == null) - return "null"; - int iMax = bytes.length - 1; - if (iMax == -1) - return "[]"; - String digits = "0123456789abcdef"; - StringBuilder b = new StringBuilder(); - b.append('['); - for (int i = 0; ; i++) { - b.append(digits.charAt((0xF0 & bytes[i]) >>> 4)); - b.append(digits.charAt(0x0F & bytes[i])); - if (i == iMax) - return b.append(']').toString(); - b.append(',').append(' '); - } - } - - - // -------------------------------------------------------------------------------------------- - - - /** - * 数组拷贝。 - * @param src 字节数组。 - * @param off 起始下标。 - * @param len 拷贝长度。 - * @return 指定长度的字节数组。 - */ - private static byte[] copyFrom(byte[] src, int off, int len) { - // return Arrays.copyOfRange(src, off, off + len); - byte[] copy = new byte[len]; - System.arraycopy(src, off, copy, 0, Math.min(src.length - off, len)); - return copy; - } - - /** - * 判断 CPU Endian 是否为 Little - * @return 判断结果 - */ - private static boolean isLittleEndian() { - return ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/CodeUtil.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/CodeUtil.java deleted file mode 100644 index 1199a8e..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/CodeUtil.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.tianji.promotion.utils; - -import com.tianji.common.constants.RegexConstants; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.StringUtils; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.Arrays; - -import static com.tianji.promotion.constants.PromotionErrorInfo.INVALID_COUPON_CODE; - -/** - *

兑换码算法说明:

- *

兑换码分为明文和密文,明文是40位二进制数,密文是长度为8的Base32编码的字符串

- *

兑换码的明文结构:

- *

32(序列号) + 8(校验码)

- * - *

兑换码的加密过程:

- *

- 首先利用由序列号s的低8位 异或 序列号的高8位 得到8位校验码 c - * - 然后拼接兑换码明文:序列号s(高32位) + 校验码c(低8位) - * - 利用AES加密明文,得到密文 - * - 利用Base32对密文转码,生成兑换码 - *

- *

兑换码的解密过程:

- *

- 首先利用Base32解码兑换码,得到字节 - * - 基于AES解密,并转为40位二进制数 - * - 取低8位,得到校验码 c - * - 取高32位,得到序列号 s - * - 验证格式:用户 序列号s的低8位 异或 序列号s的高8位 得到的结果与c比较,如果不一致,说明是无效数据 - *

- * - */ -@Component -@RequiredArgsConstructor -public class CodeUtil { - - private final AESUtil aesUtil; - - /** - * 生成兑换码 - * @param serialNum 递增序列号 - * @return 兑换码 - */ - public String generateCode(long serialNum){ - // 1.生成校验码,由序列号的低8位 异或 序列号的高8位 - long checkCode = (serialNum >>> 24 & 0xff) ^ (serialNum & 0xff); - // 2.拼接兑换码明文:序列号(32位) + 校验码(8位) - long code = serialNum << 8L | (checkCode & 0xff); - // 3.加密 - byte[] digest = aesUtil.encrypt(Arrays.copyOf(BitConverter.getBytes(code), 5)); - // 4.转码 - return Base32.encode(digest); - } - - public long parseCode(String code){ - if (StringUtils.isEmpty(code) || !code.matches(RegexConstants.COUPON_CODE_PATTERN)) { - // 兑换码格式错误 - throw new BadRequestException(INVALID_COUPON_CODE); - } - // 1.Base32解码 - byte[] bytes = Base32.decode2Byte(code); - // 2.aes解密 - byte[] decrypt = aesUtil.decrypt(bytes); - // 3.转为数字 - long num = BitConverter.toLong(Arrays.copyOf(decrypt, 8)); - // 4.获取低8位,校验码 - int checkCode = (int) (num & 0xff); - // 5.获取高32位,序列号 - long serialNum = num >>> 8 & 0xffffffffL; - // 6.验证格式: - if (((serialNum >>> 24 & 0xff) ^ (serialNum & 0xff)) != checkCode) { - throw new BadRequestException(INVALID_COUPON_CODE); - } - return serialNum; - } -} diff --git a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/PromotionUtil.java b/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/PromotionUtil.java deleted file mode 100644 index bdf3b71..0000000 --- a/tianji-master/tj-promotion/src/main/java/com/tianji/promotion/utils/PromotionUtil.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.promotion.utils; - -public class PromotionUtil { - - -} diff --git a/tianji-master/tj-promotion/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-promotion/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index 706429d..0000000 --- a/tianji-master/tj-promotion/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: c975b6f4-de7e-40ad-9b15-4a245ce7a2ef - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-promotion/src/main/resources/bootstrap.yml b/tianji-master/tj-promotion/src/main/resources/bootstrap.yml deleted file mode 100644 index 15ee1dd..0000000 --- a/tianji-master/tj-promotion/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,42 +0,0 @@ -server: - port: 8090 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 - error: - include-message: always #返回的响应体带上message -spring: - profiles: - active: dev - application: - name: promotion-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - dataId: shared-spring.yaml # 共享spring配置 - - dataId: shared-redis.yaml # 共享redis配置 - - dataId: shared-mybatis.yaml # 共享mybatis配置 - - dataId: shared-logs.yaml # 共享日志配置 - - dataId: shared-feign.yaml # 共享feign配置 - - dataId: shared-mq.yaml # 共享mq配置 - - dataId: shared-xxljob.yaml # 共享mq配置 -tj: - swagger: - enable: true - package-path: com.tianji.promotion.controller - title: 智汇云课堂 - 促销中心接口文档 - description: 该服务提供各种促销活动管理、优惠券管理等功能 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - jdbc: - database: tj_promotion - auth: - resource: - enable: true - promotion: - aes: - key: tjxt-test-key-in - iv: tjxt-test-ivinit \ No newline at end of file diff --git a/tianji-master/tj-promotion/src/main/resources/mapper/CouponBizMapper.xml b/tianji-master/tj-promotion/src/main/resources/mapper/CouponBizMapper.xml deleted file mode 100644 index 7d62920..0000000 --- a/tianji-master/tj-promotion/src/main/resources/mapper/CouponBizMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-promotion/src/main/resources/mapper/CouponMapper.xml b/tianji-master/tj-promotion/src/main/resources/mapper/CouponMapper.xml deleted file mode 100644 index 1d24549..0000000 --- a/tianji-master/tj-promotion/src/main/resources/mapper/CouponMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - diff --git a/tianji-master/tj-promotion/src/main/resources/mapper/ExchangeCodeMapper.xml b/tianji-master/tj-promotion/src/main/resources/mapper/ExchangeCodeMapper.xml deleted file mode 100644 index 40715c7..0000000 --- a/tianji-master/tj-promotion/src/main/resources/mapper/ExchangeCodeMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-promotion/src/main/resources/mapper/PromotionMapper.xml b/tianji-master/tj-promotion/src/main/resources/mapper/PromotionMapper.xml deleted file mode 100644 index b6cd380..0000000 --- a/tianji-master/tj-promotion/src/main/resources/mapper/PromotionMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-promotion/src/main/resources/mapper/UserCouponMapper.xml b/tianji-master/tj-promotion/src/main/resources/mapper/UserCouponMapper.xml deleted file mode 100644 index 5bf61da..0000000 --- a/tianji-master/tj-promotion/src/main/resources/mapper/UserCouponMapper.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - diff --git a/tianji-master/tj-promotion/src/test/java/com/tianji/promotion/EncryptTest.java b/tianji-master/tj-promotion/src/test/java/com/tianji/promotion/EncryptTest.java deleted file mode 100644 index 4dbab6c..0000000 --- a/tianji-master/tj-promotion/src/test/java/com/tianji/promotion/EncryptTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.tianji.promotion; - -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.crypto.SecureUtil; -import cn.hutool.crypto.digest.HMac; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.promotion.utils.AESUtil; -import com.tianji.promotion.utils.Base32; -import com.tianji.promotion.utils.BitConverter; -import com.tianji.promotion.utils.CodeUtil; -import org.junit.jupiter.api.Test; - -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; - -public class EncryptTest { - private static final String CIPHER_ALGORITHM = "AES/CTR/NoPadding"; - private AESUtil aesUtil = new AESUtil("tjxt-test-key-in", "tjxt-test-ivinit"); - @Test - void testRC4() throws NoSuchAlgorithmException, Exception { - String encode = encode(1124); - System.out.println("encode1 = " + encode); - System.out.println("num1 = " + decode(encode)); - System.out.println("num1 = " + decode(encode + "A")); - encode = encode(1125); - System.out.println("encode2 = " + encode); - System.out.println("num2 = " + decode(encode)); - encode = encode(1126); - System.out.println("encode3 = " + encode); - System.out.println("num3 = " + decode(encode)); - - } - - private String encode(int serialNum){ - // 1.对序列号加密,生成32数据作为秘钥 - byte[] encrypt = aesUtil.encrypt(BitConverter.getBytes(serialNum)); - // 2.用加密密文作为 HMac的秘钥, - HMac hMac = SecureUtil.hmacMd5(encrypt); - - // 加密结果的首尾两个字节做异或运算 - byte checkCode = (byte) (encrypt[0] ^ encrypt[3]); - // 拼接结果 - byte[] rawCode = ArrayUtil.addAll(encrypt, new byte[]{checkCode}); - // 再次加密后转码 - return Base32.encode(aesUtil.encrypt(rawCode)); - } - - private int decode(String code){ - // Base32解码 - byte[] bytes = Base32.decode2Byte(code); - // AES 解码 - bytes = aesUtil.decrypt(bytes); - // 获取前4字节,是加密数据,后1字节是向量 - byte[] encrypt = Arrays.copyOfRange(bytes, 0, 5); - byte checkCode = bytes[4]; - if(checkCode != (byte) (encrypt[0] ^ encrypt[3])){ - throw new BadRequestException("无效兑换码"); - } - // 对序列号解密 - byte[] decrypt = aesUtil.decrypt(encrypt); - // 转为数值 - return BitConverter.toInt(decrypt); - } - - - @Test - void testCodeUtil() { - CodeUtil codeUtil = new CodeUtil(new AESUtil("tjxt-test-key-in", "tjxt-test-ivinit")); - - String code1 = codeUtil.generateCode(109); - System.out.println("code1 = " + code1); - String code2 = codeUtil.generateCode(110); - System.out.println("code2 = " + code2); - String code3 = codeUtil.generateCode(111); - System.out.println("code3 = " + code3); - - System.out.println("num2 = " + codeUtil.parseCode(code2)); - System.out.println("num3 = " + codeUtil.parseCode(code3)); - System.out.println("num1 = " + codeUtil.parseCode(code1)); - - System.out.println("num = " + codeUtil.parseCode("SQBAUP2M")); - } -} diff --git a/tianji-master/tj-remark/pom.xml b/tianji-master/tj-remark/pom.xml deleted file mode 100644 index 3f95e33..0000000 --- a/tianji-master/tj-remark/pom.xml +++ /dev/null @@ -1,90 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-remark - - - 11 - 11 - - - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - com.tianji - tj-api - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-web - - - - com.baomidou - mybatis-plus-boot-starter - - - mysql - mysql-connector-java - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - org.springframework.boot - spring-boot-starter-amqp - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - com.tianji.remark.RemarkApplication - - - - - \ No newline at end of file diff --git a/tianji-master/tj-remark/src/main/java/com/tianji/remark/RemarkApplication.java b/tianji-master/tj-remark/src/main/java/com/tianji/remark/RemarkApplication.java deleted file mode 100644 index 8e6f157..0000000 --- a/tianji-master/tj-remark/src/main/java/com/tianji/remark/RemarkApplication.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.remark; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.annotation.EnableScheduling; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@Slf4j -@EnableScheduling -@SpringBootApplication -@MapperScan("com.tianji.remark.mapper") -public class RemarkApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(RemarkApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - } -} diff --git a/tianji-master/tj-remark/src/main/java/com/tianji/remark/constants/RedisConstants.java b/tianji-master/tj-remark/src/main/java/com/tianji/remark/constants/RedisConstants.java deleted file mode 100644 index 690eb82..0000000 --- a/tianji-master/tj-remark/src/main/java/com/tianji/remark/constants/RedisConstants.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.remark.constants; - -public interface RedisConstants { - String LIKES_BIZ_KEY_PREFIX = "likes:set:biz:"; - String LIKES_TIMES_KEY_PREFIX = "likes:times:type:"; -} diff --git a/tianji-master/tj-remark/src/main/java/com/tianji/remark/controller/LikedRecordController.java b/tianji-master/tj-remark/src/main/java/com/tianji/remark/controller/LikedRecordController.java deleted file mode 100644 index 8e3cd5e..0000000 --- a/tianji-master/tj-remark/src/main/java/com/tianji/remark/controller/LikedRecordController.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.remark.controller; - -import com.tianji.remark.domain.dto.LikeRecordFormDTO; -import com.tianji.remark.service.ILikedRecordService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; -import java.util.Set; - -/** - *

- * 点赞记录表 控制器 - *

- * - * @author 虎哥 - */ -@RestController -@RequiredArgsConstructor -@RequestMapping("/likes") -@Api(tags = "点赞业务相关接口") -public class LikedRecordController { - - private final ILikedRecordService likedRecordService; - - @PostMapping - @ApiOperation("点赞或取消点赞") - public void addLikeRecord(@Valid @RequestBody LikeRecordFormDTO recordDTO) { - likedRecordService.addLikeRecord(recordDTO); - } - - @GetMapping("list") - @ApiOperation("查询指定业务id的点赞状态") - public Set isBizLiked(@RequestParam("bizIds") List bizIds){ - return likedRecordService.isBizLiked(bizIds); - } -} diff --git a/tianji-master/tj-remark/src/main/java/com/tianji/remark/domain/dto/LikeRecordFormDTO.java b/tianji-master/tj-remark/src/main/java/com/tianji/remark/domain/dto/LikeRecordFormDTO.java deleted file mode 100644 index 2c99f26..0000000 --- a/tianji-master/tj-remark/src/main/java/com/tianji/remark/domain/dto/LikeRecordFormDTO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.remark.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Data -@ApiModel(description = "点赞记录表单实体") -public class LikeRecordFormDTO { - @ApiModelProperty("点赞业务id") - @NotNull(message = "业务id不能为空") - private Long bizId; - - @ApiModelProperty("点赞业务类型") - @NotNull(message = "业务类型不能为空") - private String bizType; - - @ApiModelProperty("是否点赞,true:点赞;false:取消点赞") - @NotNull(message = "是否点赞不能为空") - private Boolean liked; -} diff --git a/tianji-master/tj-remark/src/main/java/com/tianji/remark/domain/po/LikedRecord.java b/tianji-master/tj-remark/src/main/java/com/tianji/remark/domain/po/LikedRecord.java deleted file mode 100644 index 40957e3..0000000 --- a/tianji-master/tj-remark/src/main/java/com/tianji/remark/domain/po/LikedRecord.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.tianji.remark.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 点赞记录表 - *

- * - * @author 虎哥 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("liked_record") -public class LikedRecord implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键id - */ - @TableId(value = "id", type = IdType.AUTO) - private Long id; - - /** - * 用户id - */ - private Long userId; - - /** - * 点赞的业务id - */ - private Long bizId; - - /** - * 点赞的业务类型 - */ - private String bizType; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-remark/src/main/java/com/tianji/remark/mapper/LikedRecordMapper.java b/tianji-master/tj-remark/src/main/java/com/tianji/remark/mapper/LikedRecordMapper.java deleted file mode 100644 index d3c402e..0000000 --- a/tianji-master/tj-remark/src/main/java/com/tianji/remark/mapper/LikedRecordMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.remark.mapper; - -import com.tianji.remark.domain.po.LikedRecord; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 点赞记录表 Mapper 接口 - *

- * - * @author 虎哥 - */ -public interface LikedRecordMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-remark/src/main/java/com/tianji/remark/service/ILikedRecordService.java b/tianji-master/tj-remark/src/main/java/com/tianji/remark/service/ILikedRecordService.java deleted file mode 100644 index 67ea8be..0000000 --- a/tianji-master/tj-remark/src/main/java/com/tianji/remark/service/ILikedRecordService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.remark.service; - -import com.tianji.remark.domain.dto.LikeRecordFormDTO; -import com.tianji.remark.domain.po.LikedRecord; -import com.baomidou.mybatisplus.extension.service.IService; - -import java.util.List; -import java.util.Set; - -/** - *

- * 点赞记录表 服务类 - *

- * - * @author 虎哥 - */ -public interface ILikedRecordService extends IService { - - void addLikeRecord(LikeRecordFormDTO recordDTO); - - Set isBizLiked(List bizIds); - - void readLikedTimesAndSendMessage(String bizType, int maxBizSize); -} diff --git a/tianji-master/tj-remark/src/main/java/com/tianji/remark/service/impl/LikedRecordServiceImpl.java b/tianji-master/tj-remark/src/main/java/com/tianji/remark/service/impl/LikedRecordServiceImpl.java deleted file mode 100644 index 3d97f79..0000000 --- a/tianji-master/tj-remark/src/main/java/com/tianji/remark/service/impl/LikedRecordServiceImpl.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.tianji.remark.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.dto.remark.LikedTimesDTO; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.utils.StringUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.remark.domain.dto.LikeRecordFormDTO; -import com.tianji.remark.domain.po.LikedRecord; -import com.tianji.remark.mapper.LikedRecordMapper; -import com.tianji.remark.service.ILikedRecordService; -import lombok.RequiredArgsConstructor; - -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import static com.tianji.common.constants.MqConstants.Exchange.LIKE_RECORD_EXCHANGE; -import static com.tianji.common.constants.MqConstants.Key.LIKED_TIMES_KEY_TEMPLATE; - -/** - *

- * 点赞记录表 服务实现类 - *

- * - * @author 虎哥 - */ -// @Service -@RequiredArgsConstructor -public class LikedRecordServiceImpl extends ServiceImpl implements ILikedRecordService { - - private final RabbitMqHelper mqHelper; - - @Override - public void addLikeRecord(LikeRecordFormDTO recordDTO) { - // 1.基于前端的参数,判断是执行点赞还是取消点赞 - boolean success = recordDTO.getLiked() ? like(recordDTO) : unlike(recordDTO); - // 2.判断是否执行成功,如果失败,则直接结束 - if (!success) { - return; - } - // 3.如果执行成功,统计点赞总数 - Integer likedTimes = lambdaQuery() - .eq(LikedRecord::getBizId, recordDTO.getBizId()) - .count(); - // 4.发送MQ通知 - mqHelper.send( - LIKE_RECORD_EXCHANGE, - StringUtils.format(LIKED_TIMES_KEY_TEMPLATE, recordDTO.getBizType()), - LikedTimesDTO.of(recordDTO.getBizId(), likedTimes)); - } - - @Override - public Set isBizLiked(List bizIds) { - // 1.获取登录用户id - Long userId = UserContext.getUser(); - // 2.查询点赞状态 - List list = lambdaQuery() - .in(LikedRecord::getBizId, bizIds) - .eq(LikedRecord::getUserId, userId) - .list(); - // 3.返回结果 - return list.stream().map(LikedRecord::getBizId).collect(Collectors.toSet()); - } - - @Override - public void readLikedTimesAndSendMessage(String bizType, int maxBizSize) { - - } - - private boolean unlike(LikeRecordFormDTO recordDTO) { - return remove(new QueryWrapper().lambda() - .eq(LikedRecord::getUserId, UserContext.getUser()) - .eq(LikedRecord::getBizId, recordDTO.getBizId())); - } - - private boolean like(LikeRecordFormDTO recordDTO) { - Long userId = UserContext.getUser(); - // 1.查询点赞记录 - Integer count = lambdaQuery() - .eq(LikedRecord::getUserId, userId) - .eq(LikedRecord::getBizId, recordDTO.getBizId()) - .count(); - // 2.判断是否存在,如果已经存在,直接结束 - if (count > 0) { - return false; - } - // 3.如果不存在,直接新增 - LikedRecord r = new LikedRecord(); - r.setUserId(userId); - r.setBizId(recordDTO.getBizId()); - r.setBizType(recordDTO.getBizType()); - save(r); - return true; - } -} diff --git a/tianji-master/tj-remark/src/main/java/com/tianji/remark/service/impl/LikedRecordServiceRedisImpl.java b/tianji-master/tj-remark/src/main/java/com/tianji/remark/service/impl/LikedRecordServiceRedisImpl.java deleted file mode 100644 index 6a048b2..0000000 --- a/tianji-master/tj-remark/src/main/java/com/tianji/remark/service/impl/LikedRecordServiceRedisImpl.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.tianji.remark.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.dto.remark.LikedTimesDTO; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.remark.constants.RedisConstants; -import com.tianji.remark.domain.dto.LikeRecordFormDTO; -import com.tianji.remark.domain.po.LikedRecord; -import com.tianji.remark.mapper.LikedRecordMapper; -import com.tianji.remark.service.ILikedRecordService; -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.connection.StringRedisConnection; -import org.springframework.data.redis.core.RedisCallback; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.core.ZSetOperations; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static com.tianji.common.constants.MqConstants.Exchange.LIKE_RECORD_EXCHANGE; -import static com.tianji.common.constants.MqConstants.Key.LIKED_TIMES_KEY_TEMPLATE; - -/** - *

- * 点赞记录表 服务实现类 - *

- * - * @author 虎哥 - */ -@Service -@RequiredArgsConstructor -public class LikedRecordServiceRedisImpl extends ServiceImpl implements ILikedRecordService { - - private final RabbitMqHelper mqHelper; - private final StringRedisTemplate redisTemplate; - - @Override - public void addLikeRecord(LikeRecordFormDTO recordDTO) { - // 1.基于前端的参数,判断是执行点赞还是取消点赞 - boolean success = recordDTO.getLiked() ? like(recordDTO) : unlike(recordDTO); - // 2.判断是否执行成功,如果失败,则直接结束 - if (!success) { - return; - } - // 3.如果执行成功,统计点赞总数 - Long likedTimes = redisTemplate.opsForSet() - .size(RedisConstants.LIKES_BIZ_KEY_PREFIX + recordDTO.getBizId()); - if (likedTimes == null) { - return; - } - // 4.缓存点总数到Redis - redisTemplate.opsForZSet().add( - RedisConstants.LIKES_TIMES_KEY_PREFIX + recordDTO.getBizType(), - recordDTO.getBizId().toString(), - likedTimes - ); - } - - @Override - public Set isBizLiked(List bizIds) { - // 1.获取登录用户id - Long userId = UserContext.getUser(); - // 2.查询点赞状态 - List objects = redisTemplate.executePipelined((RedisCallback) connection -> { - StringRedisConnection src = (StringRedisConnection) connection; - for (Long bizId : bizIds) { - String key = RedisConstants.LIKES_BIZ_KEY_PREFIX + bizId; - src.sIsMember(key, userId.toString()); - } - return null; - }); - // 3.返回结果 - return IntStream.range(0, objects.size()) - .filter(i -> (boolean) objects.get(i)) - .mapToObj(bizIds::get) - .collect(Collectors.toSet()); - } - - @Override - public void readLikedTimesAndSendMessage(String bizType, int maxBizSize) { - // 1.读取并移除Redis中缓存的点赞总数 - String key = RedisConstants.LIKES_TIMES_KEY_PREFIX + bizType; - Set> tuples = redisTemplate.opsForZSet().popMin(key, maxBizSize); - if (CollUtils.isEmpty(tuples)) { - return; - } - // 2.数据转换 - List list = new ArrayList<>(tuples.size()); - for (ZSetOperations.TypedTuple tuple : tuples) { - String bizId = tuple.getValue(); - Double likedTimes = tuple.getScore(); - if (bizId == null || likedTimes == null) { - continue; - } - list.add(LikedTimesDTO.of(Long.valueOf(bizId), likedTimes.intValue())); - } - // 3.发送MQ消息 - mqHelper.send( - LIKE_RECORD_EXCHANGE, - StringUtils.format(LIKED_TIMES_KEY_TEMPLATE, bizType), - list); - } - - private boolean unlike(LikeRecordFormDTO recordDTO) { - // 1.获取用户id - Long userId = UserContext.getUser(); - // 2.获取Key - String key = RedisConstants.LIKES_BIZ_KEY_PREFIX + recordDTO.getBizId(); - // 3.执行SREM命令 - Long result = redisTemplate.opsForSet().remove(key, userId.toString()); - return result != null && result > 0; - } - - private boolean like(LikeRecordFormDTO recordDTO) { - // 1.获取用户id - Long userId = UserContext.getUser(); - // 2.获取Key - String key = RedisConstants.LIKES_BIZ_KEY_PREFIX + recordDTO.getBizId(); - // 3.执行SADD命令 - Long result = redisTemplate.opsForSet().add(key, userId.toString()); - return result != null && result > 0; - } -} diff --git a/tianji-master/tj-remark/src/main/java/com/tianji/remark/task/LikedTimesCheckTask.java b/tianji-master/tj-remark/src/main/java/com/tianji/remark/task/LikedTimesCheckTask.java deleted file mode 100644 index 8026024..0000000 --- a/tianji-master/tj-remark/src/main/java/com/tianji/remark/task/LikedTimesCheckTask.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.tianji.remark.task; - -import com.tianji.remark.service.ILikedRecordService; -import lombok.RequiredArgsConstructor; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -@RequiredArgsConstructor -public class LikedTimesCheckTask { - - private static final List BIZ_TYPES = List.of("QA", "NOTE"); - private static final int MAX_BIZ_SIZE = 30; - - private final ILikedRecordService recordService; - - @Scheduled(fixedDelay = 20000) - public void checkLikedTimes(){ - for (String bizType : BIZ_TYPES) { - recordService.readLikedTimesAndSendMessage(bizType, MAX_BIZ_SIZE); - } - } -} diff --git a/tianji-master/tj-remark/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-remark/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-remark/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-remark/src/main/resources/bootstrap-local.yml b/tianji-master/tj-remark/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-remark/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-remark/src/main/resources/bootstrap.yml b/tianji-master/tj-remark/src/main/resources/bootstrap.yml deleted file mode 100644 index 775b1ad..0000000 --- a/tianji-master/tj-remark/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,42 +0,0 @@ -server: - port: 8091 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: remark-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - data-id: shared-spring.yaml # 共享spring配置 - refresh: false - - data-id: shared-redis.yaml # 共享redis配置 - refresh: false - - data-id: shared-mybatis.yaml # 共享mybatis配置 - refresh: false - - data-id: shared-logs.yaml # 共享日志配置 - refresh: false - - data-id: shared-feign.yaml # 共享feign配置 - refresh: false - - data-id: shared-mq.yaml # 共享mq配置 - refresh: false -tj: - swagger: - enable: true - enableResponseWrap: true - package-path: com.tianji.remark.controller - title: 天机学堂 - 评价中心接口文档 - description: 该服务包含评价、点赞等功能 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - jdbc: - database: tj_remark - auth: - resource: - enable: true # 登录拦截功能 diff --git a/tianji-master/tj-remark/src/main/resources/mapper/LikedRecordMapper.xml b/tianji-master/tj-remark/src/main/resources/mapper/LikedRecordMapper.xml deleted file mode 100644 index 659c1ac..0000000 --- a/tianji-master/tj-remark/src/main/resources/mapper/LikedRecordMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-search/pom.xml b/tianji-master/tj-search/pom.xml deleted file mode 100644 index 8f76c7b..0000000 --- a/tianji-master/tj-search/pom.xml +++ /dev/null @@ -1,105 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-search - - - 11 - 11 - - - - - com.tianji - tj-api - 1.0.0 - - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-web - - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.redisson - redisson - - - - org.apache.commons - commons-pool2 - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - org.elasticsearch.client - elasticsearch-rest-high-level-client - - - - com.baomidou - mybatis-plus-boot-starter - - - mysql - mysql-connector-java - - - org.springframework.boot - spring-boot-starter-amqp - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - com.tianji.search.SearchApplication - - - - - \ No newline at end of file diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/SearchApplication.java b/tianji-master/tj-search/src/main/java/com/tianji/search/SearchApplication.java deleted file mode 100644 index 0339dc7..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/SearchApplication.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.tianji.search; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; -import org.springframework.scheduling.annotation.EnableScheduling; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@MapperScan("com.tianji.search.mapper") -@SpringBootApplication -@EnableScheduling -@Slf4j -public class SearchApplication { - - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(SearchApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - - } -} \ No newline at end of file diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/config/InterestsProperties.java b/tianji-master/tj-search/src/main/java/com/tianji/search/config/InterestsProperties.java deleted file mode 100644 index 32b1851..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/config/InterestsProperties.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.tianji.search.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Data -@Component -@ConfigurationProperties(prefix = "tj.interests") -public class InterestsProperties { - private int topNumber; -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/constants/SearchErrorInfo.java b/tianji-master/tj-search/src/main/java/com/tianji/search/constants/SearchErrorInfo.java deleted file mode 100644 index 6e686ee..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/constants/SearchErrorInfo.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.tianji.search.constants; - -public interface SearchErrorInfo { - String UPDATE_COURSE_STATUS_ERROR = "更新课程状态异常"; - String SAVE_COURSE_ERROR = "新增课程索引异常"; - String QUERY_COURSE_ERROR = "查询课程异常"; - String TEACHER_NOT_EXISTS = "教师信息不存在"; - String STAFF_NOT_EXISTS = "员工信息不存在"; -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/controller/CourseController.java b/tianji-master/tj-search/src/main/java/com/tianji/search/controller/CourseController.java deleted file mode 100644 index 5ac90b6..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/controller/CourseController.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.tianji.search.controller; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.search.domain.query.CoursePageQuery; -import com.tianji.search.domain.vo.CourseVO; -import com.tianji.search.service.ICourseService; -import com.tianji.search.service.ISearchService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; - -import java.util.List; - -@RestController -@RequestMapping("courses") -@Api(tags = "课程搜索接口") -@RequiredArgsConstructor -public class CourseController { - - private final ISearchService searchService; - private final ICourseService courseService; - - @ApiOperation("用户端课程搜索接口") - @GetMapping("/portal") - public PageDTO queryCoursesForPortal(CoursePageQuery query){ - return searchService.queryCoursesForPortal(query); - } - - @ApiIgnore - @GetMapping("/name") - public List queryCoursesIdByName(@RequestParam("keyword") String keyword){ - return searchService.queryCoursesIdByName(keyword); - } - - @ApiOperation("处理指定课程上架失败的问题") - @PostMapping("/up") - public void handleCoursesUp( - @ApiParam("课程id集合") @RequestParam("courseIds") List courseIds) { - for (Long courseId : courseIds) { - courseService.handleCourseUp(courseId); - } - } - - @ApiOperation("处理指定课程下架失败的问题") - @PostMapping("/down") - public void handleCoursesDown( - @ApiParam("课程id集合") @RequestParam("courseIds") List courseIds) { - for (Long courseId : courseIds) { - courseService.handleCourseDeletes(courseIds); - } - } -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/controller/InterestsController.java b/tianji-master/tj-search/src/main/java/com/tianji/search/controller/InterestsController.java deleted file mode 100644 index fa3a12b..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/controller/InterestsController.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.tianji.search.controller; - - -import com.tianji.search.domain.vo.CourseVO; -import com.tianji.search.service.IInterestsService; -import com.tianji.search.service.ISearchService; -import com.tianji.api.dto.course.CategoryBasicDTO; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - *

- * 用户兴趣表,保存感兴趣的二级分类id 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-07-21 - */ -@RestController -@RequestMapping("/interests") -@Api(tags = "课程推荐相关接口") -@RequiredArgsConstructor -public class InterestsController { - - private final IInterestsService interestsService; - private final ISearchService searchService; - - @ApiOperation("新增兴趣爱好") - @PostMapping - public void saveMyInterests(@RequestParam("interestedIds") ListinterestedIds){ - interestsService.saveInterests(interestedIds); - } - - @ApiOperation("查询我的兴趣爱好") - @GetMapping - public List queryMyInterests(){ - return interestsService.queryMyInterests(); - } - - - @ApiOperation("根据二级分类id查询课程TOP10") - @GetMapping("/{id}/courses") - public List queryCourseByCateId(@PathVariable("id") Long cateLv2Id){ - return searchService.queryCourseByCateId(cateLv2Id); - } -} \ No newline at end of file diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/controller/RecommendController.java b/tianji-master/tj-search/src/main/java/com/tianji/search/controller/RecommendController.java deleted file mode 100644 index 21a8c49..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/controller/RecommendController.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.search.controller; - -import com.tianji.search.domain.vo.CourseVO; -import com.tianji.search.service.ISearchService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@Api(tags = "课程推荐相关接口") -@RequiredArgsConstructor -@RestController -@RequestMapping("recommend") -public class RecommendController { - - private final ISearchService searchService; - - @ApiOperation("精品好课接口") - @GetMapping("/best") - public List queryBestTopN(){ - return searchService.queryBestTopN(); - } - - @ApiOperation("新课推荐接口") - @GetMapping("/new") - public List queryNewTopN(){ - return searchService.queryNewTopN(); - } - - @ApiOperation("精品公开课接口") - @GetMapping("/free") - public List queryFreeTopN(){ - return searchService.queryFreeTopN(); - } - -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/domain/po/Course.java b/tianji-master/tj-search/src/main/java/com/tianji/search/domain/po/Course.java deleted file mode 100644 index 655587b..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/domain/po/Course.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.tianji.search.domain.po; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import lombok.Data; -import org.springframework.data.annotation.Id; - -import java.time.LocalDateTime; -import java.util.List; - -@Data -public class Course { - @Id - private Long id; - /** 课程名称 */ - private String name; - /** 分类id */ - private Long categoryIdLv1; - /** 分类id2 */ - private Long categoryIdLv2; - /** 分类id3 */ - private Long categoryIdLv3; - /** 是否免费 */ - private Boolean free; - /** 课程类型:1:直播课,2:录播课 */ - private Integer type; - /** 课程销量,报名人数 */ - private Integer sold; - /** 价格 */ - private Integer price; - /** 课程评分 */ - private Integer score; - /** 老师id */ - private Long teacher; - /** 章节数量 */ - private Integer sections; - /** 课程封面 */ - private String coverUrl; - private LocalDateTime publishTime; - - @JsonIgnore - public List getCategoryIds(){ - return List.of(categoryIdLv1, categoryIdLv2, categoryIdLv3); - } -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/domain/po/Interests.java b/tianji-master/tj-search/src/main/java/com/tianji/search/domain/po/Interests.java deleted file mode 100644 index ced5029..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/domain/po/Interests.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.tianji.search.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 用户兴趣表,保存感兴趣的二级分类id - *

- * - * @author 虎哥 - * @since 2022-07-21 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("interests") -public class Interests implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键,对应用户id - */ - @TableId(value = "id", type = IdType.INPUT) - private Long id; - - /** - * 感兴趣的二级分类id,以逗号分隔,例如:120,220,330 - */ - private String interests; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/domain/query/CoursePageQuery.java b/tianji-master/tj-search/src/main/java/com/tianji/search/domain/query/CoursePageQuery.java deleted file mode 100644 index 9bcf0ec..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/domain/query/CoursePageQuery.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.search.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import com.tianji.common.utils.DateUtils; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "课程搜索条件") -public class CoursePageQuery extends PageQuery { - - @ApiModelProperty(value = "搜索关键字", example = "Redis") - private String keyword; - @ApiModelProperty(value = "课程1级分类id", example = "1") - private Long categoryIdLv1; - @ApiModelProperty(value = "课程2级分类id", example = "1") - private Long categoryIdLv2; - @ApiModelProperty(value = "课程3级分类id", example = "1") - private Long categoryIdLv3; - @ApiModelProperty(value = "售卖模式,true:免费,false:收费", example = "true") - private Boolean free; - @ApiModelProperty(value = "课程状态,1:待上架,2:已上架,3:已下架,4:已完结", example = "1") - private Integer status; - @ApiModelProperty(value = "课程类型,1-录播,2-直播", example = "1") - private Integer type; - @ApiModelProperty(value = "更新时间区间的开始时间", example = "2022-7-18 19:52:36") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime beginTime; - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - @ApiModelProperty(value = "更新时间区间的结束时间", example = "2022-7-18 19:52:36") - private LocalDateTime endTime; -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/domain/vo/CourseVO.java b/tianji-master/tj-search/src/main/java/com/tianji/search/domain/vo/CourseVO.java deleted file mode 100644 index 4c90c3f..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/domain/vo/CourseVO.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.tianji.search.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "课程信息") -public class CourseVO { - @ApiModelProperty(value = "课程id", example = "1") - private Long id; - @ApiModelProperty(value = "课程名称", example = "Java") - private String name; - @ApiModelProperty(value = "课程价格,单位分", example = "32900") - private Long price; - @ApiModelProperty(value = "老师名字", example = "张老师") - private String teacher; - @ApiModelProperty(value = "老师头像", example = "default-user-icon.jpg") - private String icon; - @ApiModelProperty(value = "课程时长,单位秒", example = "3280") - private Integer duration; - @ApiModelProperty(value = "课程封面地址", example = "default-cover-url.jpg") - private String coverUrl; - @ApiModelProperty(value = "课程章节数量", example = "25") - private Integer sections; - @ApiModelProperty(value = "课程报名人数(销量)", example = "3920") - private Integer sold; - - public static final String[] EXCLUDE_FIELDS = - {"categoryIdLv1", "categoryIdLv2", "categoryIdLv3", "free", - "publishTime", "type", "status", "score"}; -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/domain/vo/InterestCategoryVO.java b/tianji-master/tj-search/src/main/java/com/tianji/search/domain/vo/InterestCategoryVO.java deleted file mode 100644 index 58f55d6..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/domain/vo/InterestCategoryVO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.search.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "感兴趣的分类") -public class InterestCategoryVO { - @ApiModelProperty(value = "分类id", example = "1") - private Long id; - @ApiModelProperty(value = "分类名称", example = "Java") - private String name; -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/enums/CourseStatus.java b/tianji-master/tj-search/src/main/java/com/tianji/search/enums/CourseStatus.java deleted file mode 100644 index 767efcf..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/enums/CourseStatus.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.search.enums; - -import lombok.Getter; - -@Getter -public enum CourseStatus { - NOT_READY(1, "待上架"), - ON_THE_MARKET(2, "已上架"), - NO_LONGER_BE_SOLD(3, "下架"), - EXPIRED(4, "已完结"); - ; - int value; - String desc; - - CourseStatus(int value, String desc) { - this.value = value; - this.desc = desc; - } -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/mapper/InterestsMapper.java b/tianji-master/tj-search/src/main/java/com/tianji/search/mapper/InterestsMapper.java deleted file mode 100644 index f71b2fa..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/mapper/InterestsMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.search.mapper; - -import com.tianji.search.domain.po.Interests; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 用户兴趣表,保存感兴趣的二级分类id Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-07-21 - */ -public interface InterestsMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/mq/CourseEventListener.java b/tianji-master/tj-search/src/main/java/com/tianji/search/mq/CourseEventListener.java deleted file mode 100644 index f3ddafb..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/mq/CourseEventListener.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.tianji.search.mq; - -import com.tianji.search.service.ICourseService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.ExchangeTypes; -import org.springframework.amqp.rabbit.annotation.Exchange; -import org.springframework.amqp.rabbit.annotation.Queue; -import org.springframework.amqp.rabbit.annotation.QueueBinding; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import static com.tianji.common.constants.MqConstants.Exchange.COURSE_EXCHANGE; -import static com.tianji.common.constants.MqConstants.Key.*; - -@Slf4j -@Component -public class CourseEventListener { - - @Autowired - private ICourseService courseService; - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "search.course.up.queue", durable = "true"), - exchange = @Exchange(name = COURSE_EXCHANGE, type = ExchangeTypes.TOPIC), - key = COURSE_UP_KEY - )) - public void listenCourseUp(Long courseId){ - log.debug("监听到课程{}上架", courseId); - courseService.handleCourseUp(courseId); - } - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "search.course.down.queue", durable = "true"), - exchange = @Exchange(name = COURSE_EXCHANGE, type = ExchangeTypes.TOPIC), - key = COURSE_DOWN_KEY - )) - public void listenCourseDown(Long courseId){ - log.debug("监听到课程{}下架", courseId); - courseService.handleCourseDelete(courseId); - } - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "search.course.expire.queue", durable = "true"), - exchange = @Exchange(name = COURSE_EXCHANGE, type = ExchangeTypes.TOPIC), - key = COURSE_EXPIRE_KEY - )) - public void listenCourseExpire(Long courseId){ - courseService.handleCourseDelete(courseId); - } -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/mq/OrderEventListener.java b/tianji-master/tj-search/src/main/java/com/tianji/search/mq/OrderEventListener.java deleted file mode 100644 index d277782..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/mq/OrderEventListener.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.tianji.search.mq; - -import com.tianji.api.dto.trade.OrderBasicDTO; -import com.tianji.common.utils.CollUtils; -import com.tianji.search.service.ICourseService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.ExchangeTypes; -import org.springframework.amqp.rabbit.annotation.Exchange; -import org.springframework.amqp.rabbit.annotation.Queue; -import org.springframework.amqp.rabbit.annotation.QueueBinding; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import static com.tianji.common.constants.MqConstants.Exchange.ORDER_EXCHANGE; -import static com.tianji.common.constants.MqConstants.Key.ORDER_PAY_KEY; -import static com.tianji.common.constants.MqConstants.Key.ORDER_REFUND_KEY; - -@Slf4j -@Component -public class OrderEventListener { - - @Autowired - private ICourseService courseService; - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "search.order.pay.queue", durable = "true"), - exchange = @Exchange(name = ORDER_EXCHANGE, type = ExchangeTypes.TOPIC), - key = ORDER_PAY_KEY - )) - public void listenOrderPay(OrderBasicDTO order) { - if (order == null || order.getUserId() == null || CollUtils.isEmpty(order.getCourseIds())) { - log.debug("订单支付,异常消息,信息未空"); - return; - } - log.debug("处理订单支付消息:{}", order); - courseService.updateCourseSold(order.getCourseIds(), 1); - } - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "search.order.refund.queue", durable = "true"), - exchange = @Exchange(name = ORDER_EXCHANGE, type = ExchangeTypes.TOPIC), - key = ORDER_REFUND_KEY - )) - public void listenOrderRefund(OrderBasicDTO order) { - if (order == null || order.getUserId() == null || CollUtils.isEmpty(order.getCourseIds())) { - log.debug("订单退款,异常消息,信息未空"); - return; - } - log.debug("处理订单退款消息:{}", order); - courseService.updateCourseSold(order.getCourseIds(), -1); - } -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/repository/CourseRepository.java b/tianji-master/tj-search/src/main/java/com/tianji/search/repository/CourseRepository.java deleted file mode 100644 index d6ccccb..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/repository/CourseRepository.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.tianji.search.repository; - -import com.tianji.search.domain.po.Course; - -import java.util.List; -import java.util.Optional; - -public interface CourseRepository{ - String INDEX_NAME = "course"; - String DEFAULT_QUERY_NAME = "name"; - String CATEGORY_ID_LV1 = "categoryIdLv1"; - String CATEGORY_ID_LV2 = "categoryIdLv2"; - String CATEGORY_ID_LV3 = "categoryIdLv3"; - String PUBLISH_TIME = "publishTime"; - String FREE = "free"; - String STATUS = "status"; - String TYPE = "type"; - String UPDATE_TIME = "updateTime"; - String SOLD = "sold"; - - /** - *

更新sold的脚本

- *
-     * {
-     *   "script": {
-     *     "lang": "painless",
-     *     "source": "ctx._source.sold += params.count"
-     *   }
-     * }
-     * 
- */ - String INCREMENT_SOLD_SCRIPT_ID = "increment_sold"; - String INCREMENT_SOLD_SCRIPT_PARAM = "count"; - - void save(Course course); - - void deleteById(Long courseId); - - Optional findById(Long courseId); - - void updateById(Long courseId, Object ... docs); - - void increment(Long courseId, String field, int amount); - - void incrementSold(List courseIds, int amount); - - void saveAll(List list); - - void deleteByIds(List courseIds); -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/repository/impl/CourseRepositoryImpl.java b/tianji-master/tj-search/src/main/java/com/tianji/search/repository/impl/CourseRepositoryImpl.java deleted file mode 100644 index 17707a8..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/repository/impl/CourseRepositoryImpl.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.tianji.search.repository.impl; - -import com.tianji.search.domain.po.Course; -import com.tianji.search.repository.CourseRepository; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.utils.JsonUtils; -import com.tianji.common.utils.StringUtils; -import lombok.extern.slf4j.Slf4j; -import org.elasticsearch.action.bulk.BulkItemResponse; -import org.elasticsearch.action.bulk.BulkRequest; -import org.elasticsearch.action.bulk.BulkResponse; -import org.elasticsearch.action.delete.DeleteRequest; -import org.elasticsearch.action.get.GetRequest; -import org.elasticsearch.action.get.GetResponse; -import org.elasticsearch.action.index.IndexRequest; -import org.elasticsearch.action.update.UpdateRequest; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.common.xcontent.XContentType; -import org.elasticsearch.rest.RestStatus; -import org.elasticsearch.script.Script; -import org.elasticsearch.script.ScriptType; -import org.springframework.stereotype.Component; - -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import static com.tianji.search.constants.SearchErrorInfo.*; - -@Slf4j -@Component -public class CourseRepositoryImpl implements CourseRepository { - - private final RestHighLevelClient restHighLevelClient; - - public CourseRepositoryImpl(RestHighLevelClient restHighLevelClient) { - this.restHighLevelClient = restHighLevelClient; - } - - @Override - public void save(Course course) { - IndexRequest request = new IndexRequest(INDEX_NAME) - .id(course.getId().toString()) - .source(JsonUtils.toJsonStr(course), XContentType.JSON); - try { - restHighLevelClient.index(request, RequestOptions.DEFAULT); - } catch (Exception e) { - throw new CommonException(SAVE_COURSE_ERROR, e); - } - } - - @Override - public void deleteById(Long courseId) { - try { - restHighLevelClient.delete(new DeleteRequest(INDEX_NAME, courseId.toString()), RequestOptions.DEFAULT); - } catch (Exception e) { - throw new CommonException(SAVE_COURSE_ERROR, e); - } - } - - @Override - public Optional findById(Long courseId) { - GetResponse response = null; - try { - response = restHighLevelClient.get(new GetRequest(INDEX_NAME, courseId.toString()), RequestOptions.DEFAULT); - } catch (IOException e) { - throw new CommonException(QUERY_COURSE_ERROR, e); - } - String source = response.getSourceAsString(); - if (StringUtils.isBlank(source)) { - return Optional.empty(); - } - return Optional.of(JsonUtils.toBean(source, Course.class)); - } - - @Override - public void updateById(Long courseId, Object... sources) { - // 1.创建Request - UpdateRequest request = new UpdateRequest(INDEX_NAME, courseId.toString()); - // 2.更新字段 - request.doc(sources); - // 3.发送请求 - try { - restHighLevelClient.update(request, RequestOptions.DEFAULT); - } catch (Exception e) { - throw new CommonException(UPDATE_COURSE_STATUS_ERROR, e); - } - } - - @Override - public void increment(Long courseId, String field, int amount) { - // 1.创建Request - UpdateRequest request = new UpdateRequest(INDEX_NAME, courseId.toString()); - // 2.更新字段 - String code = "ctx._source." + field + " += params.count"; - Map params = new HashMap<>(); - params.put("count", amount); - request.script(new Script(ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, code, params)); - // 3.发送请求 - try { - restHighLevelClient.update(request, RequestOptions.DEFAULT); - } catch (Exception e) { - throw new CommonException(UPDATE_COURSE_STATUS_ERROR, e); - } - } - - @Override - public void incrementSold(List courseIds, int amount) { - // 1.bulk请求 - BulkRequest bulkRequest = new BulkRequest(INDEX_NAME); - - for (Long courseId : courseIds) { - // 2.创建Request - UpdateRequest request = new UpdateRequest(INDEX_NAME, courseId.toString()); - // 3.更新字段 - Map params = new HashMap<>(); - params.put(INCREMENT_SOLD_SCRIPT_PARAM, amount); - request.script(new Script(ScriptType.STORED, null, INCREMENT_SOLD_SCRIPT_ID, params)); - bulkRequest.add(request); - } - - // 4.发送请求 - try { - restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT); - } catch (Exception e) { - throw new CommonException(UPDATE_COURSE_STATUS_ERROR, e); - } - } - - @Override - public void saveAll(List list) { - // 1.创建BulkRequest - BulkRequest request = new BulkRequest(INDEX_NAME); - // 2.添加参数 - for (Course course : list) { - request.add(new IndexRequest(INDEX_NAME) - .id(course.getId().toString()) - .source(JsonUtils.toJsonStr(course), XContentType.JSON)); - } - // 3.批处理 - try { - BulkResponse bulkResponse = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); - for (BulkItemResponse itemResponse : bulkResponse.getItems()) { - if (itemResponse.status().compareTo(RestStatus.BAD_REQUEST) >= 0) { - log.error("批处理失败,id:{}, 原因:{}", itemResponse.getId(), itemResponse.getFailureMessage()); - } - } - } catch (IOException e) { - throw new CommonException(SAVE_COURSE_ERROR, e); - } - } - - @Override - public void deleteByIds(List courseIds) { - // 1.创建BulkRequest - BulkRequest request = new BulkRequest(INDEX_NAME); - // 2.添加参数 - for (Long courseId : courseIds) { - request.add(new DeleteRequest(INDEX_NAME, courseId.toString())); - } - // 3.批处理 - try { - BulkResponse bulkResponse = restHighLevelClient.bulk(request, RequestOptions.DEFAULT); - for (BulkItemResponse itemResponse : bulkResponse.getItems()) { - if (itemResponse.status().compareTo(RestStatus.BAD_REQUEST) >= 0) { - log.error("批处理失败,id:{}, 原因:{}", itemResponse.getId(), itemResponse.getFailureMessage()); - } - } - } catch (IOException e) { - throw new CommonException(SAVE_COURSE_ERROR, e); - } - } -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/service/ICourseService.java b/tianji-master/tj-search/src/main/java/com/tianji/search/service/ICourseService.java deleted file mode 100644 index 558cfc4..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/service/ICourseService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.search.service; - -import java.util.List; - -public interface ICourseService { - - void handleCourseDelete(Long courseId); - - void handleCourseUp(Long courseId); - - void updateCourseSold(List courseId, int amount); - - void handleCourseDeletes(List courseIds); -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/service/IInterestsService.java b/tianji-master/tj-search/src/main/java/com/tianji/search/service/IInterestsService.java deleted file mode 100644 index 836ece7..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/service/IInterestsService.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.search.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.search.domain.po.Interests; -import com.tianji.api.dto.course.CategoryBasicDTO; - -import java.util.List; - -/** - *

- * 用户兴趣表,保存感兴趣的二级分类id 服务类 - *

- * - * @author 虎哥 - * @since 2022-07-21 - */ -public interface IInterestsService extends IService { - - void saveInterests(List interestedIds); - - List queryMyInterests(); - - List queryMyInterestsIds(); -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/service/ISearchService.java b/tianji-master/tj-search/src/main/java/com/tianji/search/service/ISearchService.java deleted file mode 100644 index 2885851..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/service/ISearchService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.search.service; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.search.domain.query.CoursePageQuery; -import com.tianji.search.domain.vo.CourseVO; - -import java.util.List; - -public interface ISearchService { - - List queryCourseByCateId(Long cateLv2Id); - - List queryBestTopN(); - - List queryNewTopN(); - - List queryFreeTopN(); - - PageDTO queryCoursesForPortal(CoursePageQuery query); - - List queryCoursesIdByName(String keyword); -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/CourseServiceImpl.java b/tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/CourseServiceImpl.java deleted file mode 100644 index 83dd3a8..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/CourseServiceImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.tianji.search.service.impl; - -import com.tianji.api.client.course.CourseClient; -import com.tianji.api.dto.course.CourseSearchDTO; -import com.tianji.common.utils.BeanUtils; -import com.tianji.search.domain.po.Course; -import com.tianji.search.repository.CourseRepository; -import com.tianji.search.service.ICourseService; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; - -@Service -public class CourseServiceImpl implements ICourseService { - - @Resource - private CourseRepository courseRepository; - @Resource - private CourseClient courseClient; - - @Override - public void handleCourseDelete(Long courseId) { - // 1.直接删除 - courseRepository.deleteById(courseId); - } - - @Override - public void handleCourseUp(Long courseId) { - // 1.根据id查询课程信息 - CourseSearchDTO courseSearchDTO = courseClient.getSearchInfo(courseId); - if (courseSearchDTO == null) { - return; - } - // 2.数据转换 - Course course = BeanUtils.toBean(courseSearchDTO, Course.class); - course.setType(courseSearchDTO.getCourseType()); - // 3.写入索引库 - courseRepository.save(course); - - } - - @Override - public void updateCourseSold(List courseIds, int amount) { - courseRepository.incrementSold(courseIds, amount); - } - - @Override - public void handleCourseDeletes(List courseIds) { - // 1.直接删除 - courseRepository.deleteByIds(courseIds); - } -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/InterestsServiceImpl.java b/tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/InterestsServiceImpl.java deleted file mode 100644 index ed94489..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/InterestsServiceImpl.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.tianji.search.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.cache.CategoryCache; -import com.tianji.api.dto.course.CategoryBasicDTO; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.search.domain.po.Interests; -import com.tianji.search.mapper.InterestsMapper; -import com.tianji.search.service.IInterestsService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; - -/** - *

- * 用户兴趣表,保存感兴趣的二级分类id 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-07-21 - */ -@Service -public class InterestsServiceImpl extends ServiceImpl implements IInterestsService { - - @Autowired - private CategoryCache categoryCache; - - @Override - public void saveInterests(List interestedIds) { - // 1.获取当前用户 - Long userId = UserContext.getUser(); - String ids = CollUtils.joinIgnoreNull(interestedIds, ","); - if(StringUtils.isBlank(ids)){ - // 说明没有兴趣爱好,直接删除 - removeById(userId); - return; - } - // 2.封装数据 - Interests interests = new Interests(); - interests.setId(userId); - interests.setInterests(CollUtils.join(interestedIds, ",")); - // 3.保存 - saveOrUpdate(interests); - } - - @Override - public List queryMyInterests() { - // 1.获取兴趣爱好id - List ids = queryMyInterestsIds(); - // 2.获取缓存结果 - return categoryCache.queryCategoryByIds(ids); - } - - @Override - public List queryMyInterestsIds() { - // 1.获取当前用户 - Long userId = UserContext.getUser(); - // 2.查询兴趣爱好 - Interests interests = getById(userId); - if (interests == null || StringUtils.isBlank(interests.getInterests())) { - return CollUtils.emptyList(); - } - // 3.获取分类信息 - String[] ids = interests.getInterests().split(","); - if (ids.length == 0) { - return CollUtils.emptyList(); - } - try { - // 4.转换并返回 - return Arrays.stream(ids).map(Long::valueOf).collect(Collectors.toList()); - } catch (Exception e) { - // 5.数据转换异常,返回空 - return CollUtils.emptyList(); - } - } -} diff --git a/tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/SearchServiceImpl.java b/tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/SearchServiceImpl.java deleted file mode 100644 index 30da943..0000000 --- a/tianji-master/tj-search/src/main/java/com/tianji/search/service/impl/SearchServiceImpl.java +++ /dev/null @@ -1,324 +0,0 @@ -package com.tianji.search.service.impl; - -import com.tianji.api.cache.CategoryCache; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.CommonException; -import com.tianji.common.utils.*; -import com.tianji.search.config.InterestsProperties; -import com.tianji.search.constants.SearchErrorInfo; -import com.tianji.search.domain.po.Course; -import com.tianji.search.domain.query.CoursePageQuery; -import com.tianji.search.domain.vo.CourseVO; -import com.tianji.search.repository.CourseRepository; -import com.tianji.search.service.IInterestsService; -import com.tianji.search.service.ISearchService; -import org.apache.commons.lang3.StringUtils; -import org.elasticsearch.action.search.SearchRequest; -import org.elasticsearch.action.search.SearchResponse; -import org.elasticsearch.client.RequestOptions; -import org.elasticsearch.client.RestHighLevelClient; -import org.elasticsearch.index.query.BoolQueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.elasticsearch.index.query.RangeQueryBuilder; -import org.elasticsearch.search.SearchHit; -import org.elasticsearch.search.SearchHits; -import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder; -import org.elasticsearch.search.fetch.subphase.highlight.HighlightField; -import org.elasticsearch.search.sort.SortOrder; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - -import static com.tianji.search.repository.CourseRepository.PUBLISH_TIME; - -@Service -public class SearchServiceImpl implements ISearchService { - - @Autowired - private RestHighLevelClient restClient; - - @Autowired - private IInterestsService interestsService; - - @Autowired - private UserClient userClient; - - @Autowired - private CategoryCache categoryCache; - - @Autowired - private InterestsProperties interestsProperties; - - @Override - public List queryCourseByCateId(Long cateLv2Id) { - return queryTopNByCategoryIdLv2sAndFree( - CollUtils.singletonList(cateLv2Id), null, PUBLISH_TIME, false, 10); - } - - @Override - public List queryBestTopN() { - // 1.获取当前用户 - return queryTopNCourseOnMarketByFree(false, CourseRepository.SOLD); - } - - @Override - public List queryNewTopN() { - return queryTopNCourseOnMarketByFree(false, PUBLISH_TIME); - } - - @Override - public List queryFreeTopN() { - return queryTopNCourseOnMarketByFree(true, CourseRepository.SOLD); - } - - private List queryTopNCourseOnMarketByFree(boolean isFree, String sortBy) { - // 1.获取当前用户 - Long id = UserContext.getUser(); - // 2.查询课程 - List courses = null; - if (id == null) { - // 3.未登录,直接查询报名人数最多的 - courses = queryTopNByCategoryIdLv2sAndFree( - null, isFree, sortBy, false, interestsProperties.getTopNumber()); - } else { - // 4.已登录,根据兴趣爱好查询 - List categoryIds = interestsService.queryMyInterestsIds(); - if (CollUtils.isEmpty(categoryIds)) { - // 4.1.没有兴趣爱好,直接查询报名人数最多的 - courses = queryTopNByCategoryIdLv2sAndFree( - null, isFree, sortBy, false, interestsProperties.getTopNumber()); - } else { - // 4.2.有爱好.查询爱好课程中报名人数最多的 - courses = queryTopNByCategoryIdLv2sAndFree( - categoryIds, isFree, sortBy, false, interestsProperties.getTopNumber()); - } - } - return courses; - } - - private List queryTopNByCategoryIdLv2sAndFree( - List categoryIds, Boolean isFree, String sortBy, boolean isASC, int n) { - // 1.准备Request - SearchRequest request = new SearchRequest(CourseRepository.INDEX_NAME); - BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); - // 1.1.是否免费 - if(isFree != null) { - queryBuilder.filter(QueryBuilders.termQuery(CourseRepository.FREE, isFree)); - } - // 1.2.分类id - if (categoryIds != null) { - if (categoryIds.size() == 1) { - queryBuilder.filter(QueryBuilders.termQuery(CourseRepository.CATEGORY_ID_LV2, categoryIds.get(0))); - } else { - queryBuilder.filter(QueryBuilders.termsQuery(CourseRepository.CATEGORY_ID_LV2, categoryIds)); - } - } - if(isFree != null || categoryIds != null) { - request.source().query(queryBuilder); - } - // 1.3.TopN - request.source().size(n).sort(sortBy, isASC ? SortOrder.ASC : SortOrder.DESC); - // 2.发送请求 - SearchResponse response = null; - try { - response = restClient.search(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new CommonException(SearchErrorInfo.QUERY_COURSE_ERROR, e); - } - // 3.解析 - SearchHits searchHits = response.getHits(); - SearchHit[] hits = searchHits.getHits(); - if (hits == null || hits.length == 0) { - return CollUtils.emptyList(); - } - List courses = new ArrayList<>(hits.length); - Set teacherIds = new HashSet<>(hits.length); - for (SearchHit hit : hits) { - // 3.1.数据转换 - CourseVO vo = JsonUtils.toBean(hit.getSourceAsString(), CourseVO.class); - // 3.2.获取分类id - teacherIds.add(Long.valueOf(vo.getTeacher())); - // 3.3.保存 - courses.add(vo); - } - teacherIds.remove(0L); - if (teacherIds.size() == 0) { - return courses; - } - // 4.查询教师 - List teachers = userClient.queryUserByIds(teacherIds); - AssertUtils.isNotEmpty(teachers, SearchErrorInfo.TEACHER_NOT_EXISTS); - Map tMap = teachers.stream() - .collect(Collectors.toMap(t -> t.getId().toString(), UserDTO::getName)); - for (CourseVO c : courses) { - c.setTeacher(tMap.getOrDefault(c.getTeacher(), "匿名")); - } - return courses; - } - - @Override - public PageDTO queryCoursesForPortal(CoursePageQuery query) { - // 1.搜索数据 - SearchResponse response = searchForResponse(query, CourseVO.EXCLUDE_FIELDS); - // 2.解析响应 - PageDTO result = handleSearchResponse(response, query.getPageSize()); - // 3.处理VO - List list = result.getList(); - if (CollUtils.isEmpty(list)) { - return PageDTO.empty(result.getTotal(), result.getPages()); - } - // 3.1.查询教师信息 - List teacherIds = list.stream().map(Course::getTeacher).collect(Collectors.toList()); - List teachers = userClient.queryUserByIds(teacherIds); - AssertUtils.isNotEmpty(teachers, SearchErrorInfo.TEACHER_NOT_EXISTS); - Map teacherMap = teachers.stream() - .collect(Collectors.toMap(UserDTO::getId, UserDTO::getName)); - // 3.2.转换VO - List vos = new ArrayList<>(list.size()); - for (Course c : list) { - CourseVO vo = BeanUtils.toBean(c, CourseVO.class); - vo.setTeacher(teacherMap.getOrDefault(c.getTeacher(), "未知")); - vos.add(vo); - } - return new PageDTO<>(result.getTotal(), result.getPages(), vos); - } - - @Override - public List queryCoursesIdByName(String keyword) { - // 1.创建Request - SearchRequest request = new SearchRequest(CourseRepository.INDEX_NAME); - // 2.构建DSL - request.source() - .query(QueryBuilders.matchPhraseQuery(CourseRepository.DEFAULT_QUERY_NAME, keyword)) - .fetchSource(new String[]{"id"}, null); - // 3.查询 - SearchResponse response; - try { - response = restClient.search(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new CommonException(SearchErrorInfo.QUERY_COURSE_ERROR, e); - } - // 4.解析 - SearchHits searchHits = response.getHits(); - // 4.1.获取hits - SearchHit[] hits = searchHits.getHits(); - if (hits.length == 0) { - return CollUtils.emptyList(); - } - // 4.2.获取id - return Arrays.stream(hits) - .map(SearchHit::getId) - .map(Long::valueOf) - .collect(Collectors.toList()); - } - - - private SearchResponse searchForResponse(CoursePageQuery query, String[] excludeFields) { - // 1.创建Request - SearchRequest request = new SearchRequest(CourseRepository.INDEX_NAME); - // 2.构建DSL - // 2.1.构建query - buildBasicQuery(request, query); - // 2.2.排序 - String sortBy = query.getSortBy(); - if (StringUtils.isNotBlank(sortBy)) { - request.source().sort(sortBy, query.getIsAsc() ? SortOrder.ASC : SortOrder.DESC); - } - // 2.3.分页 - request.source().from(query.from()).size(query.getPageSize()); - // 2.4.高亮 - request.source().highlighter(new HighlightBuilder().field(CourseRepository.DEFAULT_QUERY_NAME)); - // 2.5.source处理 - request.source().fetchSource(null, excludeFields); - // 3.发送请求 - SearchResponse response = null; - try { - response = restClient.search(request, RequestOptions.DEFAULT); - } catch (IOException e) { - throw new CommonException(ErrorInfo.Msg.SERVER_INTER_ERROR, e); - } - return response; - } - - private void buildBasicQuery(SearchRequest request, CoursePageQuery query) { - // 1.准备bool查询 - BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); - // 2.关键字搜索 - String keyword = query.getKeyword(); - if (StringUtils.isBlank(keyword)) { - queryBuilder.must(QueryBuilders.matchAllQuery()); - } else { - queryBuilder.must(QueryBuilders.matchPhraseQuery(CourseRepository.DEFAULT_QUERY_NAME, keyword)); - } - // 3.其它条件 - if (query.getCategoryIdLv1() != null) { - queryBuilder.filter(QueryBuilders.termQuery(CourseRepository.CATEGORY_ID_LV1, query.getCategoryIdLv1())); - } - if (query.getCategoryIdLv2() != null) { - queryBuilder.filter(QueryBuilders.termQuery(CourseRepository.CATEGORY_ID_LV2, query.getCategoryIdLv2())); - } - if (query.getCategoryIdLv3() != null) { - queryBuilder.filter(QueryBuilders.termQuery(CourseRepository.CATEGORY_ID_LV3, query.getCategoryIdLv3())); - } - if (query.getFree() != null) { - queryBuilder.filter(QueryBuilders.termQuery(CourseRepository.FREE, query.getFree())); - } - if (query.getType() != null) { - queryBuilder.filter(QueryBuilders.termQuery(CourseRepository.TYPE, query.getType())); - } - LocalDateTime beginTime = query.getBeginTime(); - LocalDateTime endTime = query.getEndTime(); - if(beginTime != null || endTime != null) { - RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery(CourseRepository.UPDATE_TIME); - if (beginTime != null) { - rangeQuery.gte(beginTime); - } - if (endTime != null) { - rangeQuery.lte(endTime); - } - queryBuilder.filter(rangeQuery); - } - // 4.写入request - request.source().query(queryBuilder); - } - - private PageDTO handleSearchResponse(SearchResponse response, int pageSize) { - SearchHits searchHits = response.getHits(); - // 1.总条数 - long total = searchHits.getTotalHits().value; - // 2.总页数 - long totalPages = (total + pageSize - 1) / pageSize; - // 3.获取命中的数据 - SearchHit[] hits = searchHits.getHits(); - if (hits.length <= 0) { - return new PageDTO<>(total, totalPages, CollUtils.emptyList()); - } - // 4.遍历 - List list = new ArrayList<>(hits.length); - for (SearchHit hit : hits) { - // 5.获取某一条source - String jsonSource = hit.getSourceAsString(); - // 6.反序列化 - Course course = JsonUtils.toBean(jsonSource, Course.class); - // 7.处理高亮 - Map highlightFields = hit.getHighlightFields(); - if (CollUtils.isNotEmpty(highlightFields)) { - // 7.1.获取高亮结果 - HighlightField field = highlightFields.get(CourseRepository.DEFAULT_QUERY_NAME); - Object[] fragments = field.getFragments(); - String value = StringUtils.join(fragments); - // 7.2.覆盖非高亮结果 - course.setName(value); - } - list.add(course); - } - return new PageDTO<>(total, totalPages, list); - } -} diff --git a/tianji-master/tj-search/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-search/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index 3445812..0000000 --- a/tianji-master/tj-search/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,13 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 - elasticsearch: - uris: http://192.168.150.101:9200 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-search/src/main/resources/bootstrap-local.yml b/tianji-master/tj-search/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 0d328aa..0000000 --- a/tianji-master/tj-search/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,13 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 - elasticsearch: - uris: http://192.168.150.101:9200 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-search/src/main/resources/bootstrap.yml b/tianji-master/tj-search/src/main/resources/bootstrap.yml deleted file mode 100644 index 1cc3534..0000000 --- a/tianji-master/tj-search/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,46 +0,0 @@ -server: - port: 8083 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: search-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - data-id: shared-spring.yaml # 共享spring配置 - refresh: false - - data-id: shared-redis.yaml # 共享redis配置 - refresh: false - - data-id: shared-mybatis.yaml # 共享mybatis配置 - refresh: false - - data-id: shared-logs.yaml # 共享日志配置 - refresh: false - - data-id: shared-feign.yaml # 共享feign配置 - refresh: false - - data-id: shared-mq.yaml # 共享MQ配置 - refresh: false -tj: - swagger: - enable: true - package-path: com.tianji.search.controller - title: 智汇云课堂 - 搜索系统接口文档 - description: 该服务包含课程搜索、兴趣推荐等相关功能 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - enableResponseWrap: true - auth: - resource: - enable: true - includeLoginPaths: - - /interests/** - - /courses/admin - jdbc: - database: tj_search - diff --git a/tianji-master/tj-search/src/main/resources/mapper/InterestsMapper.xml b/tianji-master/tj-search/src/main/resources/mapper/InterestsMapper.xml deleted file mode 100644 index ee9d918..0000000 --- a/tianji-master/tj-search/src/main/resources/mapper/InterestsMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-search/src/test/java/com/tianji/search/impl/CourseServiceImplTest.java b/tianji-master/tj-search/src/test/java/com/tianji/search/impl/CourseServiceImplTest.java deleted file mode 100644 index 9139013..0000000 --- a/tianji-master/tj-search/src/test/java/com/tianji/search/impl/CourseServiceImplTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.tianji.search.impl; - -import com.tianji.api.client.course.CourseClient; -import com.tianji.api.dto.course.CourseSearchDTO; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.RandomUtils; -import com.tianji.search.domain.po.Course; -import com.tianji.search.domain.vo.CourseVO; -import com.tianji.search.repository.CourseRepository; -import com.tianji.search.service.ICourseService; -import com.tianji.search.service.ISearchService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@SpringBootTest -class CourseServiceImplTest { - - @Autowired - private ISearchService searchService; - - @Autowired - private CourseRepository repository; - - @Autowired - private CourseClient courseClient; - - @Autowired - private ICourseService courseService; - - @Test - void testTop5Best() { - List courseVOS = searchService.queryBestTopN(); - for (CourseVO courseVO : courseVOS) { - System.out.println("courseVO = " + courseVO); - } - } - - @Test - void testTop5New() { - List courseVOS = searchService.queryNewTopN(); - for (CourseVO courseVO : courseVOS) { - System.out.println("courseVO = " + courseVO); - } - } - - @Test - void testTop5Free() { - List courseVOS = searchService.queryFreeTopN(); - for (CourseVO courseVO : courseVOS) { - System.out.println("courseVO = " + courseVO); - } - } - - static List teachers = List.of( - 1548889371405492225L, 1548940676303970306L, - 1548940777449611265L, 1548940921662365698L, - 1548941239125041153L, 1548941336596471809L - ); - - @Test - void testLoadCourse() { - for (long i = 1549025085494521857L; i <= 1549025085494521857L; i++) { - // 1.根据id查询课程信息 - CourseSearchDTO courseSearchDTO = courseClient.getSearchInfo(i); - if (courseSearchDTO == null) { - return; - } - // 2.数据转换 - Course course = BeanUtils.toBean(courseSearchDTO, Course.class); - course.setType(courseSearchDTO.getCourseType()); - course.setScore(41 + RandomUtils.randomInt(10)); - course.setSold(0); - // 3.写入索引库 - repository.save(course); - } - } - - @Test - void testRepository() { - List list = new ArrayList<>(); - - for (int i = 0; i < 200; i++) { - LocalDateTime time = LocalDateTime.now().minusDays(RandomUtils.randomInt(20)); - Course course = new Course(); - course.setId(1L + i); - course.setCategoryIdLv1(1001L); - course.setCategoryIdLv2(2000L + RandomUtils.randomInt(1,9)); - course.setCategoryIdLv3(3007L); - course.setCoverUrl("default-cover-url.jpg"); - course.setFree(RandomUtils.randomBoolean()); - course.setName("Java实战课"); - course.setPublishTime(time); - course.setScore(30 + RandomUtils.randomInt(20)); - course.setSections(10 + RandomUtils.randomInt(10)); - course.setSold(200 + RandomUtils.randomInt(1000)); - course.setTeacher(teachers.get(RandomUtils.randomInt(5))); - course.setType(2); - list.add(course); - } - - repository.saveAll(list); - } -} \ No newline at end of file diff --git a/tianji-master/tj-search/src/test/java/com/tianji/search/repository/CourseRepositoryTest.java b/tianji-master/tj-search/src/test/java/com/tianji/search/repository/CourseRepositoryTest.java deleted file mode 100644 index cccb250..0000000 --- a/tianji-master/tj-search/src/test/java/com/tianji/search/repository/CourseRepositoryTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.tianji.search.repository; - -import com.tianji.common.utils.RandomUtils; -import com.tianji.search.domain.po.Course; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.time.LocalDateTime; -import java.util.Optional; - -@SpringBootTest -class CourseRepositoryTest { - - @Autowired - private CourseRepository repository; - - @Test - void save() { - LocalDateTime time = LocalDateTime.now().minusDays(RandomUtils.randomInt(20)); - Course course = new Course(); - course.setId(1204101L); - course.setCategoryIdLv1(1001L); - course.setCategoryIdLv2(2000L + RandomUtils.randomInt(1,9)); - course.setCategoryIdLv3(3007L); - course.setCoverUrl("default-cover-url.jpg"); - course.setFree(RandomUtils.randomBoolean()); - course.setName("Java实战课"); - course.setPublishTime(time); - course.setScore(30 + RandomUtils.randomInt(20)); - course.setSections(10 + RandomUtils.randomInt(10)); - course.setSold(200 + RandomUtils.randomInt(1000)); - course.setTeacher(1548889371405492225L); - course.setType(2); - repository.save(course); - } - - @Test - void deleteById() { - repository.deleteById(1204101L); - } - - @Test - void findById() { - Optional op = repository.findById(1204101L); - op.ifPresent(System.out::println); - } - - @Test - void updateById() { - } - - @Test - void increment() { - repository.increment(1204101L, "sold", -1); - } - -} \ No newline at end of file diff --git a/tianji-master/tj-trade/pom.xml b/tianji-master/tj-trade/pom.xml deleted file mode 100644 index 052bf84..0000000 --- a/tianji-master/tj-trade/pom.xml +++ /dev/null @@ -1,113 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-trade - - - 11 - 11 - - - - - com.tianji - tj-pay-api - 1.0.0 - - - com.tianji - tj-api - 1.0.0 - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - org.springframework.boot - spring-boot-starter-web - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-sentinel - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.redisson - redisson - - - - - com.baomidou - mybatis-plus-boot-starter - ${mybatis-plus.version} - - - mysql - mysql-connector-java - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - - org.springframework.boot - spring-boot-starter-amqp - - - - - com.xuxueli - xxl-job-core - - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - build-info - - - - - - - \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/TradeApplication.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/TradeApplication.java deleted file mode 100644 index 808c398..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/TradeApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.trade; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@MapperScan("com.tianji.trade.mapper") -@SpringBootApplication -@Slf4j -public class TradeApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(TradeApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - - } -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/config/ThreadPoolConfig.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/config/ThreadPoolConfig.java deleted file mode 100644 index ef8f944..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/config/ThreadPoolConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.trade.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; - -import java.util.concurrent.ThreadPoolExecutor; - -@Configuration -public class ThreadPoolConfig { - - @Bean - public ThreadPoolTaskExecutor sendRefundRequestExecutor(){ - ThreadPoolTaskExecutor refundExecutor = new ThreadPoolTaskExecutor(); - //配置核心线程数 - refundExecutor.setCorePoolSize(4); - //配置最大线程数 - refundExecutor.setMaxPoolSize(20); - //配置队列大小 - refundExecutor.setQueueCapacity(10000); - //配置线程池中的线程的名称前缀 - refundExecutor.setThreadNamePrefix("pd-user-async-service-"); - // 由调用者线程执行 - refundExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); - refundExecutor.initialize(); - return refundExecutor; - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/config/TradeProperties.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/config/TradeProperties.java deleted file mode 100644 index d28b1ff..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/config/TradeProperties.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.trade.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -@Data -@Component -@ConfigurationProperties(prefix = "tj.trade") -public class TradeProperties { - /** - * 单次允许购买的最大课程数量 - */ - private int maxCourseAmount = 10; - /** - * 订单支付的最大等待时间,单位分钟 - */ - private int payOrderTTLMinutes = 30; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/OrderStatus.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/OrderStatus.java deleted file mode 100644 index 7cfc3cf..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/OrderStatus.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.tianji.trade.constants; - -import com.tianji.common.enums.BaseEnum; -import lombok.AllArgsConstructor; -import lombok.Getter; - - -@AllArgsConstructor -@Getter -public enum OrderStatus implements BaseEnum { - - NO_PAY(1, "待支付", "下单"), - PAYED(2, "已支付", "付款"), - CLOSED(3, "已关闭", "交易关闭"), - FINISHED(4, "已完成", "交易完成"), - ENROLLED(5, "已报名", "免费报名"), - REFUNDED(6, "申请退款", "申请退款"); - - private final int value; - private final String desc; - private final String progressName; - - public static OrderStatus of(Integer value){ - if(value == null){ - return null; - } - for (OrderStatus status : values()) { - if(status.equalsValue(value)){ - return status; - } - } - return null; - } - - public static String desc(Integer value) { - OrderStatus status = of(value); - if (status == null) { - return null; - } - return status.getDesc(); - } - - public static String progress(Integer value) { - OrderStatus status = of(value); - if (status == null) { - return null; - } - return status.getProgressName(); - } - - public static boolean canRefund(Integer value) { - return PAYED.equalsValue(value); - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/RefundStatus.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/RefundStatus.java deleted file mode 100644 index 71e01a6..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/RefundStatus.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.tianji.trade.constants; - -import com.tianji.common.enums.BaseEnum; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@AllArgsConstructor -@Getter -public enum RefundStatus implements BaseEnum { - - - UN_APPROVE(1, "待审批", "提交退款申请"), - CANCEL(2, "学员取消退款", "学员取消退款"), - AGREE(3, "同意退款", "退款审批"), - REJECT(4, "拒绝退款", "退款审批"), - SUCCESS(5, "退款成功", "退款成功"), - FAILED(6, "退款失败", "退款失败"); - - private final int value; - private final String desc; - private final String progressName; - - public static RefundStatus of(Integer value){ - if(value == null){ - return null; - } - for (RefundStatus status : values()) { - if(status.equalsValue(value)){ - return status; - } - } - return null; - } - - public static String desc(Integer value) { - RefundStatus status = of(value); - if (status == null) { - return null; - } - return status.getDesc(); - } - - public static String progress(Integer value) { - RefundStatus status = of(value); - if (status == null) { - return null; - } - return status.getProgressName(); - } - - public static boolean inProgress(Integer value) { - if (value == null) { - return false; - } - return UN_APPROVE.getValue() == value || AGREE.getValue() == value; - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/TradeErrorInfo.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/TradeErrorInfo.java deleted file mode 100644 index 19bfa15..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/constants/TradeErrorInfo.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.trade.constants; - -public interface TradeErrorInfo { - - String CARTS_FULL = "用户购物车课程不能超过{}"; - String COURSE_NOT_EXISTS = "课程不存在"; - String COURSE_EXPIRED = "课程已过期"; - String COURSE_NOT_FOR_SALE = "课程无法购买"; - String COURSE_NOT_FREE = "课程不是免费课程"; - - String PLACE_ORDER_FAILED = "下单失败"; - String ORDER_NOT_EXISTS = "订单不存在"; - String ORDER_ALREADY_FINISH = "订单已经支付或退款"; - String ORDER_OVER_TIME = "订单已经超时"; - String ORDER_CANNOT_REFUND = "订单未支付或已关闭"; - - String NO_AUTH_REFUND = "无权申请退款"; - String REFUND_TOO_MANY_TIMES = "退款次数太多"; - String REFUND_IN_PROGRESS = "有其它未完成的退款进程"; - String REFUND_NOT_EXISTS = "退款记录不存在"; - String REFUND_APPROVED = "退款申请已经处理过了"; - String FREE_COURSE_CANNOT_REFUND = "免费课程不能退款"; - -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/CartController.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/CartController.java deleted file mode 100644 index 8815e03..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/CartController.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.tianji.trade.controller; - - -import com.tianji.trade.domain.dto.CartsAddDTO; -import com.tianji.trade.domain.vo.CartVO; -import com.tianji.trade.service.ICartService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; -import java.util.List; - -/** - *

- * 购物车条目信息,也就是购物车中的课程 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-28 - */ -@RestController -@RequestMapping("/carts") -@RequiredArgsConstructor -@Api(tags = "购物车相关接口") -public class CartController { - - private final ICartService cartService; - - @ApiOperation("添加课程到购物车") - @PostMapping - public void addCourse2Cart(@Valid @RequestBody CartsAddDTO cartsAddDTO){ - cartService.addCourse2Cart(cartsAddDTO.getCourseId()); - } - - @ApiOperation("获取购物车中的课程") - @GetMapping - public List getMyCarts(){ - return cartService.getMyCarts(); - } - - @ApiOperation("删除指定的购物车条目") - @DeleteMapping("/{id}") - public void deleteCartById(@ApiParam("购物车条目id") @PathVariable("id") Long id){ - cartService.deleteCartById(id); - } - - @ApiOperation("批量删除购物车条目") - @DeleteMapping - public void deleteCartById(@ApiParam("购物车条目id集合") @RequestParam("ids") List ids){ - cartService.deleteCartByIds(ids); - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/OrderController.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/OrderController.java deleted file mode 100644 index 3e2cc2f..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/OrderController.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.tianji.trade.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.trade.domain.dto.PlaceOrderDTO; -import com.tianji.trade.domain.query.OrderPageQuery; -import com.tianji.trade.domain.vo.OrderConfirmVO; -import com.tianji.trade.domain.vo.OrderPageVO; -import com.tianji.trade.domain.vo.OrderVO; -import com.tianji.trade.domain.vo.PlaceOrderResultVO; -import com.tianji.trade.service.IOrderService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -/** - *

- * 订单 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -@Api(tags = "订单相关接口") -@RestController -@RequestMapping("/orders") -@RequiredArgsConstructor -public class OrderController { - - private final IOrderService orderService; - - @ApiOperation("分页查询我的订单") - @GetMapping("page") - public PageDTO queryMyOrderPage(OrderPageQuery pageQuery){ - return orderService.queryMyOrderPage(pageQuery); - } - - @ApiOperation("根据id查询订单详细信息") - @GetMapping("/{id}") - public OrderVO queryOrderById(@ApiParam ("订单id")@PathVariable("id") Long id){ - return orderService.queryOrderById(id); - } - - @ApiOperation("查询订单支付状态") - @GetMapping("/{id}/status") - public PlaceOrderResultVO queryOrderStatus(@ApiParam("订单id") @PathVariable("id") Long orderId) { - return orderService.queryOrderStatus(orderId); - } - - @ApiOperation("预下单接口,生成订单id,确认订单可用优惠券信息") - @GetMapping("prePlaceOrder") - public OrderConfirmVO prePlaceOrder(@RequestParam("courseIds")List courseIds) { - return orderService.prePlaceOrder(courseIds); - } - - @ApiOperation("下单接口") - @PostMapping("placeOrder") - public PlaceOrderResultVO placeOrder(@RequestBody @Validated PlaceOrderDTO placeOrderDTO) { - return orderService.placeOrder(placeOrderDTO); - } - - @ApiOperation("免费课立刻报名接口") - @PostMapping("/freeCourse/{courseId}") - public PlaceOrderResultVO enrolledFreeCourse(@ApiParam("免费课程id") @PathVariable("courseId") Long courseId) { - return orderService.enrolledFreeCourse(courseId); - } - - @ApiOperation("取消订单接口") - @PutMapping("/{id}/cancel") - public void cancelOrder(@ApiParam("要取消订单的id") @PathVariable("id") Long orderId){ - orderService.cancelOrder(orderId); - } - - @ApiOperation("删除订单接口") - @DeleteMapping("/{id}") - public void deleteOrder(@ApiParam("要删除的订单id") @PathVariable("id") Long id) { - orderService.deleteOrder(id); - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/OrderDetailController.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/OrderDetailController.java deleted file mode 100644 index 9c486d7..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/OrderDetailController.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.tianji.trade.controller; - - -import com.tianji.api.dto.course.CoursePurchaseInfoDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.trade.domain.query.OrderDetailPageQuery; -import com.tianji.trade.domain.vo.OrderDetailAdminVO; -import com.tianji.trade.domain.vo.OrderDetailPageVO; -import com.tianji.trade.service.IOrderDetailService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; -import java.util.Map; - -/** - *

- * 订单明细 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ - -@Api(tags = "订单明细相关接口") -@RestController -@RequestMapping("/order-details") -@RequiredArgsConstructor -public class OrderDetailController { - - private final IOrderDetailService detailService; - - @ApiOperation("分页查询订单明细") - @GetMapping("/page") - public PageDTO queryDetailForPage(OrderDetailPageQuery pageQuery) { - return detailService.queryDetailForPage(pageQuery); - } - - @ApiOperation("根据订单明细id获取详细信息") - @GetMapping("/{id}") - public OrderDetailAdminVO queryOrdersDetailProgress( @ApiParam(value = "订单明细id")@PathVariable("id") Long id) { - return detailService.queryOrdersDetailProgress(id); - } - - @ApiOperation("校验课程是否购买,是否过期") - @GetMapping("/course/{id}") - public Boolean checkCourseOrderInfo(@PathVariable("id") Long courseId){ - return detailService.checkCourseOrderInfo(courseId); - } - - @ApiOperation("统计课程报名人数") - @GetMapping("/enrollNum") - public Map countEnrollNumOfCourse(@RequestParam("courseIdList") List courseIdList){ - return detailService.countEnrollNumOfCourse(courseIdList); - } - - @ApiOperation("统计学生报名课程数量") - @GetMapping("/enrollCourse") - public Map countEnrollCourseOfStudent(@RequestParam("studentIds") List studentIds){ - return detailService.countEnrollCourseOfStudent(studentIds); - } - - @GetMapping("purchaseInfo") - public CoursePurchaseInfoDTO getPurchaseInfoOfCourse(@RequestParam("courseId") Long courseId){ - return detailService.getPurchaseInfoOfCourse(courseId); - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/PayController.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/PayController.java deleted file mode 100644 index 8ca6d6a..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/PayController.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.tianji.trade.controller; - -import com.tianji.trade.domain.dto.PayApplyFormDTO; -import com.tianji.trade.domain.vo.PayChannelVO; -import com.tianji.trade.service.IPayService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@Api(tags = "支付相关接口") -@RestController -@RequestMapping("pay") -@RequiredArgsConstructor -public class PayController { - - private final IPayService payService; - - @PostMapping("/order") - @ApiOperation(value = "支付申请,返回支付二维码url") - public String applyPayOrder(@RequestBody PayApplyFormDTO payApply) { - return payService.applyPayOrder(payApply); - } - - @GetMapping("/channels") - @ApiOperation("获取支付渠道列表接口") - public List queryPayChannels() { - return payService.queryPayChannels(); - } - -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/RefundApplyController.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/RefundApplyController.java deleted file mode 100644 index 6ddcb6b..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/controller/RefundApplyController.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.tianji.trade.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.trade.domain.dto.ApproveFormDTO; -import com.tianji.trade.domain.dto.RefundCancelDTO; -import com.tianji.trade.domain.dto.RefundFormDTO; -import com.tianji.trade.domain.query.RefundApplyPageQuery; -import com.tianji.trade.domain.vo.RefundApplyPageVO; -import com.tianji.trade.domain.vo.RefundApplyVO; -import com.tianji.trade.service.IRefundApplyService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - *

- * 退款申请 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -@Api(tags = "退款相关接口") -@RequiredArgsConstructor -@RestController -@RequestMapping("/refund-apply") -public class RefundApplyController { - - private final IRefundApplyService refundApplyService; - - @ApiOperation("退款申请") - @PostMapping - public void applyRefund(@Valid @RequestBody RefundFormDTO refundFormDTO) { - refundApplyService.applyRefund(refundFormDTO); - } - - @ApiOperation("审批退款申请") - @PutMapping("/approval") - public void approveRefundApply(@Valid @RequestBody ApproveFormDTO approveDTO){ - refundApplyService.approveRefundApply(approveDTO); - } - - @ApiOperation("取消退款申请") - @PutMapping("/cancel") - public void cancelRefundApply(@Valid @RequestBody RefundCancelDTO cancelDTO){ - refundApplyService.cancelRefundApply(cancelDTO); - } - - @ApiOperation("分页查询退款申请") - @GetMapping("/page") - public PageDTO queryRefundApplyByPage(RefundApplyPageQuery pageQuery){ - return refundApplyService.queryRefundApplyByPage(pageQuery); - } - - @ApiOperation("根据id查询退款详情") - @GetMapping("/{id}") - public RefundApplyVO queryRefundDetailById(@ApiParam("退款id") @PathVariable("id") Long id){ - return refundApplyService.queryRefundDetailById(id); - } - - @ApiOperation("根据子订单id查询退款详情") - @GetMapping("/detail/{id}") - public RefundApplyVO queryRefundDetailByDetailId(@ApiParam("子订单id") @PathVariable("id") Long detailId){ - return refundApplyService.queryRefundDetailByDetailId(detailId); - } - - @ApiOperation("查询下一个待审批的退款申请") - @GetMapping("/next") - public RefundApplyVO nextRefundApplyToApprove(){ - return refundApplyService.nextRefundApplyToApprove(); - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/ApproveFormDTO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/ApproveFormDTO.java deleted file mode 100644 index 82fdcda..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/ApproveFormDTO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.trade.domain.dto; - -import com.tianji.common.validate.annotations.EnumValid; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Data -@ApiModel(description = "退款审批模型") -public class ApproveFormDTO{ - @ApiModelProperty("退款id") - @NotNull(message = "退款id不能为空") - private Long id; - @NotNull(message = "审批类型不能为空") - @EnumValid(enumeration = {1,2}, message = "审批只有同意和拒绝两种操作") - @ApiModelProperty("审批类型,1:同意,2:拒绝") - public Integer approveType; - @ApiModelProperty("审批意见") - private String approveOpinion; - @ApiModelProperty("备注") - private String remark; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/CartsAddDTO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/CartsAddDTO.java deleted file mode 100644 index 23e10da..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/CartsAddDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.trade.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Data -@ApiModel(description = "课程加入购物车") -public class CartsAddDTO { - @ApiModelProperty("要加入购物车的课程id") - @NotNull(message = "课程id不能为空") - private Long courseId; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/OrderDelayQueryDTO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/OrderDelayQueryDTO.java deleted file mode 100644 index a51aabe..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/OrderDelayQueryDTO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.trade.domain.dto; - -import lombok.Data; - -import java.util.ArrayList; -import java.util.List; - -/** - * 订单状态延迟查询的MQ通知消息 - */ -@Data -public class OrderDelayQueryDTO { - /** - * 订单id - */ - private Long orderId; - /** - * 延迟通知的间隔,默认是3秒、5秒、15秒、30秒、60秒、2分钟共6次延迟查询,中间成功后可以随时取消任务 - */ - private List delayMillis; - - public static OrderDelayQueryDTO init(Long orderId){ - OrderDelayQueryDTO dto = new OrderDelayQueryDTO(); - dto.setOrderId(orderId); - List list = new ArrayList<>(6); - list.add(3000L); - list.add(5000L); - list.add(15000L); - list.add(30000L); - list.add(60000L); - list.add(120000L); - dto.setDelayMillis(list); - return dto; - } - public long removeFirst(){ - return delayMillis.remove(0); - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/PayApplyFormDTO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/PayApplyFormDTO.java deleted file mode 100644 index b9c60f2..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/PayApplyFormDTO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.trade.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@ApiModel(description = "支付申请信息") -@Data -public class PayApplyFormDTO { - @ApiModelProperty(value = "订单id",required = true) - private Long orderId; - @ApiModelProperty(value = "支付渠道码,wxPay,aliPay",required = true) - private String payChannelCode; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/PlaceOrderDTO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/PlaceOrderDTO.java deleted file mode 100644 index beeca59..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/PlaceOrderDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.trade.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; -import java.util.List; - -@Data -@ApiModel(description = "下单模型") -public class PlaceOrderDTO { - @ApiModelProperty("要购买的课程id列表,可以只买单个课程") - @NotNull(message = "你还没有选好课程") - @Size(min = 1, message = "你还没有选好课程") - @Size(max = 10, message = "一次最多选购10门课程") - private List courseIds; - - @ApiModelProperty("该订单使用的优惠券id列表,可以为空") - private List couponIds; - - @ApiModelProperty("订单id") - @NotNull(message = "订单id不能为空") - private Long orderId; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/RefundCancelDTO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/RefundCancelDTO.java deleted file mode 100644 index 4f9f96b..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/RefundCancelDTO.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.tianji.trade.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@ApiModel(description = "退款取消") -@Data -public class RefundCancelDTO { - @ApiModelProperty("退款申请id,订单明细id和退款申请id二选一") - private Long id; - @ApiModelProperty("订单明细id,订单明细id和退款申请id二选一") - private Long orderDetailId; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/RefundFormDTO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/RefundFormDTO.java deleted file mode 100644 index 5b5a291..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/dto/RefundFormDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.trade.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import javax.validation.constraints.NotNull; - -@Data -@ApiModel(description = "退款申请数据") -public class RefundFormDTO { - @ApiModelProperty("订单明细id") - @NotNull(message = "请选中退款订单") - private Long orderDetailId; - @ApiModelProperty("退款原因") - @NotNull(message = "请选择退款原因") - private String refundReason; - @ApiModelProperty("问题说明") - @NotNull(message = "问题说明不能为空") - private String questionDesc; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/Cart.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/Cart.java deleted file mode 100644 index 88638f4..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/Cart.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.tianji.trade.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 购物车条目信息,也就是购物车中的课程 - *

- * - * @author 虎哥 - * @since 2022-08-28 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("cart") -public class Cart implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 购物车条目id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 用户id - */ - private Long userId; - - /** - * 课程id - */ - private Long courseId; - - /** - * 课程封面路径 - */ - private String coverUrl; - - /** - * 课程名称 - */ - private String courseName; - - /** - * 单价 - */ - private Integer price; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/Order.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/Order.java deleted file mode 100644 index cb16f4b..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/Order.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.tianji.trade.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 订单 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("`order`") -public class Order implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 订单id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - /** - * 支付交易流水单 - */ - private Long payOrderNo; - /** - * 用户id - */ - private Long userId; - - /** - * 订单状态,1:待支付,2:已支付,3:已关闭,4:已完成,5:已报名,6:已申请退款 - */ - private Integer status; - - /** - * 状态备注 - */ - private String message; - - /** - * 订单总金额,单位分 - */ - private Integer totalAmount; - - /** - * 实付金额,单位分 - */ - private Integer realAmount; - - /** - * 优惠金额,单位分 - */ - private Integer discountAmount; - - /** - * 支付渠道 - */ - private String payChannel; - - /** - * 优惠券id - */ - private Long couponId; - - /** - * 创建订单时间 - */ - private LocalDateTime createTime; - - /** - * 支付时间 - */ - private LocalDateTime payTime; - - /** - * 订单关闭时间 - */ - private LocalDateTime closeTime; - - /** - * 订单完成时间,支付后30天 - */ - private LocalDateTime finishTime; - - /** - * 申请退款时间 - */ - private LocalDateTime refundTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - - private Long creater; - - /** - * 更新人 - */ - - private Long updater; - - /** - * 逻辑删除 - */ - @TableLogic - private Integer deleted; - - -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/OrderDetail.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/OrderDetail.java deleted file mode 100644 index 7d17231..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/OrderDetail.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.tianji.trade.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 订单明细 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("order_detail") -public class OrderDetail implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 订单明细id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 订单id - */ - private Long orderId; - - /** - * 用户id - */ - private Long userId; - - /** - * 课程id - */ - private Long courseId; - - /** - * 课程价格 - */ - private Integer price; - - /** - * 课程名称 - */ - private String name; - - /** - * 封面地址 - */ - private String coverUrl; - - /** - * 课程学习有效期,单位:月。从付款时间开始算 - */ - private Integer validDuration; - - /** - * 课程学习过期时间 - */ - private LocalDateTime courseExpireTime; - - /** - * 折扣金额 - */ - private Integer discountAmount; - - /** - * 实付金额 - */ - private Integer realPayAmount; - - /** - * 订单详情状态,1:待支付,2:已支付,3:已关闭,4:已完成,5:已报名 - */ - private Integer status; - - /** - * 1:待审批,2:取消退款,3:同意退款,4:拒绝退款,5:退款成功,6:退款失败 - */ - private Integer refundStatus; - - /** - * 优惠券id - */ - private Long couponId; - - /** - * 支付渠道名称 - */ - private String payChannel; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建人 - */ - - private Long creater; - - /** - * 更新人 - */ - - private Long updater; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/RefundApply.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/RefundApply.java deleted file mode 100644 index c058221..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/po/RefundApply.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.tianji.trade.domain.po; - -import com.baomidou.mybatisplus.annotation.*; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 退款申请 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("refund_apply") -public class RefundApply implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 退款id - */ - @TableId(value = "id", type = IdType.ASSIGN_ID) - private Long id; - - /** - * 订单明细id - */ - private Long orderDetailId; - - /** - * 订单id - */ - private Long orderId; - /** - * 退款单号,每次退款的唯一标示 - */ - private Long refundOrderNo; - - /** - * 订单所属用户id - */ - private Long userId; - - /** - * 退款金额 - */ - private Integer refundAmount; - - /** - * 退款状态,1:待审批,2:取消退款,3:同意退款,4:拒绝退款,5:退款成功,6:退款失败 - */ - private Integer status; - /** - * 退款状态描述 - */ - private String message; - /** - * 申请退款原因 - */ - private String refundReason; - /** - * 退款原因描述 - */ - private String questionDesc; - - /** - * 审批人id - */ - private Long approver; - /** - * 审批意见 - */ - private String approveOpinion; - /** - * 审批备注 - */ - private String remark; - - /** - * 退款渠道 - */ - private String refundChannel; - /** - * 退款失败原因 - */ - private String failedReason; - - /** - * 创建退款申请时间 - */ - private LocalDateTime createTime; - - /** - * 审批时间 - */ - private LocalDateTime approveTime; - - /** - * 退款完成时间(成功或失败) - */ - private LocalDateTime finishTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - /** - * 创建人 - */ - - private Long creater; - - /** - * 更新人 - */ - - private Long updater; - -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/OrderDetailPageQuery.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/OrderDetailPageQuery.java deleted file mode 100644 index 97c47ec..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/OrderDetailPageQuery.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.tianji.trade.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import com.tianji.common.utils.DateUtils; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "订单明细查询条件") -public class OrderDetailPageQuery extends PageQuery { - @ApiModelProperty("订单明细id") - private Long id; - @ApiModelProperty("订单状态:1:待支付,2:已支付,3:已关闭,4:已完成,5:已报名") - private Integer status; - @ApiModelProperty("退款状态:1:待审批,2:取消退款,3:同意退款,4:拒绝退款,5:退款成功,6:退款失败") - private Integer refundStatus; - @ApiModelProperty("支付方式:wxPay:微信,aliPay:支付宝") - private String payChannel; - @ApiModelProperty("手机号") - private String mobile; - @ApiModelProperty("下单开始时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime orderStartTime; - @ApiModelProperty("下单结束时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime orderEndTime; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/OrderPageQuery.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/OrderPageQuery.java deleted file mode 100644 index c2d4813..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/OrderPageQuery.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.trade.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "订单分页查询条件") -public class OrderPageQuery extends PageQuery { - @ApiModelProperty("订单状态") - private Integer status; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/RefundApplyPageQuery.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/RefundApplyPageQuery.java deleted file mode 100644 index 7432fc8..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/query/RefundApplyPageQuery.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.trade.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import com.tianji.common.utils.DateUtils; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "退款申请分页参数") -public class RefundApplyPageQuery extends PageQuery { - - @ApiModelProperty("退款id") - private Long id; - @ApiModelProperty("退款状态,1:待审批,2:取消退款,3:同意退款,4:拒绝退款,5:退款成功,6:退款失败") - private Integer refundStatus; - @ApiModelProperty("订单明细id") - private Long orderDetailId; - @ApiModelProperty("订单id") - private Long orderId; - @ApiModelProperty("学员手机号") - private String mobile; - @ApiModelProperty("申请开始时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime applyStartTime; - @ApiModelProperty("申请结束时间") - @DateTimeFormat(pattern = DateUtils.DEFAULT_DATE_TIME_FORMAT) - private LocalDateTime applyEndTime; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/CartVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/CartVO.java deleted file mode 100644 index aa0ceea..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/CartVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tianji.trade.domain.vo; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "购物车条目信息") -public class CartVO { - @ApiModelProperty("购物车中条目id") - private Long id; - @ApiModelProperty("课程id") - private Long courseId; - @ApiModelProperty("课程名称") - private String courseName; - @ApiModelProperty("课程封面url") - private String coverUrl; - @ApiModelProperty("加入购物车时的课程价格,单位元") - private Integer price; - @ApiModelProperty("现在的课程价格,单位元") - private Integer nowPrice; - @ApiModelProperty("课程是否已经过期") - private Boolean expired; - @JsonIgnore - @ApiModelProperty(value = "课程有效期", hidden = true) - private LocalDateTime courseValidDate; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderConfirmVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderConfirmVO.java deleted file mode 100644 index b63af17..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderConfirmVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.trade.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "订单确认页信息") -public class OrderConfirmVO { - @ApiModelProperty("订单id") - private Long orderId; - @ApiModelProperty("订单总金额") - private Integer totalAmount; - @ApiModelProperty("优惠折扣金额") - private Integer discountAmount; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailAdminVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailAdminVO.java deleted file mode 100644 index 3247166..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailAdminVO.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.tianji.trade.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Data -@ApiModel(description = "管理端订单条目详细信息") -public class OrderDetailAdminVO { - @ApiModelProperty("订单条目id") - private Long id; - @ApiModelProperty("订单id") - private Long orderId; - @ApiModelProperty("退款id") - private Long refundApplyId; - - @ApiModelProperty("支付流水单号") - private Long payOrderNo; - @ApiModelProperty("退款流水单号") - private Long refundOrderNo; - - @ApiModelProperty("学员昵称") - private String studentName; - @ApiModelProperty("手机号") - private String mobile; - @ApiModelProperty("退款申请人,格式:角色-名字") - private String refundProposerName; - - @ApiModelProperty("支付方式") - private String payChannel; - @ApiModelProperty("退款方式") - private String refundChannel; - @ApiModelProperty("退款失败原因") - private String failedReason; - - @ApiModelProperty("申请退款原因") - private String refundReason; - @ApiModelProperty("申请退款描述") - private String refundMessage; - @ApiModelProperty("审批意见") - private String remark; - - @ApiModelProperty("订单状态,1:待支付,2:已支付,3:已关闭,4:已完成,5:已报名") - private Integer status; - @ApiModelProperty("退款状态,1:待审批,2:取消退款,3:同意退款,4:拒绝退款,5:退款成功,6:退款失败") - private Integer refundStatus; - @ApiModelProperty("状态描述") - private String message; - - @ApiModelProperty("订单节点进度节点列表") - private List nodes; - - @ApiModelProperty("课程名称") - private String name; - @ApiModelProperty("课程价格") - private Integer price; - @ApiModelProperty("实付金额") - private Integer realPayAmount; - @ApiModelProperty("优惠券规则") - private String couponDesc; - @ApiModelProperty("优惠总金额") - private Integer discountAmount; - @ApiModelProperty("学习有效期") - private LocalDateTime studyValidTime; - - @ApiModelProperty("是否可以退款") - private Boolean canRefund; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailPageVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailPageVO.java deleted file mode 100644 index 35604e9..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailPageVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.trade.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "订单明细分页结果") -public class OrderDetailPageVO { - @ApiModelProperty("订单明细id") - private Long id; - @ApiModelProperty("订单id") - private Long orderId; - @ApiModelProperty("学员姓名") - private String name; - @ApiModelProperty("手机号") - private String mobile; - @ApiModelProperty("订单金额,也就是课程原价") - private Integer price; - @ApiModelProperty("实付金额") - private Integer realPayAmount; - @ApiModelProperty("订单状态1:待支付,2:已支付,3:已关闭,4:已完成,5:已报名") - private Integer status; - @ApiModelProperty("订单状态描述") - private String statusDesc; - @ApiModelProperty("退款状态1:待支付,2:已支付,3:已关闭,4:已完成,5:已报名,0:表示没有退款状态") - private Integer refundStatus; - @ApiModelProperty("退款状态描述") - private String refundStatusDesc; - @ApiModelProperty("订单时间") - private LocalDateTime createTime; - @ApiModelProperty("支付方式") - private String payChannel; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailVO.java deleted file mode 100644 index c9c13c2..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderDetailVO.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.tianji.trade.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "订单条目中的课程信息") -public class OrderDetailVO { - @ApiModelProperty("订单条目id") - private Long id; - @ApiModelProperty("总订单id") - private Long orderId; - @ApiModelProperty("课程id") - private Long courseId; - @ApiModelProperty("课程名称") - private String name; - @ApiModelProperty("封面") - private String coverUrl; - @ApiModelProperty("课程价格") - private Integer price; - @ApiModelProperty("实付金额") - private Integer realPayAmount; - @ApiModelProperty("退款状态") - private Integer refundStatus; - @ApiModelProperty("优惠券规则") - private String couponDesc; - @ApiModelProperty("是否可以退款") - private Boolean canRefund; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderPageVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderPageVO.java deleted file mode 100644 index 90e0ab9..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderPageVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.trade.domain.vo; - - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Data -@ApiModel(description = "订单分页信息") -public class OrderPageVO { - @ApiModelProperty("订单id") - private Long id; - @ApiModelProperty("订单创建时间") - private LocalDateTime createTime; - @ApiModelProperty("订单实付金额") - private Integer realAmount; - @ApiModelProperty("订单明细金额") - private Integer totalAmount; - @ApiModelProperty("订单状态1:待支付,2:已支付,3:已关闭,4:已完成,5:已报名") - private Integer status; - @ApiModelProperty("订单状态描述") - private String statusDesc; - @ApiModelProperty("订单中课程明细") - private List details; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderProgressNodeVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderProgressNodeVO.java deleted file mode 100644 index f762b47..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderProgressNodeVO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.trade.domain.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class OrderProgressNodeVO { - @ApiModelProperty("订单进度节点名称") - private String name; - @ApiModelProperty("订单进度节点名称对应的时间") - private LocalDateTime time; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderVO.java deleted file mode 100644 index 666ceda..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/OrderVO.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.trade.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; -import java.util.List; - -@Data -@ApiModel(description = "订单详细信息") -public class OrderVO { - @ApiModelProperty("订单id") - private Long id; - @ApiModelProperty("订单创建时间") - private LocalDateTime createTime; - @ApiModelProperty("订单实付金额") - private Integer realAmount; - @ApiModelProperty("订单明细金额") - private Integer totalAmount; - @ApiModelProperty("优惠券规则,可以有多个优惠券规则") - private String couponDesc; - @ApiModelProperty("优惠总金额") - private Double discountAmount; - @ApiModelProperty("订单状态,1:待支付,2:已支付,3:已关闭,4:已完成,5:已报名,6:已申请退款") - private Integer status; - @ApiModelProperty("订单状态描述") - private String statusDesc; - @ApiModelProperty("订单状态描述") - private String message; - @ApiModelProperty("订单进度明细") - private List progressNodes; - - @ApiModelProperty("订单中课程明细") - private List details; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/PayChannelVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/PayChannelVO.java deleted file mode 100644 index 55452cc..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/PayChannelVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.tianji.trade.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - *

- * 支付渠道vo对象 - *

- * - * @author 虎哥 - * @since 2022-08-26 - */ -@Data -@ApiModel(description = "支付渠道信息") -public class PayChannelVO { - - @ApiModelProperty("支付渠道id") - private Long id; - @ApiModelProperty("支付渠道名称") - private String name; - @ApiModelProperty("支付渠道编码,唯一标示") - private String channelCode; - @ApiModelProperty("渠道优先级,数字越小优先级越高") - private Integer channelPriority; - @ApiModelProperty("渠道图标") - private String channelIcon; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/PlaceOrderResultVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/PlaceOrderResultVO.java deleted file mode 100644 index 41e488f..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/PlaceOrderResultVO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.trade.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Builder; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@Builder -@ApiModel(description = "下单响应信息") -public class PlaceOrderResultVO { - @ApiModelProperty("订单号") - private Long orderId; - @ApiModelProperty("支付金额") - private Integer payAmount; - @ApiModelProperty("待支付的订单,超时时间") - private LocalDateTime payOutTime; - @ApiModelProperty("订单状态,1:待支付,2:已支付,3:已关闭,4:已完成,5:已报名, 6:申请退款") - private Integer status; -} - diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/RefundApplyPageVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/RefundApplyPageVO.java deleted file mode 100644 index 672cf38..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/RefundApplyPageVO.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.trade.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "退款信息") -public class RefundApplyPageVO { - @ApiModelProperty("退款id") - private Long id; - @ApiModelProperty("订单明细id") - private Long orderDetailId; - @ApiModelProperty("订单id") - private Long orderId; - @ApiModelProperty("退款金额") - private Integer refundAmount; - @ApiModelProperty("申请人") - private String proposerName; - @ApiModelProperty("申请人手机号") - private String proposerMobile; - @ApiModelProperty("退款申请状态") - private Integer status; - @ApiModelProperty("退款申请状态描述") - private String refundStatusDesc; - @ApiModelProperty("退款申请时间") - private LocalDateTime createTime; - - @ApiModelProperty("审批人") - private String approverName; - @ApiModelProperty("审批时间") - private String approveTime; - - @ApiModelProperty("退款成功时间") - private LocalDateTime refundSuccessTime; -} \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/RefundApplyVO.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/RefundApplyVO.java deleted file mode 100644 index 17b866d..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/domain/vo/RefundApplyVO.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.tianji.trade.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; -@Data -@ApiModel(description = "退款申请详细信息") -public class RefundApplyVO { - @ApiModelProperty("退款id") - private Long id; - @ApiModelProperty("子订单id") - private Long orderDetailId; - @ApiModelProperty("订单id") - private Long orderId; - @ApiModelProperty("支付流水单号") - private Long payOrderNo; - - @ApiModelProperty("支付方式") - private String payChannel; - @ApiModelProperty("退款方式") - private String refundChannel; - @ApiModelProperty("退款流水单号") - private Long refundOrderNo; - - @ApiModelProperty("申请退款原因") - private String refundReason; - @ApiModelProperty("申请退款说明") - private String questionDesc; - - @ApiModelProperty("学员昵称") - private String studentName; - @ApiModelProperty("手机号") - private String mobile; - @ApiModelProperty("退款申请人,格式:角色-名字") - private String refundProposerName; - - @ApiModelProperty("订单时间") - private LocalDateTime orderTime; - @ApiModelProperty("支付时间") - private LocalDateTime paySuccessTime; - @ApiModelProperty("退款申请时间") - private LocalDateTime createTime; - @ApiModelProperty("退款审批时间") - private LocalDateTime approveTime; - - @ApiModelProperty("状态描述") - private String message; - @ApiModelProperty("审批意见") - private String approveOpinion; - @ApiModelProperty("审批意见") - private String remark; - - @ApiModelProperty("课程名称") - private String name; - @ApiModelProperty("课程价格") - private Integer price; - @ApiModelProperty("实付金额") - private Integer realPayAmount; - @ApiModelProperty("优惠券规则") - private String couponDesc; - @ApiModelProperty("优惠总金额") - private Integer discountAmount; - - - @ApiModelProperty("退款状态:1:待审批,2:取消退款,3:同意退款,4:拒绝退款,5:退款成功,6:退款失败") - private Integer status; - @ApiModelProperty("退款失败原因") - private String failedReason; -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/handler/PayMessageHandler.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/handler/PayMessageHandler.java deleted file mode 100644 index ed4761a..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/handler/PayMessageHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.tianji.trade.handler; - -import com.tianji.common.constants.MqConstants; -import com.tianji.pay.sdk.dto.PayResultDTO; -import com.tianji.pay.sdk.dto.RefundResultDTO; -import com.tianji.trade.domain.dto.OrderDelayQueryDTO; -import com.tianji.trade.service.IOrderService; -import com.tianji.trade.service.IPayService; -import com.tianji.trade.service.IRefundApplyService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.ExchangeTypes; -import org.springframework.amqp.rabbit.annotation.Exchange; -import org.springframework.amqp.rabbit.annotation.Queue; -import org.springframework.amqp.rabbit.annotation.QueueBinding; -import org.springframework.amqp.rabbit.annotation.RabbitListener; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -@RequiredArgsConstructor -public class PayMessageHandler { - - private final IOrderService orderService; - private final IRefundApplyService refundApplyService; - private final IPayService payService; - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "trade.pay.success.queue", durable = "true"), - exchange = @Exchange(name = MqConstants.Exchange.PAY_EXCHANGE, type = ExchangeTypes.TOPIC), - key = MqConstants.Key.PAY_SUCCESS - )) - public void listenPaySuccess(PayResultDTO payResult){ - log.debug("收到支付成功通知:{}", payResult); - orderService.handlePaySuccess(payResult); - } - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "trade.refund.result.queue", durable = "true"), - exchange = @Exchange(name = MqConstants.Exchange.PAY_EXCHANGE, type = ExchangeTypes.TOPIC), - key = MqConstants.Key.REFUND_CHANGE - )) - public void listenRefundResult(RefundResultDTO refundResult){ - log.debug("收到退款变更成功通知:{}", refundResult); - refundApplyService.handleRefundResult(refundResult); - } - - @RabbitListener(bindings = @QueueBinding( - value = @Queue(name = "trade.delay.order.query", durable = "true"), - exchange = @Exchange(name = MqConstants.Exchange.TRADE_DELAY_EXCHANGE, delayed = "true", type = ExchangeTypes.TOPIC), - key = MqConstants.Key.ORDER_DELAY_KEY - )) - public void listenOrderDelayQueryMessage(OrderDelayQueryDTO message){ - log.debug("收到订单延迟查询通知:{}", message); - payService.queryPayResult(message); - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/handler/RefundJobHandler.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/handler/RefundJobHandler.java deleted file mode 100644 index 14fd79d..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/handler/RefundJobHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.trade.handler; - -import com.tianji.trade.domain.po.RefundApply; -import com.tianji.trade.service.IRefundApplyService; -import com.xxl.job.core.context.XxlJobHelper; -import com.xxl.job.core.handler.annotation.XxlJob; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -@RequiredArgsConstructor -public class RefundJobHandler { - - private final IRefundApplyService refundApplyService; - - @XxlJob("refundRequestJobHandler") - public void handleRefundRequest(){ - // 1.获取分片信息,作为页码,每页最多查询 2条,避免退款申请过于频繁 - int index = XxlJobHelper.getShardIndex() + 1; - int size = 2; - // 2.分页查询审批通过的退款申请 - List list = refundApplyService.queryApplyToSend(index, size); - // 3.循环处理退款申请 - for (RefundApply refundApply : list) { - // 3.1.检查退款单状态,是否已经退款结束 - boolean refundFinished = refundApplyService.checkRefundStatus(refundApply); - if(refundFinished){ - continue; - } - // 3.2.发送退款申请 - refundApplyService.sendRefundRequest(refundApply); - } - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/CartMapper.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/CartMapper.java deleted file mode 100644 index 07c849d..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/CartMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.trade.mapper; - -import com.tianji.trade.domain.po.Cart; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 购物车条目信息,也就是购物车中的课程 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-28 - */ -public interface CartMapper extends BaseMapper { - -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/OrderDetailMapper.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/OrderDetailMapper.java deleted file mode 100644 index ce45e5f..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/OrderDetailMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.trade.mapper; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.trade.domain.po.OrderDetail; -import org.apache.ibatis.annotations.Param; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - *

- * 订单明细 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -public interface OrderDetailMapper extends BaseMapper { - - @Select("SELECT course_id FROM order_detail WHERE order_id = #{orderId}") - List queryCourseIdsByOrderId(Long orderId); - - List countEnrollNumOfCourse(@Param("ew") QueryWrapper wrapper); - - List countEnrollCourseOfStudent(@Param("ew") QueryWrapper wrapper); - - @Select("SELECT SUM(real_pay_amount) FROM order_detail WHERE course_id = #{courseId}") - int countRealPayAmountByCourseId(Long courseId); -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/OrderMapper.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/OrderMapper.java deleted file mode 100644 index b583d3d..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/OrderMapper.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.trade.mapper; - -import com.tianji.trade.domain.po.Order; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - *

- * 订单 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -public interface OrderMapper extends BaseMapper { - - Order getById(Long id); -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/RefundApplyMapper.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/RefundApplyMapper.java deleted file mode 100644 index 754275a..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/mapper/RefundApplyMapper.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.trade.mapper; - -import com.tianji.trade.domain.po.RefundApply; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Select; - -import java.util.List; - -/** - *

- * 退款申请 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -public interface RefundApplyMapper extends BaseMapper { - - @Select("SELECT id FROM refund_apply WHERE status = 1 LIMIT 1") - Long nextRefundApplyToApprove(); - - List queryByDetailId(Long detailId); -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/ICartService.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/ICartService.java deleted file mode 100644 index 981e3c2..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/ICartService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.trade.service; - -import com.tianji.trade.domain.po.Cart; -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.trade.domain.vo.CartVO; - -import java.util.List; - -/** - *

- * 购物车条目信息,也就是购物车中的课程 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-28 - */ -public interface ICartService extends IService { - - void addCourse2Cart(Long courseId); - - List getMyCarts(); - - void deleteCartById(Long id); - - void deleteCartByIds(List ids); - - void deleteCartByUserAndCourseIds(Long userId, List courseIds); -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IOrderDetailService.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IOrderDetailService.java deleted file mode 100644 index f84c98e..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IOrderDetailService.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.tianji.trade.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.api.dto.course.CoursePurchaseInfoDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.trade.domain.po.Order; -import com.tianji.trade.domain.po.OrderDetail; -import com.tianji.trade.domain.po.RefundApply; -import com.tianji.trade.domain.query.OrderDetailPageQuery; -import com.tianji.trade.domain.vo.OrderDetailAdminVO; -import com.tianji.trade.domain.vo.OrderDetailPageVO; -import com.tianji.trade.domain.vo.OrderProgressNodeVO; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Map; - -/** - *

- * 订单明细 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -public interface IOrderDetailService extends IService { - - void updateStatusByOrderId(Long orderId, Integer status); - - List queryByOrderIds(List orderIds); - - List queryByOrderId(Long orderId); - - PageDTO queryDetailForPage(OrderDetailPageQuery pageQuery); - - OrderDetailAdminVO queryOrdersDetailProgress(Long id); - - List packageProgressNodes(Order order, RefundApply refundApply); - - void markDetailSuccessByOrderId(Long id, String payChannel, LocalDateTime successTime); - - void updateRefundStatusById(Long orderDetailId, int status); - - List queryCourseIdsByOrderId(Long orderId); - - Boolean checkCourseOrderInfo(Long courseId); - - Map countEnrollNumOfCourse(List courseIdList); - - Map countEnrollCourseOfStudent(List studentIds); - - CoursePurchaseInfoDTO getPurchaseInfoOfCourse(Long courseId); -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IOrderService.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IOrderService.java deleted file mode 100644 index 07fa44e..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IOrderService.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.tianji.trade.service; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.pay.sdk.dto.PayResultDTO; -import com.tianji.trade.domain.dto.PlaceOrderDTO; -import com.tianji.trade.domain.po.Order; -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.trade.domain.po.OrderDetail; -import com.tianji.trade.domain.query.OrderPageQuery; -import com.tianji.trade.domain.vo.OrderConfirmVO; -import com.tianji.trade.domain.vo.OrderPageVO; -import com.tianji.trade.domain.vo.OrderVO; -import com.tianji.trade.domain.vo.PlaceOrderResultVO; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -/** - *

- * 订单 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -public interface IOrderService extends IService { - - PlaceOrderResultVO placeOrder(PlaceOrderDTO placeOrderDTO); - - @Transactional - void saveOrderAndDetails(Order order, List orderDetails); - - void cancelOrder(Long orderId); - - void deleteOrder(Long id); - - PageDTO queryMyOrderPage(OrderPageQuery pageQuery); - - OrderVO queryOrderById(Long id); - - PlaceOrderResultVO queryOrderStatus(Long orderId); - - void handlePaySuccess(PayResultDTO payResult); - - PlaceOrderResultVO enrolledFreeCourse(Long courseId); - - OrderConfirmVO prePlaceOrder(List courseIds); - -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IPayService.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IPayService.java deleted file mode 100644 index 10181d0..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IPayService.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.trade.service; - -import com.tianji.trade.domain.dto.OrderDelayQueryDTO; -import com.tianji.trade.domain.dto.PayApplyFormDTO; -import com.tianji.trade.domain.vo.PayChannelVO; - -import java.util.List; - -public interface IPayService { - List queryPayChannels(); - - String applyPayOrder(PayApplyFormDTO payApply); - - void queryPayResult(OrderDelayQueryDTO message); -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IRefundApplyService.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IRefundApplyService.java deleted file mode 100644 index 6725c22..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/IRefundApplyService.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.tianji.trade.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.pay.sdk.dto.RefundResultDTO; -import com.tianji.trade.domain.dto.ApproveFormDTO; -import com.tianji.trade.domain.dto.RefundCancelDTO; -import com.tianji.trade.domain.dto.RefundFormDTO; -import com.tianji.trade.domain.po.RefundApply; -import com.tianji.trade.domain.query.RefundApplyPageQuery; -import com.tianji.trade.domain.vo.RefundApplyPageVO; -import com.tianji.trade.domain.vo.RefundApplyVO; - -import java.util.List; - -/** - *

- * 退款申请 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -public interface IRefundApplyService extends IService { - - List queryByDetailId(Long id); - - void applyRefund(RefundFormDTO refundFormDTO); - - PageDTO queryRefundApplyByPage(RefundApplyPageQuery pageQuery); - - RefundApplyVO queryRefundDetailById(Long id); - - RefundApplyVO nextRefundApplyToApprove(); - - void approveRefundApply(ApproveFormDTO approveDTO); - - void cancelRefundApply(RefundCancelDTO cancelDTO); - - RefundApplyVO queryRefundDetailByDetailId(Long id); - - void handleRefundResult(RefundResultDTO refundResult); - - List queryApplyToSend(int page, int size); - - void sendRefundRequest(RefundApply refundApply); - - boolean checkRefundStatus(RefundApply refundApply); -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/CartServiceImpl.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/CartServiceImpl.java deleted file mode 100644 index 23329de..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/CartServiceImpl.java +++ /dev/null @@ -1,169 +0,0 @@ -package com.tianji.trade.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.course.CourseClient; -import com.tianji.api.dto.course.CourseFullInfoDTO; -import com.tianji.api.dto.course.CourseSimpleInfoDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.trade.config.TradeProperties; -import com.tianji.trade.domain.po.Cart; -import com.tianji.trade.domain.vo.CartVO; -import com.tianji.trade.mapper.CartMapper; -import com.tianji.trade.service.ICartService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static com.tianji.trade.constants.TradeErrorInfo.*; - -/** - *

- * 购物车条目信息,也就是购物车中的课程 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-28 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class CartServiceImpl extends ServiceImpl implements ICartService { - - private final CourseClient courseClient; - private final TradeProperties tradeProperties; - - @Override - public void addCourse2Cart(Long courseId) { - Long userId = UserContext.getUser(); - log.debug("加入购物车请求:用户:{},课程:{}", userId, courseId); - // 1.查询该课程是否已经在购物车 - if (checkCourseExists(courseId, userId)) { - return; - } - // 2.查询购物车中课程是否超出上限 - checkCartsFull(userId); - - // 3.根据id查询课程信息 - CourseFullInfoDTO courseInfo = courseClient.getCourseInfoById(courseId, false, false); - - // 4.判断是否为空 - if (courseInfo == null) { - throw new BadRequestException(COURSE_NOT_EXISTS); - } - - // 5.判断是否过期 - if (courseInfo.getPurchaseEndTime().isBefore(LocalDateTime.now())) { - // 已经过期,无法购买 - throw new BadRequestException(COURSE_EXPIRED); - } - // 5.写入购物车 - Cart cart = new Cart(); - cart.setId(IdWorker.getId()); //购物车中的id - cart.setCourseId(courseId); //课程id - cart.setCourseName(courseInfo.getName()); - cart.setUserId(UserContext.getUser()); - cart.setCoverUrl(courseInfo.getCoverUrl()); - cart.setPrice(courseInfo.getPrice()); - save(cart); - log.debug("加入购物车成功!用户:{},课程:{}", userId, courseId); - } - - private void checkCartsFull(Long userId) { - int count = lambdaQuery().eq(Cart::getUserId, userId).count(); - if (count >= tradeProperties.getMaxCourseAmount()) { - throw new BizIllegalException( - StringUtils.format(CARTS_FULL, tradeProperties.getMaxCourseAmount())); - } - } - - private boolean checkCourseExists(Long courseId, Long userId) { - int count = lambdaQuery() - .eq(Cart::getUserId, userId) - .eq(Cart::getCourseId, courseId) - .count(); - return count > 0; - } - - @Override - public List getMyCarts() { - // 1.获取用户 - Long userId = UserContext.getUser(); - // 2.查询我的购物车 - List carts = lambdaQuery().eq(Cart::getUserId, userId).list(); - if (CollUtils.isEmpty(carts)) { - return CollUtils.emptyList(); - } - // 3.查询购物车中的课程 - List courseIds = carts.stream().map(Cart::getCourseId).collect(Collectors.toList()); - List courseSimpleInfos = courseClient.getSimpleInfoList(courseIds); - Map map = courseSimpleInfos.stream() - .collect(Collectors.toMap(CourseSimpleInfoDTO::getId, c -> c)); - // 4.组织 vo - List list = new ArrayList<>(carts.size()); - for (Cart cart : carts) { - // 4.1.转换VO - CartVO vo = BeanUtils.toBean(cart, CartVO.class); - list.add(vo); - // 4.2.获取新的课程信息 - CourseSimpleInfoDTO info = map.get(cart.getCourseId()); - vo.setNowPrice(info.getPrice()); - vo.setExpired(info.getPurchaseEndTime().isBefore(LocalDateTime.now())); - vo.setCourseValidDate(info.getPurchaseEndTime()); - } - // 5.排序 - return list.stream().sorted( - Comparator.comparing(CartVO::getExpired).reversed() // 先看是否过期,未过期的在前,已过期的在后 - .thenComparingLong(CartVO::getId).reversed() // 再看id,id大的是新加入的 - ).collect(Collectors.toList()); - } - - @Override - public void deleteCartById(Long id) { - // 1.获取用户 - Long userId = UserContext.getUser(); - // 2.删除 - remove(new LambdaQueryWrapper() - .eq(Cart::getId, id) - .eq(Cart::getUserId, userId) - ); - } - - @Override - public void deleteCartByIds(List ids) { - Long userId = UserContext.getUser(); - remove(new LambdaQueryWrapper() - .eq(Cart::getUserId, userId) - .in(Cart::getId, ids) - ); - } - - @Override - public void deleteCartByUserAndCourseIds(Long userId, List courseIds) { - log.debug("尝试从购物车删除用户已购买的课程,用户id:{},课程id:{}", userId, courseIds); - try { - if(CollUtils.isEmpty(courseIds) || userId == null){ - return; - } - remove(new LambdaQueryWrapper() - .eq(Cart::getUserId, userId) - .in(Cart::getCourseId, courseIds) - ); - } catch (Exception e) { - log.error("从购物车删除用户已购买的课程发生异常,用户id:{},课程id:{}", userId, courseIds, e); - } - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/OrderDetailServiceImpl.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/OrderDetailServiceImpl.java deleted file mode 100644 index 18c13d6..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/OrderDetailServiceImpl.java +++ /dev/null @@ -1,342 +0,0 @@ -package com.tianji.trade.service.impl; - -import cn.hutool.db.DbRuntimeException; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.cache.RoleCache; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.IdAndNumDTO; -import com.tianji.api.dto.course.CoursePurchaseInfoDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.*; -import com.tianji.pay.sdk.client.PayClient; -import com.tianji.pay.sdk.constants.PayChannel; -import com.tianji.pay.sdk.constants.RefundChannelEnum; -import com.tianji.trade.constants.OrderStatus; -import com.tianji.trade.constants.RefundStatus; -import com.tianji.trade.domain.po.Order; -import com.tianji.trade.domain.po.OrderDetail; -import com.tianji.trade.domain.po.RefundApply; -import com.tianji.trade.domain.query.OrderDetailPageQuery; -import com.tianji.trade.domain.vo.OrderDetailAdminVO; -import com.tianji.trade.domain.vo.OrderDetailPageVO; -import com.tianji.trade.domain.vo.OrderProgressNodeVO; -import com.tianji.trade.mapper.OrderDetailMapper; -import com.tianji.trade.mapper.OrderMapper; -import com.tianji.trade.mapper.RefundApplyMapper; -import com.tianji.trade.service.IOrderDetailService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - -import static com.tianji.trade.constants.OrderStatus.*; -import static com.tianji.trade.constants.TradeErrorInfo.ORDER_NOT_EXISTS; - -/** - *

- * 订单明细 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -@Service -@RequiredArgsConstructor -public class OrderDetailServiceImpl extends ServiceImpl implements IOrderDetailService { - - private final UserClient userClient; - - private final OrderMapper orderMapper; - - private final PayClient payClient; - - private final RefundApplyMapper applyMapper; - - private final RoleCache roleCache; - - @Override - @Transactional - public void updateStatusByOrderId(Long orderId, Integer status) { - boolean success = lambdaUpdate() - .set(OrderDetail::getStatus, status) - .eq(OrderDetail::getOrderId, orderId) - .update(); - if (!success) { - throw new DbRuntimeException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - } - - @Override - public List queryByOrderIds(List orderIds) { - return lambdaQuery().in(OrderDetail::getOrderId, orderIds).list(); - } - - @Override - public List queryByOrderId(Long orderId) { - return lambdaQuery().eq(OrderDetail::getOrderId, orderId).list(); - } - - @Override - public PageDTO queryDetailForPage(OrderDetailPageQuery query) { - // 1.分页和排序条件 - Page p = query.toMpPageDefaultSortByCreateTimeDesc(); - // 2.可能有用户条件 - Long userId = null; - if (StringUtils.isNotBlank(query.getMobile())) { - userId = userClient.exchangeUserIdWithPhone(query.getMobile()); - if (userId == null) { - // 学生不存在,则返回空数据 - return PageDTO.empty(0L, 0L); - } - } - // 3.搜索 - Page page = lambdaQuery() - .eq(query.getId() != null, OrderDetail::getId, query.getId()) - .eq(query.getStatus() != null, OrderDetail::getStatus, query.getStatus()) - .eq(query.getRefundStatus() != null, OrderDetail::getRefundStatus, query.getRefundStatus()) - .eq(StringUtils.isNotBlank(query.getPayChannel()), OrderDetail::getPayChannel, query.getPayChannel()) - .ge(query.getOrderStartTime() != null, OrderDetail::getCreateTime, query.getOrderStartTime()) - .le(query.getOrderEndTime() != null, OrderDetail::getCreateTime, query.getOrderEndTime()) - .eq(userId != null, OrderDetail::getUserId, userId) - .page(p); - // 4.判断是否为空 - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(page); - } - // 5.查询订单中的用户信息 - Set uIds = records.stream().map(OrderDetail::getUserId).collect(Collectors.toSet()); - List users = userClient.queryUserByIds(uIds); - AssertUtils.isNotEmpty(users, ErrorInfo.Msg.USER_NOT_EXISTS); - Map userMap = users.stream().collect(Collectors.toMap(UserDTO::getId, u -> u)); - - // 6.数据转换 - List list = new ArrayList<>(records.size()); - for (OrderDetail record : records) { - // 6.1.转换vo - OrderDetailPageVO v = BeanUtils.toBean(record, OrderDetailPageVO.class); - list.add(v); - // 6.2.用户信息 - UserDTO u = userMap.get(record.getUserId()); - v.setName(roleCache.exchangeRoleName(u)); - v.setMobile(u == null ? null : u.getCellPhone()); - // 6.3.其它 - v.setPayChannel(PayChannel.desc(record.getPayChannel())); - v.setStatusDesc(OrderStatus.desc(record.getStatus())); - v.setRefundStatusDesc(RefundStatus.desc(record.getRefundStatus())); - } - - return PageDTO.of(page, list); - } - - @Override - public OrderDetailAdminVO queryOrdersDetailProgress(Long id) { - // 1.查询订单明细 - OrderDetail detail = getById(id); - if (detail == null) { - throw new BadRequestException(ORDER_NOT_EXISTS); - } - // 2.查询对应订单 - Order order = orderMapper.getById(detail.getOrderId()); - if (order == null) { - throw new BadRequestException(ORDER_NOT_EXISTS); - } - // 3.查询退款申请单 - List refundApplyList = null; - RefundApply refundApply = null; - if (detail.getRefundStatus() != null && detail.getRefundStatus() != 0) { - refundApplyList = applyMapper.queryByDetailId(detail.getId()); - refundApply = refundApplyList.get(0); - } - - // 4.查询学生和申请人信息 - Set uIds = new HashSet<>(2); - uIds.add(detail.getUserId()); - if (refundApply != null) { - uIds.add(refundApply.getCreater()); - } - List userDTOS = userClient.queryUserByIds(uIds); - AssertUtils.isNotEmpty(userDTOS, ErrorInfo.Msg.USER_NOT_EXISTS); - Map userMap = userDTOS.stream().collect(Collectors.toMap(UserDTO::getId, u -> u)); - - // 5.数据处理 - OrderDetailAdminVO vo = BeanUtils.toBean(detail, OrderDetailAdminVO.class); - vo.setMessage(order.getMessage()); - vo.setPayChannel(PayChannel.desc(order.getPayChannel())); - // 5.1.订单流水信息 - vo.setPayOrderNo(order.getPayOrderNo()); - if (refundApply != null) { - vo.setRefundOrderNo(refundApply.getRefundOrderNo()); - vo.setRefundChannel(RefundChannelEnum.desc(refundApply.getRefundChannel())); - vo.setFailedReason(refundApply.getFailedReason()); - } - // 5.2.用户信息 - UserDTO student = userMap.get(detail.getUserId()); - vo.setStudentName(student.getName()); - vo.setMobile(student.getCellPhone()); - - // 5.3.退款单信息 - if (refundApply != null) { - vo.setRefundApplyId(refundApply.getId()); - vo.setRefundProposerName(userMap.get(refundApply.getCreater()).getName()); - vo.setRefundReason(refundApply.getRefundReason()); - vo.setRemark(refundApply.getRemark()); - vo.setRefundMessage(refundApply.getMessage()); - } - - // 5.4.课程有效期 - Integer validDuration = detail.getValidDuration(); - if (order.getPayTime() != null && validDuration != null && validDuration > 0) { - // 已经支付成功,设置课程有效期 - vo.setStudyValidTime(order.getPayTime().plusMonths(validDuration)); - } - - // 5.5.设置订单进度 - List progressNodes = packageProgressNodes(order, refundApply); - vo.setNodes(progressNodes); - - // 5.6.是否允许退款: - // - 已经支付并且当前没有退款 - // - 当前只且只有1次退款并且退款进程已完结 - vo.setCanRefund( - (OrderStatus.canRefund(detail.getStatus()) && refundApply == null) || - (refundApply != null && refundApplyList.size() == 1 && - !RefundStatus.inProgress(refundApply.getStatus())) - ); - return vo; - } - - @Override - public List packageProgressNodes(Order order, RefundApply refundApply) { - // 1.先填充订单交易的每个节点的时间值 - List list = new ArrayList<>(); - // 1.1.下单时间 - list.add(new OrderProgressNodeVO(OrderStatus.NO_PAY.getProgressName(), order.getCreateTime())); - // 1.2.支付成功时间 - list.add(new OrderProgressNodeVO(PAYED.getProgressName(), order.getPayTime())); - // 1.3.交易关闭时间 - list.add(new OrderProgressNodeVO(OrderStatus.CLOSED.getProgressName(), order.getCloseTime())); - // 1.4.交易完成时间 - list.add(new OrderProgressNodeVO(FINISHED.getProgressName(), order.getFinishTime())); - if (refundApply == null) { - // 1.5.没有退款参数情况下,默认是用户端查询,添加退款成功时间字段 - list.add(new OrderProgressNodeVO(OrderStatus.REFUNDED.getProgressName(), order.getRefundTime())); - } else { - // 2.再填充订单退款的每个节点的时间值 - // 2.1.订单申请退款 - list.add(new OrderProgressNodeVO(RefundStatus.UN_APPROVE.getProgressName(), refundApply.getCreateTime())); - // 2.2.订单审批时间(审批成功或失败) - list.add(new OrderProgressNodeVO(RefundStatus.AGREE.getProgressName(), refundApply.getApproveTime())); - // 2.3.退款结束时间(学员取消、退款成功、退款关闭) - RefundStatus status = RefundStatus.of(refundApply.getStatus()); - list.add(new OrderProgressNodeVO(status.getProgressName(), refundApply.getFinishTime())); - } - - // 3.然后过滤掉没有时间的节点,再按照时间进行排序,升序 - return list.stream() - .filter(nodeVO -> nodeVO.getTime() != null) - .sorted(Comparator.comparing(OrderProgressNodeVO::getTime)) - .collect(Collectors.toList()); - } - - @Override - public void markDetailSuccessByOrderId(Long id, String payChannel, LocalDateTime successTime) { - List details = queryByOrderId(id); - for (OrderDetail detail : details) { - detail.setStatus(PAYED.getValue()); - detail.setPayChannel(payChannel); - detail.setCourseExpireTime(successTime.plusMinutes(detail.getValidDuration())); - } - updateBatchById(details); - } - - @Override - public void updateRefundStatusById(Long orderDetailId, int status) { - lambdaUpdate() - .set(OrderDetail::getRefundStatus, status) - .eq(OrderDetail::getId, orderDetailId) - .update(); - } - - @Override - public List queryCourseIdsByOrderId(Long orderId) { - return baseMapper.queryCourseIdsByOrderId(orderId); - } - - @Override - public Boolean checkCourseOrderInfo(Long courseId) { - // 1.获取用户 - Long userId = UserContext.getUser(); - - // 2.查询订单 - List orders = lambdaQuery() - .eq(OrderDetail::getUserId, userId) - .eq(OrderDetail::getCourseId, courseId) - .in(OrderDetail::getStatus, PAYED.getValue(), FINISHED.getValue(), ENROLLED.getValue()) - .list(); - - // 3.判断是否存在订单 - if (CollUtils.isEmpty(orders)) { - return false; - } - - // 4.找到未过期的 - LocalDateTime now = LocalDateTime.now(); - return orders.stream().anyMatch(o -> o.getCourseExpireTime().isAfter(now)); - } - - @Override - public Map countEnrollNumOfCourse(List courseIdList) { - // 1.条件构造 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda() - .in(OrderDetail::getCourseId, courseIdList) - .in(OrderDetail::getStatus, PAYED.getValue(), FINISHED.getValue(), ENROLLED.getValue()); - - // 2.统计 - List list = baseMapper.countEnrollNumOfCourse(wrapper); - - // 3.转换返回 - return IdAndNumDTO.toMap(list); - } - - @Override - public Map countEnrollCourseOfStudent(List studentIds) { - // 1.条件构造 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.lambda() - .in(OrderDetail::getUserId, studentIds) - .in(OrderDetail::getStatus, PAYED.getValue(), FINISHED.getValue(), ENROLLED.getValue()); - // 2.统计 - List list = baseMapper.countEnrollCourseOfStudent(wrapper); - - // 3.转换返回 - return IdAndNumDTO.toMap(list); - } - - @Override - public CoursePurchaseInfoDTO getPurchaseInfoOfCourse(Long courseId) { - // 1.统计报名人数 - Integer enrollNum = lambdaQuery() - .eq(OrderDetail::getCourseId, courseId) - .in(OrderDetail::getStatus, PAYED.getValue(), FINISHED.getValue(), ENROLLED.getValue()) - .count(); - // 2.统计退款人数 - Integer refundNum = lambdaQuery() - .eq(OrderDetail::getCourseId, courseId) - .eq(OrderDetail::getStatus, REFUNDED.getValue()) - .count(); - // 3.统计销售额 - int realPayAmount = baseMapper.countRealPayAmountByCourseId(courseId); - - return new CoursePurchaseInfoDTO(enrollNum, refundNum, realPayAmount); - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/OrderServiceImpl.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/OrderServiceImpl.java deleted file mode 100644 index 5eb5357..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/OrderServiceImpl.java +++ /dev/null @@ -1,407 +0,0 @@ -package com.tianji.trade.service.impl; - -import com.baomidou.mybatisplus.core.toolkit.IdWorker; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.course.CourseClient; -import com.tianji.api.constants.CourseStatus; -import com.tianji.api.dto.course.CourseSimpleInfoDTO; -import com.tianji.api.dto.trade.OrderBasicDTO; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.pay.sdk.dto.PayResultDTO; -import com.tianji.trade.config.TradeProperties; -import com.tianji.trade.constants.OrderStatus; -import com.tianji.trade.constants.RefundStatus; -import com.tianji.trade.constants.TradeErrorInfo; -import com.tianji.trade.domain.dto.PlaceOrderDTO; -import com.tianji.trade.domain.po.Order; -import com.tianji.trade.domain.po.OrderDetail; -import com.tianji.trade.domain.query.OrderPageQuery; -import com.tianji.trade.domain.vo.*; -import com.tianji.trade.mapper.OrderMapper; -import com.tianji.trade.service.ICartService; -import com.tianji.trade.service.IOrderDetailService; -import com.tianji.trade.service.IOrderService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static com.tianji.common.constants.ErrorInfo.Msg.OPERATE_FAILED; -import static com.tianji.trade.constants.TradeErrorInfo.ORDER_ALREADY_FINISH; -import static com.tianji.trade.constants.TradeErrorInfo.ORDER_NOT_EXISTS; - -/** - *

- * 订单 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -@Service -@RequiredArgsConstructor -public class OrderServiceImpl extends ServiceImpl implements IOrderService { - - private final CourseClient courseClient; - private final IOrderDetailService detailService; - private final ICartService cartService; - private final TradeProperties tradeProperties; - private final RabbitMqHelper rabbitMqHelper; - - @Override - @Transactional - public PlaceOrderResultVO placeOrder(PlaceOrderDTO placeOrderDTO) { - Long userId = UserContext.getUser(); - // 1.查询课程费用信息,如果不可购买,这里直接报错 - List courseInfos = getOnShelfCourse(placeOrderDTO.getCourseIds()); - // 2.封装订单信息 - Order order = new Order(); - // 2.1.计算订单金额 - Integer totalAmount = courseInfos.stream() - .map(CourseSimpleInfoDTO::getPrice).reduce(Integer::sum).orElse(0); - // TODO 2.2.计算优惠金额 - Integer discountAmount = 0; - Integer realAmount = totalAmount - discountAmount; - // 2.3.封装其它信息 - order.setUserId(userId); - order.setTotalAmount(totalAmount); - order.setDiscountAmount(discountAmount); - order.setRealAmount(realAmount); - order.setStatus(OrderStatus.NO_PAY.getValue()); - order.setMessage(OrderStatus.NO_PAY.getProgressName()); - // 2.4.订单id - Long orderId = placeOrderDTO.getOrderId(); - order.setId(orderId); - - // 3.封装订单详情 - List orderDetails = new ArrayList<>(courseInfos.size()); - for (CourseSimpleInfoDTO courseInfo : courseInfos) { - orderDetails.add(packageOrderDetail(courseInfo, order)); - } - - // 4.写入数据库 - saveOrderAndDetails(order, orderDetails); - - // 5.删除购物车数据 - cartService.deleteCartByUserAndCourseIds(userId, placeOrderDTO.getCourseIds()); - - // 6.构建下单结果 - return PlaceOrderResultVO.builder() - .orderId(orderId) - .payAmount(realAmount) - .status(order.getStatus()) - .payOutTime(LocalDateTime.now().plusMinutes(tradeProperties.getPayOrderTTLMinutes())) - .build(); - } - - private List getOnShelfCourse(List courseIds) { - // 1.查询课程 - List courseInfos = courseClient.getSimpleInfoList(courseIds); - LocalDateTime now = LocalDateTime.now(); - // 2.判断状态 - for (CourseSimpleInfoDTO courseInfo : courseInfos) { - // 2.1.检查课程是否上架 - if(!CourseStatus.SHELF.equalsValue(courseInfo.getStatus())){ - throw new BizIllegalException(TradeErrorInfo.COURSE_NOT_FOR_SALE); - } - // 2.2.检查课程是否过期 - if(courseInfo.getPurchaseEndTime().isBefore(now)){ - throw new BizIllegalException(TradeErrorInfo.COURSE_EXPIRED); - } - } - return courseInfos; - } - - - @Override - @Transactional - public PlaceOrderResultVO enrolledFreeCourse(Long courseId) { - Long userId = UserContext.getUser(); - // 1.查询课程信息 - List cIds = CollUtils.singletonList(courseId); - List courseInfos = getOnShelfCourse(cIds); - if (CollUtils.isEmpty(courseInfos)) { - // 课程不存在 - throw new BizIllegalException(TradeErrorInfo.COURSE_NOT_EXISTS); - } - CourseSimpleInfoDTO courseInfo = courseInfos.get(0); - if(!courseInfo.getFree()){ - // 非免费课程,直接报错 - throw new BizIllegalException(TradeErrorInfo.COURSE_NOT_FREE); - } - // 2.创建订单 - Order order = new Order(); - // 2.1.基本信息 - order.setUserId(userId); - order.setTotalAmount(0); - order.setDiscountAmount(0); - order.setRealAmount(0); - order.setStatus(OrderStatus.ENROLLED.getValue()); - order.setFinishTime(LocalDateTime.now()); - order.setMessage(OrderStatus.ENROLLED.getProgressName()); - // 2.2.订单id - Long orderId = IdWorker.getId(order); - order.setId(orderId); - - // 3.订单详情 - OrderDetail detail = packageOrderDetail(courseInfo, order); - - // 4.写入数据库 - saveOrderAndDetails(order, CollUtils.singletonList(detail)); - - // 5.发送MQ消息,通知报名成功 - rabbitMqHelper.send( - MqConstants.Exchange.ORDER_EXCHANGE, - MqConstants.Key.ORDER_PAY_KEY, - OrderBasicDTO.builder() - .orderId(orderId) - .userId(userId) - .courseIds(cIds) - .finishTime(order.getFinishTime()) - .build() - ); - // 6.返回vo - return PlaceOrderResultVO.builder() - .orderId(orderId) - .payAmount(0) - .status(order.getStatus()) - .build(); - } - - @Override - public OrderConfirmVO prePlaceOrder(List courseIds) { - // 1.查询课程信息 - List courseInfos = courseClient.getSimpleInfoList(courseIds); - if (CollUtils.isEmpty(courseInfos)) { - throw new BizIllegalException(TradeErrorInfo.COURSE_NOT_EXISTS); - } - // 2.计算总价 - int total = courseInfos.stream().mapToInt(CourseSimpleInfoDTO::getPrice).sum(); - // TODO 3.计算折扣 - int discountAmount = 0; - // 4.生成订单id - long orderId = IdWorker.getId(); - // 5.组织返回 - OrderConfirmVO vo = new OrderConfirmVO(); - vo.setOrderId(orderId); - vo.setTotalAmount(total); - vo.setDiscountAmount(discountAmount); - return vo; - } - - private OrderDetail packageOrderDetail(CourseSimpleInfoDTO courseInfo, Order order) { - OrderDetail detail = new OrderDetail(); - detail.setUserId(order.getUserId()); - detail.setOrderId(order.getId()); - detail.setStatus(order.getStatus()); - detail.setCourseId(courseInfo.getId()); - detail.setPrice(courseInfo.getPrice()); - detail.setCoverUrl(courseInfo.getCoverUrl()); - detail.setName(courseInfo.getName()); - detail.setValidDuration(courseInfo.getValidDuration()); - detail.setDiscountAmount(0);// TODO 计算优惠金额 - detail.setRealPayAmount(courseInfo.getPrice() - detail.getDiscountAmount()); - return detail; - } - - @Override - @Transactional - public void saveOrderAndDetails(Order order, List orderDetails) { - // 4.1.写订单 - boolean success = save(order); - if (!success) { - throw new DbException(TradeErrorInfo.PLACE_ORDER_FAILED); - } - // 4.2.写订单详情 - if(orderDetails.size() == 1){ - success = detailService.save(orderDetails.get(0)); - }else { - success = detailService.saveBatch(orderDetails); - } - if (!success) { - throw new DbException(TradeErrorInfo.PLACE_ORDER_FAILED); - } - } - - @Override - @Transactional - public void cancelOrder(Long orderId) { - Long userId = UserContext.getUser(); - // 1.查询订单 - Order order = getById(orderId); - if (order == null || !userId.equals(order.getUserId())) { - throw new BadRequestException(ORDER_NOT_EXISTS); - } - // 2.判断订单状态是否已经取消,幂等判断 - if(OrderStatus.CLOSED.equalsValue(order.getStatus())){ - // 订单已经取消,无需重复操作 - return; - } - // 3.判断订单是否未支付,只有未支付订单才可以取消 - if(!OrderStatus.NO_PAY.equalsValue(order.getStatus())){ - throw new BizIllegalException(ORDER_ALREADY_FINISH); - } - // 4.可以更新订单状态为取消了 - boolean success = lambdaUpdate() - .set(Order::getStatus, OrderStatus.CLOSED.getValue()) - .set(Order::getMessage, "用户取消订单") - .set(Order::getCloseTime, LocalDateTime.now()) - .eq(Order::getStatus, OrderStatus.NO_PAY.getValue()) - .eq(Order::getId, orderId) - .update(); - if (!success) { - return; - } - // 5.更新订单条目的状态 - detailService.updateStatusByOrderId(orderId, OrderStatus.CLOSED.getValue()); - } - - @Override - public void deleteOrder(Long id) { - // 1.获取登录用户 - Long userId = UserContext.getUser(); - // 2.查询订单 - Order order = getById(id); - if (order == null) { - return; - } - // 3.判断订单所属用户与当前登录用户是否一致 - if(!order.getUserId().equals(userId)){ - // 不一致,说明不是当前用户的订单,结束 - throw new BadRequestException("不能删除他人订单"); - } - // 4.删除订单 - boolean success = removeById(id); - if (!success) { - throw new DbException(OPERATE_FAILED); - } - } - - @Override - public PageDTO queryMyOrderPage(OrderPageQuery pageQuery) { - Long userId = UserContext.getUser(); - // 1.分页排序条件 - Page p = pageQuery.toMpPageDefaultSortByCreateTimeDesc(); - // 2.分页查询订单 - Integer status = pageQuery.getStatus(); - Page page = lambdaQuery() - .eq(status != null, Order::getStatus, status) - .eq(Order::getUserId, userId) - .page(p); - // 3.数据判断 - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(p); - } - // 4.查询订单明细信息 - List orderIds = records.stream().map(Order::getId).collect(Collectors.toList()); - // 4.1.根据订单id查询订单明细 - List details = detailService.queryByOrderIds(orderIds); - // 4.2.将订单明细分组,key是订单id,值是订单下的所有detail - Map> detailMap = details.stream() - .map(od -> BeanUtils.copyBean(od, OrderDetailVO.class)) - .collect(Collectors.groupingBy(OrderDetailVO::getOrderId)); - // 5.转换VO - List list = new ArrayList<>(orderIds.size()); - for (Order record : records) { - // 5.1.转换订单 - OrderPageVO v = BeanUtils.toBean(record, OrderPageVO.class); - list.add(v); - // 5.2.写入vo - v.setDetails(detailMap.get(record.getId())); - v.setStatusDesc(OrderStatus.desc(v.getStatus())); - } - return PageDTO.of(page, list); - } - - @Override - public OrderVO queryOrderById(Long id) { - // 1.查询订单 - Order order = getById(id); - if (order == null) { - throw new BadRequestException(ORDER_NOT_EXISTS); - } - // 2.查询订单详情 - List details = detailService.queryByOrderId(id); - // 3.转换VO - // 3.1.订单 - OrderVO vo = BeanUtils.toBean(order, OrderVO.class); - // 3.2.订单详情 - List dvs = BeanUtils.copyList(details, OrderDetailVO.class, (d, v) -> v.setCanRefund( - // 订单已经支付,且 退款没有在进行中,标记为可退款状态 - OrderStatus.canRefund(d.getStatus()) && !RefundStatus.inProgress(v.getRefundStatus()) - )); - vo.setDetails(dvs); - // 3.3.订单进度 - vo.setProgressNodes(detailService.packageProgressNodes(order, null)); - return vo; - } - - @Override - public PlaceOrderResultVO queryOrderStatus(Long orderId) { - // 1.查询订单 - Order order = getById(orderId); - if (order == null) { - throw new BizIllegalException(ORDER_NOT_EXISTS); - } - // 2.计算超时时间 - LocalDateTime outTime = null; - if(OrderStatus.NO_PAY.equalsValue(order.getStatus())){ - outTime = order.getCreateTime().plusMinutes(tradeProperties.getPayOrderTTLMinutes()); - } - // 3.封装结果 - return PlaceOrderResultVO.builder() - .orderId(orderId) - .payAmount(order.getRealAmount()) - .status(order.getStatus()) - .payOutTime(outTime) - .build(); - } - - @Override - @Transactional - public void handlePaySuccess(PayResultDTO payResult) { - // 1.查询订单 - Order order = getById(payResult.getBizOrderId()); - if (order == null) { - return; - } - // 2.更新订单状态 - Order o = new Order(); - o.setId(order.getId()); - o.setStatus(OrderStatus.PAYED.getValue()); - o.setPayTime(payResult.getSuccessTime()); - o.setPayChannel(payResult.getPayChannel()); - o.setPayOrderNo(payResult.getPayOrderNo()); - o.setMessage("用户支付成功"); - updateById(o); - // 3.更新订单条目 - detailService.markDetailSuccessByOrderId(o.getId(), payResult.getPayChannel(), payResult.getSuccessTime()); - // 4.查询订单包含的课程信息 - List cIds = detailService.queryCourseIdsByOrderId(o.getId()); - // 5.发送MQ消息,通知报名成功 - rabbitMqHelper.send( - MqConstants.Exchange.ORDER_EXCHANGE, - MqConstants.Key.ORDER_PAY_KEY, - OrderBasicDTO.builder() - .orderId(o.getId()).userId(order.getUserId()).courseIds(cIds) - .finishTime(o.getPayTime()) - .build() - ); - } - -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/PayServiceImpl.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/PayServiceImpl.java deleted file mode 100644 index 17d632a..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/PayServiceImpl.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.tianji.trade.service.impl; - -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.utils.AssertUtils; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.pay.sdk.client.PayClient; -import com.tianji.pay.sdk.constants.PayType; -import com.tianji.pay.sdk.dto.PayApplyDTO; -import com.tianji.pay.sdk.dto.PayChannelDTO; -import com.tianji.pay.sdk.dto.PayResultDTO; -import com.tianji.trade.config.TradeProperties; -import com.tianji.trade.constants.OrderStatus; -import com.tianji.trade.constants.TradeErrorInfo; -import com.tianji.trade.domain.dto.OrderDelayQueryDTO; -import com.tianji.trade.domain.dto.PayApplyFormDTO; -import com.tianji.trade.domain.po.Order; -import com.tianji.trade.domain.po.OrderDetail; -import com.tianji.trade.domain.vo.PayChannelVO; -import com.tianji.trade.service.IOrderDetailService; -import com.tianji.trade.service.IOrderService; -import com.tianji.trade.service.IPayService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Collectors; - -import static com.tianji.common.constants.MqConstants.Exchange.TRADE_DELAY_EXCHANGE; -import static com.tianji.common.constants.MqConstants.Key.ORDER_DELAY_KEY; -import static com.tianji.trade.constants.TradeErrorInfo.ORDER_NOT_EXISTS; - -@Slf4j -@Service -@RequiredArgsConstructor -public class PayServiceImpl implements IPayService { - - private final PayClient payClient; - private final IOrderService orderService; - private final IOrderDetailService detailService; - private final TradeProperties tradeProperties; - private final RabbitMqHelper mqHelper; - - @Override - public List queryPayChannels() { - List list = payClient.listAllPayChannels(); - if (list == null) { - return CollUtils.emptyList(); - } - return list.stream() - .filter(p -> p.getStatus() == 1) - .map(p -> BeanUtils.copyBean(p, PayChannelVO.class)) - .collect(Collectors.toList()); - } - - @Override - public String applyPayOrder(PayApplyFormDTO payApply) { - Long orderId = payApply.getOrderId(); - // 1.查询订单信息 - Order order = orderService.getById(orderId); - if (order == null) { - throw new BadRequestException(ORDER_NOT_EXISTS); - } - // 2.判断订单状态 - if (!OrderStatus.NO_PAY.equalsValue(order.getStatus())) { - // 订单已经支付或关闭 - throw new BizIllegalException(TradeErrorInfo.ORDER_ALREADY_FINISH); - } - // 3.判断订单是否已经超时 - if (order.getCreateTime().plusMinutes(tradeProperties.getPayOrderTTLMinutes()).isBefore(LocalDateTime.now())) { - // 订单已经超时,无法支付 - throw new BizIllegalException(TradeErrorInfo.ORDER_OVER_TIME); - } - // 4.查询订单详情 - List details = detailService.queryByOrderId(orderId); - AssertUtils.isNotEmpty(details, ORDER_NOT_EXISTS); - - // 5.封装下单参数 - PayApplyDTO payApplyDTO = PayApplyDTO.builder() - .bizOrderNo(orderId) - .amount(order.getRealAmount()) - .orderInfo(details.get(0).getName()) - .bizUserId(order.getUserId()) - .payType(PayType.NATIVE.getValue()) - .payChannelCode(payApply.getPayChannelCode()) - .build(); - String url = payClient.applyPayOrder(payApplyDTO); - // 6.通过延迟队列,异步查询支付结果 - sendDelayQueryMessage(OrderDelayQueryDTO.init(orderId)); - return url; - } - - private void sendDelayQueryMessage(OrderDelayQueryDTO message) { - mqHelper.sendDelayMessage( - TRADE_DELAY_EXCHANGE, - ORDER_DELAY_KEY, - message, Duration.ofMillis(message.removeFirst())); - } - - @Override - public void queryPayResult(OrderDelayQueryDTO message) { - // 1.获取订单信息 - Long orderId = message.getOrderId(); - Order order = orderService.getById(orderId); - if (order == null) { - log.error("要查询状态的订单:{}不存在", orderId); - return; - } - // 2.判断订单状态 - if (!OrderStatus.NO_PAY.equalsValue(order.getStatus())) { - // 订单已经支付或关闭,任务结束 - return; - } - // 3.查询支付状态 - PayResultDTO payResult = payClient.queryPayResult(orderId); - int status = payResult.getStatus(); - if(PayResultDTO.SUCCESS != status){ - // 3.1.支付中或支付失败,需要重试查询 - if(message.getDelayMillis().size() == 0){ - // 重试次数用尽,结束 - return; - } - // 发送延迟查询消息,再次查询支付状态 - sendDelayQueryMessage(message); - } - // 3.2.支付成功 - orderService.handlePaySuccess(payResult); - } -} diff --git a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/RefundApplyServiceImpl.java b/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/RefundApplyServiceImpl.java deleted file mode 100644 index 19b240c..0000000 --- a/tianji-master/tj-trade/src/main/java/com/tianji/trade/service/impl/RefundApplyServiceImpl.java +++ /dev/null @@ -1,509 +0,0 @@ -package com.tianji.trade.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.cache.RoleCache; -import com.tianji.api.client.user.UserClient; -import com.tianji.api.dto.trade.OrderBasicDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.autoconfigure.mq.RabbitMqHelper; -import com.tianji.common.constants.Constant; -import com.tianji.common.constants.ErrorInfo; -import com.tianji.common.constants.MqConstants; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.enums.UserType; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.BizIllegalException; -import com.tianji.common.exceptions.DbException; -import com.tianji.common.utils.*; -import com.tianji.pay.sdk.client.PayClient; -import com.tianji.pay.sdk.constants.PayChannel; -import com.tianji.pay.sdk.constants.RefundChannelEnum; -import com.tianji.pay.sdk.dto.RefundApplyDTO; -import com.tianji.pay.sdk.dto.RefundResultDTO; -import com.tianji.trade.constants.OrderStatus; -import com.tianji.trade.constants.RefundStatus; -import com.tianji.trade.constants.TradeErrorInfo; -import com.tianji.trade.domain.dto.ApproveFormDTO; -import com.tianji.trade.domain.dto.RefundCancelDTO; -import com.tianji.trade.domain.dto.RefundFormDTO; -import com.tianji.trade.domain.po.Order; -import com.tianji.trade.domain.po.OrderDetail; -import com.tianji.trade.domain.po.RefundApply; -import com.tianji.trade.domain.query.RefundApplyPageQuery; -import com.tianji.trade.domain.vo.RefundApplyPageVO; -import com.tianji.trade.domain.vo.RefundApplyVO; -import com.tianji.trade.mapper.OrderMapper; -import com.tianji.trade.mapper.RefundApplyMapper; -import com.tianji.trade.service.IOrderDetailService; -import com.tianji.trade.service.IRefundApplyService; -import lombok.RequiredArgsConstructor; -import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.*; -import java.util.stream.Collectors; - -import static com.tianji.trade.constants.RefundStatus.AGREE; -import static com.tianji.trade.constants.RefundStatus.REJECT; - -/** - *

- * 退款申请 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-29 - */ -@Service -@RequiredArgsConstructor -public class RefundApplyServiceImpl extends ServiceImpl implements IRefundApplyService { - - private final OrderMapper orderMapper; - private final IOrderDetailService detailService; - private final UserClient userClient; - private final PayClient payClient; - private final RoleCache roleCache; - private final ThreadPoolTaskExecutor sendRefundRequestExecutor; - private final RabbitMqHelper rabbitMqHelper; - - @Override - public List queryByDetailId(Long id) { - // 1.根据id倒序查询,最新的退款申请在最前面 - List list = baseMapper.queryByDetailId(id); - // 2.判空 - if (CollUtils.isEmpty(list)) { - return CollUtils.emptyList(); - } - return list; - } - - @Override - @Transactional - public void applyRefund(RefundFormDTO refundFormDTO) { - Long userId = UserContext.getUser(); - // 1.查询订单明细 - OrderDetail detail = detailService.getBaseMapper().selectById(refundFormDTO.getOrderDetailId()); - if (detail == null) { - throw new BadRequestException(TradeErrorInfo.ORDER_NOT_EXISTS); - } - if (detail.getRealPayAmount() == 0) { - // 免费课程不能退款 - throw new BadRequestException(TradeErrorInfo.FREE_COURSE_CANNOT_REFUND); - } - // 2.查询订单 - Order order = orderMapper.getById(detail.getOrderId()); - if(order == null){ - throw new BadRequestException(TradeErrorInfo.ORDER_NOT_EXISTS); - } - if(!(OrderStatus.PAYED.equalsValue(order.getStatus()) || OrderStatus.REFUNDED.equalsValue(order.getStatus()))){ - // 订单状态未支付或已经完结,不能退款 - throw new BizIllegalException(TradeErrorInfo.ORDER_CANNOT_REFUND); - } - - // 3.查询申请人信息 - UserDTO userDTO = userClient.queryUserById(userId); - AssertUtils.isNotNull(userDTO, ErrorInfo.Msg.USER_NOT_EXISTS); - boolean isStudent = UserType.STUDENT.equalsValue(userDTO.getType()); - if (!userId.equals(detail.getUserId()) && isStudent) { - // 申请人不是订单中的用户,并且申请人也不是后台管理员,直接报错 - throw new BizIllegalException(TradeErrorInfo.NO_AUTH_REFUND); - } - - // 4.查询已经申请的退款次数 - List refundApplies = queryByDetailId(refundFormDTO.getOrderDetailId()); - if (isStudent && refundApplies.size() >= 2) { - throw new BizIllegalException(TradeErrorInfo.REFUND_TOO_MANY_TIMES); - } - // 5.判断最近一次退款的状态,如果退款在进行中,直接返回 - if (CollUtils.isNotEmpty(refundApplies) && RefundStatus.inProgress(refundApplies.get(0).getStatus())) { - throw new BizIllegalException(TradeErrorInfo.REFUND_IN_PROGRESS); - } - - // 6.提交退款申请 - RefundApply refundApply = new RefundApply(); - refundApply.setOrderDetailId(detail.getId()); //订单明细id - refundApply.setOrderId(detail.getOrderId()); //订单id - refundApply.setUserId(detail.getUserId()); //退款订单所属人 - refundApply.setRefundAmount(detail.getRealPayAmount()); //退款金额 - refundApply.setRefundReason(refundFormDTO.getRefundReason()); //退款原因 - refundApply.setQuestionDesc(refundFormDTO.getQuestionDesc()); //退款问题说明 - refundApply.setCreater(userId); //申请id - if (isStudent) { - refundApply.setMessage("用户申请退款"); - refundApply.setStatus(RefundStatus.UN_APPROVE.getValue()); - } else { - refundApply.setMessage("管理员直接退款"); - refundApply.setStatus(AGREE.getValue()); - } - boolean success = save(refundApply); - if (!success) { - // 退款申请失败 - throw new DbException(ErrorInfo.Msg.DB_SAVE_EXCEPTION); - } - // 7.更新订单状态 - Order o = new Order(); - o.setId(refundApply.getOrderId()); - o.setStatus(OrderStatus.REFUNDED.getValue()); - o.setRefundTime(LocalDateTime.now()); - o.setMessage(isStudent ? "学员申请退款" : "管理员直接退款"); - int count = orderMapper.updateById(o); - if (count < 1) { - // 退款申请失败 - throw new DbException(ErrorInfo.Msg.DB_SAVE_EXCEPTION); - } - // 8.更新订单详情状态 - OrderDetail d = new OrderDetail(); - d.setId(detail.getId()); - d.setStatus(OrderStatus.REFUNDED.getValue()); - d.setRefundStatus(refundApply.getStatus()); - detailService.updateById(d); - // 9.如果是管理员申请的,立刻异步发送退款请求 - if(!isStudent) { - sendRefundRequestAsync(refundApply); - } - } - - @Override - public PageDTO queryRefundApplyByPage(RefundApplyPageQuery q) { - // 1.分页和排序条件 - Page p = searchRefundApply(q); - - // 2.数据处理 - List records = p.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(p); - } - // 3.获取用户信息 - Map userMap = getRefundUserInfo(records); - // 4.vo转换 - List list = new ArrayList<>(records.size()); - for (RefundApply r : records) { - RefundApplyPageVO v = BeanUtils.copyBean(r, RefundApplyPageVO.class); - list.add(v); - // 4.1.申请人 - UserDTO u = userMap.get(r.getCreater()); - v.setProposerName(roleCache.exchangeRoleName(u)); - v.setProposerMobile(u == null ? null : u.getCellPhone()); - // 4.2.审批人 - v.setApproverName(roleCache.exchangeRoleName(userMap.get(r.getApprover()))); - // 4.3.退款状态 - v.setRefundStatusDesc(RefundStatus.desc(r.getStatus())); - if (RefundStatus.SUCCESS.equalsValue(r.getStatus())) { - v.setRefundSuccessTime(r.getFinishTime()); - } - } - return PageDTO.of(p, list); - } - - private Page searchRefundApply(RefundApplyPageQuery q) { - Integer refundStatus = q.getRefundStatus(); - String defaultSortBy = "id"; - boolean isAsc = true; - if (refundStatus != null) { - if (RefundStatus.UN_APPROVE.equalsValue(refundStatus)) { - defaultSortBy = Constant.DATA_FIELD_NAME_CREATE_TIME; - } else { - defaultSortBy = "approve_time"; - isAsc = false; - } - } - Page p = q.toMpPage(defaultSortBy, isAsc); - - // 2.学生条件 - Long userId = null; - if (StringUtils.isNotBlank(q.getMobile())) { - userId = userClient.exchangeUserIdWithPhone(q.getMobile()); - if (userId == null) { - // 学生不存在,则返回空数据 - return Page.of(0, 0); - } - } - - // 3.分页搜索 - p = lambdaQuery() - .eq(q.getId() != null, RefundApply::getId, q.getId()) - .eq(refundStatus != null, RefundApply::getStatus, refundStatus) - .eq(q.getOrderDetailId() != null, RefundApply::getOrderDetailId, q.getOrderDetailId()) - .eq(q.getOrderId() != null, RefundApply::getOrderId, q.getOrderId()) - .eq(userId != null, RefundApply::getUserId, userId) - .ge(q.getApplyStartTime() != null, RefundApply::getCreateTime, q.getApplyStartTime()) - .le(q.getApplyEndTime() != null, RefundApply::getCreateTime, q.getApplyEndTime()) - .page(p); - return p; - } - - private Map getRefundUserInfo(List records) { - Set uIds = new HashSet<>(); - for (RefundApply record : records) { - uIds.add(record.getCreater()); - uIds.add(record.getApprover()); - } - uIds.remove(null); - List userDTOS = userClient.queryUserByIds(uIds); - if (userDTOS.size() != uIds.size()) { - throw new BizIllegalException("用户数据有误"); - } - return userDTOS.stream().collect(Collectors.toMap(UserDTO::getId, u -> u)); - } - - @Override - public RefundApplyVO queryRefundDetailById(Long id) { - // 1.查询退款数据 - RefundApply apply = getById(id); - if (apply == null) { - throw new BadRequestException(TradeErrorInfo.REFUND_NOT_EXISTS); - } - // 2.转换VO - RefundApplyVO vo = BeanUtils.copyBean(apply, RefundApplyVO.class); - - // 3.查询订单信息及交易流水 - Order order = orderMapper.getById(apply.getOrderId()); - if (order == null) { - throw new BadRequestException(TradeErrorInfo.ORDER_NOT_EXISTS); - } - vo.setPayOrderNo(order.getPayOrderNo()); - vo.setPayChannel(PayChannel.desc(order.getPayChannel())); - vo.setRefundChannel(RefundChannelEnum.desc(apply.getRefundChannel())); - vo.setOrderTime(order.getCreateTime()); - vo.setPaySuccessTime(order.getPayTime()); - - // 4.用户信息 - Set uIds = new HashSet<>(2); - uIds.add(apply.getUserId()); - uIds.add(apply.getCreater()); - // 4.1.远程查询 - List userDTOS = userClient.queryUserByIds(uIds); - AssertUtils.isNotEmpty(userDTOS, TradeErrorInfo.COURSE_EXPIRED); - Map userMap = userDTOS.stream().collect(Collectors.toMap(UserDTO::getId, u -> u)); - // 4.2.学员 - UserDTO student = userMap.get(apply.getUserId()); - vo.setStudentName(roleCache.exchangeRoleName(student)); - vo.setMobile(student.getCellPhone()); - // 4.3.申请人 - vo.setRefundProposerName(roleCache.exchangeRoleName(userMap.get(apply.getCreater()))); - - // 6.订单详情 - OrderDetail detail = detailService.getBaseMapper().selectById(apply.getOrderDetailId()); - if (detail == null) { - throw new BadRequestException(TradeErrorInfo.ORDER_NOT_EXISTS); - } - vo.setName(detail.getName()); - vo.setPrice(detail.getPrice()); - vo.setRealPayAmount(detail.getRealPayAmount()); - vo.setDiscountAmount(detail.getDiscountAmount()); - - return vo; - } - - @Override - public RefundApplyVO nextRefundApplyToApprove() { - // 1.查询一个待处理的申请单 - Long id = baseMapper.nextRefundApplyToApprove(); - // 2.查询数据并返回 - return queryRefundDetailById(id); - } - - @Override - @Transactional - public void approveRefundApply(ApproveFormDTO approveDTO) { - // 1.查询申请 - RefundApply apply = getById(approveDTO.getId()); - if (apply == null) { - throw new BadRequestException(TradeErrorInfo.REFUND_NOT_EXISTS); - } - // 2.判断状态 - if (!RefundStatus.UN_APPROVE.equalsValue(apply.getStatus())) { - // 已审批订单,无法再次审批 - throw new BadRequestException(TradeErrorInfo.REFUND_APPROVED); - } - // 3.更新数据 - boolean agree = approveDTO.getApproveType() == 1; - RefundApply r = new RefundApply(); - r.setId(apply.getId()); - r.setApprover(UserContext.getUser()); - r.setStatus(agree ? AGREE.getValue() : REJECT.getValue()); - r.setApproveTime(LocalDateTime.now()); - r.setApproveOpinion(approveDTO.getApproveOpinion()); - r.setRemark(approveDTO.getRemark()); - r.setMessage(RefundStatus.desc(r.getStatus())); - boolean success = updateById(r); - - if (!success) { - throw new DbException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - - // 4.更新子订单状态 - detailService.updateRefundStatusById(apply.getOrderDetailId(), r.getStatus()); - - // 5.异步发送退款请求 - if(agree) { - sendRefundRequestAsync(apply); - } - } - - @Override - @Transactional - public void cancelRefundApply(RefundCancelDTO cancelDTO) { - // 1.查询退款申请记录 - Long applyId = cancelDTO.getId(); - Long detailId = cancelDTO.getOrderDetailId(); - List list = lambdaQuery() - .eq(applyId != null, RefundApply::getId, applyId) - .eq(detailId != null, RefundApply::getOrderDetailId, detailId) - .list(); - // 2.判断是否为空 - if (CollUtils.isEmpty(list)) { - return; - } - // 3.获取最新一次退款记录,判断状态 - RefundApply apply = list.get(0); - if (!RefundStatus.UN_APPROVE.equalsValue(apply.getStatus())) { - // 申请已经完成审批或退款,不能撤销 - throw new BizIllegalException(TradeErrorInfo.REFUND_APPROVED); - } - // 4.更新退款记录 - RefundApply r = new RefundApply(); - r.setId(applyId); - r.setStatus(RefundStatus.CANCEL.getValue()); - r.setMessage(RefundStatus.CANCEL.getProgressName()); - boolean success = updateById(r); - if (!success) { - throw new DbException(ErrorInfo.Msg.DB_UPDATE_EXCEPTION); - } - // 4.更新子订单状态 - detailService.updateRefundStatusById(r.getOrderDetailId(), r.getStatus()); - } - - @Override - public RefundApplyVO queryRefundDetailByDetailId(Long detailId) { - // 1.查询申请记录 - List refundApplies = queryByDetailId(detailId); - if (CollUtils.isEmpty(refundApplies)) { - return null; - } - - // 2.获取最近一次记录,转换vo - RefundApply apply = refundApplies.get(0); - RefundApplyVO vo = BeanUtils.copyBean(apply, RefundApplyVO.class); - - // 3.查询订单信息 - Order order = orderMapper.getById(apply.getOrderId()); - vo.setPayOrderNo(order.getPayOrderNo()); - vo.setOrderTime(order.getCreateTime()); - vo.setPaySuccessTime(order.getPayTime()); - - vo.setPayChannel(PayChannel.desc(order.getPayChannel())); - vo.setRefundChannel(RefundChannelEnum.desc(apply.getRefundChannel())); - vo.setRefundOrderNo(apply.getRefundOrderNo()); - return vo; - } - - @Override - @Transactional - public void handleRefundResult(RefundResultDTO result) { - // 1.查询退款申请记录 - RefundApply refundApply = getById(result.getBizRefundOrderId()); - if (refundApply == null) { - return; - } - UserContext.setUser(refundApply.getApprover()); - // 2.判断结果,支付宝支付有可能直接返回退款成功结果,微信只会返回退款中 - RefundApply r = new RefundApply(); - r.setId(refundApply.getId()); - r.setRefundChannel(result.getRefundChannel()); - r.setRefundOrderNo(result.getRefundOrderNo()); - // 2.1.判断状态是否退款中 - int status = result.getStatus(); - if(status == RefundResultDTO.RUNNING){ - // 退款中,结果未知,将其它数据写入数据库即可 - updateById(r); - return; - } - - // 2.2.判断退款成功还是失败 - if(status == RefundResultDTO.SUCCESS){ - // 退款成功,记录状态 - r.setStatus(RefundStatus.SUCCESS.getValue()); - r.setMessage(RefundStatus.SUCCESS.getProgressName()); - }else { - // 2.3.退款失败,需要记录状态及退款失败原因 - r.setStatus(RefundStatus.FAILED.getValue()); - r.setMessage(RefundStatus.FAILED.getProgressName()); - r.setFailedReason(result.getMsg()); - } - - // 2.4.更新数据库 - r.setFinishTime(LocalDateTime.now()); - updateById(r); - - // 3.更新子订单状态 - detailService.updateRefundStatusById(refundApply.getOrderDetailId(), r.getStatus()); - - // 4.如果是退款成功,要取消用户报名的课程 - if (status == RefundResultDTO.SUCCESS) { - // 4.1.查询子订单信息 - OrderDetail detail = detailService.getById(refundApply.getOrderDetailId()); - // 4.2.发送MQ消息,通知报名成功 - rabbitMqHelper.send( - MqConstants.Exchange.ORDER_EXCHANGE, - MqConstants.Key.ORDER_REFUND_KEY, - OrderBasicDTO.builder() - .orderId(refundApply.getOrderId()) - .userId(refundApply.getUserId()) - .courseIds(CollUtils.singletonList(detail.getCourseId())).build()); - } - } - - @Override - public List queryApplyToSend(int index, int size) { - Page page = lambdaQuery() - .eq(RefundApply::getStatus, AGREE.getValue()) - .page(new Page<>(index, size)); - if (page == null || CollUtils.isEmpty(page.getRecords())) { - return CollUtils.emptyList(); - } - return page.getRecords(); - } - - @Override - @Transactional - public void sendRefundRequest(RefundApply refundApply) { - // 1.组织请求参数 - RefundApplyDTO applyDTO = RefundApplyDTO.builder() - .bizOrderNo(refundApply.getOrderId()) - .bizRefundOrderNo(refundApply.getId()) - .refundAmount(refundApply.getRefundAmount()) - .build(); - // 2.发送退款请求 - RefundResultDTO result = payClient.applyRefund(applyDTO); - - // 3.处理退款结果 - handleRefundResult(result); - } - - @Override - @Transactional - public boolean checkRefundStatus(RefundApply refundApply) { - // 1.先检查是否已经退款成功 - Integer status = refundApply.getStatus(); - if(!AGREE.equalsValue(status)){ - return true; - } - // 2.远程查询,判断是否已经退款成功 - RefundResultDTO result = payClient.queryRefundResult(refundApply.getId()); - if (result == null) { - // 退款数据不存在,放弃处理 - return false; - } - // 3.处理退款结果 - handleRefundResult(result); - return result.getStatus() != RefundResultDTO.RUNNING; - } - - private void sendRefundRequestAsync(RefundApply refundApply) { - sendRefundRequestExecutor.execute(() -> this.sendRefundRequest(refundApply)); - } -} diff --git a/tianji-master/tj-trade/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-trade/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-trade/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/resources/bootstrap-local.yml b/tianji-master/tj-trade/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-trade/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/resources/bootstrap.yml b/tianji-master/tj-trade/src/main/resources/bootstrap.yml deleted file mode 100644 index c72d4e5..0000000 --- a/tianji-master/tj-trade/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,39 +0,0 @@ -server: - port: 8088 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: trade-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - dataId: shared-spring.yaml # 共享spring配置 - - dataId: shared-redis.yaml # 共享redis配置 - - dataId: shared-mybatis.yaml # 共享mybatis配置 - - dataId: shared-logs.yaml # 共享日志配置 - - dataId: shared-feign.yaml # 共享feign配置 - - dataId: shared-mq.yaml # 共享mq配置 - - dataId: shared-xxljob.yaml # 共享mq配置 -tj: - swagger: - enable: true - enableResponseWrap: true - package-path: com.tianji.trade.controller - title: 智汇云课堂 - 交易中心接口文档 - description: 该服务提供购物车、订单管理等功能 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - jdbc: - database: tj_trade - auth: - resource: - enable: true - excludeLoginPaths: - - "/order-details/enrollNum" \ No newline at end of file diff --git a/tianji-master/tj-trade/src/main/resources/mapper/CartMapper.xml b/tianji-master/tj-trade/src/main/resources/mapper/CartMapper.xml deleted file mode 100644 index 4785dd2..0000000 --- a/tianji-master/tj-trade/src/main/resources/mapper/CartMapper.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/tianji-master/tj-trade/src/main/resources/mapper/OrderDetailMapper.xml b/tianji-master/tj-trade/src/main/resources/mapper/OrderDetailMapper.xml deleted file mode 100644 index e5924ba..0000000 --- a/tianji-master/tj-trade/src/main/resources/mapper/OrderDetailMapper.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - diff --git a/tianji-master/tj-trade/src/main/resources/mapper/OrderMapper.xml b/tianji-master/tj-trade/src/main/resources/mapper/OrderMapper.xml deleted file mode 100644 index f13377f..0000000 --- a/tianji-master/tj-trade/src/main/resources/mapper/OrderMapper.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/tianji-master/tj-trade/src/main/resources/mapper/RefundApplyMapper.xml b/tianji-master/tj-trade/src/main/resources/mapper/RefundApplyMapper.xml deleted file mode 100644 index 031009d..0000000 --- a/tianji-master/tj-trade/src/main/resources/mapper/RefundApplyMapper.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - diff --git a/tianji-master/tj-trade/src/test/java/com/tianji/trade/mapper/OrderMapperTest.java b/tianji-master/tj-trade/src/test/java/com/tianji/trade/mapper/OrderMapperTest.java deleted file mode 100644 index 91f20aa..0000000 --- a/tianji-master/tj-trade/src/test/java/com/tianji/trade/mapper/OrderMapperTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.trade.mapper; - -import com.tianji.trade.domain.po.Order; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class OrderMapperTest { - - @Autowired - private OrderMapper orderMapper; - - @Test - void getById() { - Order order = orderMapper.getById(1L); - System.out.println("order = " + order); - } -} \ No newline at end of file diff --git a/tianji-master/tj-user/pom.xml b/tianji-master/tj-user/pom.xml deleted file mode 100644 index 47129cb..0000000 --- a/tianji-master/tj-user/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - - - tjxt - com.tianji - 1.0.0 - - 4.0.0 - - tj-user - - - 11 - 11 - - - - org.springframework.boot - spring-boot-starter-web - - - com.baomidou - mybatis-plus-boot-starter - - - mysql - mysql-connector-java - - - - org.springframework.boot - spring-boot-starter-data-redis - - - - org.apache.commons - commons-pool2 - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-config - - - - com.tianji - tj-auth-resource-sdk - 1.0.0 - - - - com.tianji - tj-api - 1.0.0 - - - com.tianji - tj-message-api - 1.0.0 - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - \ No newline at end of file diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/UserApplication.java b/tianji-master/tj-user/src/main/java/com/tianji/user/UserApplication.java deleted file mode 100644 index 0119690..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/UserApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.tianji.user; - -import lombok.extern.slf4j.Slf4j; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.core.env.Environment; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -@MapperScan("com.tianji.user.mapper") -@SpringBootApplication -@Slf4j -public class UserApplication { - public static void main(String[] args) throws UnknownHostException { - SpringApplication app = new SpringApplicationBuilder(UserApplication.class).build(args); - Environment env = app.run(args).getEnvironment(); - String protocol = "http"; - if (env.getProperty("server.ssl.key-store") != null) { - protocol = "https"; - } - log.info("--/\n---------------------------------------------------------------------------------------\n\t" + - "Application '{}' is running! Access URLs:\n\t" + - "Local: \t\t{}://localhost:{}\n\t" + - "External: \t{}://{}:{}\n\t" + - "Profile(s): \t{}" + - "\n---------------------------------------------------------------------------------------", - env.getProperty("spring.application.name"), - protocol, - env.getProperty("server.port"), - protocol, - InetAddress.getLocalHost().getHostAddress(), - env.getProperty("server.port"), - env.getActiveProfiles()); - - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/config/SecurityConfig.java b/tianji-master/tj-user/src/main/java/com/tianji/user/config/SecurityConfig.java deleted file mode 100644 index 22dceed..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/config/SecurityConfig.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.user.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; - -@Configuration -public class SecurityConfig { - - @Bean - public PasswordEncoder passwordEncoder(){ - return new BCryptPasswordEncoder(); - } - -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/constants/UserConstants.java b/tianji-master/tj-user/src/main/java/com/tianji/user/constants/UserConstants.java deleted file mode 100644 index 19eee8b..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/constants/UserConstants.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.user.constants; - -import java.time.Duration; - -public interface UserConstants { - String DEFAULT_PASSWORD = "123456"; - - Long STUDENT_ROLE_ID = 2L; - String STUDENT_ROLE_NAME = "学生"; - - Long TEACHER_ROLE_ID = 3L; - String TEACHER_ROLE_NAME = "教师"; - - // 验证码的Redis key前缀 - String USER_VERIFY_CODE_KEY = "sms:user:code:phone:"; - // 验证码有效期,5分钟 - Duration USER_VERIFY_CODE_TTL = Duration.ofMinutes(5); -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/constants/UserErrorInfo.java b/tianji-master/tj-user/src/main/java/com/tianji/user/constants/UserErrorInfo.java deleted file mode 100644 index 6128589..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/constants/UserErrorInfo.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.tianji.user.constants; - -public interface UserErrorInfo { - interface Msg { - String INVALID_UN_OR_PW = "用户登录信息错误"; - String INVALID_UN = "用户名或手机号不能为空"; - String INVALID_USER_TYPE = "无效的用户类型"; - String PHONE_NOT_EXISTS = "手机号不存在"; - String ILLEGAL_LOGIN_TYPE = "无效的登录方式"; - String USER_ID_NOT_EXISTS = "用户id不存在"; - - String USER_FROZEN = "账号已冻结"; - String PHONE_ALREADY_EXISTS = "手机号已存在"; - String INVALID_USER_STATUS = "用户状态不正确"; - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/controller/StaffController.java b/tianji-master/tj-user/src/main/java/com/tianji/user/controller/StaffController.java deleted file mode 100644 index 7e7bb28..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/controller/StaffController.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.tianji.user.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.user.domain.vo.StaffVO; -import com.tianji.user.service.IStaffService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - *

- * 员工详情表 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@RestController -@RequestMapping("/staffs") -@Api(tags = "用户管理接口") -public class StaffController { - - private final IStaffService staffService; - - public StaffController(IStaffService staffService) { - this.staffService = staffService; - } - - @ApiOperation("分页查询员工信息") - @GetMapping("page") - public PageDTO queryStaffPage(UserPageQuery pageQuery){ - return staffService.queryStaffPage(pageQuery); - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/controller/StudentController.java b/tianji-master/tj-user/src/main/java/com/tianji/user/controller/StudentController.java deleted file mode 100644 index 8052ae3..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/controller/StudentController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.tianji.user.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.user.domain.dto.StudentFormDTO; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.user.domain.vo.StudentPageVo; -import com.tianji.user.service.IStudentService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -/** - *

- * 学员详情表 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@RestController -@RequestMapping("/students") -@Api(tags = "用户管理接口") -public class StudentController { - - @Autowired - private IStudentService studentService; - - @ApiOperation("分页查询学生信息") - @GetMapping("/page") - public PageDTO queryStudentPage(UserPageQuery pageQuery){ - return studentService.queryStudentPage(pageQuery); - } - - @ApiOperation("学员注册") - @PostMapping("/register") - public void registerStudent(@RequestBody StudentFormDTO studentFormDTO) { - studentService.saveStudent(studentFormDTO); - } - - @ApiOperation("修改学员密码") - @PutMapping("/password") - public void updateMyPassword(@RequestBody StudentFormDTO studentFormDTO) { - studentService.updateMyPassword(studentFormDTO); - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/controller/TeacherController.java b/tianji-master/tj-user/src/main/java/com/tianji/user/controller/TeacherController.java deleted file mode 100644 index 03bf638..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/controller/TeacherController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.tianji.user.controller; - - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.user.domain.vo.TeacherPageVO; -import com.tianji.user.service.ITeacherService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - *

- * 教师详情表 前端控制器 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@RestController -@RequestMapping("/teachers") -@Api(tags = "用户管理接口") -public class TeacherController { - - @Autowired - private ITeacherService teacherService; - - @GetMapping("/page") - @ApiOperation("分页查询教师信息") - public PageDTO queryTeacherPage(UserPageQuery pageQuery){ - return teacherService.queryTeacherPage(pageQuery); - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/controller/UserController.java b/tianji-master/tj-user/src/main/java/com/tianji/user/controller/UserController.java deleted file mode 100644 index 06774c6..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/controller/UserController.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.tianji.user.controller; - -import com.tianji.api.dto.user.LoginFormDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.domain.dto.LoginUserDTO; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.user.constants.UserErrorInfo; -import com.tianji.user.domain.dto.UserFormDTO; -import com.tianji.user.domain.po.User; -import com.tianji.user.domain.po.UserDetail; -import com.tianji.user.domain.vo.UserDetailVO; -import com.tianji.user.enums.UserStatus; -import com.tianji.user.service.IUserDetailService; -import com.tianji.user.service.IUserService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; -import springfox.documentation.annotations.ApiIgnore; - -import javax.validation.Valid; -import java.util.List; - -@RestController -@RequestMapping("users") -@Api(tags = "用户管理接口") -public class UserController { - - @Autowired - private IUserService userService; - @Autowired - private IUserDetailService detailService; - - @ApiOperation("新增用户,一般是员工或教师") - @PostMapping - public Long saveUser(@Valid @RequestBody UserDTO userDTO){ - userDTO.setId(null); - return userService.saveUser(userDTO); - } - - @ApiOperation("更新用户信息") - @PutMapping("/{id}") - public void updateUser(@RequestBody UserDTO userDTO){ - userService.updateUser(userDTO); - } - - @ApiOperation("更新当前登录用户信息,可修改密码") - @PutMapping - public void updateCurrentUser(@Valid @RequestBody UserFormDTO userDTO){ - userService.updateUserWithPassword(userDTO); - } - - @PutMapping("/{id}/password/default") - @ApiOperation("重置密码") - public void resetPassword( - @ApiParam(value = "要重置的用户的id", example = "1") @PathVariable("id") Long userId) { - userService.resetPassword(userId); - } - - @PutMapping("/{id}/status/{status}") - @ApiOperation("修改用户状态, status=0为禁用,status=1为正常") - public void updateUserStatus( - @ApiParam(value = "要重置的用户的id", example = "1") @PathVariable("id") Long userId, - @ApiParam(value = "状态", example = "1") @PathVariable("status") Integer status - ) { - User user = new User(); - user.setId(userId); - user.setStatus(UserStatus.of(status)); - userService.updateById(user); - } - - @ApiOperation("获取当前登录用户信息") - @GetMapping(value = "/me") - public UserDetailVO me() { - return userService.myInfo(); - } - - @ApiOperation("根据id查询用户信息") - @GetMapping("/{id}") - public UserDTO queryUserById( - @ApiParam("用户id") @PathVariable("id") Long id) { - UserDetail userDetail = detailService.queryById(id); - return BeanUtils.copyBean(userDetail, UserDTO.class, (d, u) -> u.setType(d.getType().getValue())); - } - - /** - * 登录结构 - * @param loginDTO 登录表单 - * @param isStaff 是否是后台登录 - * @return 登录用户信息 - */ - @ApiIgnore - @PostMapping("/detail/{isStaff}") - public LoginUserDTO queryUserDetail( - @Valid @RequestBody LoginFormDTO loginDTO, @PathVariable("isStaff") boolean isStaff) { - return userService.queryUserDetail(loginDTO, isStaff); - } - - /** - *

根据id批量查询用户信息

- * - * @param ids 用户id集合 - * @return 用户集合 - */ - @ApiIgnore - @GetMapping("/list") - public List queryUserByIds( - @ApiParam("用户id的列表") @RequestParam("ids") List ids) { - if(CollUtils.isEmpty(ids)){ - return CollUtils.emptyList(); - } - // 1.查询列表 - List list = detailService.queryByIds(ids); - // 2.转换 - return BeanUtils.copyList(list, UserDTO.class, (d, u) -> u.setType(d.getType().getValue())); - } - - /** - * 查询用户类型 - * - * @param id 用户id - * @return 用户类型,0-普通学员,1-老师,2-其他员工 - */ - @ApiIgnore - @GetMapping("/{id}/type") - public Integer queryUserType(@PathVariable("id") Long id) { - User user = userService.getById(id); - if (user == null) { - throw new BadRequestException(UserErrorInfo.Msg.USER_ID_NOT_EXISTS); - } - return user.getType().getValue(); - } - - @ApiIgnore - @GetMapping("/ids") - public Long exchangeUserIdWithPhone(@RequestParam("phone") String phone) { - User user = userService - .lambdaQuery().eq(User::getCellPhone, phone).one(); - if (user == null) { - throw new BadRequestException(UserErrorInfo.Msg.USER_ID_NOT_EXISTS); - } - return user.getId(); - } - - @ApiOperation("检查用户手机号是否存在") - @GetMapping("checkCellphone") - public Boolean checkCellPhone(@RequestParam("cellphone") String cellPhone){ - return userService.lambdaQuery() - .eq(User::getCellPhone, cellPhone) - // .in(User::getType, UserType.STAFF, UserType.TEACHER) - .count() <= 0; - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/dto/StudentFormDTO.java b/tianji-master/tj-user/src/main/java/com/tianji/user/domain/dto/StudentFormDTO.java deleted file mode 100644 index f647329..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/dto/StudentFormDTO.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.user.domain.dto; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -@Data -@ApiModel(description = "学生注册和修改密码的表单实体") -public class StudentFormDTO { - - @ApiModelProperty(value = "手机号", example = "13800010004") - private String cellPhone; - - @ApiModelProperty(value = "密码", example = "123456") - private String password; - - @ApiModelProperty(value = "验证码", example = "645632") - private String code; -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/dto/UserFormDTO.java b/tianji-master/tj-user/src/main/java/com/tianji/user/domain/dto/UserFormDTO.java deleted file mode 100644 index b689088..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/dto/UserFormDTO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.tianji.user.domain.dto; - -import com.tianji.api.dto.user.UserDTO; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import javax.validation.constraints.NotNull; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "修改用户信息的表单,带有密码") -public class UserFormDTO extends UserDTO { - @ApiModelProperty(value = "原始密码", example = "123321") - @NotNull - private String oldPassword; - @ApiModelProperty(value = "新密码", example = "123321") - @NotNull - private String password; -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/po/User.java b/tianji-master/tj-user/src/main/java/com/tianji/user/domain/po/User.java deleted file mode 100644 index 5cd6f24..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/po/User.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.tianji.user.domain.po; - -import com.baomidou.mybatisplus.annotation.FieldFill; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.common.enums.UserType; -import com.tianji.user.enums.UserStatus; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - *

- * 学员用户表 - *

- * - * @author 虎哥 - * @since 2022-06-28 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("user") -public class User implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 用户名 - */ - private String username; - - /** - * 手机号 - */ - private String cellPhone; - - /** - * 密码 - */ - private String password; - - /** - * 账户状态:0-禁用,1-正常 - */ - private UserStatus status; - - /** - * 用户类型:1-其他员工, 2-普通学员,3-老师 - */ - private UserType type; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - /** - * 创建者id - */ - - private Long creater; - /** - * 修改者id - */ - - private Long updater; -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/po/UserDetail.java b/tianji-master/tj-user/src/main/java/com/tianji/user/domain/po/UserDetail.java deleted file mode 100644 index 94fc649..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/po/UserDetail.java +++ /dev/null @@ -1,139 +0,0 @@ -package com.tianji.user.domain.po; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.tianji.common.enums.UserType; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.time.LocalDate; -import java.time.LocalDateTime; - -/** - *

- * 教师详情表 - *

- * - * @author 虎哥 - * @since 2022-08-15 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Accessors(chain = true) -@TableName("user_detail") -public class UserDetail implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 关联用户id - */ - @TableId(value = "id", type = IdType.NONE) - private Long id; - - /** - * 用户类型:1-员工, 2-普通学员,3-老师 - */ - private UserType type; - - /** - * 名字 - */ - private String name; - - /** - * 性别:0-男性,1-女性 - */ - private Integer gender; - - /** - * 头像地址 - */ - private String icon; - - /** - * 邮箱 - */ - private String email; - - /** - * QQ号码 - */ - private String qq; - - /** - * 生日 - */ - private LocalDate birthday; - - /** - * 岗位 - */ - private String job; - - /** - * 省 - */ - private String province; - - /** - * 市 - */ - private String city; - - /** - * 区 - */ - private String district; - - /** - * 个人介绍 - */ - private String intro; - - /** - * 形象照地址 - */ - private String photo; - - /** - * 角色id - */ - private Long roleId; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 更新时间 - */ - private LocalDateTime updateTime; - - /** - * 创建者id - */ - private Long creater; - - /** - * 更新者id - */ - private Long updater; - - /** - * 部门id - */ - private Long depId; - - @TableField(exist = false) - private String cellPhone; - @TableField(exist = false) - private String username; - @TableField(exist = false) - private Integer status; -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/query/UserPageQuery.java b/tianji-master/tj-user/src/main/java/com/tianji/user/domain/query/UserPageQuery.java deleted file mode 100644 index dc9383e..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/query/UserPageQuery.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.tianji.user.domain.query; - -import com.tianji.common.domain.query.PageQuery; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -@Data -@ApiModel(description = "教师分页查询条件") -public class UserPageQuery extends PageQuery { - @ApiModelProperty(value = "账户状态") - private Integer status; - @ApiModelProperty(value = "教师名称") - private String name; - @ApiModelProperty(value = "手机号码") - private String phone; -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/StaffVO.java b/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/StaffVO.java deleted file mode 100644 index f1f3c18..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/StaffVO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.user.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "员工用户") -public class StaffVO { - @ApiModelProperty(value = "主键", example = "1") - private Long id; - @ApiModelProperty(value = "头像", example = "default-user-icon.jpg") - private String icon; - @ApiModelProperty(value = "手机号", example = "13800010002") - private String cellPhone; - @ApiModelProperty(value = "员工姓名", example = "user_138foo0002") - private String name; - @ApiModelProperty(value = "角色id", example = "5") - private Long roleId; - @ApiModelProperty(value = "角色名称", example = "5") - private String roleName; - @ApiModelProperty(value = "注册时间", example = "2022-07-22") - private LocalDateTime createTime; - @ApiModelProperty(value = "账号状态", example = "0") - private Integer status; -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/StudentPageVo.java b/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/StudentPageVo.java deleted file mode 100644 index 64e5c1e..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/StudentPageVo.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.tianji.user.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "学生信息") -public class StudentPageVo { - @ApiModelProperty(value = "学生id,也是用户id", example = "1") - private Long id; - @ApiModelProperty(value = "学生名称", example = "张三") - private String name; - @ApiModelProperty(value = "头像", example = "default-icon.jpg") - private String icon; - @ApiModelProperty(value = "手机号", example = "13800010004") - private String cellPhone; - @ApiModelProperty(value = "性别:0-男性,1-女性", example = "0") - private Integer gender; - @ApiModelProperty(value = "购买/报名课程数量", example = "12") - private Integer courseAmount; - @ApiModelProperty(value = "注册时间", example = "2022-07-12") - private LocalDateTime createTime; - @ApiModelProperty(value = "账户状态,0-禁用,1-正常", example = "1") - private Integer status; -} \ No newline at end of file diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/TeacherPageVO.java b/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/TeacherPageVO.java deleted file mode 100644 index 65abb3b..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/TeacherPageVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.tianji.user.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "分页教师信息") -public class TeacherPageVO { - @ApiModelProperty(value = "教师id,也是用户id", example = "1") - private Long id; - @ApiModelProperty(value = "教师名称", example = "罗老师") - private String name; - @ApiModelProperty(value = "头像", example = "default-user-icon.jpg") - private String icon; - @ApiModelProperty(value = "手机号", example = "13980019001") - private String cellPhone; - @ApiModelProperty(value = "岗位", example = "讲师") - private String job; - @ApiModelProperty(value = "介绍", example = "黑马高级Java讲师") - private String intro; - @ApiModelProperty(value = "负责的课程数量", example = "10") - private Integer courseAmount; - @ApiModelProperty(value = "出题数量", example = "18") - private Integer examQuestionAmount; - @ApiModelProperty(value = "注册时间", example = "2022-07-12") - private LocalDateTime createTime; - @ApiModelProperty(value = "账户状态,0-禁用,1-正常", example = "1") - private Integer status; - @ApiModelProperty(value = "形象照片地址", example = "default-user-icon.jpg") - private String photo; -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/UserBasicVO.java b/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/UserBasicVO.java deleted file mode 100644 index bed3685..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/UserBasicVO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.tianji.user.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@ApiModel(description = "用户信息") -public class UserBasicVO { - @ApiModelProperty(value = "用户id", example = "1") - private Long id; - @ApiModelProperty(value = "用户名称/昵称", example = "李四") - private String name; - @ApiModelProperty(value = "用户类型,1-员工,2-普通学员,3-老师", example = "2") - private Integer type; - @ApiModelProperty(value = "头像", example = "default-user-icon.jpg") - private String icon; -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/UserDetailVO.java b/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/UserDetailVO.java deleted file mode 100644 index 572e4b1..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/domain/vo/UserDetailVO.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.tianji.user.domain.vo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.time.LocalDateTime; - -@Data -@ApiModel(description = "用户详情") -public class UserDetailVO { - @ApiModelProperty(value = "用户id", example = "1") - private Long id; - @ApiModelProperty(value = "名字", example = "张三") - private String name; - @ApiModelProperty(value = "头像", example = "default-icon.jpg") - private String icon; - @ApiModelProperty(value = "手机号", example = "13800010004") - private String cellPhone; - @ApiModelProperty(value = "用户名", example = "13800010004") - private String username; - @ApiModelProperty(value = "邮箱") - private String email; - @ApiModelProperty(value = "QQ号码") - private String qq; - @ApiModelProperty(value = "个人介绍") - private String intro; - @ApiModelProperty(value = "省") - private String province; - @ApiModelProperty(value = "市") - private String city; - @ApiModelProperty(value = "区") - private String district; - @ApiModelProperty(value = "性别:0-男性,1-女性", example = "0") - private Integer gender; - @ApiModelProperty(value = "注册时间", example = "2022-07-12") - private LocalDateTime createTime; - @ApiModelProperty(value = "角色名称", example = "教师") - private String roleName; -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/enums/UserStatus.java b/tianji-master/tj-user/src/main/java/com/tianji/user/enums/UserStatus.java deleted file mode 100644 index 66bd98e..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/enums/UserStatus.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.tianji.user.enums; - -import com.baomidou.mybatisplus.annotation.EnumValue; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.user.constants.UserErrorInfo; -import lombok.Getter; - -@Getter -public enum UserStatus { - FROZEN(0, "禁止使用"), - NORMAL(1, "已激活"), - ; - @EnumValue - int value; - String desc; - - UserStatus(Integer value, String desc) { - this.value = value; - this.desc = desc; - } - - public static UserStatus of(int value) { - if (value == 0) { - return FROZEN; - } - if (value == 1) { - return NORMAL; - } - throw new BadRequestException(UserErrorInfo.Msg.INVALID_USER_STATUS); - } -} \ No newline at end of file diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/mapper/UserDetailMapper.java b/tianji-master/tj-user/src/main/java/com/tianji/user/mapper/UserDetailMapper.java deleted file mode 100644 index 4bf37c8..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/mapper/UserDetailMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.user.mapper; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.tianji.user.domain.po.UserDetail; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - *

- * 教师详情表 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-08-15 - */ -public interface UserDetailMapper extends BaseMapper { - - UserDetail queryById(Long userId); - - List queryByIds(List ids); - - Page queryByPage(Page p, @Param("ew") QueryWrapper wrapper); -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/mapper/UserMapper.java b/tianji-master/tj-user/src/main/java/com/tianji/user/mapper/UserMapper.java deleted file mode 100644 index 20ad6fb..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/mapper/UserMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.tianji.user.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.tianji.user.domain.po.User; - -/** - *

- * 学员用户表 Mapper 接口 - *

- * - * @author 虎哥 - * @since 2022-06-28 - */ -public interface UserMapper extends BaseMapper { -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/ICodeService.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/ICodeService.java deleted file mode 100644 index c8b51a8..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/ICodeService.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.tianji.user.service; - -public interface ICodeService { - void sendVerifyCode(String phone); - void verifyCode(String phone, String code); -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/IStaffService.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/IStaffService.java deleted file mode 100644 index 266b4e2..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/IStaffService.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.tianji.user.service; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.user.domain.vo.StaffVO; - -/** - *

- * 员工详情表 服务类 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -public interface IStaffService { - PageDTO queryStaffPage(UserPageQuery pageQuery); -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/IStudentService.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/IStudentService.java deleted file mode 100644 index 38cfffe..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/IStudentService.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.tianji.user.service; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.user.domain.dto.StudentFormDTO; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.user.domain.vo.StudentPageVo; - -/** - *

- * 学员详情表 服务类 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -public interface IStudentService { - - void saveStudent(StudentFormDTO studentFormDTO); - - void updateMyPassword(StudentFormDTO studentFormDTO); - - PageDTO queryStudentPage(UserPageQuery pageQuery); -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/ITeacherService.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/ITeacherService.java deleted file mode 100644 index 2272738..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/ITeacherService.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.tianji.user.service; - -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.user.domain.vo.TeacherPageVO; - -/** - *

- * 教师详情表 服务类 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -public interface ITeacherService{ - PageDTO queryTeacherPage(UserPageQuery pageQuery); - -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/IUserDetailService.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/IUserDetailService.java deleted file mode 100644 index 007781c..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/IUserDetailService.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.tianji.user.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.user.domain.po.UserDetail; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.common.enums.UserType; - -import java.util.List; - -/** - *

- * 教师详情表 服务类 - *

- * - * @author 虎哥 - * @since 2022-08-15 - */ -public interface IUserDetailService extends IService { - - UserDetail queryById(Long userId); - - List queryByIds(List ids); - - Page queryUserDetailByPage(UserPageQuery pageQuery, UserType type); -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/IUserService.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/IUserService.java deleted file mode 100644 index d0fd945..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/IUserService.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.tianji.user.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.tianji.api.dto.user.LoginFormDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.domain.dto.LoginUserDTO; -import com.tianji.user.domain.dto.UserFormDTO; -import com.tianji.user.domain.po.User; -import com.tianji.user.domain.vo.UserDetailVO; - -/** - *

- * 学员用户表 服务类 - *

- * - * @author 虎哥 - * @since 2022-06-28 - */ -public interface IUserService extends IService { - LoginUserDTO queryUserDetail(LoginFormDTO loginDTO, boolean isStaff); - - void resetPassword(Long userId); - - UserDetailVO myInfo(); - - void addUserByPhone(User user, String code); - - void updatePasswordByPhone(String cellPhone, String code, String password); - - Long saveUser(UserDTO userDTO); - - void updateUser(UserDTO userDTO); - - void updateUserWithPassword(UserFormDTO userDTO); -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/CodeServiceImpl.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/CodeServiceImpl.java deleted file mode 100644 index 0a43475..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/CodeServiceImpl.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.tianji.user.service.impl; - -import com.tianji.message.domain.enums.SmsTemplate; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.RandomUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.message.api.client.AsyncSmsClient; -import com.tianji.message.domain.dto.SmsInfoDTO; -import com.tianji.user.service.ICodeService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - -import static com.tianji.api.constants.SmsConstants.VERIFY_CODE_PARAM_NAME; -import static com.tianji.common.constants.ErrorInfo.Msg.INVALID_VERIFY_CODE; -import static com.tianji.user.constants.UserConstants.USER_VERIFY_CODE_KEY; -import static com.tianji.user.constants.UserConstants.USER_VERIFY_CODE_TTL; - -@Slf4j -@Service -public class CodeServiceImpl implements ICodeService { - - @Autowired - private StringRedisTemplate stringRedisTemplate; - @Autowired - private AsyncSmsClient asyncSmsClient; - - @Override - public void sendVerifyCode(String phone) { - String key = USER_VERIFY_CODE_KEY + phone; - // 1.查看code是否存在 - String code = stringRedisTemplate.opsForValue().get(key); - if(StringUtils.isBlank(code)){ - // 2.生成随机验证码 - code = RandomUtils.randomNumbers(4); - // 3.保存到redis - stringRedisTemplate.opsForValue() - .set(USER_VERIFY_CODE_KEY + phone, code, USER_VERIFY_CODE_TTL); - - } - // 4.发送短信 - log.debug("发送短信验证码:{}", code); - SmsInfoDTO info = new SmsInfoDTO(); - info.setPhones(CollUtils.singletonList(phone)); - info.setTemplateCode(SmsTemplate.VERIFY_CODE.toString()); - Map params = new HashMap<>(1); - params.put(VERIFY_CODE_PARAM_NAME, code); - info.setTemplateParams(params); - asyncSmsClient.sendMessage(info); - } - - @Override - public void verifyCode(String phone, String code) { - String cacheCode = stringRedisTemplate.opsForValue().get(USER_VERIFY_CODE_KEY + phone); - if (!StringUtils.equals(cacheCode, code)) { - // 验证码错误 - throw new BadRequestException(INVALID_VERIFY_CODE); - } - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/StaffServiceImpl.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/StaffServiceImpl.java deleted file mode 100644 index 3bffe6f..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/StaffServiceImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.tianji.user.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.tianji.api.cache.RoleCache; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.enums.UserType; -import com.tianji.common.utils.BeanUtils; -import com.tianji.user.domain.po.UserDetail; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.user.domain.vo.StaffVO; -import com.tianji.user.service.IStaffService; -import com.tianji.user.service.IUserDetailService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -/** - *

- * 员工详情表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@Service -@RequiredArgsConstructor -public class StaffServiceImpl implements IStaffService { - - private final IUserDetailService detailService; - private final RoleCache roleCache; - @Override - public PageDTO queryStaffPage(UserPageQuery query) { - // 1.搜索 - Page p = detailService.queryUserDetailByPage(query, UserType.STAFF); - // 2.处理vo - return PageDTO.of(p, u -> { - StaffVO v = BeanUtils.toBean(u, StaffVO.class); - v.setRoleName(roleCache.getRoleName(u.getRoleId())); - return v; - }); - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/StudentServiceImpl.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/StudentServiceImpl.java deleted file mode 100644 index be11a51..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/StudentServiceImpl.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.tianji.user.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.tianji.api.client.trade.TradeClient; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.enums.UserType; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.CollUtils; -import com.tianji.common.utils.RandomUtils; -import com.tianji.user.constants.UserConstants; -import com.tianji.user.domain.dto.StudentFormDTO; -import com.tianji.user.domain.po.User; -import com.tianji.user.domain.po.UserDetail; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.user.domain.vo.StudentPageVo; -import com.tianji.user.service.IStudentService; -import com.tianji.user.service.IUserDetailService; -import com.tianji.user.service.IUserService; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - *

- * 学员详情表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@Service -@RequiredArgsConstructor -public class StudentServiceImpl implements IStudentService { - - private final IUserService userService; - private final IUserDetailService detailService; - private final TradeClient tradeClient; - - @Override - @Transactional - public void saveStudent(StudentFormDTO studentFormDTO) { - // 1.新增用户账号 - User user = new User(); - user.setCellPhone(studentFormDTO.getCellPhone()); - user.setPassword(studentFormDTO.getPassword()); - user.setType(UserType.STUDENT); - userService.addUserByPhone(user, studentFormDTO.getCode()); - - // 2.新增学员详情 - UserDetail student = new UserDetail(); - student.setId(user.getId()); - student.setName(RandomUtils.randomString(8)); - student.setRoleId(UserConstants.STUDENT_ROLE_ID); - detailService.save(student); - } - - @Override - public void updateMyPassword(StudentFormDTO studentFormDTO) { - userService.updatePasswordByPhone( - studentFormDTO.getCellPhone(), studentFormDTO.getCode(), studentFormDTO.getPassword() - ); - } - - @Override - public PageDTO queryStudentPage(UserPageQuery query) { - // 1.分页条件 - Page page = detailService.queryUserDetailByPage(query, UserType.STUDENT); - List records = page.getRecords(); - if (CollUtils.isEmpty(records)) { - return PageDTO.empty(page); - } - - // 2.查询购买的课程数量 - List stuIds = records.stream().map(UserDetail::getId).collect(Collectors.toList()); - Map numMap = tradeClient.countEnrollCourseOfStudent(stuIds); - - // 3.处理vo - List list = new ArrayList<>(records.size()); - for (UserDetail r : records) { - StudentPageVo v = BeanUtils.toBean(r, StudentPageVo.class); - list.add(v); - v.setCourseAmount(numMap.get(r.getId())); - } - return new PageDTO<>(page.getTotal(), page.getPages(), list); - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/TeacherServiceImpl.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/TeacherServiceImpl.java deleted file mode 100644 index b879a2a..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/TeacherServiceImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.tianji.user.service.impl; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.tianji.api.client.course.CourseClient; -import com.tianji.api.dto.course.SubNumAndCourseNumDTO; -import com.tianji.common.domain.dto.PageDTO; -import com.tianji.common.utils.BeanUtils; -import com.tianji.user.domain.po.UserDetail; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.user.domain.vo.TeacherPageVO; -import com.tianji.common.enums.UserType; -import com.tianji.user.service.ITeacherService; -import com.tianji.user.service.IUserDetailService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - *

- * 教师详情表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-07-12 - */ -@Service -public class TeacherServiceImpl implements ITeacherService { - @Autowired - private IUserDetailService detailService; - @Autowired - private CourseClient courseClient; - - @Override - public PageDTO queryTeacherPage(UserPageQuery pageQuery) { - // 1.分页参数 - Page page = detailService.queryUserDetailByPage(pageQuery, UserType.TEACHER); - // 2.处理返回值 - List records = page.getRecords(); - // 2.1.查询老师的试题数量、课程数量 - List ids = records.stream().map(UserDetail::getId).collect(Collectors.toList()); - List countDTOs = courseClient.infoByTeacherIds(ids); - Map map = countDTOs.stream() - .collect(Collectors.toMap(SubNumAndCourseNumDTO::getTeacherId, s -> s)); - // 2.2.数据转换 - List list = new ArrayList<>(records.size()); - for (UserDetail record : records) { - TeacherPageVO teacherPageVO = BeanUtils.toBean(record, TeacherPageVO.class); - SubNumAndCourseNumDTO sc = map.get(teacherPageVO.getId()); - teacherPageVO.setCourseAmount(sc.getCourseNum()); - teacherPageVO.setExamQuestionAmount(sc.getSubjectNum()); - list.add(teacherPageVO); - } - return new PageDTO<>(page.getTotal(), page.getPages(), list); - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/UserDetailServiceImpl.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/UserDetailServiceImpl.java deleted file mode 100644 index 7fdc95a..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/UserDetailServiceImpl.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.tianji.user.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.common.enums.UserType; -import com.tianji.common.utils.StringUtils; -import com.tianji.user.domain.po.UserDetail; -import com.tianji.user.domain.query.UserPageQuery; -import com.tianji.user.mapper.UserDetailMapper; -import com.tianji.user.service.IUserDetailService; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - *

- * 教师详情表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-08-15 - */ -@Service -public class UserDetailServiceImpl extends ServiceImpl implements IUserDetailService { - - @Override - public UserDetail queryById(Long userId) { - return getBaseMapper().queryById(userId); - } - - @Override - public List queryByIds(List ids) { - return getBaseMapper().queryByIds(ids); - } - - @Override - public Page queryUserDetailByPage(UserPageQuery query, UserType type) { - // 1.分页条件 - Page p = query.toMpPageDefaultSortByCreateTimeDesc(); - // 2.搜索条件 - Integer status = query.getStatus(); - String name = query.getName(); - String phone = query.getPhone(); - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper - .eq(type != null , "u.type", type) - .eq(status != null, "u.status", status) - .eq(StringUtils.isNotBlank(phone),"u.cell_phone", phone) - .like(StringUtils.isNotBlank(name), "ud.name", name); - // 3.查询 - p = getBaseMapper().queryByPage(p, wrapper); - // 4.返回 - return p; - } -} diff --git a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/UserServiceImpl.java b/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/UserServiceImpl.java deleted file mode 100644 index b63e83b..0000000 --- a/tianji-master/tj-user/src/main/java/com/tianji/user/service/impl/UserServiceImpl.java +++ /dev/null @@ -1,301 +0,0 @@ -package com.tianji.user.service.impl; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.tianji.api.client.auth.AuthClient; -import com.tianji.api.dto.auth.RoleDTO; -import com.tianji.api.dto.user.LoginFormDTO; -import com.tianji.api.dto.user.UserDTO; -import com.tianji.common.domain.dto.LoginUserDTO; -import com.tianji.common.enums.UserType; -import com.tianji.common.exceptions.BadRequestException; -import com.tianji.common.exceptions.ForbiddenException; -import com.tianji.common.exceptions.UnauthorizedException; -import com.tianji.common.utils.AssertUtils; -import com.tianji.common.utils.BeanUtils; -import com.tianji.common.utils.StringUtils; -import com.tianji.common.utils.UserContext; -import com.tianji.user.domain.dto.UserFormDTO; -import com.tianji.user.domain.po.User; -import com.tianji.user.domain.po.UserDetail; -import com.tianji.user.domain.vo.UserDetailVO; -import com.tianji.user.enums.UserStatus; -import com.tianji.user.mapper.UserMapper; -import com.tianji.user.service.ICodeService; -import com.tianji.user.service.IUserDetailService; -import com.tianji.user.service.IUserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import static com.tianji.user.constants.UserConstants.*; -import static com.tianji.user.constants.UserErrorInfo.Msg.*; - - -/** - *

- * 学员用户表 服务实现类 - *

- * - * @author 虎哥 - * @since 2022-06-28 - */ -@Service -public class UserServiceImpl extends ServiceImpl implements IUserService { - - @Autowired - private PasswordEncoder passwordEncoder; - @Autowired - private ICodeService codeService; - @Autowired - private AuthClient authClient; - @Autowired - private IUserDetailService detailService; - - @Override - public LoginUserDTO queryUserDetail(LoginFormDTO loginDTO, boolean isStaff) { - // 1.判断登录方式 - Integer type = loginDTO.getType(); - User user = null; - // 2.用户名和密码登录 - if (type == 1) { - user = loginByPw(loginDTO); - } - // 3.验证码登录 - if (type == 2) { - user = loginByVerifyCode(loginDTO.getCellPhone(), loginDTO.getPassword()); - } - // 4.错误的登录方式 - if (user == null) { - throw new BadRequestException(ILLEGAL_LOGIN_TYPE); - } - // 5.判断用户类型与登录方式是否匹配 - if (isStaff ^ user.getType() != UserType.STUDENT) { - throw new BadRequestException(isStaff ? "非管理端用户" : "非学生端用户"); - } - // 6.封装返回 - LoginUserDTO userDTO = new LoginUserDTO(); - userDTO.setUserId(user.getId()); - userDTO.setRoleId(handleRoleId(user)); - return userDTO; - } - - @Override - public void resetPassword(Long userId) { - User user = new User(); - user.setId(userId); - user.setPassword(passwordEncoder.encode(DEFAULT_PASSWORD)); - AssertUtils.isTrue(updateById(user), USER_ID_NOT_EXISTS); - } - - @Override - public UserDetailVO myInfo() { - // 1.获取登录用户id - Long userId = UserContext.getUser(); - if (userId == null) { - return null; - } - // 2.查询用户 - UserDetail userDetail = detailService.queryById(userId); - AssertUtils.isNotNull(userDetail, USER_ID_NOT_EXISTS); - // 3.封装vo - UserType type = userDetail.getType(); - // 3.1.基本信息 - UserDetailVO vo = BeanUtils.toBean(userDetail, UserDetailVO.class); - // 3.2.详情信息 - switch (type) { - case STAFF: - RoleDTO roleDTO = authClient.queryRoleById(userDetail.getRoleId()); - vo.setRoleName(roleDTO == null ? "" : roleDTO.getName()); - break; - case STUDENT: - vo.setRoleName(STUDENT_ROLE_NAME); - break; - case TEACHER: - vo.setRoleName(TEACHER_ROLE_NAME); - break; - default: - break; - } - return vo; - } - - @Override - public void addUserByPhone(User user, String code) { - // 1.验证码校验 - codeService.verifyCode(user.getCellPhone(), code); - // 2.判断手机号是否存在 - Integer count = lambdaQuery().eq(User::getCellPhone, user.getCellPhone()).count(); - if (count > 0) { - throw new BadRequestException(PHONE_ALREADY_EXISTS); - } - // 3.加密密码 - user.setPassword(passwordEncoder.encode(user.getPassword())); - // 4.新增 - user.setUsername(user.getCellPhone()); - save(user); - } - - @Override - public void updatePasswordByPhone(String cellPhone, String code, String password) { - // 1.验证码校验 - codeService.verifyCode(cellPhone, code); - // 2.查询用户 - User oldUser = lambdaQuery().eq(User::getCellPhone, cellPhone).one(); - if (oldUser == null) { - // 手机号不存在 - throw new BadRequestException(PHONE_NOT_EXISTS); - } - // 2.修改密码 - User user = new User(); - user.setId(user.getId()); - user.setPassword(passwordEncoder.encode(password)); - updateById(user); - } - - public void updatePhoneById(Long id, String cellPhone) { - // 1.1.判断是否需要修改手机号 - if (StringUtils.isNotBlank(cellPhone)) { - // 1.2.需要修改,封装数据 - User user = new User(); - user.setId(id); - user.setUsername(cellPhone); - user.setCellPhone(cellPhone); - // 1.3.修改 - updateById(user); - } - } - - @Override - @Transactional - public Long saveUser(UserDTO userDTO) { - UserType type = UserType.of(userDTO.getType()); - // 1.保存用户基本信息 - User user = new User(); - user.setPassword(passwordEncoder.encode(DEFAULT_PASSWORD)); - user.setCellPhone(userDTO.getCellPhone()); - user.setUsername(userDTO.getCellPhone()); - user.setType(type); - save(user); - // 2.新增详情 - UserDetail detail = BeanUtils.toBean(userDTO, UserDetail.class); - detail.setId(user.getId()); - detail.setType(type); - if(type == UserType.TEACHER){ - detail.setRoleId(TEACHER_ROLE_ID); - }else{ - if (userDTO.getRoleId() == null) { - throw new BadRequestException("员工角色信息不能为空"); - } - } - detailService.save(detail); - return user.getId(); - } - - @Override - @Transactional - public void updateUser(UserDTO userDTO) { - // 1.如果传递了手机号,则修改手机号 - String cellphone = userDTO.getCellPhone(); - if(StringUtils.isNotBlank(cellphone)){ - User user = new User(); - user.setId(userDTO.getId()); - user.setCellPhone(cellphone); - user.setUsername(cellphone); - updateById(user); - } - // 2.修改详情 - UserDetail detail = BeanUtils.toBean(userDTO, UserDetail.class); - detail.setType(null); - detailService.updateById(detail); - } - - @Override - public void updateUserWithPassword(UserFormDTO userDTO) { - // 1.尝试更新密码 - String pw = userDTO.getPassword(); - String oldPw = userDTO.getOldPassword(); - if(StringUtils.isNotBlank(pw) && StringUtils.isNotBlank(pw)) { - Long userId = UserContext.getUser(); - // 1.1.查询用户 - User user = getById(userId); - // 1.2.校验 - if (user == null) { - throw new UnauthorizedException(USER_ID_NOT_EXISTS); - } - // 1.3.校验密码 - if (!passwordEncoder.matches(oldPw, user.getPassword())) { - // 密码不一致 - throw new UnauthorizedException(INVALID_UN_OR_PW); - } - // 1.4.修改密码 - user = new User(); - user.setId(userId); - user.setPassword(passwordEncoder.encode(pw)); - updateById(user); - } - // 2.更新用户详情 - UserDetail detail = BeanUtils.toBean(userDTO, UserDetail.class); - detail.setRoleId(null); - detail.setType(null); - detailService.updateById(detail); - } - - public User loginByPw(LoginFormDTO loginDTO) { - // 1.数据校验 - String username = loginDTO.getUsername(); - String cellPhone = loginDTO.getCellPhone(); - if (StrUtil.isBlank(username) && StrUtil.isBlank(cellPhone)) { - throw new BadRequestException(INVALID_UN); - } - // 2.根据用户名或手机号查询 - User user = lambdaQuery() - .eq(StrUtil.isNotBlank(username), User::getUsername, username) - .eq(StrUtil.isNotBlank(cellPhone), User::getCellPhone, cellPhone) - .one(); - AssertUtils.isNotNull(user, INVALID_UN_OR_PW); - // 3.校验是否禁用 - if (user.getStatus() == UserStatus.FROZEN) { - throw new ForbiddenException(USER_FROZEN); - } - // 4.校验密码 - if (!passwordEncoder.matches(loginDTO.getPassword(), user.getPassword())) { - throw new BadRequestException(INVALID_UN_OR_PW); - } - - return user; - } - - private Long handleRoleId(User user) { - Long roleId = 0L; - switch (user.getType()) { - case STUDENT: - roleId = STUDENT_ROLE_ID; - break; - case TEACHER: - roleId = TEACHER_ROLE_ID; - break; - case STAFF: - UserDetail detail = detailService.getById(user.getId()); - roleId = detail.getRoleId(); - break; - } - return roleId; - } - - public User loginByVerifyCode(String phone, String code) { - // 1.校验验证码 - codeService.verifyCode(phone, code); - // 2.根据手机号查询 - User user = lambdaQuery().eq(User::getCellPhone, phone).one(); - if (user == null) { - throw new BadRequestException(PHONE_NOT_EXISTS); - } - // 3.校验是否禁用 - if (user.getStatus() == UserStatus.FROZEN) { - throw new ForbiddenException(USER_FROZEN); - } - return user; - } -} diff --git a/tianji-master/tj-user/src/main/resources/bootstrap-dev.yml b/tianji-master/tj-user/src/main/resources/bootstrap-dev.yml deleted file mode 100644 index f265036..0000000 --- a/tianji-master/tj-user/src/main/resources/bootstrap-dev.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.101 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-user/src/main/resources/bootstrap-local.yml b/tianji-master/tj-user/src/main/resources/bootstrap-local.yml deleted file mode 100644 index 65ea132..0000000 --- a/tianji-master/tj-user/src/main/resources/bootstrap-local.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - cloud: - nacos: - server-addr: 192.168.150.101:8848 # nacos注册中心 - discovery: - namespace: f923fb34-cb0a-4c06-8fca-ad61ea61a3f0 - group: DEFAULT_GROUP - ip: 192.168.150.1 -logging: - level: - com.tianji: debug \ No newline at end of file diff --git a/tianji-master/tj-user/src/main/resources/bootstrap.yml b/tianji-master/tj-user/src/main/resources/bootstrap.yml deleted file mode 100644 index f0651c4..0000000 --- a/tianji-master/tj-user/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,48 +0,0 @@ -server: - port: 8082 #端口 - tomcat: - uri-encoding: UTF-8 #服务编码 -spring: - profiles: - active: dev - application: - name: user-service - cloud: - nacos: - config: - file-extension: yaml - shared-configs: # 共享配置 - - data-id: shared-spring.yaml # 共享spring配置 - refresh: false - - data-id: shared-redis.yaml # 共享redis配置 - refresh: false - - data-id: shared-mybatis.yaml # 共享mybatis配置 - refresh: false - - data-id: shared-logs.yaml # 共享日志配置 - refresh: false - - data-id: shared-feign.yaml # 共享feign配置 - refresh: false -tj: - swagger: - enable: true - enableResponseWrap: true - package-path: com.tianji.user.controller - title: 智汇云课堂 - 用户中心接口文档 - description: 该服务用户管理、用户信息管理 - contact-name: 传智教育·研究院 - contact-url: http://www.itcast.cn/ - contact-email: zhanghuyi@itcast.cn - version: v1.0 - auth: - resource: - enable: true - excludeLoginPaths: - - /students/register - - /users/detail/{isStaff} - - /users/list - - GET:/users/{id} - - /users/{id}/type - - /users/ids - - /users/me - jdbc: - database: tj_user \ No newline at end of file diff --git a/tianji-master/tj-user/src/main/resources/mapper/UserDetailMapper.xml b/tianji-master/tj-user/src/main/resources/mapper/UserDetailMapper.xml deleted file mode 100644 index a1e8f70..0000000 --- a/tianji-master/tj-user/src/main/resources/mapper/UserDetailMapper.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - diff --git a/tianji-master/tj-user/src/main/resources/mapper/UserMapper.xml b/tianji-master/tj-user/src/main/resources/mapper/UserMapper.xml deleted file mode 100644 index 79716f9..0000000 --- a/tianji-master/tj-user/src/main/resources/mapper/UserMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/tianji-master/tj-user/src/test/java/com/tianji/user/service/impl/StudentServiceImplTest.java b/tianji-master/tj-user/src/test/java/com/tianji/user/service/impl/StudentServiceImplTest.java deleted file mode 100644 index 0b98330..0000000 --- a/tianji-master/tj-user/src/test/java/com/tianji/user/service/impl/StudentServiceImplTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.tianji.user.service.impl; - -import com.tianji.user.domain.dto.StudentFormDTO; -import com.tianji.user.service.IStudentService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class StudentServiceImplTest { - - @Autowired - private IStudentService studentService; - - @Test - void saveStudent() { - for (int i = 1; i < 20; i++) { - StudentFormDTO dto = new StudentFormDTO(); - dto.setCellPhone((13898675600L + i) + ""); - dto.setPassword("123321"); - studentService.saveStudent(dto); - } - } -} \ No newline at end of file