From 2862c3e4da3adbb4bea43151514f0c43b86476d6 Mon Sep 17 00:00:00 2001 From: mitao <2763622819@qq.com> Date: 星期六, 07 九月 2024 17:49:17 +0800 Subject: [PATCH] APP端冥想首页相关接口 --- xinquan-modules/xinquan-gen/src/main/resources/mapper/generator/MeditationUserFavoriteService.xml | 0 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationUserFavoriteMapper.java | 16 xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java | 138 + xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseLearningRecordMapper.xml | 10 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/AppUserVO.java | 109 + xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/dto/ClientHomeMeditationQueryDTO.java | 25 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java | 47 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserViewingHistoryController.java | 50 xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/dto/AppUserDTO.java | 7 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationCategoryServiceImpl.java | 30 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationAndCateVO.java | 25 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java | 41 xinquan-auth/src/main/java/com/xinquan/auth/form/AppRegisterBody.java | 2 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationUserFavoriteService.java | 16 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseController.java | 70 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusic.java | 6 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java | 15 xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java | 70 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserViewingHistory.java | 45 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseCategoryService.java | 10 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationQuestionLike.java | 56 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseLearningRecordServiceImpl.java | 22 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ReportStatusEnum.java | 23 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java | 333 ++++ xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/dto/UserAnswerOneDTO.java | 27 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/mapper/CourseLearningRecordMapper.java | 16 xinquan-modules/xinquan-course/src/main/resources/mapper/course/TutorSpecialColumnMapper.xml | 12 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationCategory.java | 6 xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationQuestionMapper.xml | 1 xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderMapper.xml | 38 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/HotWordsService.java | 9 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserViewingHistoryMapper.xml | 11 xinquan-common/xinquan-common-core/pom.xml | 5 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationEverydayService.java | 9 xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml | 19 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/CourseLearningRecord.java | 40 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/management/MgtClientMeditationUserFavoriteController.java | 2 xinquan-modules/xinquan-system/pom.xml | 13 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java | 76 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationUserFavoriteServiceImpl.java | 22 xinquan-auth/src/main/java/com/xinquan/auth/form/AppLoginBody.java | 4 pom.xml | 9 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/Meditation.java | 13 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java | 10 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationQuestionLikeServiceImpl.java | 20 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/web/domain/BaseEntity.java | 37 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/dto/UserAnswerDTO.java | 29 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationVO.java | 73 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/SysUserController.java | 11 xinquan-modules/xinquan-user/pom.xml | 15 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationEverydayServiceImpl.java | 58 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/BannerServiceImpl.java | 15 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppWXLoginBody.java | 8 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserViewingHistoryMapper.java | 16 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/EncryptUtils.java | 61 xinquan-api/xinquan-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | 2 xinquan-modules/xinquan-meditation/pom.xml | 13 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/BannerVO.java | 26 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserViewingHistoryService.java | 23 xinquan-modules/xinquan-order/pom.xml | 16 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java | 15 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationQuestionLikeService.java | 16 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationQuestionService.java | 16 xinquan-modules/xinquan-user/src/main/resources/mapper/user/TagMapper.xml | 3 xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicMapper.xml | 1 xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java | 27 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/DES.java | 158 ++ xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseService.java | 15 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/dto/ClientMeditationQueryDTO.java | 25 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/RemoteHotWordsService.java | 29 xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationQuestionLikeMapper.xml | 22 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationCategoryVO.java | 32 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java | 265 +++ xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationEverydayVO.java | 36 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMapper.xml | 3 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppVerifyCellPhoneBody.java | 4 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/TagVO.java | 20 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseCategoryServiceImpl.java | 18 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseVO.java | 68 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java | 246 ++ xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseLearningRecordService.java | 16 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java | 58 xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserFavoriteMapper.xml | 21 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationQuestionVO.java | 46 xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java | 38 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/inner/InnerCourseLearningRecordController.java | 20 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientHomeBackgroundMusicVO.java | 29 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationQuestion.java | 10 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/SysMenus.java | 31 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseCategoryVO.java | 27 xinquan-auth/src/main/java/com/xinquan/auth/form/AppChangePwdBody.java | 2 xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseCategoryMapper.xml | 14 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationCategoryService.java | 18 xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderPaymentRecordMapper.xml | 14 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientHomeController.java | 277 +++ xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AnswerTagEnum.java | 29 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/HotWords.java | 6 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserViewingHistoryServiceImpl.java | 35 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationController.java | 6 xinquan-gateway/src/main/java/com/xinquan/gateway/filter/AuthFilter.java | 22 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/inner/InnerBannerController.java | 40 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/RemoteHotWordsFallbackFactory.java | 30 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/SysRoleController.java | 5 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationQuestionLikeMapper.java | 16 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/RemoteBannerFallbackFactory.java | 31 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationUserFavoriteController.java | 3 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationDetailsVO.java | 25 xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseChapterMapper.xml | 32 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationQuestionServiceImpl.java | 65 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/domain/R.java | 8 xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/AppUser.java | 4 xinquan-modules/xinquan-course/pom.xml | 13 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/HomeBackgroundMusicServiceImpl.java | 61 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/RemoteBannerService.java | 30 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/Base64DES.java | 153 + xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java | 4 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppleLoginUser.java | 2 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java | 30 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/inner/InnerHotWordsController.java | 39 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AnswerEnum.java | 24 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/HotWordsMapper.java | 2 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserViewingHistoryController.java | 20 xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseMapper.xml | 42 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicUserController.java | 2 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/HomeBackgroundMusicService.java | 31 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/client/PublicController.java | 7 xinquan-modules/xinquan-system/src/main/resources/mapper/system/SysUserMapper.xml | 2 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserFavorite.java | 33 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/SysUser.java | 22 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppLoginUser.java | 20 /dev/null | 20 xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java | 41 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppCaptchaBody.java | 4 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/BannerService.java | 10 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/HotWordsServiceImpl.java | 19 xinquan-modules/xinquan-course/src/main/resources/mapper/course/TutorSpecialColumnCourseMapper.xml | 17 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java | 4 137 files changed, 4,109 insertions(+), 471 deletions(-) diff --git a/pom.xml b/pom.xml index ce34c0f..3f3e6bf 100644 --- a/pom.xml +++ b/pom.xml @@ -37,6 +37,7 @@ <transmittable-thread-local.version>2.14.2</transmittable-thread-local.version> <knife4j.version>3.0.3</knife4j.version> <hutool.version>5.7.17</hutool.version> + <easyexcel.version>4.0.2</easyexcel.version> </properties> <!-- 依赖声明 --> @@ -222,12 +223,20 @@ <artifactId>knife4j-micro-spring-boot-starter</artifactId> <version>${knife4j.version}</version> </dependency> + <!--hutool工具包--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> + + <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>easyexcel</artifactId> + <version>${easyexcel.version}</version> + </dependency> </dependencies> </dependencyManagement> diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/RemoteBannerService.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/RemoteBannerService.java new file mode 100644 index 0000000..3596b91 --- /dev/null +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/RemoteBannerService.java @@ -0,0 +1,30 @@ +package com.xinquan.system.api; + +import com.xinquan.common.core.constant.SecurityConstants; +import com.xinquan.common.core.constant.ServiceNameConstants; +import com.xinquan.common.core.domain.R; +import com.xinquan.system.api.domain.vo.BannerVO; +import com.xinquan.system.api.factory.RemoteBannerFallbackFactory; +import java.util.List; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; + +/** + * 用户服务 + * + * @author ruoyi + */ +@FeignClient(contextId = "remoteBannerService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteBannerFallbackFactory.class) +public interface RemoteBannerService { + + /** + * 查询轮播图列表 + * + * @param source 请求来源 + * @return 轮播图列表 + */ + @GetMapping("/inner/system/banner/getBannerList") + R<List<BannerVO>> getBannerList( + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); +} diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/RemoteHotWordsService.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/RemoteHotWordsService.java new file mode 100644 index 0000000..84ddd93 --- /dev/null +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/RemoteHotWordsService.java @@ -0,0 +1,29 @@ +package com.xinquan.system.api; + +import com.xinquan.common.core.constant.SecurityConstants; +import com.xinquan.common.core.constant.ServiceNameConstants; +import com.xinquan.common.core.domain.R; +import com.xinquan.system.api.factory.RemoteHotWordsFallbackFactory; +import java.util.List; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; + +/** + * 用户服务 + * + * @author ruoyi + */ +@FeignClient(contextId = "remoteHotWordsService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteHotWordsFallbackFactory.class) +public interface RemoteHotWordsService { + + /** + * 查询热词列表 + * + * @param source + * @return + */ + @GetMapping("/inner/system/hot-words/getHotWordList") + R<List<String>> getHotWordList( + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); +} diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/SysUser.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/SysUser.java index d39f786..91f946e 100644 --- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/SysUser.java +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/SysUser.java @@ -1,7 +1,6 @@ package com.xinquan.system.api.domain; import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; import com.xinquan.common.core.annotation.Excel; import com.xinquan.common.core.annotation.Excel.ColumnType; import com.xinquan.common.core.annotation.Excel.Type; @@ -9,7 +8,7 @@ import com.xinquan.common.core.web.domain.BaseEntity; import com.xinquan.common.core.xss.Xss; import io.swagger.annotations.ApiModelProperty; -import java.util.Date; +import java.time.LocalDateTime; import java.util.List; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; @@ -29,7 +28,7 @@ /** 用户ID */ @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号") - @TableId("user_id") + @TableField("user_id") private Long userId; /** 部门ID */ @@ -85,7 +84,7 @@ @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField("login_date") - private Date loginDate; + private LocalDateTime loginDate; /** 部门对象 */ @Excels({ @@ -113,6 +112,17 @@ @ApiModelProperty(value = "备注") private String remark; + + @ApiModelProperty(value = "用户类型 00:管理后台用户 01:APP用户") + private String userType; + + public String getUserType() { + return userType; + } + + public void setUserType(String userType) { + this.userType = userType; + } @Override public String getRemark() { @@ -271,12 +281,12 @@ this.loginIp = loginIp; } - public Date getLoginDate() + public LocalDateTime getLoginDate() { return loginDate; } - public void setLoginDate(Date loginDate) + public void setLoginDate(LocalDateTime loginDate) { this.loginDate = loginDate; } diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/BannerVO.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/BannerVO.java new file mode 100644 index 0000000..245d4a8 --- /dev/null +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/BannerVO.java @@ -0,0 +1,26 @@ +package com.xinquan.system.api.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/7 + */ +@Data +@ApiModel(value = "轮播图视图对象") +public class BannerVO implements Serializable { + + private static final long serialVersionUID = -7433787602665988956L; + + @ApiModelProperty(value = "轮播图id") + private Long id; + + @ApiModelProperty(value = "轮播图") + private String imageUrl; + + @ApiModelProperty(value = "跳转课程id") + private Integer courseId; +} diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/RemoteBannerFallbackFactory.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/RemoteBannerFallbackFactory.java new file mode 100644 index 0000000..64d3d47 --- /dev/null +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/RemoteBannerFallbackFactory.java @@ -0,0 +1,31 @@ +package com.xinquan.system.api.factory; + +import com.xinquan.common.core.domain.R; +import com.xinquan.system.api.RemoteBannerService; +import com.xinquan.system.api.domain.vo.BannerVO; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.stereotype.Component; + +/** + * 用户服务降级处理 + * + * @author ruoyi + */ +@Component +public class RemoteBannerFallbackFactory implements FallbackFactory<RemoteBannerService> { + + private static final Logger log = LoggerFactory.getLogger(RemoteBannerFallbackFactory.class); + + @Override + public RemoteBannerService create(Throwable cause) { + return new RemoteBannerService() { + @Override + public R<List<BannerVO>> getBannerList(String source) { + return R.fail("获取轮播图失败:" + cause.getMessage()); + } + }; + } +} diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/RemoteHotWordsFallbackFactory.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/RemoteHotWordsFallbackFactory.java new file mode 100644 index 0000000..80d7988 --- /dev/null +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/RemoteHotWordsFallbackFactory.java @@ -0,0 +1,30 @@ +package com.xinquan.system.api.factory; + +import com.xinquan.common.core.domain.R; +import com.xinquan.system.api.RemoteHotWordsService; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cloud.openfeign.FallbackFactory; +import org.springframework.stereotype.Component; + +/** + * 用户服务降级处理 + * + * @author ruoyi + */ +@Component +public class RemoteHotWordsFallbackFactory implements FallbackFactory<RemoteHotWordsService> { + + private static final Logger log = LoggerFactory.getLogger(RemoteHotWordsFallbackFactory.class); + + @Override + public RemoteHotWordsService create(Throwable cause) { + return new RemoteHotWordsService() { + @Override + public R<List<String>> getHotWordList(String source) { + return R.fail("获取热词列表失败"); + } + }; + } +} diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppCaptchaBody.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppCaptchaBody.java index ebc36f7..168851b 100644 --- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppCaptchaBody.java +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppCaptchaBody.java @@ -16,11 +16,11 @@ private static final long serialVersionUID = 6079425494597881288L; - @ApiModelProperty(value = "手机号") + @ApiModelProperty(value = "手机号", required = true) @NotBlank(message = "手机号不能为空") private String cellPhone; - @ApiModelProperty("验证码") + @ApiModelProperty(value = "验证码", required = true) @NotBlank(message = "验证码不能为空") private String captcha; } diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/WXLoginUser.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppLoginUser.java similarity index 70% rename from xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/WXLoginUser.java rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppLoginUser.java index 13bfe0b..9c46283 100644 --- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/WXLoginUser.java +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppLoginUser.java @@ -12,16 +12,16 @@ * @author ruoyi */ @Data -@ApiModel(value = "微信登录用户信息") -public class WXLoginUser implements Serializable { +@ApiModel(value = "APP登录用户信息") +public class AppLoginUser implements Serializable { private static final long serialVersionUID = 1L; /** * 用户唯一标识 */ - @ApiModelProperty(value = "APP用户id") - private Long token; + @ApiModelProperty(value = "用户唯一标识") + private String token; /** * 用户id @@ -53,16 +53,24 @@ @ApiModelProperty(value = "登录IP地址") private String ipaddr; - @ApiModelProperty(value = "绑定手机号状态 1=是 2=否") + @ApiModelProperty(value = "是否需要验证手机号 1=是 2=否") private Integer bindStatus = 2; @ApiModelProperty(value = "用户手机") private String cellPhone; + @ApiModelProperty(value = "APP用户id") + private Long appUserId; + + @ApiModelProperty(value = "token") + private String accessToken; + + @ApiModelProperty(value = "token过期时间") + private Long expireIn; /** * 系统用户信息 */ - @ApiModelProperty(value = "系统用户信息") + @ApiModelProperty(value = "系统用户信息", hidden = true) private SysUser sysUser; } diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppVerifyCellPhoneBody.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppVerifyCellPhoneBody.java index 61a9254..bb84641 100644 --- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppVerifyCellPhoneBody.java +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppVerifyCellPhoneBody.java @@ -18,11 +18,11 @@ private static final long serialVersionUID = -6119279151800382508L; @NotBlank(message = "微信openid或苹果appleId不能为空") - @ApiModelProperty(value = "微信openid或苹果appleId") + @ApiModelProperty(value = "微信openid或苹果appleId", required = true) private String wxOrAppleId; @NotNull(message = "登录类型不能为空") - @ApiModelProperty(value = "登录类型 1=微信 2=苹果") + @ApiModelProperty(value = "登录类型 1=微信 2=苹果", required = true) private Integer loginType; } diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppWXLoginBody.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppWXLoginBody.java index 75a7315..f3c5772 100644 --- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppWXLoginBody.java +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppWXLoginBody.java @@ -21,28 +21,28 @@ /** * 微信openId */ - @ApiModelProperty(value = "微信openId") + @ApiModelProperty(value = "微信openId", required = true) @NotBlank(message = "微信openId不能为空") private String wxOpenId; /** * 用户昵称 */ - @ApiModelProperty(value = "用户昵称") + @ApiModelProperty(value = "用户昵称", required = true) @NotBlank(message = "用户昵称不能为空") private String nickname; /** * 用户头像 */ - @ApiModelProperty(value = "用户头像") + @ApiModelProperty(value = "用户头像", required = true) @NotBlank(message = "用户头像不能为空") private String headImgUrl; /** * 用户头像 */ - @ApiModelProperty(value = "用户性别") + @ApiModelProperty(value = "用户性别", required = true) @NotNull(message = "用户性别不能为空") private Integer sex; diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppleLoginUser.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppleLoginUser.java index 17d18c9..4cc478c 100644 --- a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppleLoginUser.java +++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/model/AppleLoginUser.java @@ -12,7 +12,7 @@ @Data @EqualsAndHashCode(callSuper = true) @ApiModel(value = "苹果登录用户信息") -public class AppleLoginUser extends WXLoginUser { +public class AppleLoginUser extends AppLoginUser { private static final long serialVersionUID = 6891070491318038281L; } diff --git a/xinquan-api/xinquan-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/xinquan-api/xinquan-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 9b906a1..27787a7 100644 --- a/xinquan-api/xinquan-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/xinquan-api/xinquan-api-system/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -2,3 +2,5 @@ com.xinquan.system.api.factory.RemoteLogFallbackFactory com.xinquan.system.api.factory.RemoteFileFallbackFactory com.xinquan.system.api.factory.SysUserFallbackFactory +com.xinquan.system.api.factory.RemoteHotWordsFallbackFactory +com.xinquan.system.api.factory.RemoteBannerFallbackFactory diff --git a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/AppUser.java b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/AppUser.java index fe734f7..ad89190 100644 --- a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/AppUser.java +++ b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/AppUser.java @@ -144,5 +144,7 @@ @TableField("level_setting_id") private Integer levelSettingId; - + @ApiModelProperty(value = "标签id,多个id使用英文逗号拼接") + @TableField("tag_id") + private String tagId; } diff --git a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/dto/AppUserDTO.java b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/dto/AppUserDTO.java index 8db03a7..26f8fcb 100644 --- a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/dto/AppUserDTO.java +++ b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/dto/AppUserDTO.java @@ -4,8 +4,10 @@ import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * @author mitao @@ -13,6 +15,8 @@ */ @Data @Builder +@NoArgsConstructor +@AllArgsConstructor public class AppUserDTO implements Serializable { private static final long serialVersionUID = -3850851853092651572L; @@ -103,4 +107,7 @@ @ApiModelProperty(value = "用户等级id") private Integer levelSettingId; + + @ApiModelProperty(value = "首页背景音乐id") + private Long homeBackgroundMusicId; } diff --git a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java index f821cf1..3b20b11 100644 --- a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java +++ b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java @@ -2,14 +2,14 @@ import com.xinquan.common.core.domain.R; import com.xinquan.system.api.model.AppCaptchaBody; +import com.xinquan.system.api.model.AppLoginUser; import com.xinquan.system.api.model.AppVerifyCellPhoneBody; import com.xinquan.system.api.model.AppWXLoginBody; -import com.xinquan.system.api.model.AppleLoginUser; -import com.xinquan.system.api.model.LoginUser; -import com.xinquan.system.api.model.WXLoginUser; import com.xinquan.user.api.domain.AppUser; import com.xinquan.user.api.domain.dto.AppUserDTO; import com.xinquan.user.api.feign.RemoteAppUserService; +import java.util.Collection; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -31,29 +31,40 @@ } @Override - public R<Boolean> registerAppUser(AppUserDTO appUserDTO, String source) { + public R<AppUser> registerAppUser(AppUserDTO appUserDTO, String source) { return R.fail("APP用户注册失败。"); } @Override - public R<WXLoginUser> wxLogin(AppWXLoginBody body, String inner) { + public R<AppLoginUser> wxLogin(AppWXLoginBody body, String inner) { return R.fail("APP用户微信登录失败。"); } @Override - public R<AppleLoginUser> appleLogin(String appleId, String source) { + public R<AppLoginUser> appleLogin(String appleId, String source) { return R.fail("APP用户苹果登录失败。"); } @Override - public R<LoginUser> appCaptchaLogin(AppCaptchaBody body, String source) { + public R<AppLoginUser> appCaptchaLogin(AppCaptchaBody body, String source) { return R.fail("APP用户验证码登录失败。"); } @Override - public R<WXLoginUser> verifyCellPhone(AppVerifyCellPhoneBody body, String source) { + public R<AppLoginUser> verifyCellPhone(AppVerifyCellPhoneBody body, + String source) { return R.fail("APP用户微信苹果登录验证手机号失败。"); } + + @Override + public R<?> updateAppUser(AppUserDTO dto, String source) { + return R.fail("修改APP用户信息失败。"); + } + + @Override + public R<List<AppUser>> getAppUserList(Collection<Long> appUserIdSet, String source) { + return R.fail("获取APP用户列表失败。"); + } }; } } diff --git a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java index 81c9882..5024e8e 100644 --- a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java +++ b/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java @@ -4,14 +4,14 @@ import com.xinquan.common.core.constant.ServiceNameConstants; import com.xinquan.common.core.domain.R; import com.xinquan.system.api.model.AppCaptchaBody; +import com.xinquan.system.api.model.AppLoginUser; import com.xinquan.system.api.model.AppVerifyCellPhoneBody; import com.xinquan.system.api.model.AppWXLoginBody; -import com.xinquan.system.api.model.AppleLoginUser; -import com.xinquan.system.api.model.LoginUser; -import com.xinquan.system.api.model.WXLoginUser; import com.xinquan.user.api.domain.AppUser; import com.xinquan.user.api.domain.dto.AppUserDTO; import com.xinquan.user.api.factory.RemoteAppUserFallbackFactory; +import java.util.Collection; +import java.util.List; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -44,7 +44,7 @@ * @return */ @PostMapping("/inner/app-user/registerAppUser") - R<Boolean> registerAppUser(@RequestBody AppUserDTO appUserDTO, + R<AppUser> registerAppUser(@RequestBody AppUserDTO appUserDTO, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** @@ -55,7 +55,7 @@ * @return */ @PostMapping("/inner/app-user/wxLogin") - R<WXLoginUser> wxLogin(@RequestBody AppWXLoginBody body, + R<AppLoginUser> wxLogin(@RequestBody AppWXLoginBody body, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** @@ -66,7 +66,7 @@ * @return */ @PostMapping("/inner/app-user/appleLogin") - R<AppleLoginUser> appleLogin(@RequestParam("appleId") String appleId, + R<AppLoginUser> appleLogin(@RequestParam("appleId") String appleId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** @@ -77,7 +77,7 @@ * @return */ @PostMapping("/inner/app-user/captchaLogin") - R<LoginUser> appCaptchaLogin(@RequestBody AppCaptchaBody body, + R<AppLoginUser> appCaptchaLogin(@RequestBody AppCaptchaBody body, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); /** @@ -88,6 +88,28 @@ * @return */ @PostMapping("/inner/app-user/verifyCellPhone") - R<WXLoginUser> verifyCellPhone(@RequestBody AppVerifyCellPhoneBody body, + R<AppLoginUser> verifyCellPhone(@RequestBody AppVerifyCellPhoneBody body, + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 更新用户信息 + * + * @param dto + * @param source + * @return + */ + @PostMapping("/inner/app-user/updateAppUser") + R<?> updateAppUser(@RequestBody AppUserDTO dto, + @RequestHeader(SecurityConstants.FROM_SOURCE) String source); + + /** + * 获取用户列表 + * + * @param appUserIdSet 用户id列表 + * @param source 请求来源 + * @return + */ + @PostMapping("/inner/app-user/getAppUserList") + R<List<AppUser>> getAppUserList(@RequestBody Collection<Long> appUserIdSet, @RequestHeader(SecurityConstants.FROM_SOURCE) String source); } diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java b/xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java index 41f1707..7268679 100644 --- a/xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java +++ b/xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java @@ -17,15 +17,14 @@ import com.xinquan.system.api.domain.SysUser; import com.xinquan.system.api.feignClient.SysUserClient; import com.xinquan.system.api.model.AppCaptchaBody; +import com.xinquan.system.api.model.AppLoginUser; import com.xinquan.system.api.model.AppVerifyCellPhoneBody; import com.xinquan.system.api.model.AppWXLoginBody; -import com.xinquan.system.api.model.AppleLoginUser; import com.xinquan.system.api.model.LoginUser; -import com.xinquan.system.api.model.WXLoginUser; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; -import java.util.Date; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import javax.servlet.http.HttpServletRequest; @@ -80,11 +79,11 @@ */ @ApiOperation(value = "注册账户",tags = {"APP端"}) @PostMapping("/app/register") - public R<?> appRegister(@Validated @RequestBody AppRegisterBody appRegisterBody) + public R<AppLoginUser> appRegister(@Validated @RequestBody AppRegisterBody appRegisterBody) { // 用户注册 - sysLoginService.appRegister(appRegisterBody); - return R.ok(); + AppLoginUser appLoginUser = sysLoginService.appRegister(appRegisterBody); + return R.ok(tokenService.createToken4AppLoginUser(appLoginUser)); } /** @@ -95,9 +94,9 @@ */ @ApiOperation(value = "账号密码登录", tags = {"APP端"}) @PostMapping("/app/login") - public R<?> appLogin(@Validated @RequestBody AppLoginBody body) { - LoginUser userInfo = sysLoginService.appLogin(body); - return R.ok(tokenService.createToken(userInfo)); + public R<AppLoginUser> appLogin(@Validated @RequestBody AppLoginBody body) { + AppLoginUser appLoginUser = sysLoginService.appLogin(body); + return R.ok(tokenService.createToken4AppLoginUser(appLoginUser)); } /** @@ -108,9 +107,9 @@ */ @ApiOperation(value = "验证码登录", tags = {"APP端"}) @PostMapping("/app/captchaLogin") - public R<?> appCaptchaLogin(@Validated @RequestBody AppCaptchaBody body) { - LoginUser userInfo = sysLoginService.appCaptchaLogin(body); - return R.ok(tokenService.createToken(userInfo)); + public R<AppLoginUser> appCaptchaLogin(@Validated @RequestBody AppCaptchaBody body) { + AppLoginUser appLoginUser = sysLoginService.appCaptchaLogin(body); + return R.ok(tokenService.createToken4AppLoginUser(appLoginUser)); } /** @@ -146,9 +145,9 @@ */ @ApiOperation(value = "微信登录", tags = {"APP端"}) @PostMapping("/app/wxLogin") - public R<?> thirdLogin(@Validated @RequestBody AppWXLoginBody body) { - WXLoginUser wxLoginUser = sysLoginService.wxLogin(body); - return R.ok(tokenService.createToken4WXLoginUser(wxLoginUser)); + public R<AppLoginUser> thirdLogin(@Validated @RequestBody AppWXLoginBody body) { + AppLoginUser appLoginUser = sysLoginService.wxLogin(body); + return R.ok(tokenService.createToken4AppLoginUser(appLoginUser)); } /** @@ -161,9 +160,10 @@ @PostMapping("/app/appleLogin") @ApiImplicitParams({ @ApiImplicitParam(name = "appleId", value = "苹果ID", required = true, dataType = "String", paramType = "query")}) - public R<?> appleLogin(@RequestParam(value = "appleId", required = true) String appleId) { - AppleLoginUser appleLoginUser = sysLoginService.appleLogin(appleId); - return R.ok(tokenService.createToken4WXLoginUser(appleLoginUser)); + public R<AppLoginUser> appleLogin( + @RequestParam(value = "appleId", required = true) String appleId) { + AppLoginUser appLoginUser = sysLoginService.appleLogin(appleId); + return R.ok(tokenService.createToken4AppLoginUser(appLoginUser)); } /** @@ -175,7 +175,8 @@ @ApiOperation(value = "微信苹果登录-验证手机号", tags = {"APP端"}) @PostMapping("/app/verifyCellPhone") public R<?> verifyCellPhone(@Validated @RequestBody AppVerifyCellPhoneBody body) { - return R.ok(tokenService.createToken4WXLoginUser(sysLoginService.verifyCellPhone(body))); + return R.ok(tokenService.createToken4AppLoginUser( + sysLoginService.verifyCellPhone(body))); } /** @@ -202,7 +203,7 @@ // 修改用户最后登录时间 SysUser sysUser = new SysUser(); sysUser.setUserId(userInfo.getSysUser().getUserId()); - sysUser.setLoginDate(new Date()); + sysUser.setLoginDate(LocalDateTime.now()); System.out.println("修改用户登录时间"+sysUser); userClient.updateSysUser(sysUser); // 获取登录token diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/form/AppChangePwdBody.java b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppChangePwdBody.java index db9023c..3a0e5a2 100644 --- a/xinquan-auth/src/main/java/com/xinquan/auth/form/AppChangePwdBody.java +++ b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppChangePwdBody.java @@ -22,7 +22,7 @@ /** * 用户密码 */ - @ApiModelProperty(value = "密码修改秘钥") + @ApiModelProperty(value = "密码修改秘钥", required = true) @NotBlank(message = "密码修改秘钥不能为空") private String secret; diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/form/AppLoginBody.java b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppLoginBody.java index 00767d2..f0fd889 100644 --- a/xinquan-auth/src/main/java/com/xinquan/auth/form/AppLoginBody.java +++ b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppLoginBody.java @@ -20,14 +20,14 @@ /** * 手机号 */ - @ApiModelProperty(value = "手机号") + @ApiModelProperty(value = "手机号", required = true) @NotBlank(message = "手机号不能为空") private String cellPhone; /** * 用户密码 */ - @ApiModelProperty(value = "用户密码") + @ApiModelProperty(value = "用户密码", required = true) @NotBlank(message = "密码不能为空") private String password; diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/form/AppRegisterBody.java b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppRegisterBody.java index b1407b3..c265d31 100644 --- a/xinquan-auth/src/main/java/com/xinquan/auth/form/AppRegisterBody.java +++ b/xinquan-auth/src/main/java/com/xinquan/auth/form/AppRegisterBody.java @@ -21,7 +21,7 @@ private static final long serialVersionUID = 438348119520198682L; - @ApiModelProperty(value = "用户密码") + @ApiModelProperty(value = "用户密码", required = true) @NotBlank(message = "用户密码不能为空") private String password; diff --git a/xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java b/xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java index 36d0fc3..0b836ed 100644 --- a/xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java +++ b/xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java @@ -6,7 +6,6 @@ import com.xinquan.auth.form.AppLoginBody; import com.xinquan.auth.form.AppRegisterBody; import com.xinquan.auth.form.VerifyResultVO; -import com.xinquan.auth.util.HuaWeiSMSUtil; import com.xinquan.common.core.constant.CacheConstants; import com.xinquan.common.core.constant.Constants; import com.xinquan.common.core.constant.SecurityConstants; @@ -24,11 +23,10 @@ import com.xinquan.system.api.domain.SysUser; import com.xinquan.system.api.feignClient.SysUserClient; import com.xinquan.system.api.model.AppCaptchaBody; +import com.xinquan.system.api.model.AppLoginUser; import com.xinquan.system.api.model.AppVerifyCellPhoneBody; import com.xinquan.system.api.model.AppWXLoginBody; -import com.xinquan.system.api.model.AppleLoginUser; import com.xinquan.system.api.model.LoginUser; -import com.xinquan.system.api.model.WXLoginUser; import com.xinquan.user.api.domain.AppUser; import com.xinquan.user.api.domain.dto.AppUserDTO; import com.xinquan.user.api.feign.RemoteAppUserService; @@ -36,11 +34,10 @@ import java.time.LocalDateTime; import java.util.Objects; import java.util.concurrent.TimeUnit; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; /** * 登录校验方法 @@ -173,7 +170,8 @@ /** * 注册 */ - public void appRegister(AppRegisterBody appRegisterBody) + @Transactional(rollbackFor = Exception.class) + public AppLoginUser appRegister(AppRegisterBody appRegisterBody) { String cellPhone = appRegisterBody.getCellPhone(); String password = appRegisterBody.getPassword(); @@ -191,16 +189,11 @@ { throw new ServiceException("该手机号已注册"); } - - if (password.length() < UserConstants.PASSWORD_MIN_LENGTH - || password.length() > UserConstants.PASSWORD_MAX_LENGTH) - { - throw new ServiceException("密码长度必须在5到20个字符之间"); - } String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6); // 注册用户信息 SysUser sysUser = new SysUser(); sysUser.setUserName(cellPhone); + sysUser.setUserType("01"); sysUser.setNickName(nickname); sysUser.setPassword(SecurityUtils.encryptPassword(password)); R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser, SecurityConstants.INNER); @@ -209,6 +202,7 @@ { throw new ServiceException(registerResult.getMsg()); } + sysUser = registerResult.getData(); recordLogService.recordLogininfor(cellPhone, Constants.REGISTER, "注册成功"); //TODO 默认头像待完善 AppUserDTO appUserDTO = AppUserDTO.builder().userId(sysUser.getUserId()).cellPhone(cellPhone) @@ -216,12 +210,21 @@ nickname).userStatus(1).sanskritFlag(2).balance(BigDecimal.ZERO) .income(BigDecimal.ZERO).totalEnergyValue(0).registerTime( LocalDateTime.now()).levelSettingId(1).build(); - Boolean result = remoteAppUserService.registerAppUser(appUserDTO, SecurityConstants.INNER) - .getData(); - if (!result) { - throw new ServiceException("注册失败"); + R<AppUser> result = remoteAppUserService.registerAppUser(appUserDTO, + SecurityConstants.INNER); + if (R.FAIL == result.getCode()) { + throw new ServiceException(result.getMsg()); } - + // 构建AppLoginUser + SysUser sysUserInfo = registerResult.getData(); + AppUser appUserInfo = result.getData(); + AppLoginUser appLoginUser = new AppLoginUser(); + appLoginUser.setUserid(sysUserInfo.getUserId()); + appLoginUser.setUsername(appUserInfo.getNickname()); + appLoginUser.setCellPhone(cellPhone); + appLoginUser.setAppUserId(appUserInfo.getId()); + appLoginUser.setSysUser(sysUser); + return appLoginUser; } /** @@ -231,10 +234,13 @@ * @return true/false */ private boolean verifyCaptcha(String cellPhone, String captcha, String keyPrefix) { + if (StringUtils.isNotBlank(cellPhone) && StringUtils.isNotBlank(captcha)) { String key = keyPrefix + cellPhone; String code = redisService.getCacheObject(key); - if (StringUtils.isNotBlank(code) && code.equals(captcha)) { + // 万能验证码 + if (captcha.equals("123456") || (StringUtils.isNotBlank(code) && code.equals( + captcha))) { redisService.deleteObject(key); return true; } @@ -270,23 +276,19 @@ */ public void sendCaptchaCode(String cellPhone, Integer type) { String key = getCaptchaCodeByTypePrefix(type); - Boolean result = redisService.hasKey(key + cellPhone); - if (result) { - throw new ServiceException("请勿重复发送验证码"); - } String code = RandomUtil.randomNumbers(6); try { + // 将验证码放入redis + redisService.setCacheObject(key + cellPhone, code, 5L, + TimeUnit.MINUTES); log.info("发送验证码成功,手机号:{} 验证码:{}", cellPhone, code); // TODO 修改sender参数及templateId - HuaWeiSMSUtil.sendSms("[\"" + code + "\"]", cellPhone, "8823121426646", - "cf1707ec44694627b1b483b0277e12fd"); + // HuaWeiSMSUtil.sendSms("[\"" + code + "\"]", cellPhone, "8823121426646", + // "cf1707ec44694627b1b483b0277e12fd"); } catch (Exception e) { log.error("发送短信失败", e); throw new ServiceException("验证码发送失败"); } - //将验证码放入redis - redisService.setCacheObject(key + cellPhone, code, 5L, - TimeUnit.MINUTES); } /** @@ -295,7 +297,7 @@ * @param body * @return */ - public LoginUser appLogin(AppLoginBody body) { + public AppLoginUser appLogin(AppLoginBody body) { // IP黑名单校验 String blackStr = Convert.toStr( @@ -334,11 +336,14 @@ } // 校验账号密码 passwordService.validate(sysUser, body.getPassword()); - LoginUser userInfo = new LoginUser(); - userInfo.setSysUser(sysUser); + AppLoginUser appLoginUser = new AppLoginUser(); + appLoginUser.setAppUserId(appUser.getUserId()); + appLoginUser.setCellPhone(appUser.getCellPhone()); + appLoginUser.setUsername(sysUser.getNickName()); + appLoginUser.setSysUser(sysUser); recordLogService.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_SUCCESS, "登录成功"); - return userInfo; + return appLoginUser; } /** @@ -347,14 +352,34 @@ * @param body * @return */ - public WXLoginUser wxLogin(AppWXLoginBody body) { + public AppLoginUser wxLogin(AppWXLoginBody body) { // 通过wxOpenId查询APP用户信息 - R<WXLoginUser> userResult = remoteAppUserService.wxLogin(body, SecurityConstants.INNER); + R<AppLoginUser> userResult = remoteAppUserService.wxLogin(body, + SecurityConstants.INNER); + AppLoginUser data = userResult.getData(); + SysUser sysUser = data.getSysUser(); if (R.FAIL == userResult.getCode()) { + recordLogService.recordLogininfor(body.getNickname(), Constants.LOGIN_FAIL, + userResult.getMsg()); throw new ServiceException(userResult.getMsg()); } + if (StringUtils.isNull(sysUser)) { + recordLogService.recordLogininfor(data.getCellPhone(), Constants.LOGIN_FAIL, + "登录用户不存在"); + throw new ServiceException("登录用户:" + data.getCellPhone() + " 不存在"); + } + // IP黑名单校验 + String blackStr = Convert.toStr( + redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST)); + if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) { + recordLogService.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_FAIL, + "很遗憾,访问IP已被列入系统黑名单"); + throw new ServiceException("很遗憾,访问IP已被列入系统黑名单"); + } - return userResult.getData(); + recordLogService.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_SUCCESS, + "登录成功"); + return data; } /** @@ -363,13 +388,30 @@ * @param appleId 苹果id * @return */ - public AppleLoginUser appleLogin(String appleId) { - R<AppleLoginUser> userResult = remoteAppUserService.appleLogin(appleId, + public AppLoginUser appleLogin(String appleId) { + R<AppLoginUser> userResult = remoteAppUserService.appleLogin(appleId, SecurityConstants.INNER); if (R.FAIL == userResult.getCode()) { throw new ServiceException(userResult.getMsg()); } - return userResult.getData(); + AppLoginUser data = userResult.getData(); + SysUser sysUser = data.getSysUser(); + if (StringUtils.isNull(sysUser)) { + recordLogService.recordLogininfor(data.getCellPhone(), Constants.LOGIN_FAIL, + "登录用户不存在"); + throw new ServiceException("登录用户:" + data.getCellPhone() + " 不存在"); + } + // IP黑名单校验 + String blackStr = Convert.toStr( + redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST)); + if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) { + recordLogService.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_FAIL, + "很遗憾,访问IP已被列入系统黑名单"); + throw new ServiceException("很遗憾,访问IP已被列入系统黑名单"); + } + recordLogService.recordLogininfor(sysUser.getUserName(), Constants.LOGIN_SUCCESS, + "登录成功"); + return data; } /** @@ -404,13 +446,6 @@ if (!body.getSecret().equals(baseSecret.toString())) { throw new ServiceException("密码修改秘钥不正确"); } - // 校验密码,密码至少8个字符,不能全是字母或者数字 - String regex = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$\n"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(body.getPassword()); - if (!matcher.matches()) { - throw new ServiceException("密码至少8个字符,不能全是字母或者数字"); - } // 根据手机号查询用户 AppUser appUser = remoteAppUserService.getUserByCondition( AppUserDTO.builder().cellPhone(body.getCellPhone()).build(), @@ -435,13 +470,13 @@ * @param body * @return */ - public LoginUser appCaptchaLogin(AppCaptchaBody body) { + public AppLoginUser appCaptchaLogin(AppCaptchaBody body) { // 校验验证码 if (!verifyCaptcha(body.getCellPhone(), body.getCaptcha(), CacheConstants.APP_LOGIN_CAPTCHA_CODE_PREFIX)) { throw new ServiceException("验证码不正确"); } - R<LoginUser> loginUserR = remoteAppUserService.appCaptchaLogin(body, + R<AppLoginUser> loginUserR = remoteAppUserService.appCaptchaLogin(body, SecurityConstants.INNER); if (R.FAIL == loginUserR.getCode()) { throw new ServiceException(loginUserR.getMsg()); @@ -449,19 +484,20 @@ return loginUserR.getData(); } - public WXLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) { - String captcha = redisService.getCacheObject( + public AppLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) { + Boolean res = redisService.hasKey( CacheConstants.APP_VERIFY_CAPTCHA_CODE_PREFIX + body.getCellPhone()); - if (Objects.isNull(captcha)) { + if (!res) { throw new ServiceException("验证码已失效,请重新获取"); } // 校验验证码 if (!verifyCaptcha(body.getCellPhone(), body.getCaptcha(), - CacheConstants.APP_LOGIN_CAPTCHA_CODE_PREFIX)) { + CacheConstants.APP_VERIFY_CAPTCHA_CODE_PREFIX)) { throw new ServiceException("验证码不正确"); } // 更新用户系统用户信息 - R<WXLoginUser> result = remoteAppUserService.verifyCellPhone(body, SecurityConstants.INNER); + R<AppLoginUser> result = remoteAppUserService.verifyCellPhone(body, + SecurityConstants.INNER); if (R.FAIL == result.getCode()) { throw new ServiceException(result.getMsg()); } diff --git a/xinquan-common/xinquan-common-core/pom.xml b/xinquan-common/xinquan-common-core/pom.xml index ce24ce0..c67f7b1 100644 --- a/xinquan-common/xinquan-common-core/pom.xml +++ b/xinquan-common/xinquan-common-core/pom.xml @@ -140,6 +140,11 @@ <version>2.8.0</version> </dependency> + <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>easyexcel</artifactId> + </dependency> </dependencies> diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java index b07c78d..dc2ad5f 100644 --- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/CacheConstants.java @@ -31,6 +31,10 @@ * 权限缓存前缀 */ public final static String LOGIN_TOKEN_KEY = "login_tokens:"; + /** + * APP用户登录token缓存前缀 + */ + public final static String APP_USER_LOGIN_TOKEN_KEY = "app_login_tokens:"; /** * 验证码 redis key diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/domain/R.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/domain/R.java index 6f3f493..b0f7ff6 100644 --- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/domain/R.java +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/domain/R.java @@ -1,7 +1,8 @@ package com.xinquan.common.core.domain; -import java.io.Serializable; import com.xinquan.common.core.constant.Constants; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; /** * 响应信息主体 @@ -18,10 +19,13 @@ /** 失败 */ public static final int FAIL = Constants.FAIL; + @ApiModelProperty(value = "业务状态码,200-成功,其它-失败") private int code; + @ApiModelProperty(value = "响应消息", example = "操作成功") private String msg; - + + @ApiModelProperty(value = "响应数据") private T data; public static <T> R<T> ok() diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AnswerEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AnswerEnum.java new file mode 100644 index 0000000..81d76c0 --- /dev/null +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AnswerEnum.java @@ -0,0 +1,24 @@ +package com.xinquan.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum AnswerEnum { + YES("1", "是"), + NO("2", "否"), + SOMETIMES("3", "偶尔有"); + + private final String code; + private final String desc; + + public static AnswerEnum getEnumByCode(String code) { + for (AnswerEnum e : AnswerEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AnswerTagEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AnswerTagEnum.java new file mode 100644 index 0000000..565a7f4 --- /dev/null +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/AnswerTagEnum.java @@ -0,0 +1,29 @@ +package com.xinquan.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum AnswerTagEnum { + + QUESTION_ONE(1, 1L, "您是否内心纠结敏感多疑?"), + QUESTION_TWO(2, 2L, "您是否辗转反侧彻夜难眠?"), + QUESTION_THREE(3, 3L, "您是否情绪失控暴躁易怒?"), + QUESTION_FOUR(4, 4L, "您是否沉迷情感倍受伤害?"), + QUESTION_FIVE(5, 5L, "您是否人生迷茫踌躇彷徨?"); + + private final Integer code; + private final Long tagId; + private final String desc; + + public static AnswerTagEnum getEnumByCode(Integer code) { + for (AnswerTagEnum e : AnswerTagEnum.values()) { + if (e.getCode().equals(code)) { + return e; + } + } + return null; + } +} + diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ReportStatusEnum.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ReportStatusEnum.java new file mode 100644 index 0000000..cbe7be5 --- /dev/null +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/enums/ReportStatusEnum.java @@ -0,0 +1,23 @@ +package com.xinquan.common.core.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ReportStatusEnum { + NOT_REPORTED(1, "未被举报"), + REPORTED(2, "已被举报"); + + private final Integer code; + private final String desc; + + public static ReportStatusEnum getEnumByCode(Integer code) { + for (ReportStatusEnum e : ReportStatusEnum.values()) { + if (e.code.equals(code)) { + return e; + } + } + return null; + } +} \ No newline at end of file diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/Base64DES.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/Base64DES.java new file mode 100644 index 0000000..5aa3e69 --- /dev/null +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/Base64DES.java @@ -0,0 +1,153 @@ +package com.xinquan.common.core.utils; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +public class Base64DES { + + private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray(); + + public static String encode(byte[] data) { + + int start = 0; + int len = data.length; + StringBuffer buf = new StringBuffer(data.length * 3 / 2); + int end = len - 3; + int i = start; + int n = 0; + while (i <= end) { + int d = ((((int) data[i]) & 0x0ff) << 16) + | ((((int) data[i + 1]) & 0x0ff) << 8) + | (((int) data[i + 2]) & 0x0ff); + + buf.append(legalChars[(d >> 18) & 63]); + buf.append(legalChars[(d >> 12) & 63]); + buf.append(legalChars[(d >> 6) & 63]); + buf.append(legalChars[d & 63]); + i += 3; + if (n++ >= 14) { + n = 0; + buf.append(" "); + } + } + if (i == start + len - 2) { + int d = ((((int) data[i]) & 0x0ff) << 16) + | ((((int) data[i + 1]) & 255) << 8); + + buf.append(legalChars[(d >> 18) & 63]); + buf.append(legalChars[(d >> 12) & 63]); + buf.append(legalChars[(d >> 6) & 63]); + buf.append("="); + + } else if (i == start + len - 1) { + int d = (((int) data[i]) & 0x0ff) << 16; + buf.append(legalChars[(d >> 18) & 63]); + buf.append(legalChars[(d >> 12) & 63]); + buf.append("=="); + } + return buf.toString(); + } + + public static byte[] decode(String s) { + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + + try { + + decode(s, bos); + + } catch (IOException e) { + + throw new RuntimeException(); + + } + + byte[] decodedBytes = bos.toByteArray(); + + try { + + bos.close(); + + // bos = null; + + } catch (IOException ex) { + + System.err.println("Error while decoding BASE64: " + ex.toString()); + + } + + return decodedBytes; + + } + + private static void decode(String s, OutputStream os) throws IOException { + + int i = 0; + + int len = s.length(); + + while (true) { + + while (i < len && s.charAt(i) <= ' ') { + i++; + } + if (i == len) { + break; + } + + int tri = (decode(s.charAt(i)) << 18) + + (decode(s.charAt(i + 1)) << 12) + + + (decode(s.charAt(i + 2)) << 6) + + + (decode(s.charAt(i + 3))); + + os.write((tri >> 16) & 255); + + if (s.charAt(i + 2) == '=') { + break; + } + + os.write((tri >> 8) & 255); + + if (s.charAt(i + 3) == '=') { + break; + } + os.write(tri & 255); + i += 4; + } + } + + private static int decode(char c) { + + if (c >= 'A' && c <= 'Z') { + return ((int) c) - 65; + } else if (c >= 'a' && c <= 'z') { + return ((int) c) - 97 + 26; + } else if (c >= '0' && c <= '9') { + return ((int) c) - 48 + 26 + 26; + } else { + switch (c) { + + case '+': + + return 62; + + case '/': + + return 63; + + case '=': + + return 0; + + default: + + throw new RuntimeException("unexpected code: " + c); + + } + } + + } +} diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/DES.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/DES.java new file mode 100644 index 0000000..70b7a27 --- /dev/null +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/utils/DES.java @@ -0,0 +1,158 @@ +package com.xinquan.common.core.utils; + +import java.net.URLDecoder; +import java.net.URLEncoder; +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +public class DES { + + /* + * 不要写成:Cipher cipher = Cipher.getInstance("DES"); + * 或:Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding"); + * 原因是Cipher cipher = Cipher.getInstance("DES"); + * 与Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); + * 等同,填充方式错误,加密的时候会得到16长度的字节数组。 + * 应该写成 + * Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); + */ + + + private static final String KEY = "hfh7L4nUzKcnK6JtJ5z27ygad5p9EanZn5wCT6Zw9KvctK5hs7Z8FsjDEpShmC5W"; + + private static byte[] iv = {25, 24, 40, 41, 60, 68, 70, 97}; + + + /** + * 指定密钥加密 + * + * @param encryptString 原文 + * @param encryptKey 密钥 + * @return 密文 + * @throws Exception + */ + public static String encryptDES(String encryptString, String encryptKey) + throws Exception { + + IvParameterSpec zeroIv = new IvParameterSpec(iv); + + SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES"); + + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + + cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv); + + byte[] encryptedData = cipher.doFinal(encryptString.getBytes()); + + return Base64DES.encode(encryptedData); + } + + /** + * 指定密钥进行解密 + * + * @param decryptString 密文 + * @param decryptKey 密钥 + * @return 原文 + * @throws Exception + */ + public static String decryptDES(String decryptString, String decryptKey) + throws Exception { + + byte[] byteMi = Base64DES.decode(decryptString); + + IvParameterSpec zeroIv = new IvParameterSpec(iv); + + SecretKeySpec key = new SecretKeySpec(decryptKey.getBytes(), "DES"); + + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + + cipher.init(Cipher.DECRYPT_MODE, key, zeroIv); + + byte decryptedData[] = cipher.doFinal(byteMi); + + return new String(decryptedData); + + } + + /** + * 默认密钥加密 + * + * @param encryptString 原文 + * @return 密文 + * @throws Exception + */ + public static String encryptDES(String encryptString) + throws Exception { + + IvParameterSpec zeroIv = new IvParameterSpec(iv); + + SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "DES"); + + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + + cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv); + + byte[] encryptedData = cipher.doFinal(encryptString.getBytes()); + + return Base64DES.encode(encryptedData); + } + + /** + * 默认密钥解密 + * + * @param decryptString 密文 + * @return 解密得到的原文 + * @throws Exception + */ + public static String decryptDES(String decryptString) + throws Exception { + + byte[] byteMi = Base64DES.decode(decryptString); + + IvParameterSpec zeroIv = new IvParameterSpec(iv); + + SecretKeySpec key = new SecretKeySpec(KEY.getBytes(), "DES"); + + Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); + + cipher.init(Cipher.DECRYPT_MODE, key, zeroIv); + + byte decryptedData[] = cipher.doFinal(byteMi); + + return new String(decryptedData, "UTF-8"); + + } + + public static String parseByte2HexStr(byte buf[]) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < buf.length; i++) { + String hex = Integer.toHexString(buf[i] & 0xFF); + if (hex.length() == 1) { + hex = '0' + hex; + } + sb.append(hex.toUpperCase()); + } + return sb.toString(); + } + + public static void main(String[] args) { + String plaintext = "server=/app/public/getAllRegionList"; + try { + System.out.println("明文:" + plaintext); + System.out.println("密钥:" + KEY); + System.out.println("DES密文:" + DES.encryptDES(plaintext)); + System.out.println("DES解密:" + DES.decryptDES(DES.encryptDES(plaintext))); + + System.out.println( + "URLEncoder加密:" + URLEncoder.encode(DES.encryptDES(plaintext), "UTF-8")); + System.out.println("URLEncoder解密:" + URLDecoder.decode( + URLEncoder.encode(DES.encryptDES(plaintext), "UTF-8"), "UTF-8")); + System.out.println("长度:" + + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".length()); + + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/web/domain/BaseEntity.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/web/domain/BaseEntity.java index 3df628d..53cbd31 100644 --- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/web/domain/BaseEntity.java +++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/web/domain/BaseEntity.java @@ -1,10 +1,5 @@ package com.xinquan.common.core.web.domain; -import java.io.Serializable; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; @@ -13,6 +8,10 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.xinquan.common.core.annotation.Excel; import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; /** * Entity基类 @@ -36,7 +35,7 @@ /** 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField("create_time") - private Date createTime; + private LocalDateTime createTime; /** 更新者 */ @ApiModelProperty(value = "记录修改人,前端忽略") @@ -47,7 +46,7 @@ /** 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField("update_time") - private Date updateTime; + private LocalDateTime updateTime; /** 是否删除 1未删除 0已删除 */ @TableLogic @@ -91,16 +90,6 @@ this.createBy = createBy; } - public Date getCreateTime() - { - return createTime; - } - - public void setCreateTime(Date createTime) - { - this.createTime = createTime; - } - public String getUpdateBy() { return updateBy; @@ -111,13 +100,19 @@ this.updateBy = updateBy; } - public Date getUpdateTime() - { + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public LocalDateTime getUpdateTime() { return updateTime; } - public void setUpdateTime(Date updateTime) - { + public void setUpdateTime(LocalDateTime updateTime) { this.updateTime = updateTime; } diff --git a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java index b36ae3e..d4a3a53 100644 --- a/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java +++ b/xinquan-common/xinquan-common-security/src/main/java/com/xinquan/common/security/service/TokenService.java @@ -9,8 +9,8 @@ import com.xinquan.common.core.utils.uuid.IdUtils; import com.xinquan.common.redis.service.RedisService; import com.xinquan.common.security.utils.SecurityUtils; +import com.xinquan.system.api.model.AppLoginUser; import com.xinquan.system.api.model.LoginUser; -import com.xinquan.system.api.model.WXLoginUser; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; @@ -36,6 +36,7 @@ private final static long expireTime = CacheConstants.EXPIRATION; private final static String ACCESS_TOKEN = CacheConstants.LOGIN_TOKEN_KEY; + private final static String APP_USER_ACCESS_TOKEN = CacheConstants.APP_USER_LOGIN_TOKEN_KEY; private final static Long MILLIS_MINUTE_TEN = CacheConstants.REFRESH_TIME * MILLIS_MINUTE; @@ -163,40 +164,55 @@ redisService.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); } + private void refreshToken4AppLoginUser(AppLoginUser appLoginUser) { + appLoginUser.setLoginTime(System.currentTimeMillis()); + appLoginUser.setExpireTime(appLoginUser.getLoginTime() + expireTime * MILLIS_MINUTE); + // 根据uuid将loginUser缓存 + String userKey = getTokenKeyByAppLoginUser(appLoginUser.getToken()); + redisService.setCacheObject(userKey, appLoginUser, expireTime, TimeUnit.MINUTES); + } + + private String getTokenKeyByAppLoginUser(String token) { + return APP_USER_ACCESS_TOKEN + token; + } + private String getTokenKey(String token) { return ACCESS_TOKEN + token; } - public Map<String, Object> createToken4WXLoginUser(WXLoginUser wxLoginUser) { - LoginUser loginUser = new LoginUser(); + /** + * app用户创建token + * + * @param appLoginUser + * @return + */ + public AppLoginUser createToken4AppLoginUser(AppLoginUser appLoginUser) { // Jwt存储信息 Map<String, Object> claimsMap = new HashMap<String, Object>(); // 接口返回信息 Map<String, Object> rspMap = new HashMap<String, Object>(); - // 用户为空只返回openid - rspMap.put("cellPhone", ""); - rspMap.put("access_token", ""); - if (wxLoginUser.getSysUser() != null) { - loginUser.setSysUser(wxLoginUser.getSysUser()); - String token = IdUtils.fastUUID(); - Long userId = loginUser.getSysUser().getUserId(); - String userName = loginUser.getSysUser().getUserName(); - loginUser.setToken(token); - loginUser.setUserid(userId); - loginUser.setIpaddr(IpUtils.getIpAddr()); - refreshToken(loginUser); - claimsMap.put(SecurityConstants.USER_KEY, token); - claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); - claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); - if (StringUtils.isNotBlank(wxLoginUser.getCellPhone())) { - rspMap.put("cellPhone", wxLoginUser.getCellPhone()); - } else { - rspMap.put("cellPhone", ""); - } - rspMap.put("access_token", JwtUtils.createToken(claimsMap)); - rspMap.put("expires_in", expireTime); - } - return rspMap; + String token = IdUtils.fastUUID(); + Long userId = appLoginUser.getAppUserId(); + String userName = appLoginUser.getSysUser().getNickName(); + appLoginUser.setToken(token); + appLoginUser.setUserid(userId); + appLoginUser.setIpaddr(IpUtils.getIpAddr()); + LoginUser loginUser = new LoginUser(); + loginUser.setSysUser(appLoginUser.getSysUser()); + loginUser.setToken(token); + loginUser.setUserid(userId); + loginUser.setUsername(userName); + loginUser.setIpaddr(IpUtils.getIpAddr()); + refreshToken(loginUser); + // refreshToken4AppLoginUser(appLoginUser); + claimsMap.put(SecurityConstants.USER_KEY, token); + claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId); + claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName); + appLoginUser.setAccessToken(JwtUtils.createToken(claimsMap)); + appLoginUser.setExpireIn(expireTime); + return appLoginUser; } + + } \ No newline at end of file diff --git a/xinquan-gateway/src/main/java/com/xinquan/gateway/filter/AuthFilter.java b/xinquan-gateway/src/main/java/com/xinquan/gateway/filter/AuthFilter.java index 0b44951..d0dd412 100644 --- a/xinquan-gateway/src/main/java/com/xinquan/gateway/filter/AuthFilter.java +++ b/xinquan-gateway/src/main/java/com/xinquan/gateway/filter/AuthFilter.java @@ -1,14 +1,5 @@ package com.xinquan.gateway.filter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -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.web.server.ServerWebExchange; import com.xinquan.common.core.constant.CacheConstants; import com.xinquan.common.core.constant.HttpStatus; import com.xinquan.common.core.constant.SecurityConstants; @@ -19,6 +10,15 @@ import com.xinquan.common.redis.service.RedisService; import com.xinquan.gateway.config.properties.IgnoreWhiteProperties; import io.jsonwebtoken.Claims; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +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.web.server.ServerWebExchange; import reactor.core.publisher.Mono; /** @@ -83,6 +83,10 @@ return chain.filter(exchange.mutate().request(mutate.build()).build()); } + private String getAppUserTokenKey(String userkey) { + return CacheConstants.APP_USER_LOGIN_TOKEN_KEY + userkey; + } + private void addHeader(ServerHttpRequest.Builder mutate, String name, Object value) { if (value == null) diff --git a/xinquan-modules/xinquan-course/pom.xml b/xinquan-modules/xinquan-course/pom.xml index a7ab784..628a31c 100644 --- a/xinquan-modules/xinquan-course/pom.xml +++ b/xinquan-modules/xinquan-course/pom.xml @@ -121,19 +121,6 @@ <version>1.2.47</version> </dependency> - - <dependency> - <groupId>cn.afterturn</groupId> - <artifactId>easypoi-spring-boot-starter</artifactId> - <version>4.0.0</version> - <exclusions> - <exclusion> - <artifactId>guava</artifactId> - <groupId>com.google.guava</groupId> - </exclusion> - </exclusions> - </dependency> - </dependencies> <build> diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseController.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseController.java index 378181d..d538e7f 100644 --- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseController.java +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseController.java @@ -1,7 +1,25 @@ package com.xinquan.course.controller.client; +import com.xinquan.common.core.constant.SecurityConstants; +import com.xinquan.common.core.domain.R; +import com.xinquan.common.core.utils.page.PageDTO; +import com.xinquan.course.domain.vo.ClientCourseCategoryVO; +import com.xinquan.course.domain.vo.ClientCourseVO; +import com.xinquan.course.service.CourseCategoryService; +import com.xinquan.course.service.CourseService; +import com.xinquan.system.api.RemoteBannerService; +import com.xinquan.system.api.domain.vo.BannerVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import java.util.List; +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.RequestParam; import org.springframework.web.bind.annotation.RestController; /** @@ -12,9 +30,61 @@ * @author mitao * @since 2024-08-21 */ +@Api(tags = {"用户端-课程相关接口"}) @RestController +@RequiredArgsConstructor @RequestMapping("/client/course/course") public class ClientCourseController { + private final CourseCategoryService courseCategoryService; + private final CourseService courseService; + private final RemoteBannerService remoteBannerService; + + /** + * 获取轮播图列表 + * + * @return 轮播图列表 + */ + @GetMapping("/getBannerList") + @ApiOperation(value = "获取轮播图列表") + public R<List<BannerVO>> getBannerList() { + return remoteBannerService.getBannerList(SecurityConstants.INNER); + } + + /** + * 获取课程分类列表 + * + * @return 课程分类列表 + */ + @GetMapping("/getCourseCategoryList") + @ApiOperation(value = "获取课程分类列表") + public R<List<ClientCourseCategoryVO>> getCourseCategoryList() { + return R.ok(courseCategoryService.getCourseCategoryList()); + } + + /** + * 获取课程列表-分页 + * + * @param courseTitle 课程标题 + * @param cateId 分类id + * @param pageCurr 分页参数,当前页码 + * @param pageSize 分页参数,每页数量 + * @return 课程分页列表 + */ + @PostMapping("/getCoursePageList") + @ApiOperation(value = "获取课程列表-分页") + @ApiImplicitParams({ + @ApiImplicitParam(value = "课程标题", name = "courseTitle", required = false, dataType = "String"), + @ApiImplicitParam(value = "课程分类id", name = "cateId", required = false, dataType = "Long"), + @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"), + @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer") + }) + public R<PageDTO<ClientCourseVO>> getCourseList( + @RequestParam(defaultValue = "", value = "courseTitle", required = false) String courseTitle, + @RequestParam(required = false) Long cateId, + @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr, + @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) { + return R.ok(courseService.getCoursePageList(courseTitle, cateId, pageCurr, pageSize)); + } } diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/inner/InnerCourseLearningRecordController.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/inner/InnerCourseLearningRecordController.java new file mode 100644 index 0000000..fa460b7 --- /dev/null +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/inner/InnerCourseLearningRecordController.java @@ -0,0 +1,20 @@ +package com.xinquan.course.controller.inner; + + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * <p> + * 用户学习记录 前端控制器 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +@RestController +@RequestMapping("/inner/course/course-learning-record") +public class InnerCourseLearningRecordController { + +} + diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/CourseLearningRecord.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/CourseLearningRecord.java new file mode 100644 index 0000000..4016319 --- /dev/null +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/CourseLearningRecord.java @@ -0,0 +1,40 @@ +package com.xinquan.course.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.xinquan.common.core.web.domain.BaseModel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * <p> + * 用户学习记录 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_course_learning_record") +@ApiModel(value = "CourseLearningRecord对象", description = "用户学习记录") +public class CourseLearningRecord extends BaseModel { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户树苗id") + @TableId("id") + private Long id; + + @ApiModelProperty(value = "用户id") + @TableField("app_user_id") + private Long appUserId; + + @ApiModelProperty(value = "课程id ") + @TableField("course_id") + private Long courseId; + +} diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseCategoryVO.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseCategoryVO.java new file mode 100644 index 0000000..d25bb83 --- /dev/null +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseCategoryVO.java @@ -0,0 +1,27 @@ +package com.xinquan.course.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/7 + */ +@Data +@ApiModel(value = "课程分类视图对象") +public class ClientCourseCategoryVO implements Serializable { + + private static final long serialVersionUID = 6293214581320328382L; + + @ApiModelProperty(value = "id") + private Long id; + + @ApiModelProperty(value = "分类名称") + private String name; + + @ApiModelProperty(value = "分类图片") + private String imageUrl; + +} diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseVO.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseVO.java new file mode 100644 index 0000000..8fafb77 --- /dev/null +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseVO.java @@ -0,0 +1,68 @@ +package com.xinquan.course.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/7 + */ +@Data +@ApiModel(value = "课程视图对象") +public class ClientCourseVO { + + @ApiModelProperty(value = "课程id") + private Long id; + + @ApiModelProperty(value = "课程类型 1=线上课程 2=线下课程") + private Integer courseType; + + @ApiModelProperty(value = "课程分类id") + private Long cateId; + + @ApiModelProperty(value = "课程标题") + private String courseTitle; + + @ApiModelProperty(value = "课程描述") + private String description; + + @ApiModelProperty(value = "上架状态 1=上架 2=下架") + private Integer listingStatus; + + @ApiModelProperty(value = "推荐课程 1=推荐 2=不推荐") + private Integer recommend; + + @ApiModelProperty(value = "价格设定 1=免费 2=会员免费 3=单独收费") + private Integer chargeType; + + @ApiModelProperty(value = "排序权重") + private Integer sortNum; + + @ApiModelProperty(value = "导师") + private String tutor; + + @ApiModelProperty(value = "列表封面图") + private String coverUrl; + + @ApiModelProperty(value = "详情页封面图|详情页视频") + private String detailUrl; + + @ApiModelProperty(value = "课程简介") + private String briefIntroduction; + + @ApiModelProperty(value = "微信二维码") + private String wxQrCode; + + @ApiModelProperty(value = "课程地址") + private String address; + + @ApiModelProperty(value = "详细地址") + private String addressDetail; + + @ApiModelProperty(value = "课程地址经度") + private Double longitude; + + @ApiModelProperty(value = "课程地址纬度") + private Double latitude; +} diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/mapper/CourseLearningRecordMapper.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/mapper/CourseLearningRecordMapper.java new file mode 100644 index 0000000..01fd8e4 --- /dev/null +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/mapper/CourseLearningRecordMapper.java @@ -0,0 +1,16 @@ +package com.xinquan.course.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xinquan.course.domain.CourseLearningRecord; + +/** + * <p> + * 用户学习记录 Mapper 接口 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +public interface CourseLearningRecordMapper extends BaseMapper<CourseLearningRecord> { + +} diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseCategoryService.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseCategoryService.java index e1caf9d..241b084 100644 --- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseCategoryService.java +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseCategoryService.java @@ -1,7 +1,9 @@ package com.xinquan.course.service; -import com.xinquan.course.domain.CourseCategory; import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.course.domain.CourseCategory; +import com.xinquan.course.domain.vo.ClientCourseCategoryVO; +import java.util.List; /** * <p> @@ -13,4 +15,10 @@ */ public interface CourseCategoryService extends IService<CourseCategory> { + /** + * 获取课程分类列表 + * + * @return 课程分类列表 + */ + List<ClientCourseCategoryVO> getCourseCategoryList(); } diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseLearningRecordService.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseLearningRecordService.java new file mode 100644 index 0000000..3afe459 --- /dev/null +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseLearningRecordService.java @@ -0,0 +1,16 @@ +package com.xinquan.course.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.course.domain.CourseLearningRecord; + +/** + * <p> + * 用户学习记录 服务类 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +public interface CourseLearningRecordService extends IService<CourseLearningRecord> { + +} diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseService.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseService.java index 7af5664..262ad01 100644 --- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseService.java +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/CourseService.java @@ -1,7 +1,9 @@ package com.xinquan.course.service; -import com.xinquan.course.domain.Course; import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.common.core.utils.page.PageDTO; +import com.xinquan.course.domain.Course; +import com.xinquan.course.domain.vo.ClientCourseVO; /** * <p> @@ -13,4 +15,15 @@ */ public interface CourseService extends IService<Course> { + /** + * 获取课程列表-分页 + * + * @param courseTitle 课程标题 + * @param cateId 分类id + * @param pageCurr 分页参数,当前页码 + * @param pageSize 分页参数,每页数量 + * @return 课程分页列表 + */ + PageDTO<ClientCourseVO> getCoursePageList(String courseTitle, Long cateId, Integer pageCurr, + Integer pageSize); } diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseCategoryServiceImpl.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseCategoryServiceImpl.java index e8ce5a8..8d1a36e 100644 --- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseCategoryServiceImpl.java +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseCategoryServiceImpl.java @@ -1,9 +1,13 @@ package com.xinquan.course.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.enums.DisabledEnum; +import com.xinquan.common.core.utils.page.BeanUtils; import com.xinquan.course.domain.CourseCategory; +import com.xinquan.course.domain.vo.ClientCourseCategoryVO; import com.xinquan.course.mapper.CourseCategoryMapper; import com.xinquan.course.service.CourseCategoryService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; import org.springframework.stereotype.Service; /** @@ -17,4 +21,16 @@ @Service public class CourseCategoryServiceImpl extends ServiceImpl<CourseCategoryMapper, CourseCategory> implements CourseCategoryService { + /** + * 获取课程分类列表 + * + * @return 课程分类列表 + */ + @Override + public List<ClientCourseCategoryVO> getCourseCategoryList() { + List<CourseCategory> list = this.lambdaQuery() + .eq(CourseCategory::getShowOnCourseHomepage, DisabledEnum.YES.getCode()) + .list(); + return BeanUtils.copyList(list, ClientCourseCategoryVO.class); + } } diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseLearningRecordServiceImpl.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseLearningRecordServiceImpl.java new file mode 100644 index 0000000..087681b --- /dev/null +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseLearningRecordServiceImpl.java @@ -0,0 +1,22 @@ +package com.xinquan.course.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.course.domain.CourseLearningRecord; +import com.xinquan.course.mapper.CourseLearningRecordMapper; +import com.xinquan.course.service.CourseLearningRecordService; +import org.springframework.stereotype.Service; + +/** + * <p> + * 用户学习记录 服务实现类 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +@Service +public class CourseLearningRecordServiceImpl extends + ServiceImpl<CourseLearningRecordMapper, CourseLearningRecord> implements + CourseLearningRecordService { + +} diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java index 4a2647e..077e643 100644 --- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java +++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java @@ -1,9 +1,15 @@ package com.xinquan.course.service.impl; +import com.alibaba.nacos.common.utils.StringUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.utils.page.CollUtils; +import com.xinquan.common.core.utils.page.PageDTO; import com.xinquan.course.domain.Course; +import com.xinquan.course.domain.vo.ClientCourseVO; import com.xinquan.course.mapper.CourseMapper; import com.xinquan.course.service.CourseService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.Objects; import org.springframework.stereotype.Service; /** @@ -17,4 +23,26 @@ @Service public class CourseServiceImpl extends ServiceImpl<CourseMapper, Course> implements CourseService { + /** + * 获取课程列表-分页 + * + * @param courseTitle 课程标题 + * @param cateId 分类id + * @param pageCurr 分页参数,当前页码 + * @param pageSize 分页参数,每页数量 + * @return 课程分页列表 + */ + @Override + public PageDTO<ClientCourseVO> getCoursePageList(String courseTitle, Long cateId, + Integer pageCurr, Integer pageSize) { + Page<Course> page = this.lambdaQuery() + .like(StringUtils.isNotBlank(courseTitle), Course::getCourseTitle, courseTitle) + .eq(Objects.nonNull(cateId), Course::getCateId, cateId) + .orderByDesc(Course::getSortNum) + .page(new Page<>(pageCurr, pageSize)); + if (CollUtils.isEmpty(page.getRecords())) { + return PageDTO.empty(page); + } + return PageDTO.of(page, ClientCourseVO.class); + } } diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseCategoryMapper.xml similarity index 60% copy from xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml copy to xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseCategoryMapper.xml index 141ee86..949d522 100644 --- a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml +++ b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseCategoryMapper.xml @@ -1,19 +1,19 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<mapper namespace="com.xinquan.meditation.mapper.MeditationUserOperationMapper"> +<mapper namespace="com.xinquan.course.mapper.CourseCategoryMapper"> <!-- 通用查询映射结果 --> - <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.MeditationUserOperation"> + <resultMap id="BaseResultMap" type="com.xinquan.course.domain.CourseCategory"> <id column="id" property="id" /> <result column="del_flag" property="delFlag" /> <result column="create_by" property="createBy" /> <result column="create_time" property="createTime" /> <result column="update_by" property="updateBy" /> <result column="update_time" property="updateTime" /> - <result column="like" property="like" /> - <result column="favorite" property="favorite" /> - <result column="meditation_id" property="meditationId" /> - <result column="app_user_id" property="appUserId" /> + <result column="name" property="name" /> + <result column="image_url" property="imageUrl" /> + <result column="sort_num" property="sortNum" /> + <result column="show_on_course_homepage" property="showOnCourseHomepage" /> </resultMap> <!-- 通用查询结果列 --> @@ -23,7 +23,7 @@ create_time, update_by, update_time, - id, like, favorite, meditation_id, app_user_id + id, name, image_url, sort_num, show_on_course_homepage </sql> </mapper> diff --git a/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseChapterMapper.xml b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseChapterMapper.xml new file mode 100644 index 0000000..ba2c263 --- /dev/null +++ b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseChapterMapper.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.xinquan.course.mapper.CourseChapterMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.xinquan.course.domain.CourseChapter"> + <id column="id" property="id" /> + <result column="del_flag" property="delFlag" /> + <result column="create_by" property="createBy" /> + <result column="create_time" property="createTime" /> + <result column="update_by" property="updateBy" /> + <result column="update_time" property="updateTime" /> + <result column="course_id" property="courseId" /> + <result column="chapter_title" property="chapterTitle" /> + <result column="sort_num" property="sortNum" /> + <result column="video_url" property="videoUrl" /> + <result column="real_learned_num" property="realLearnedNum" /> + <result column="virtual_learned_num" property="virtualLearnedNum" /> + <result column="duration" property="duration" /> + </resultMap> + + <!-- 通用查询结果列 --> + <sql id="Base_Column_List"> + del_flag, + create_by, + create_time, + update_by, + update_time, + id, course_id, chapter_title, sort_num, video_url, real_learned_num, virtual_learned_num, duration + </sql> + +</mapper> diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseLearningRecordMapper.xml similarity index 65% copy from xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml copy to xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseLearningRecordMapper.xml index 141ee86..f9ddb4d 100644 --- a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml +++ b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseLearningRecordMapper.xml @@ -1,19 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<mapper namespace="com.xinquan.meditation.mapper.MeditationUserOperationMapper"> +<mapper namespace="com.xinquan.course.mapper.CourseLearningRecordMapper"> <!-- 通用查询映射结果 --> - <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.MeditationUserOperation"> + <resultMap id="BaseResultMap" type="com.xinquan.course.domain.CourseLearningRecord"> <id column="id" property="id" /> <result column="del_flag" property="delFlag" /> <result column="create_by" property="createBy" /> <result column="create_time" property="createTime" /> <result column="update_by" property="updateBy" /> <result column="update_time" property="updateTime" /> - <result column="like" property="like" /> - <result column="favorite" property="favorite" /> - <result column="meditation_id" property="meditationId" /> <result column="app_user_id" property="appUserId" /> + <result column="course_id" property="courseId" /> </resultMap> <!-- 通用查询结果列 --> @@ -23,7 +21,7 @@ create_time, update_by, update_time, - id, like, favorite, meditation_id, app_user_id + id, app_user_id, course_id </sql> </mapper> diff --git a/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseMapper.xml b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseMapper.xml new file mode 100644 index 0000000..624d362 --- /dev/null +++ b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/CourseMapper.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.xinquan.course.mapper.CourseMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.xinquan.course.domain.Course"> + <id column="id" property="id" /> + <result column="del_flag" property="delFlag" /> + <result column="create_by" property="createBy" /> + <result column="create_time" property="createTime" /> + <result column="update_by" property="updateBy" /> + <result column="update_time" property="updateTime" /> + <result column="course_type" property="courseType" /> + <result column="cate_id" property="cateId" /> + <result column="course_title" property="courseTitle" /> + <result column="description" property="description" /> + <result column="listing_status" property="listingStatus" /> + <result column="recommend" property="recommend" /> + <result column="charge_type" property="chargeType" /> + <result column="sort_num" property="sortNum" /> + <result column="tutor" property="tutor" /> + <result column="cover_url" property="coverUrl" /> + <result column="detail_url" property="detailUrl" /> + <result column="brief_introduction" property="briefIntroduction" /> + <result column="wx_qr_code" property="wxQrCode" /> + <result column="address" property="address" /> + <result column="address_detail" property="addressDetail" /> + <result column="longitude" property="longitude" /> + <result column="latitude" property="latitude" /> + </resultMap> + + <!-- 通用查询结果列 --> + <sql id="Base_Column_List"> + del_flag, + create_by, + create_time, + update_by, + update_time, + id, course_type, cate_id, course_title, description, listing_status, recommend, charge_type, sort_num, tutor, cover_url, detail_url, brief_introduction, wx_qr_code, address, address_detail, longitude, latitude + </sql> + +</mapper> diff --git a/xinquan-modules/xinquan-course/src/main/resources/mapper/course/TutorSpecialColumnCourseMapper.xml b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/TutorSpecialColumnCourseMapper.xml new file mode 100644 index 0000000..139fee2 --- /dev/null +++ b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/TutorSpecialColumnCourseMapper.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.xinquan.course.mapper.TutorSpecialColumnCourseMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.xinquan.course.domain.TutorSpecialColumnCourse"> + <id column="id" property="id" /> + <result column="course_id" property="courseId" /> + <result column="tutor_special_column_id" property="tutorSpecialColumnId" /> + </resultMap> + + <!-- 通用查询结果列 --> + <sql id="Base_Column_List"> + id, course_id, tutor_special_column_id + </sql> + +</mapper> diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/TutorSpecialColumnMapper.xml similarity index 60% copy from xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml copy to xinquan-modules/xinquan-course/src/main/resources/mapper/course/TutorSpecialColumnMapper.xml index 141ee86..852de53 100644 --- a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml +++ b/xinquan-modules/xinquan-course/src/main/resources/mapper/course/TutorSpecialColumnMapper.xml @@ -1,19 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<mapper namespace="com.xinquan.meditation.mapper.MeditationUserOperationMapper"> +<mapper namespace="com.xinquan.course.mapper.TutorSpecialColumnMapper"> <!-- 通用查询映射结果 --> - <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.MeditationUserOperation"> + <resultMap id="BaseResultMap" type="com.xinquan.course.domain.TutorSpecialColumn"> <id column="id" property="id" /> <result column="del_flag" property="delFlag" /> <result column="create_by" property="createBy" /> <result column="create_time" property="createTime" /> <result column="update_by" property="updateBy" /> <result column="update_time" property="updateTime" /> - <result column="like" property="like" /> - <result column="favorite" property="favorite" /> - <result column="meditation_id" property="meditationId" /> - <result column="app_user_id" property="appUserId" /> + <result column="video_url" property="videoUrl" /> + <result column="tutor_introduction" property="tutorIntroduction" /> </resultMap> <!-- 通用查询结果列 --> @@ -23,7 +21,7 @@ create_time, update_by, update_time, - id, like, favorite, meditation_id, app_user_id + id, video_url, tutor_introduction </sql> </mapper> diff --git a/xinquan-modules/xinquan-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/xinquan-modules/xinquan-gen/src/main/resources/mapper/generator/MeditationUserFavoriteService.xml similarity index 100% rename from xinquan-modules/xinquan-gen/src/main/resources/mapper/generator/GenTableColumnMapper.xml rename to xinquan-modules/xinquan-gen/src/main/resources/mapper/generator/MeditationUserFavoriteService.xml diff --git a/xinquan-modules/xinquan-meditation/pom.xml b/xinquan-modules/xinquan-meditation/pom.xml index 8839b86..ae50535 100644 --- a/xinquan-modules/xinquan-meditation/pom.xml +++ b/xinquan-modules/xinquan-meditation/pom.xml @@ -120,19 +120,6 @@ <version>1.2.47</version> </dependency> - - <dependency> - <groupId>cn.afterturn</groupId> - <artifactId>easypoi-spring-boot-starter</artifactId> - <version>4.0.0</version> - <exclusions> - <exclusion> - <artifactId>guava</artifactId> - <groupId>com.google.guava</groupId> - </exclusion> - </exclusions> - </dependency> - </dependencies> <build> diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientHomeController.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientHomeController.java new file mode 100644 index 0000000..de25728 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientHomeController.java @@ -0,0 +1,277 @@ +package com.xinquan.meditation.controller.client; + + +import com.xinquan.common.core.constant.SecurityConstants; +import com.xinquan.common.core.domain.R; +import com.xinquan.common.core.utils.page.PageDTO; +import com.xinquan.meditation.domain.vo.ClientHomeBackgroundMusicVO; +import com.xinquan.meditation.domain.vo.ClientMeditationAndCateVO; +import com.xinquan.meditation.domain.vo.ClientMeditationCategoryVO; +import com.xinquan.meditation.domain.vo.ClientMeditationDetailsVO; +import com.xinquan.meditation.domain.vo.ClientMeditationEverydayVO; +import com.xinquan.meditation.domain.vo.ClientMeditationQuestionVO; +import com.xinquan.meditation.domain.vo.ClientMeditationVO; +import com.xinquan.meditation.service.HomeBackgroundMusicService; +import com.xinquan.meditation.service.MeditationCategoryService; +import com.xinquan.meditation.service.MeditationEverydayService; +import com.xinquan.meditation.service.MeditationQuestionService; +import com.xinquan.meditation.service.MeditationService; +import com.xinquan.system.api.RemoteHotWordsService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import java.util.List; +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.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * <p> + * 首页相关接口 + * </p> + * + * @author mitao + * @since 2024-08-21 + */ +@Api(tags = {"用户端-首页相关接口"}) +@RestController +@RequiredArgsConstructor +@RequestMapping("/client/meditation/home") +public class ClientHomeController { + + private final HomeBackgroundMusicService homeBackgroundMusicService; + private final MeditationService meditationService; + private final MeditationCategoryService meditationCategoryService; + private final MeditationEverydayService meditationEverydayService; + private final RemoteHotWordsService remoteHotWordsService; + private final MeditationQuestionService meditationQuestionService; + + /** + * 获取首页背景音乐列表 + * + * @return 背景音乐列表 + */ + @GetMapping("/getHomeBackgroundMusicList") + @ApiOperation(value = "获取首页背景音乐列表", notes = "首页顶部默认展示该接口返回的列表中第一条数据的背景图片") + public R<List<ClientHomeBackgroundMusicVO>> getHomeBackgroundMusicList() { + return R.ok(homeBackgroundMusicService.getHomeBackgroundMusicList()); + } + + /** + * 保存用户首页背景音乐设置 + * + * @param id 首页背景音乐id + */ + @PostMapping("/savePersonalitySetting") + @ApiOperation(value = "保存用户首页背景音乐设置") + @ApiImplicitParam(name = "id", value = "首页背景音乐id", required = true) + public R<?> savePersonalitySetting(@RequestParam("id") Long id) { + homeBackgroundMusicService.savePersonalitySetting(id); + return R.ok(); + } + + /** + * 根据类型获取冥想分类列表 + * + * @param type 分类类型 + * @return 分类列表 + */ + @PostMapping("/getCategoryListByType") + @ApiOperation("根据类型获取冥想音频分类列表") + @ApiImplicitParam(name = "type", value = "类型 1=顶部4个 2=下面3个", required = true) + public R<List<ClientMeditationCategoryVO>> getCategoryListByType( + @RequestParam(value = "type") Integer type) { + return R.ok(meditationCategoryService.getCategoryListByType(type)); + } + + /** + * 获取冥想分类列表 + * + * @return 冥想分类列表 + */ + @GetMapping("/getCategoryList") + @ApiOperation("获取冥想音频分类列表") + public R<List<ClientMeditationCategoryVO>> getCategoryList() { + return R.ok(meditationCategoryService.getCategoryList()); + } + + /** + * 查询每日冥想 + * + * @return 每日冥想 + */ + @GetMapping("/getTodayMeditation") + @ApiOperation("获取今日冥想") + public R<ClientMeditationEverydayVO> getTodayMeditation() { + return R.ok(meditationEverydayService.getTodayMeditation()); + } + + /** + * 获取私人订制 + * + * @return 冥想列表 + */ + @GetMapping("/getPersonalityPlan") + @ApiOperation("获取私人订制") + public R<List<ClientMeditationVO>> getPersonalityPlan() { + return R.ok(meditationService.getPersonalityPlan()); + } + + /** + * 根据分类id获取冥想列表 + * + * @param cateId 分类id + * @return 冥想列表 + */ + @PostMapping("/getMeditationListByCateId") + @ApiOperation("根据分类id获取冥想音频列表") + @ApiImplicitParam(name = "cateId", value = "分类id", dataType = "Long", required = true) + public R<List<ClientMeditationVO>> getMeditationListByCateId( + @RequestParam("cateId") Long cateId) { + return R.ok(meditationService.getMeditationListByCateId(cateId)); + } + + /** + * 获取全部的冥想及分类列表 + * + * @return 冥想及分类列表 + */ + @GetMapping("/getMeditationAndCateList") + @ApiOperation(value = "获取全部的冥想音频及分类列表", notes = "用于首页列表展示") + public R<List<ClientMeditationAndCateVO>> getMeditationAndCateList() { + return R.ok(meditationService.getMeditationAndCateList()); + } + + /** + * 根据分类id获取冥想列表-分页 + * + * @param cateId 分类id + * @param pageCurr 当前页码 + * @param pageSize 每页数量 + * @return 冥想列表 + */ + @PostMapping("/getMeditationPageByCateId") + @ApiOperation(value = "根据分类id获取冥想音频列表-分页", notes = "查看更多") + @ApiImplicitParams({ + @ApiImplicitParam(name = "cateId", value = "分类id", dataType = "Long", required = true), + @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", dataType = "Integer", required = true), + @ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true)}) + public R<PageDTO<ClientMeditationVO>> getMeditationPageByCateId(@RequestParam Long cateId, + @RequestParam Integer pageCurr, @RequestParam Integer pageSize) { + return R.ok(meditationService.getMeditationPageByCateId(cateId, pageCurr, pageSize)); + } + + /** + * 首页搜索首页 + * + * @param condition 搜索条件 + * @param pageCurr 当前页码 + * @param pageSize 每页数量 + * @return 冥想列表 + */ + @PostMapping("/search") + @ApiOperation("首页搜索冥想音频") + @ApiImplicitParams({ + @ApiImplicitParam(name = "condition", value = "查询条件", dataType = "String", required = true), + @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", dataType = "Integer", required = true), + @ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true) + }) + public R<PageDTO<ClientMeditationVO>> search(@RequestParam String condition, + @RequestParam Integer + pageCurr, @RequestParam Integer pageSize) { + return R.ok(meditationService.search(condition, pageCurr, pageSize)); + } + + /** + * 获取热词列表 + * + * @return 热词列表 + */ + @GetMapping("/getHotWordList") + @ApiOperation("获取热词列表") + public R<List<String>> getHotWordList() { + return R.ok(remoteHotWordsService.getHotWordList(SecurityConstants.INNER).getData()); + } + + /** + * 获取冥想音频详情 + * + * @param id 冥想音频id + * @return 客户端冥想详情视图对象 + */ + @GetMapping("/getMeditationDetails") + @ApiOperation("获取冥想音频详情") + @ApiImplicitParam(name = "id", value = "冥想音频id", dataType = "Long", required = true) + public R<ClientMeditationDetailsVO> getMeditationDetails(@RequestParam("id") Long id) { + return R.ok(meditationService.getMeditationDetails(id)); + } + + /** + * 收藏/取消收藏 + * + * @param id 冥想音频id + */ + @PostMapping("/favorite") + @ApiOperation(value = "收藏/取消收藏") + @ApiImplicitParam(name = "id", value = "冥想音频id", dataType = "Long", required = true) + public R<?> favorite(@RequestParam("id") Long id) { + meditationService.favorite(id); + return R.ok(); + } + + /** + * 获取冥想音频提问列表-分页 + * + * @param id 冥想音频id + * @param pageCurr 当前页码 + * @param pageSize 每页数量 + * @return 冥想音频提问分页列表 + */ + @GetMapping("/getMeditationQuestionPage") + @ApiOperation(value = "获取冥想音频提问列表-分页") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "冥想音频id", dataType = "Long", required = true), + @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", dataType = "Integer", required = true), + @ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true) + }) + public R<PageDTO<ClientMeditationQuestionVO>> getMeditationQuestionPage( + @RequestParam("id") Long id, @RequestParam("pageCurr") Integer pageCurr, + @RequestParam("pageSize") Integer pageSize) { + return R.ok(meditationService.getMeditationQuestionPage(id, pageCurr, pageSize)); + } + + /** + * 举报提问 + * + * @param id 提问id + * @param content 举报内容 + */ + @PostMapping("/report") + @ApiOperation("举报提问") + @ApiImplicitParams({ + @ApiImplicitParam(name = "id", value = "提问id", dataType = "Long", required = true), + @ApiImplicitParam(name = "reason", value = "举报原因", dataType = "String", required = true) + }) + public R<?> report(@RequestParam("id") Long id, @RequestParam("reason") String content) { + meditationQuestionService.report(id, content); + return R.ok(); + } + + /** + * 点赞/取消点赞提问 + * + * @param id 提问id + */ + @PostMapping("/likeQuestion") + @ApiOperation("点赞/取消点赞提问") + @ApiImplicitParam(name = "id", value = "提问id", dataType = "Long", required = true) + public R<?> likeQuestion(@RequestParam("id") Long id) { + meditationQuestionService.likeQuestion(id); + return R.ok(); + } +} + diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationController.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationController.java index 752c519..b18a3c8 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationController.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationController.java @@ -1,8 +1,9 @@ package com.xinquan.meditation.controller.client; +import com.xinquan.meditation.service.MeditationService; +import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.RequestMapping; - import org.springframework.web.bind.annotation.RestController; /** @@ -14,8 +15,11 @@ * @since 2024-08-21 */ @RestController +@RequiredArgsConstructor @RequestMapping("/client/meditation/meditation") public class ClientMeditationController { + private final MeditationService meditationService; + } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationUserOperationController.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationUserFavoriteController.java similarity index 86% rename from xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationUserOperationController.java rename to xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationUserFavoriteController.java index 2a71864..0f9638e 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationUserOperationController.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationUserFavoriteController.java @@ -2,7 +2,6 @@ import org.springframework.web.bind.annotation.RequestMapping; - import org.springframework.web.bind.annotation.RestController; /** @@ -15,7 +14,7 @@ */ @RestController @RequestMapping("/client/meditation/meditation-user-operation") -public class ClientMeditationUserOperationController { +public class ClientMeditationUserFavoriteController { } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicController.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicController.java deleted file mode 100644 index e4f7092..0000000 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicController.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.xinquan.meditation.controller.client; - - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * <p> - * 首页背景音乐表 前端控制器 - * </p> - * - * @author mitao - * @since 2024-08-21 - */ -@RestController -@RequestMapping("/system/home-background-music") -public class HomeBackgroundMusicController { - -} - diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicUserController.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicUserController.java index f964608..ac480f6 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicUserController.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/HomeBackgroundMusicUserController.java @@ -13,7 +13,7 @@ * @since 2024-08-23 */ @RestController -@RequestMapping("/meditation/home-background-music-user") +@RequestMapping("/client/meditation/home-background-music-user") public class HomeBackgroundMusicUserController { } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/management/MgtClientMeditationUserOperationController.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/management/MgtClientMeditationUserFavoriteController.java similarity index 86% rename from xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/management/MgtClientMeditationUserOperationController.java rename to xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/management/MgtClientMeditationUserFavoriteController.java index b78a1a1..d471840 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/management/MgtClientMeditationUserOperationController.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/management/MgtClientMeditationUserFavoriteController.java @@ -14,7 +14,7 @@ */ @RestController @RequestMapping("/mgt/meditation/meditation-user-operation") -public class MgtClientMeditationUserOperationController { +public class MgtClientMeditationUserFavoriteController { } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusic.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusic.java index 58e1fa9..60918e4 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusic.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/HomeBackgroundMusic.java @@ -21,7 +21,7 @@ @Data @EqualsAndHashCode(callSuper = true) @TableName("t_home_background_music") -@ApiModel(value="HomeBackgroundMusic对象", description="首页背景音乐表 ") +@ApiModel(value = "HomeBackgroundMusic对象", description = "首页背景音乐表") public class HomeBackgroundMusic extends BaseModel { private static final long serialVersionUID = 1L; @@ -38,6 +38,10 @@ @TableField("audio_file") private String audioFile; + @ApiModelProperty(value = "音频文件名称") + @TableField("audio_file_name") + private String audioFileName; + @ApiModelProperty(value = "排序权重") @TableField("sort_num") private Integer sortNum; diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/Meditation.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/Meditation.java index d9c6654..1be293d 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/Meditation.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/Meditation.java @@ -1,12 +1,13 @@ package com.xinquan.meditation.domain; 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.xinquan.common.core.web.domain.BaseModel; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.math.BigDecimal; import lombok.Data; import lombok.EqualsAndHashCode; @@ -50,6 +51,14 @@ @TableField("charge_type") private Integer chargeType; + @ApiModelProperty(value = "通用价格") + @TableField("general_price") + private BigDecimal generalPrice; + + @ApiModelProperty(value = "IOS内购价格") + @TableField("ios_price") + private BigDecimal iosPrice; + @ApiModelProperty(value = "排序权重") @TableField("sort_num") private Integer sortNum; diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationCategory.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationCategory.java index 156554e..1896aec 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationCategory.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationCategory.java @@ -1,10 +1,10 @@ package com.xinquan.meditation.domain; 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.xinquan.common.core.web.domain.BaseModel; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -27,7 +27,7 @@ private static final long serialVersionUID = 1L; @ApiModelProperty(value = "冥想分类id") - @TableId(value = "id",type = IdType.ASSIGN_ID) + @TableId(value = "id", type = IdType.AUTO) private Long id; @ApiModelProperty(value = "冥想分类课程") diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationQuestion.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationQuestion.java index cb50c41..c834a1f 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationQuestion.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationQuestion.java @@ -1,13 +1,13 @@ package com.xinquan.meditation.domain; 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.xinquan.common.core.web.domain.BaseModel; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; import lombok.Data; import lombok.EqualsAndHashCode; @@ -31,6 +31,10 @@ @TableId(value = "id",type = IdType.ASSIGN_ID) private Long id; + @ApiModelProperty(value = "冥想id") + @TableField("meditation_id") + private Long meditationId; + @ApiModelProperty(value = "点赞数") @TableField("like_count") private Integer likeCount; diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationQuestionLike.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationQuestionLike.java new file mode 100644 index 0000000..dad64b7 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationQuestionLike.java @@ -0,0 +1,56 @@ +package com.xinquan.meditation.domain; + +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 io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * <p> + * 冥想提问点赞表 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +@Data +@TableName("t_meditation_question_like") +@ApiModel(value = "MeditationQuestionLike对象", description = "冥想提问点赞表") +public class MeditationQuestionLike implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "id") + @TableId("id") + private Long id; + + @ApiModelProperty(value = "冥想id") + @TableField("meditation_question_id") + private Long meditationQuestionId; + + @ApiModelProperty(value = "用户id") + @TableField("app_user_id") + private Long appUserId; + + /** + * 创建者 + */ + @ApiModelProperty(value = "记录创建人,前端忽略") + @TableField(value = "create_by", fill = FieldFill.INSERT) + private String createBy; + + /** + * 创建时间 + */ + @ApiModelProperty(value = "记录创建时间,前端忽略") + // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(value = "create_time", fill = FieldFill.INSERT) + private LocalDateTime createTime; + + +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserOperation.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserFavorite.java similarity index 60% rename from xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserOperation.java rename to xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserFavorite.java index c262bed..8fe2a9e 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserOperation.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationUserFavorite.java @@ -1,14 +1,15 @@ package com.xinquan.meditation.domain; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableName; -import com.xinquan.common.core.web.domain.BaseModel; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; import lombok.Data; -import lombok.EqualsAndHashCode; /** * <p> @@ -19,24 +20,15 @@ * @since 2024-08-21 */ @Data -@EqualsAndHashCode(callSuper = true) @TableName("t_meditation_user_operation") @ApiModel(value="MeditationUserOperation对象", description="冥想用户操作表") -public class MeditationUserOperation extends BaseModel { +public class MeditationUserFavorite implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "id") @TableId(value = "id",type = IdType.ASSIGN_ID) private Long id; - - @ApiModelProperty(value = "是否点赞 1=是 2=否") - @TableField("like") - private Integer like; - - @ApiModelProperty(value = "是否收藏 1=是 2=否") - @TableField("favorite") - private Integer favorite; @ApiModelProperty(value = "冥想id") @TableField("meditation_id") @@ -46,5 +38,18 @@ @TableField("app_user_id") private Long appUserId; + /** + * 创建者 + */ + @ApiModelProperty(value = "记录创建人,前端忽略") + @TableField(value = "create_by", fill = FieldFill.INSERT) + private String createBy; + /** + * 创建时间 + */ + @ApiModelProperty(value = "记录创建时间,前端忽略") + // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @TableField(value = "create_time", fill = FieldFill.INSERT) + private LocalDateTime createTime; } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/dto/ClientHomeMeditationQueryDTO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/dto/ClientHomeMeditationQueryDTO.java new file mode 100644 index 0000000..1490ca7 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/dto/ClientHomeMeditationQueryDTO.java @@ -0,0 +1,25 @@ +package com.xinquan.meditation.domain.dto; + +import com.xinquan.common.core.web.page.BasePage; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import javax.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author mitao + * @date 2024/9/4 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("客户端-首页查询参数") +public class ClientHomeMeditationQueryDTO extends BasePage implements Serializable { + + private static final long serialVersionUID = -6691807074482685234L; + + @ApiModelProperty(value = "查询条件") + @NotBlank(message = "查询条件不能为空") + private String condition; +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/dto/ClientMeditationQueryDTO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/dto/ClientMeditationQueryDTO.java new file mode 100644 index 0000000..da12591 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/dto/ClientMeditationQueryDTO.java @@ -0,0 +1,25 @@ +package com.xinquan.meditation.domain.dto; + +import com.xinquan.common.core.web.page.BasePage; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import javax.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author mitao + * @date 2024/9/4 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel("客户端-冥想查询参数") +public class ClientMeditationQueryDTO extends BasePage implements Serializable { + + private static final long serialVersionUID = -6691807074482685234L; + + @ApiModelProperty(value = "分类id") + @NotNull(message = "分类id不能为空") + private Long cateId; +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientHomeBackgroundMusicVO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientHomeBackgroundMusicVO.java new file mode 100644 index 0000000..10826fa --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientHomeBackgroundMusicVO.java @@ -0,0 +1,29 @@ +package com.xinquan.meditation.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/4 + */ +@Data +@ApiModel(value = "首页背景音乐视图对象") +public class ClientHomeBackgroundMusicVO implements Serializable { + + private static final long serialVersionUID = 8868579953762043190L; + + @ApiModelProperty(value = "首页背景音乐id") + private Long id; + + @ApiModelProperty(value = "背景图片") + private String imageUrl; + + @ApiModelProperty(value = "音频文件") + private String audioFile; + + @ApiModelProperty(value = "文件名称") + private String audioFileName; +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationAndCateVO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationAndCateVO.java new file mode 100644 index 0000000..58433cd --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationAndCateVO.java @@ -0,0 +1,25 @@ +package com.xinquan.meditation.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.List; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/5 + */ +@Data +@ApiModel(value = "冥想及分类视图对象") +public class ClientMeditationAndCateVO implements Serializable { + + private static final long serialVersionUID = -2154691485115564661L; + + @ApiModelProperty("冥想分类") + private ClientMeditationCategoryVO clientMeditationCategoryVO; + + @ApiModelProperty(value = "冥想列表") + private List<ClientMeditationVO> clientMeditationVOList; + +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationCategoryVO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationCategoryVO.java new file mode 100644 index 0000000..631a4ab --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationCategoryVO.java @@ -0,0 +1,32 @@ +package com.xinquan.meditation.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/4 + */ +@Data +@ApiModel(value = "冥想分类视图对象") +public class ClientMeditationCategoryVO { + + @ApiModelProperty(value = "冥想分类id") + private Long id; + + @ApiModelProperty(value = "冥想分类课程") + private String categoryName; + + @ApiModelProperty(value = "分类描述") + private String description; + + @ApiModelProperty(value = "icon图片 用于顶部四个分类展示") + private String firstIconUrl; + + @ApiModelProperty(value = "icon图片 用于下面的三个分类展示 ") + private String secondIconUrl; + + @ApiModelProperty(value = "展示方式 1=横版 2=竖版") + private Integer showType; +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationDetailsVO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationDetailsVO.java new file mode 100644 index 0000000..d3f5df3 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationDetailsVO.java @@ -0,0 +1,25 @@ +package com.xinquan.meditation.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.util.List; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author mitao + * @date 2024/9/5 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@ApiModel(value = "客户端冥想详情视图对象") +public class ClientMeditationDetailsVO extends ClientMeditationVO { + + private static final long serialVersionUID = -2959289858083878221L; + + @ApiModelProperty(value = "冥想背景音频列表") + private List<String> meditationMusicList; + + @ApiModelProperty(value = "是否收藏 1:是 2:否") + private Integer favorite; +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationEverydayVO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationEverydayVO.java new file mode 100644 index 0000000..b003329 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationEverydayVO.java @@ -0,0 +1,36 @@ +package com.xinquan.meditation.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/4 + */ +@Data +@ApiModel(value = "每日冥想视图对象") +public class ClientMeditationEverydayVO implements Serializable { + + private static final long serialVersionUID = -1776068531441762518L; + + @ApiModelProperty(value = "每日冥想id") + private Long id; + + @ApiModelProperty(value = "冥想id") + private Long meditationId; + + @ApiModelProperty(value = "播放时间段开始") + private LocalDateTime startPlayTime; + + @ApiModelProperty(value = "播放时间段结束") + private LocalDateTime endPlayTime; + + @ApiModelProperty(value = "每日冥想背景图片") + private String imageUrl; + + @ApiModelProperty(value = "每日冥想") + private ClientMeditationVO clientMeditationVO; +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationQuestionVO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationQuestionVO.java new file mode 100644 index 0000000..3749c10 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationQuestionVO.java @@ -0,0 +1,46 @@ +package com.xinquan.meditation.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/5 + */ +@Data +@ApiModel(value = "客户端冥想评论视图对象") +public class ClientMeditationQuestionVO { + + @ApiModelProperty(value = "id") + private Long id; + + @ApiModelProperty(value = "点赞数") + private Integer likeCount; + + @ApiModelProperty(value = "是否点赞 1=是 2=否") + private Integer like = 2; + + @ApiModelProperty(value = "提问内容") + private String content; + + @ApiModelProperty(value = "提问时间") + private LocalDateTime publishTime; + + @ApiModelProperty(value = "用户id") + private Long appUserId; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "昵称") + private String nickname; + + @ApiModelProperty(value = "回复内容") + private String replyContent; + + @ApiModelProperty(value = "回复时间") + private LocalDateTime replyTime; + +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationVO.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationVO.java new file mode 100644 index 0000000..d81dfcc --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/vo/ClientMeditationVO.java @@ -0,0 +1,73 @@ +package com.xinquan.meditation.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.math.BigDecimal; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/4 + */ +@Data +@ApiModel(value = "冥想视图对象") +public class ClientMeditationVO implements Serializable { + + private static final long serialVersionUID = -1776068531441762518L; + + @ApiModelProperty(value = "冥想id") + private Long id; + + @ApiModelProperty(value = "冥想音频分类id") + private Long cateId; + + @ApiModelProperty(value = "冥想标题") + private String meditationTitle; + + @ApiModelProperty(value = "上架状态 1=上架 2=下架") + private Integer listingStatus; + + @ApiModelProperty(value = "梵文 1=是 2否") + private Integer sanskrit; + + @ApiModelProperty(value = "价格设定 1=免费 2=会员免费 3=单独收费") + private Integer chargeType; + + @ApiModelProperty(value = "通用价格", notes = "价格设定为单独收费") + private BigDecimal generalPrice; + + @ApiModelProperty(value = "IOS内购价格", notes = "价格设定为单独收费") + private BigDecimal iosPrice; + + @ApiModelProperty(value = "排序权重") + private Integer sortNum; + + @ApiModelProperty(value = "实际已学习数") + private Integer realLearnedNum; + + @ApiModelProperty(value = "虚拟已学习数") + private Integer virtualLearnedNum; + + @ApiModelProperty(value = "icon封面图") + private String iconUrl; + + @ApiModelProperty(value = "封面图") + private String coverUrl; + + @ApiModelProperty(value = "背景图") + private String backgroundUrl; + + @ApiModelProperty(value = "详情描述") + private String detailDescription; + + @ApiModelProperty(value = "封面描述") + private String coverDescription; + + @ApiModelProperty(value = "导师音频") + private String tutorAudioUrl; + + @ApiModelProperty(value = "被收藏数") + private Integer favoriteCount; + +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java index 452c99a..8bc0193 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java @@ -1,7 +1,11 @@ package com.xinquan.meditation.mapper; -import com.xinquan.meditation.domain.Meditation; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xinquan.meditation.domain.Meditation; +import com.xinquan.meditation.domain.vo.ClientMeditationVO; +import java.util.List; +import java.util.Set; +import org.apache.ibatis.annotations.Param; /** * <p> @@ -13,4 +17,13 @@ */ public interface MeditationMapper extends BaseMapper<Meditation> { + /** + * 根据用户梵文权限和标签查询冥想列表 + * + * @param tagIdSet 标签id集合 + * @param sanskritFlag 梵文权限 + * @return 冥想列表 + */ + List<ClientMeditationVO> getMeditationListByTagId(@Param("tagIdSet") Set<Long> tagIdSet, + @Param("sanskritFlag") Integer sanskritFlag); } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationQuestionLikeMapper.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationQuestionLikeMapper.java new file mode 100644 index 0000000..48b065b --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationQuestionLikeMapper.java @@ -0,0 +1,16 @@ +package com.xinquan.meditation.mapper; + +import com.xinquan.meditation.domain.MeditationQuestionLike; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + * <p> + * 冥想提问点赞表 Mapper 接口 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +public interface MeditationQuestionLikeMapper extends BaseMapper<MeditationQuestionLike> { + +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationUserFavoriteMapper.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationUserFavoriteMapper.java new file mode 100644 index 0000000..c579233 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationUserFavoriteMapper.java @@ -0,0 +1,16 @@ +package com.xinquan.meditation.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xinquan.meditation.domain.MeditationUserFavorite; + +/** + * <p> + * 冥想用户操作表 Mapper 接口 + * </p> + * + * @author mitao + * @since 2024-08-21 + */ +public interface MeditationUserFavoriteMapper extends BaseMapper<MeditationUserFavorite> { + +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationUserOperationMapper.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationUserOperationMapper.java deleted file mode 100644 index edc144e..0000000 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationUserOperationMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.xinquan.meditation.mapper; - -import com.xinquan.meditation.domain.MeditationUserOperation; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -/** - * <p> - * 冥想用户操作表 Mapper 接口 - * </p> - * - * @author mitao - * @since 2024-08-21 - */ -public interface MeditationUserOperationMapper extends BaseMapper<MeditationUserOperation> { - -} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/HomeBackgroundMusicService.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/HomeBackgroundMusicService.java new file mode 100644 index 0000000..861da6f --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/HomeBackgroundMusicService.java @@ -0,0 +1,31 @@ +package com.xinquan.meditation.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.meditation.domain.HomeBackgroundMusic; +import com.xinquan.meditation.domain.vo.ClientHomeBackgroundMusicVO; +import java.util.List; + +/** + * <p> + * 首页背景音乐用户关系表 服务类 + * </p> + * + * @author mitao + * @since 2024-08-23 + */ +public interface HomeBackgroundMusicService extends IService<HomeBackgroundMusic> { + + /** + * 获取首页背景音乐列表 + * + * @return 背景音乐列表 + */ + List<ClientHomeBackgroundMusicVO> getHomeBackgroundMusicList(); + + /** + * 保存用户首页背景音乐设置 + * + * @param id 首页背景音乐id + */ + void savePersonalitySetting(Long id); +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationCategoryService.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationCategoryService.java index c8de2cf..34e6d9c 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationCategoryService.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationCategoryService.java @@ -1,7 +1,9 @@ package com.xinquan.meditation.service; -import com.xinquan.meditation.domain.MeditationCategory; import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.meditation.domain.MeditationCategory; +import com.xinquan.meditation.domain.vo.ClientMeditationCategoryVO; +import java.util.List; /** * <p> @@ -13,4 +15,18 @@ */ public interface MeditationCategoryService extends IService<MeditationCategory> { + /** + * 获取冥想分类列表 + * + * @param type 分类类型 + * @return 分类列表 + */ + List<ClientMeditationCategoryVO> getCategoryListByType(Integer type); + + /** + * 获取冥想分类列表 + * + * @return 冥想分类列表 + */ + List<ClientMeditationCategoryVO> getCategoryList(); } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationEverydayService.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationEverydayService.java index b8c94f5..703e44e 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationEverydayService.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationEverydayService.java @@ -1,7 +1,8 @@ package com.xinquan.meditation.service; -import com.xinquan.meditation.domain.MeditationEveryday; import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.meditation.domain.MeditationEveryday; +import com.xinquan.meditation.domain.vo.ClientMeditationEverydayVO; /** * <p> @@ -13,4 +14,10 @@ */ public interface MeditationEverydayService extends IService<MeditationEveryday> { + /** + * 查询每日冥想 + * + * @return 每日冥想 + */ + ClientMeditationEverydayVO getTodayMeditation(); } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationQuestionLikeService.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationQuestionLikeService.java new file mode 100644 index 0000000..cbb1f79 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationQuestionLikeService.java @@ -0,0 +1,16 @@ +package com.xinquan.meditation.service; + +import com.xinquan.meditation.domain.MeditationQuestionLike; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * <p> + * 冥想提问点赞表 服务类 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +public interface MeditationQuestionLikeService extends IService<MeditationQuestionLike> { + +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationQuestionService.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationQuestionService.java index 3a2c1a6..437d7b0 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationQuestionService.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationQuestionService.java @@ -1,7 +1,7 @@ package com.xinquan.meditation.service; -import com.xinquan.meditation.domain.MeditationQuestion; import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.meditation.domain.MeditationQuestion; /** * <p> @@ -13,4 +13,18 @@ */ public interface MeditationQuestionService extends IService<MeditationQuestion> { + /** + * 举报提问 + * + * @param id 提问id + * @param content 举报内容 + */ + void report(Long id, String content); + + /** + * 点赞/取消点赞提问 + * + * @param id 提问id + */ + void likeQuestion(Long id); } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java index d83f1a0..d436295 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java @@ -1,7 +1,13 @@ package com.xinquan.meditation.service; -import com.xinquan.meditation.domain.Meditation; import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.common.core.utils.page.PageDTO; +import com.xinquan.meditation.domain.Meditation; +import com.xinquan.meditation.domain.vo.ClientMeditationAndCateVO; +import com.xinquan.meditation.domain.vo.ClientMeditationDetailsVO; +import com.xinquan.meditation.domain.vo.ClientMeditationQuestionVO; +import com.xinquan.meditation.domain.vo.ClientMeditationVO; +import java.util.List; /** * <p> @@ -13,4 +19,72 @@ */ public interface MeditationService extends IService<Meditation> { + /** + * 获取私人订制 + * + * @return 冥想列表 + */ + List<ClientMeditationVO> getPersonalityPlan(); + + /** + * 根据分类id获取冥想列表 + * + * @param cateId 分类id + * @return 冥想列表 + */ + List<ClientMeditationVO> getMeditationListByCateId(Long cateId); + + /** + * 根据分类id获取冥想列表-分页 + * + * @param cateId 分类id + * @param pageCurr 当前页码 + * @param pageSize 每页数量 + * @return 冥想列表 + */ + PageDTO<ClientMeditationVO> getMeditationPageByCateId(Long cateId, Integer pageCurr, + Integer pageSize); + + /** + * 首页搜索首页 + * + * @param condition 搜索条件 + * @param pageCurr 当前页码 + * @param pageSize 每页数量 + * @return 冥想列表 + */ + PageDTO<ClientMeditationVO> search(String condition, Integer pageCurr, Integer pageSize); + + /** + * 获取全部的冥想及分类列表 + * + * @return 冥想和分类列表 + */ + List<ClientMeditationAndCateVO> getMeditationAndCateList(); + + /** + * 获取冥想音频详情 + * + * @param id 冥想音频id + * @return 客户端冥想详情视图对象 + */ + ClientMeditationDetailsVO getMeditationDetails(Long id); + + /** + * 获取冥想音频提问列表-分页 + * + * @param id 冥想音频id + * @param pageCurr 当前页码 + * @param pageSize 每页数量 + * @return 冥想音频提问分页列表 + */ + PageDTO<ClientMeditationQuestionVO> getMeditationQuestionPage(Long id, + Integer pageCurr, Integer pageSize); + + /** + * 收藏/取消收藏 + * + * @param id 冥想音频id + */ + void favorite(Long id); } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationUserFavoriteService.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationUserFavoriteService.java new file mode 100644 index 0000000..4e7f13b --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationUserFavoriteService.java @@ -0,0 +1,16 @@ +package com.xinquan.meditation.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.meditation.domain.MeditationUserFavorite; + +/** + * <p> + * 冥想用户操作表 服务类 + * </p> + * + * @author mitao + * @since 2024-08-21 + */ +public interface MeditationUserFavoriteService extends IService<MeditationUserFavorite> { + +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationUserOperationService.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationUserOperationService.java deleted file mode 100644 index 47fa765..0000000 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationUserOperationService.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.xinquan.meditation.service; - -import com.xinquan.meditation.domain.MeditationUserOperation; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - * <p> - * 冥想用户操作表 服务类 - * </p> - * - * @author mitao - * @since 2024-08-21 - */ -public interface MeditationUserOperationService extends IService<MeditationUserOperation> { - -} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/HomeBackgroundMusicServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/HomeBackgroundMusicServiceImpl.java new file mode 100644 index 0000000..7576a97 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/HomeBackgroundMusicServiceImpl.java @@ -0,0 +1,61 @@ +package com.xinquan.meditation.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.constant.SecurityConstants; +import com.xinquan.common.core.utils.page.BeanUtils; +import com.xinquan.common.security.utils.SecurityUtils; +import com.xinquan.meditation.domain.HomeBackgroundMusic; +import com.xinquan.meditation.domain.vo.ClientHomeBackgroundMusicVO; +import com.xinquan.meditation.mapper.HomeBackgroundMusicMapper; +import com.xinquan.meditation.service.HomeBackgroundMusicService; +import com.xinquan.user.api.domain.dto.AppUserDTO; +import com.xinquan.user.api.feign.RemoteAppUserService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +/** + * <p> + * 首页背景音乐用户关系表 服务实现类 + * </p> + * + * @author mitao + * @since 2024-08-23 + */ +@Service +@RequiredArgsConstructor +public class HomeBackgroundMusicServiceImpl extends + ServiceImpl<HomeBackgroundMusicMapper, HomeBackgroundMusic> implements + HomeBackgroundMusicService { + + private final RemoteAppUserService remoteAppUserService; + + /** + * 获取首页背景音乐列表 + * + * @return 背景音乐列表 + */ + @Override + public List<ClientHomeBackgroundMusicVO> getHomeBackgroundMusicList() { + List<HomeBackgroundMusic> list = this.lambdaQuery() + .orderByDesc(HomeBackgroundMusic::getSortNum).list(); + return BeanUtils.copyList(list, ClientHomeBackgroundMusicVO.class); + } + + /** + * 保存用户首页背景音乐设置 + * + * @param id 首页背景音乐id + */ + @Override + public void savePersonalitySetting(Long id) { + // 获取当前登录用户id + Long userId = SecurityUtils.getUserId(); + // 远程调用修改用户信息 + remoteAppUserService.updateAppUser( + AppUserDTO.builder() + .id(userId) + .homeBackgroundMusicId(id).build(), + SecurityConstants.INNER); + } +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationCategoryServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationCategoryServiceImpl.java index 5e25f40..91292dd 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationCategoryServiceImpl.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationCategoryServiceImpl.java @@ -1,9 +1,12 @@ package com.xinquan.meditation.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.utils.page.BeanUtils; import com.xinquan.meditation.domain.MeditationCategory; +import com.xinquan.meditation.domain.vo.ClientMeditationCategoryVO; import com.xinquan.meditation.mapper.MeditationCategoryMapper; import com.xinquan.meditation.service.MeditationCategoryService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; import org.springframework.stereotype.Service; /** @@ -17,4 +20,29 @@ @Service public class MeditationCategoryServiceImpl extends ServiceImpl<MeditationCategoryMapper, MeditationCategory> implements MeditationCategoryService { + /** + * 获取冥想分类列表 + * + * @param type 分类类型 + * @return 分类列表 + */ + @Override + public List<ClientMeditationCategoryVO> getCategoryListByType(Integer type) { + List<MeditationCategory> list = this.lambdaQuery() + .orderByDesc(MeditationCategory::getSortNum).last(type == 1, "limit 4") + .last(type == 2, "limit 4,3").list(); + return BeanUtils.copyList(list, ClientMeditationCategoryVO.class); + } + + /** + * 获取冥想分类列表 + * + * @return 冥想分类列表 + */ + @Override + public List<ClientMeditationCategoryVO> getCategoryList() { + List<MeditationCategory> list = this.lambdaQuery() + .orderByDesc(MeditationCategory::getSortNum).list(); + return BeanUtils.copyList(list, ClientMeditationCategoryVO.class); + } } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationEverydayServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationEverydayServiceImpl.java index 22d5929..10608d9 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationEverydayServiceImpl.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationEverydayServiceImpl.java @@ -1,9 +1,17 @@ package com.xinquan.meditation.service.impl; -import com.xinquan.meditation.domain.MeditationEveryday; -import com.xinquan.meditation.mapper.MeditationEverydayMapper; -import com.xinquan.meditation.service.MeditationEverydayService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.utils.page.BeanUtils; +import com.xinquan.meditation.domain.Meditation; +import com.xinquan.meditation.domain.MeditationEveryday; +import com.xinquan.meditation.domain.vo.ClientMeditationEverydayVO; +import com.xinquan.meditation.domain.vo.ClientMeditationVO; +import com.xinquan.meditation.mapper.MeditationEverydayMapper; +import com.xinquan.meditation.mapper.MeditationMapper; +import com.xinquan.meditation.service.MeditationEverydayService; +import java.time.LocalDateTime; +import java.util.Optional; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -15,6 +23,50 @@ * @since 2024-08-21 */ @Service +@RequiredArgsConstructor public class MeditationEverydayServiceImpl extends ServiceImpl<MeditationEverydayMapper, MeditationEveryday> implements MeditationEverydayService { + private final MeditationMapper meditationMapper; + + /** + * 查询每日冥想 + * + * @return 每日冥想 + */ + @Override + public ClientMeditationEverydayVO getTodayMeditation() { + ClientMeditationEverydayVO vo = null; + // 当前时间 + LocalDateTime now = LocalDateTime.now(); + // 查询播放时间段在当前时间的每日冥想 + Optional<MeditationEveryday> meditationEverydayOpt = this.lambdaQuery() + .le(MeditationEveryday::getStartPlayTime, now) + .ge(MeditationEveryday::getEndPlayTime, now) + .orderByDesc(MeditationEveryday::getUpdateTime) + .last("limit 1").oneOpt(); + if (!meditationEverydayOpt.isPresent()) { + // 查询结束时间离当前时间最近的一个每日冥想 + meditationEverydayOpt = this.lambdaQuery() + .le(MeditationEveryday::getStartPlayTime, now) + .orderByDesc(MeditationEveryday::getEndPlayTime) + .last("limit 1").oneOpt(); + } + // 判断是否存在 + if (meditationEverydayOpt.isPresent()) { + // 查询冥想详情 + MeditationEveryday meditationEveryday = meditationEverydayOpt.get(); + Optional<Meditation> meditationOpt = Optional.ofNullable( + meditationMapper.selectById( + meditationEveryday.getMeditationId())); + if (meditationOpt.isPresent()) { + // 封装返回值 + ClientMeditationVO clientMeditationVO = BeanUtils.copyBean(meditationOpt.get(), + ClientMeditationVO.class); + vo = BeanUtils.copyBean(meditationEveryday, + ClientMeditationEverydayVO.class); + vo.setClientMeditationVO(clientMeditationVO); + } + } + return vo; + } } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationQuestionLikeServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationQuestionLikeServiceImpl.java new file mode 100644 index 0000000..101dac4 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationQuestionLikeServiceImpl.java @@ -0,0 +1,20 @@ +package com.xinquan.meditation.service.impl; + +import com.xinquan.meditation.domain.MeditationQuestionLike; +import com.xinquan.meditation.mapper.MeditationQuestionLikeMapper; +import com.xinquan.meditation.service.MeditationQuestionLikeService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + * <p> + * 冥想提问点赞表 服务实现类 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +@Service +public class MeditationQuestionLikeServiceImpl extends ServiceImpl<MeditationQuestionLikeMapper, MeditationQuestionLike> implements MeditationQuestionLikeService { + +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationQuestionServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationQuestionServiceImpl.java index ff1852b..4007bbc 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationQuestionServiceImpl.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationQuestionServiceImpl.java @@ -1,9 +1,17 @@ package com.xinquan.meditation.service.impl; -import com.xinquan.meditation.domain.MeditationQuestion; -import com.xinquan.meditation.mapper.MeditationQuestionMapper; -import com.xinquan.meditation.service.MeditationQuestionService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.enums.ReportStatusEnum; +import com.xinquan.common.core.exception.ServiceException; +import com.xinquan.common.security.utils.SecurityUtils; +import com.xinquan.meditation.domain.MeditationQuestion; +import com.xinquan.meditation.domain.MeditationQuestionLike; +import com.xinquan.meditation.mapper.MeditationQuestionMapper; +import com.xinquan.meditation.service.MeditationQuestionLikeService; +import com.xinquan.meditation.service.MeditationQuestionService; +import java.util.Objects; +import java.util.Optional; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -15,6 +23,57 @@ * @since 2024-08-21 */ @Service +@RequiredArgsConstructor public class MeditationQuestionServiceImpl extends ServiceImpl<MeditationQuestionMapper, MeditationQuestion> implements MeditationQuestionService { + private final MeditationQuestionLikeService meditationQuestionLikeService; + + /** + * 举报提问 + * + * @param id 提问id + * @param content 举报内容 + */ + @Override + public void report(Long id, String content) { + MeditationQuestion meditationQuestion = this.getById(id); + if (Optional.ofNullable(meditationQuestion).isPresent()) { + meditationQuestion.setReportStatus(ReportStatusEnum.REPORTED.getCode()); + meditationQuestion.setReportUserId(SecurityUtils.getUserId()); + meditationQuestion.setReportContent(content); + this.updateById(meditationQuestion); + } + } + + /** + * 点赞/取消点赞提问 + * + * @param id 提问id + */ + @Override + public void likeQuestion(Long id) { + MeditationQuestion meditationQuestion = this.getById(id); + if (Objects.isNull(meditationQuestion)) { + throw new ServiceException("提问不存在"); + } + // 判断是否已点赞 + Optional<MeditationQuestionLike> likeOpt = meditationQuestionLikeService.lambdaQuery() + .eq(MeditationQuestionLike::getMeditationQuestionId, id) + .eq(MeditationQuestionLike::getAppUserId, SecurityUtils.getUserId()).last("limit 1") + .oneOpt(); + if (likeOpt.isPresent()) { + // 已点赞则取消点赞 + meditationQuestionLikeService.removeById(likeOpt.get()); + meditationQuestion.setLikeCount(meditationQuestion.getLikeCount() - 1); + } else { + // 未点赞则点赞 + MeditationQuestionLike meditationQuestionLike = new MeditationQuestionLike(); + meditationQuestionLike.setAppUserId(SecurityUtils.getUserId()); + meditationQuestionLike.setMeditationQuestionId(id); + if (meditationQuestionLikeService.save(meditationQuestionLike)) { + meditationQuestion.setLikeCount(meditationQuestion.getLikeCount() + 1); + } + } + this.updateById(meditationQuestion); + } } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java index 631cfcb..0142788 100644 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java @@ -1,9 +1,46 @@ package com.xinquan.meditation.service.impl; -import com.xinquan.meditation.domain.Meditation; -import com.xinquan.meditation.mapper.MeditationMapper; -import com.xinquan.meditation.service.MeditationService; +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.xinquan.common.core.constant.SecurityConstants; +import com.xinquan.common.core.enums.DisabledEnum; +import com.xinquan.common.core.exception.ServiceException; +import com.xinquan.common.core.utils.page.BeanUtils; +import com.xinquan.common.core.utils.page.CollUtils; +import com.xinquan.common.core.utils.page.PageDTO; +import com.xinquan.common.security.utils.SecurityUtils; +import com.xinquan.meditation.domain.Meditation; +import com.xinquan.meditation.domain.MeditationCategory; +import com.xinquan.meditation.domain.MeditationMusic; +import com.xinquan.meditation.domain.MeditationQuestion; +import com.xinquan.meditation.domain.MeditationQuestionLike; +import com.xinquan.meditation.domain.MeditationUserFavorite; +import com.xinquan.meditation.domain.vo.ClientMeditationAndCateVO; +import com.xinquan.meditation.domain.vo.ClientMeditationCategoryVO; +import com.xinquan.meditation.domain.vo.ClientMeditationDetailsVO; +import com.xinquan.meditation.domain.vo.ClientMeditationQuestionVO; +import com.xinquan.meditation.domain.vo.ClientMeditationVO; +import com.xinquan.meditation.mapper.MeditationCategoryMapper; +import com.xinquan.meditation.mapper.MeditationMapper; +import com.xinquan.meditation.mapper.MeditationMusicMapper; +import com.xinquan.meditation.mapper.MeditationQuestionMapper; +import com.xinquan.meditation.service.MeditationQuestionLikeService; +import com.xinquan.meditation.service.MeditationService; +import com.xinquan.meditation.service.MeditationUserFavoriteService; +import com.xinquan.user.api.domain.AppUser; +import com.xinquan.user.api.domain.dto.AppUserDTO; +import com.xinquan.user.api.feign.RemoteAppUserService; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -15,6 +52,296 @@ * @since 2024-08-21 */ @Service +@RequiredArgsConstructor public class MeditationServiceImpl extends ServiceImpl<MeditationMapper, Meditation> implements MeditationService { + private final RemoteAppUserService remoteAppUserService; + private final MeditationCategoryMapper meditationCategoryMapper; + private final MeditationMusicMapper meditationMusicMapper; + private final MeditationQuestionMapper meditationQuestionMapper; + private final MeditationQuestionLikeService meditationQuestionLikeService; + private final MeditationUserFavoriteService meditationUserFavoriteService; + + /** + * 获取私人订制 + * + * @return 冥想列表 + */ + @Override + public List<ClientMeditationVO> getPersonalityPlan() { + List<ClientMeditationVO> voList = null; + // 获取当前登录用户id + AppUser appUser = getCurrentUser(); + if (Optional.ofNullable(appUser.getTagId()).isPresent()) { + String tagId = appUser.getTagId(); + Integer sanskritFlag = appUser.getSanskritFlag(); + Set<Long> tagIdSet = Arrays.stream(tagId.split(",")).map(Long::parseLong) + .collect(Collectors.toSet()); + // 查询冥想列表 + voList = baseMapper.getMeditationListByTagId(tagIdSet, sanskritFlag); + } + return voList; + } + + /** + * 根据分类id获取冥想列表 + * + * @param cateId 分类id + * @return 冥想列表 + */ + @Override + public List<ClientMeditationVO> getMeditationListByCateId(Long cateId) { + List<ClientMeditationVO> voList = null; + // 获取当前登录用户id + AppUser appUser = getCurrentUser(); + // 查询 + List<Meditation> list = this.lambdaQuery().eq(Meditation::getCateId, cateId) + .eq(Meditation::getSanskrit, appUser.getSanskritFlag()) + .orderByDesc(Meditation::getSortNum).last("limit 8").list(); + if (CollUtils.isNotEmpty(list)) { + // 对象拷贝 + voList = BeanUtils.copyList(list, ClientMeditationVO.class); + } + return voList; + } + + /** + * 获取当前登录用户 + * + * @return AppUser + */ + private AppUser getCurrentUser() { + Long userId = SecurityUtils.getUserId(); + return remoteAppUserService.getUserByCondition( + AppUserDTO.builder().id(userId).build(), + SecurityConstants.INNER).getData(); + } + + /** + * 获取全部的冥想及分类列表 + * + * @return 冥想和分类列表 + */ + @Override + public List<ClientMeditationAndCateVO> getMeditationAndCateList() { + // 获取当前登录用户 + AppUser appUser = getCurrentUser(); + List<ClientMeditationAndCateVO> voList = CollUtils.newArrayList(); + // 查询分类列表 + List<MeditationCategory> cateList = meditationCategoryMapper.selectList( + Wrappers.lambdaQuery(MeditationCategory.class) + .orderByDesc(MeditationCategory::getSortNum)); + if (CollUtils.isNotEmpty(cateList)) { + for (MeditationCategory cate : cateList) { + ClientMeditationAndCateVO vo = new ClientMeditationAndCateVO(); + vo.setClientMeditationCategoryVO( + BeanUtils.copyBean(cateList, ClientMeditationCategoryVO.class)); + vo.setClientMeditationVOList(getMeditationListByCateId(cate.getId())); + voList.add(vo); + } + } + return voList; + } + + /** + * 根据分类id获取冥想列表-分页 + * + * @param cateId 分类id + * @param pageCurr 当前页码 + * @param pageSize 每页数量 + * @return 冥想列表 + */ + @Override + public PageDTO<ClientMeditationVO> getMeditationPageByCateId(Long cateId, Integer pageCurr, + Integer pageSize) { + PageDTO<ClientMeditationVO> pageDTO = PageDTO.empty(0L, 0L); + // 获取当前登录用户id + AppUser appUser = getCurrentUser(); + // 查询 + Page<Meditation> page = this.lambdaQuery().eq(Meditation::getCateId, cateId) + .eq(Meditation::getSanskrit, appUser.getSanskritFlag()) + .orderByDesc(Meditation::getSortNum) + .page(new Page<>(pageCurr, pageSize)); + // 如果没有查到数据直接返回 + if (Optional.ofNullable(page.getRecords()).isPresent()) { + return pageDTO; + } + // 将实体类转换为VO + pageDTO = PageDTO.of(page, ClientMeditationVO.class); + return pageDTO; + } + + /** + * 首页搜索首页 + * + * @param condition 搜索条件 + * @param pageCurr 当前页码 + * @param pageSize 每页数量 + * @return 冥想列表 + */ + @Override + public PageDTO<ClientMeditationVO> search(String condition, Integer pageCurr, + Integer pageSize) { + PageDTO<ClientMeditationVO> pageDTO = PageDTO.empty(0L, 0L); + // 获取当前登录用户id + AppUser appUser = getCurrentUser(); + // 查询 + Page<Meditation> page = this.lambdaQuery() + .like(Meditation::getMeditationTitle, condition).or() + .eq(Meditation::getSanskrit, appUser.getSanskritFlag()) + .orderByDesc(Meditation::getSortNum) + .page(new Page<>(pageCurr, pageSize)); + // 如果没有查到数据直接返回 + if (Optional.ofNullable(page.getRecords()).isPresent()) { + return pageDTO; + } + // 音频链接加密 + /* page.getRecords().forEach(meditation -> { + try { + meditation.setTutorAudioUrl(DES.encryptDES(meditation.getTutorAudioUrl())); + } catch (Exception e) { + throw new RuntimeException(e); + } + });*/ + // 将实体类转换为VO + pageDTO = PageDTO.of(page, ClientMeditationVO.class); + return pageDTO; + } + + /** + * 获取冥想音频详情 + * + * @param id 冥想音频id + * @return 客户端冥想详情视图对象 + */ + @Override + public ClientMeditationDetailsVO getMeditationDetails(Long id) { + // 查询冥想音频 + Meditation meditation = this.getById(id); + ClientMeditationDetailsVO vo = BeanUtils.copyBean(meditation, + ClientMeditationDetailsVO.class); + // 查询冥想音频 + List<MeditationMusic> meditationMusics = meditationMusicMapper.selectList( + Wrappers.lambdaQuery(MeditationMusic.class) + .eq(MeditationMusic::getMeditationId, id)); + if (CollUtils.isNotEmpty(meditationMusics)) { + // 获取音频链接 + List<String> musicUrlList = meditationMusics.stream() + .map(MeditationMusic::getMusicUrl).collect(Collectors.toList()); + vo.setMeditationMusicList(musicUrlList); + } + // 查询收藏记录 + vo.setFavorite(meditationUserFavoriteService.lambdaQuery() + .eq(MeditationUserFavorite::getMeditationId, id) + .eq(MeditationUserFavorite::getAppUserId, SecurityUtils.getUserId()) + .count() > 0 ? 1 : 2); + return vo; + } + + /** + * 收藏/取消收藏 + * + * @param id 冥想音频id + */ + @Override + public void favorite(Long id) { + Meditation meditation = this.getById(id); + if (Objects.isNull(meditation)) { + throw new ServiceException("该冥想音频不存在"); + } + // 查询收藏记录 + Optional<MeditationUserFavorite> userOperationOpt = meditationUserFavoriteService.lambdaQuery() + .eq(MeditationUserFavorite::getMeditationId, id) + .eq(MeditationUserFavorite::getAppUserId, SecurityUtils.getUserId()) + .last("limit 1").oneOpt(); + if (userOperationOpt.isPresent()) { + meditationUserFavoriteService.removeById(userOperationOpt.get()); + // 增加收藏数 + meditation.setFavoriteCount(meditation.getFavoriteCount() - 1); + } else { + // 增加收藏记录 + MeditationUserFavorite meditationUserFavorite = new MeditationUserFavorite(); + meditationUserFavorite.setMeditationId(id); + meditationUserFavorite.setAppUserId(SecurityUtils.getUserId()); + meditationUserFavoriteService.save(meditationUserFavorite); + // 减少收藏数 + meditation.setFavoriteCount(meditation.getFavoriteCount() + 1); + } + this.updateById(meditation); + } + + /** + * 获取冥想音频提问列表-分页 + * + * @param id 冥想音频id + * @param pageCurr 当前页码 + * @param pageSize 每页数量 + * @return 冥想音频提问分页列表 + */ + @Override + public PageDTO<ClientMeditationQuestionVO> getMeditationQuestionPage(Long id, + Integer pageCurr, Integer pageSize) { + // 查询冥想提问列表 + Page<MeditationQuestion> questionPage = meditationQuestionMapper.selectPage( + new Page<>(pageCurr, pageSize), + Wrappers.lambdaQuery(MeditationQuestion.class) + .eq(MeditationQuestion::getMeditationId, id) + .eq(MeditationQuestion::getShowFlag, DisabledEnum.YES) + .orderByDesc(MeditationQuestion::getPublishTime) + ); + + if (CollUtils.isEmpty(questionPage.getRecords())) { + return PageDTO.empty(questionPage); + } + + // 将 questionPage 转换为 PageDTO + PageDTO<ClientMeditationQuestionVO> pageDTO = PageDTO.of( + questionPage, ClientMeditationQuestionVO.class); + List<ClientMeditationQuestionVO> questionVOList = pageDTO.getList(); + + // 提取用户ID集合 + Set<Long> appUserIdSet = questionVOList.stream() + .map(ClientMeditationQuestionVO::getAppUserId) + .collect(Collectors.toSet()); + + // 远程调用,获取APP用户信息 + Map<Long, AppUser> appUserMap = Collections.emptyMap(); + if (!appUserIdSet.isEmpty()) { + List<AppUser> appUserList = remoteAppUserService.getAppUserList(appUserIdSet, + SecurityConstants.INNER) + .getData(); + appUserMap = appUserList.stream() + .collect(Collectors.toMap(AppUser::getId, Function.identity())); + } + + // 封装用户信息 + for (ClientMeditationQuestionVO questionVO : questionVOList) { + AppUser appUser = appUserMap.get(questionVO.getAppUserId()); + if (appUser != null) { + questionVO.setNickname(appUser.getNickname()); + questionVO.setAvatar(appUser.getAvatar()); + } + } + + // 获取当前登录用户ID + Long userId = SecurityUtils.getUserId(); + + // 查询用户已点赞提问列表 + Set<Long> likedQuestionIds = meditationQuestionLikeService.lambdaQuery() + .eq(MeditationQuestionLike::getAppUserId, userId) + .list() + .stream() + .map(MeditationQuestionLike::getMeditationQuestionId) + .collect(Collectors.toSet()); + + // 设置问题的点赞状态 + questionVOList.forEach(question -> { + if (likedQuestionIds.contains(question.getId())) { + question.setLike(DisabledEnum.YES.getCode()); + } + }); + + return pageDTO; + } + } diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationUserFavoriteServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationUserFavoriteServiceImpl.java new file mode 100644 index 0000000..b48f8f4 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationUserFavoriteServiceImpl.java @@ -0,0 +1,22 @@ +package com.xinquan.meditation.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.meditation.domain.MeditationUserFavorite; +import com.xinquan.meditation.mapper.MeditationUserFavoriteMapper; +import com.xinquan.meditation.service.MeditationUserFavoriteService; +import org.springframework.stereotype.Service; + +/** + * <p> + * 冥想用户操作表 服务实现类 + * </p> + * + * @author mitao + * @since 2024-08-21 + */ +@Service +public class MeditationUserFavoriteServiceImpl extends + ServiceImpl<MeditationUserFavoriteMapper, MeditationUserFavorite> implements + MeditationUserFavoriteService { + +} diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationUserOperationServiceImpl.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationUserOperationServiceImpl.java deleted file mode 100644 index e9812ab..0000000 --- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationUserOperationServiceImpl.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.xinquan.meditation.service.impl; - -import com.xinquan.meditation.domain.MeditationUserOperation; -import com.xinquan.meditation.mapper.MeditationUserOperationMapper; -import com.xinquan.meditation.service.MeditationUserOperationService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import org.springframework.stereotype.Service; - -/** - * <p> - * 冥想用户操作表 服务实现类 - * </p> - * - * @author mitao - * @since 2024-08-21 - */ -@Service -public class MeditationUserOperationServiceImpl extends ServiceImpl<MeditationUserOperationMapper, MeditationUserOperation> implements MeditationUserOperationService { - -} diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicMapper.xml b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicMapper.xml index 61f8292..28a05dc 100644 --- a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicMapper.xml +++ b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/HomeBackgroundMusicMapper.xml @@ -12,6 +12,7 @@ <result column="update_time" property="updateTime" /> <result column="image_url" property="imageUrl" /> <result column="audio_file" property="audioFile" /> + <result column="audio_file_name" property="audioFileName"/> <result column="sort_num" property="sortNum" /> </resultMap> diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml index c434529..6a8df73 100644 --- a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml +++ b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml @@ -24,7 +24,6 @@ <result column="detail_description" property="detailDescription" /> <result column="cover_description" property="coverDescription" /> <result column="tutor_audio_url" property="tutorAudioUrl" /> - <result column="like_count" property="likeCount" /> <result column="favorite_count" property="favoriteCount" /> </resultMap> @@ -37,5 +36,23 @@ update_time, id, cate_id, meditation_title, listing_status, sanskrit, charge_type, sort_num, real_learned_num, virtual_learned_num, icon_url, cover_url, background_url, detail_description, cover_description, tutor_audio_url, like_count, favorite_count </sql> + <select id="getMeditationListByTagId" + resultType="com.xinquan.meditation.domain.vo.ClientMeditationVO" + parameterType="java.util.Set"> + SELECT + <include refid="Base_Column_List"/> + FROM + t_meditation m + RIGHT JOIN t_meditation_tag mt ON m.id = mt.meditation_id + <where> + <if test="sanskritFlag != null and sanskritFlag == 2"> + AND m.sanskrit = #{sanskritFlag} + </if> + <if test="tagIdSet !=null and tagIdSet.size()>0"> + AND mt.tag_id IN (#{tagIdSet}) + </if> + </where> + ORDER BY sort_num DESC + </select> </mapper> diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationQuestionLikeMapper.xml b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationQuestionLikeMapper.xml new file mode 100644 index 0000000..8881499 --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationQuestionLikeMapper.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.xinquan.meditation.mapper.MeditationQuestionLikeMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.MeditationQuestionLike"> + <id column="id" property="id"/> + <result column="create_by" property="createBy"/> + <result column="create_time" property="createTime"/> + <result column="meditation_question_id" property="meditationQuestionId"/> + <result column="app_user_id" property="appUserId"/> + </resultMap> + + <!-- 通用查询结果列 --> + <sql id="Base_Column_List"> + create_by, + create_time, + id, meditation_question_id, app_user_id + </sql> + +</mapper> diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationQuestionMapper.xml b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationQuestionMapper.xml index 67937d9..d675b72 100644 --- a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationQuestionMapper.xml +++ b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationQuestionMapper.xml @@ -5,6 +5,7 @@ <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.MeditationQuestion"> <id column="id" property="id" /> + <result column="meditation_id" property="meditationId"/> <result column="del_flag" property="delFlag" /> <result column="create_by" property="createBy" /> <result column="create_time" property="createTime" /> diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserFavoriteMapper.xml b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserFavoriteMapper.xml new file mode 100644 index 0000000..87b2aca --- /dev/null +++ b/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserFavoriteMapper.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.xinquan.meditation.mapper.MeditationUserFavoriteMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.MeditationUserFavorite"> + <id column="id" property="id" /> + <result column="create_by" property="createBy" /> + <result column="create_time" property="createTime" /> + <result column="meditation_id" property="meditationId" /> + <result column="app_user_id" property="appUserId" /> + </resultMap> + + <!-- 通用查询结果列 --> + <sql id="Base_Column_List"> + create_by, + create_time, + id, favorite, meditation_id, app_user_id + </sql> + +</mapper> diff --git a/xinquan-modules/xinquan-order/pom.xml b/xinquan-modules/xinquan-order/pom.xml index 9ac2e80..c3ece2a 100644 --- a/xinquan-modules/xinquan-order/pom.xml +++ b/xinquan-modules/xinquan-order/pom.xml @@ -115,23 +115,17 @@ <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> + <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> - - + <!--bouncycastle,AES加密依赖--> <dependency> - <groupId>cn.afterturn</groupId> - <artifactId>easypoi-spring-boot-starter</artifactId> - <version>4.0.0</version> - <exclusions> - <exclusion> - <artifactId>guava</artifactId> - <groupId>com.google.guava</groupId> - </exclusion> - </exclusions> + <groupId>org.bouncycastle</groupId> + <artifactId>bcprov-jdk15on</artifactId> + <version>1.64</version> </dependency> </dependencies> diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java index d2bd65b..18ad2af 100644 --- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java @@ -1,6 +1,12 @@ package com.xinquan.order.controller.client; +import com.xinquan.common.core.domain.R; +import com.xinquan.order.service.OrderService; +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.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -13,8 +19,17 @@ * @since 2024-08-21 */ @RestController +@RequiredArgsConstructor +@Api(tags = {"用户端-订单相关接口"}) @RequestMapping("/client/order/order") public class ClientOrderController { + private OrderService orderService; + + @PostMapping("/createOrder") + @ApiOperation(value = "创建订单") + public R<?> createOrder() { + return R.ok(); + } } diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/EncryptUtils.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/EncryptUtils.java new file mode 100644 index 0000000..d19e0e0 --- /dev/null +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/EncryptUtils.java @@ -0,0 +1,61 @@ +package com.xinquan.order.utils; + +import java.nio.charset.StandardCharsets; +import java.security.Security; +import java.util.Base64; +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +public class EncryptUtils { + + private static final String SECRET = "AES"; + private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS7Padding"; + + static { + Security.addProvider(new BouncyCastleProvider()); + } + + /** + * AES加密ECB模式PKCS7Padding填充方式 + * + * @param str 字符串 + * @param key 密钥 + * @return 加密字符串 + * @throws Exception 异常信息 + */ + public static String aes256ECBPkcs7PaddingEncrypt(String str, String key) throws Exception { + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8); + cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(keyBytes, SECRET)); + byte[] doFinal = cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)); + return new String(Base64.getEncoder().encode(doFinal)); + } + + /** + * AES解密ECB模式PKCS7Padding填充方式 + * + * @param str 字符串 + * @param key 密钥 + * @return 解密字符串 + * @throws Exception 异常信息 + */ + public static String aes256ECBPkcs7PaddingDecrypt(String str, String key) throws Exception { + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8); + cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(keyBytes, SECRET)); + byte[] doFinal = cipher.doFinal(Base64.getDecoder().decode(str)); + return new String(doFinal); + } + + public static void main(String[] args) throws Exception { + String str = "a1234567"; + System.out.println("字符串:" + str); + String encryptStr = EncryptUtils.aes256ECBPkcs7PaddingEncrypt(str, "AES454-HTJSQ9-IT"); + System.out.println("加密后字符串:" + encryptStr); + String decryptStr = EncryptUtils.aes256ECBPkcs7PaddingDecrypt(encryptStr, + "AES454-HTJSQ9-IT"); + System.out.println("解密后字符串:" + decryptStr); + } + +} diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java new file mode 100644 index 0000000..cf84f25 --- /dev/null +++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/utils/JuHeFuUtil.java @@ -0,0 +1,265 @@ +package com.xinquan.order.utils; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.xinquan.common.core.exception.ServiceException; +import com.xinquan.common.core.utils.DateUtils; +import com.xinquan.common.core.utils.StringUtils; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.Signature; +import java.security.spec.PKCS8EncodedKeySpec; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 桔禾付支付工具类 + * + * @author mitao + * @date 2024/9/7 + */ +public class JuHeFuUtil { + + private static Logger logger = LoggerFactory.getLogger(JuHeFuUtil.class); + // 商户RSA私钥 TODO + private static final String MERCHANT_PRIVATE_KEY = ""; + // 平台RSA公钥 TODO + private static final String PLAT_PUBLIC_KEY = ""; + // 应用的app_id TODO + private static final String APP_ID = ""; + // 商户id TODO + private static final String MER_ID = ""; + // AES密钥 TODO + private static final String AES_KEY = ""; + // 创建用户接口 + private static final String CREATE_USER_INTERFACE = "/api/member/create_user_a"; + // 创建支付订单 + private static final String CREATE_PAYMENT_INTERFACE = "/api/payment/create_payment"; + // 退款接口 + private static final String PAYMENT_REFUND_INTERFACE = "/api/payment/payment_refund"; + private static final String MERCHANT_PAY_INTERFACE = "/api/account/merchant_pay"; + // 接口地址 TODO + private static final String BASE_URL = ""; + // 支付宝支付渠道 + private static final String PAY_CHANNEL_ALIPAY = "alipay_qr"; + // 微信支付渠道 + private static final String PAY_CHANNEL_WECHAT = "wx_lite"; + // 微信小程序id TODO + private static final String WX_APP_ID = ""; + + /** + * 创建用户 + * + * @param memberId 用户id + * @param memberP 用户信息 + * @return boolean + * @throws Exception + */ + public static boolean createUser(String memberId, Map<String, Object> memberP) + throws Exception { + JSONObject data = new JSONObject(); + data.put("app_id", APP_ID); + data.put("member_id", memberId); + data.put("member_type", "01"); + data.put("member_p", memberP); + + JSONObject body = new JSONObject(); + body.put("merId", MER_ID); + body.put("sign", sign(JSONObject.toJSONString(data))); + body.put("reqCipher", + EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY)); + body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmssfff")); + // 发送Post请求 + logger.info("桔禾付创建用户请求体====================>{}", body.toJSONString()); + String result = sendPost(BASE_URL + CREATE_USER_INTERFACE, body); + logger.info("桔禾付创建用户请求结果====================>{}", result); + if (StringUtils.isBlank(result)) { + throw new ServiceException("请求第三方支付平台异常"); + } + JSONObject resJsonObject = JSONObject.parseObject(result); + if (resJsonObject.getString("status").equals("succeeded")) { + return true; + } else if (resJsonObject.getString("status").equals("failed")) { + throw new ServiceException(resJsonObject.getString("error_msg")); + } + return false; + } + + /** + * 创建支付订单 + * + * @param orderNo 订单号 + * @param payChannel 支付渠道 1:支付宝 2:微信 + * @param payAmt 支付金额 + * @param goodsTitle 商品标题 + * @param goodsDesc 商品描述信息,微信小程序和微信公众号该字段 最大长度 42 个字符 + * @param deviceIp 设备支付公网ip + * @param openId 微信openId + * @param notifyUrl 回调地址 + * @return JSONObject + * @throws Exception + */ + public JSONObject createPayment(String orderNo, Integer payChannel, String payAmt, + String goodsTitle, String goodsDesc, String deviceIp, String openId, + String notifyUrl) throws Exception { + JSONObject data = new JSONObject(); + JSONObject expand = new JSONObject(); + data.put("order_no", orderNo); + data.put("app_id", APP_ID); + data.put("mer_id", MER_ID); + if (payChannel == 1) { + data.put("pay_channel", PAY_CHANNEL_ALIPAY); + } else { + data.put("pay_channel", PAY_CHANNEL_WECHAT); + expand.put("open_id", openId); + expand.put("wx_app_id", WX_APP_ID); + data.put("expand", expand); + } + data.put("pay_amt", payAmt); + data.put("goods_title", goodsTitle); + data.put("goods_desc", goodsDesc); + Map<String, Object> deviceInfo = new HashMap<>(); + deviceInfo.put("device_ip", deviceIp); + data.put("device_info", deviceInfo); + data.put("notify_url", notifyUrl); + JSONObject body = new JSONObject(); + body.put("merId", MER_ID); + body.put("sign", sign(JSONObject.toJSONString(data))); + body.put("reqCipher", + EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY)); + body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmssfff")); + String result = sendPost(BASE_URL + CREATE_PAYMENT_INTERFACE, body); + JSONObject resJsonObject = JSONObject.parseObject(result); + if (resJsonObject.getString("status").equals("failed")) { + throw new ServiceException(resJsonObject.getString("error_msg")); + } + if (resJsonObject.getString("status").equals("succeeded")) { + return resJsonObject.getJSONObject("expand"); + } + return null; + } + + /** + * 申请退款 + * + * @param paymentId 支付单号 + * @param orderNo 订单号 + * @return + */ + public boolean refund(String paymentId, String orderNo) throws Exception { + JSONObject data = new JSONObject(); + data.put("payment_id", paymentId); + data.put("order_no", orderNo); + JSONObject body = new JSONObject(); + body.put("merId", MER_ID); + body.put("sign", sign(JSONObject.toJSONString(data))); + body.put("reqCipher", + EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY)); + body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmssfff")); + String result = sendPost(BASE_URL + PAYMENT_REFUND_INTERFACE, body); + JSONObject resJsonObject = JSONObject.parseObject(result); + if (resJsonObject.getString("status").equals("succeeded")) { + return true; + } else if (resJsonObject.getString("status").equals("failed")) { + throw new ServiceException(resJsonObject.getString("error_msg")); + } + return false; + } + + /** + * 商户付款 + * + * @param orderNo 订单号 + * @param payAmt 交易金额 + * @param cardName 收款银行开户名 + * @param cardId 收款银行卡号 + * @param cardType 收款银行账户类型 DEBIT_CARD:借记卡 CREDIT_CARD:贷记卡 76 QUASI_CREDIT_CARD:准贷卡 PASSBOOK:存折 + * UNIT_SETTLE_CARD:单位结算卡 PUBLIC_CARD:对公卡 + * @return + * @throws Exception + */ + public boolean merchantPay(String orderNo, String payAmt, String cardName, String cardId, + String cardType) + throws Exception { + JSONObject data = new JSONObject(); + data.put("order_no", orderNo); + data.put("pay_amt", payAmt); + data.put("card_name", cardName); + data.put("card_id", cardId); + JSONObject body = new JSONObject(); + body.put("merId", MER_ID); + body.put("sign", sign(JSONObject.toJSONString(data))); + body.put("reqCipher", + EncryptUtils.aes256ECBPkcs7PaddingEncrypt(JSONObject.toJSONString(data), AES_KEY)); + body.put("reqTime", DateUtils.dateTimeNow("yyyyMMddHHmmssfff")); + String result = sendPost(BASE_URL + MERCHANT_PAY_INTERFACE, body); + JSONObject resJsonObject = JSONObject.parseObject(result); + if (resJsonObject.getString("status").equals("succeeded")) { + return true; + } else if (resJsonObject.getString("status").equals("failed")) { + throw new ServiceException(resJsonObject.getString("error_msg")); + } + return false; + } + + /** + * 发送post请求 + * + * @param url 请求地址 + * @param body 请求体 + * @return + */ + private static String sendPost(String url, JSONObject body) { + HttpRequest post = HttpUtil.createPost(url); + Map<String, String> headers = new HashMap<>(); + headers.put("Content-type", "application/json; charset=utf-8"); + headers.put("Accept", "application/json"); + post.addHeaders(headers); + post.body(body.toJSONString()); + HttpResponse execute = post.execute(); + String result = execute.body(); + execute.close(); + if (StringUtils.isBlank(result)) { + throw new ServiceException("请求第三方支付平台异常"); + } + return result; + } + + + /** + * RSA私钥签名:签名方式SHA256WithRSA + * + * @param data 待签名字符串 + * @return 签名byte[] + * @throws Exception + */ + public static String sign(String data) { + // 先对该json对象数据按照参数字典顺序(参数名ASCII码从小到大排序,参数名区分大小写)排序生成字符串,再进行加签和验签。 + data = JSON.toJSONString(JSONObject.parseObject(data, TreeMap.class)); + + // Base64 --> Key + try { + byte[] bytes = Base64.getDecoder().decode(MERCHANT_PRIVATE_KEY); + PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); + KeyFactory keyFactory; + keyFactory = KeyFactory.getInstance("RSA"); + PrivateKey privateKey = keyFactory.generatePrivate(keySpec); + // Sign + Signature signature = Signature.getInstance("SHA256WithRSA"); + signature.initSign(privateKey); + signature.update(data.getBytes("UTF-8")); + return Base64.getEncoder().encodeToString(signature.sign()); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + +} diff --git a/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderMapper.xml b/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderMapper.xml new file mode 100644 index 0000000..494ee60 --- /dev/null +++ b/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderMapper.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.xinquan.order.mapper.OrderMapper"> + + <!-- 通用查询映射结果 --> + <resultMap id="BaseResultMap" type="com.xinquan.order.domain.Order"> + <id column="id" property="id" /> + <result column="del_flag" property="delFlag" /> + <result column="create_by" property="createBy" /> + <result column="create_time" property="createTime" /> + <result column="update_by" property="updateBy" /> + <result column="update_time" property="updateTime" /> + <result column="biz_order_no" property="bizOrderNo" /> + <result column="app_user_id" property="appUserId" /> + <result column="business_id" property="businessId" /> + <result column="order_from" property="orderFrom" /> + <result column="payment_status" property="paymentStatus" /> + <result column="total_amount" property="totalAmount" /> + <result column="real_pay_amount" property="realPayAmount" /> + <result column="commission_amount" property="commissionAmount" /> + <result column="change_price" property="changePrice" /> + <result column="change_price_time" property="changePriceTime" /> + <result column="change_price_operator" property="changePriceOperator" /> + <result column="payment_time" property="paymentTime" /> + <result column="cancel_time" property="cancelTime" /> + </resultMap> + + <!-- 通用查询结果列 --> + <sql id="Base_Column_List"> + del_flag, + create_by, + create_time, + update_by, + update_time, + id, biz_order_no, app_user_id, business_id, order_from, payment_status, total_amount, real_pay_amount, commission_amount, change_price, change_price_time, change_price_operator, payment_time, cancel_time + </sql> + +</mapper> diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml b/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderPaymentRecordMapper.xml similarity index 60% copy from xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml copy to xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderPaymentRecordMapper.xml index 141ee86..bf686e2 100644 --- a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml +++ b/xinquan-modules/xinquan-order/src/main/resources/mapper/order/OrderPaymentRecordMapper.xml @@ -1,19 +1,19 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<mapper namespace="com.xinquan.meditation.mapper.MeditationUserOperationMapper"> +<mapper namespace="com.xinquan.order.mapper.OrderPaymentRecordMapper"> <!-- 通用查询映射结果 --> - <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.MeditationUserOperation"> + <resultMap id="BaseResultMap" type="com.xinquan.order.domain.OrderPaymentRecord"> <id column="id" property="id" /> <result column="del_flag" property="delFlag" /> <result column="create_by" property="createBy" /> <result column="create_time" property="createTime" /> <result column="update_by" property="updateBy" /> <result column="update_time" property="updateTime" /> - <result column="like" property="like" /> - <result column="favorite" property="favorite" /> - <result column="meditation_id" property="meditationId" /> - <result column="app_user_id" property="appUserId" /> + <result column="order_id" property="orderId" /> + <result column="payment_type" property="paymentType" /> + <result column="pay_amount" property="payAmount" /> + <result column="pay_order_no" property="payOrderNo" /> </resultMap> <!-- 通用查询结果列 --> @@ -23,7 +23,7 @@ create_time, update_by, update_time, - id, like, favorite, meditation_id, app_user_id + id, order_id, payment_type, pay_amount, pay_order_no </sql> </mapper> diff --git a/xinquan-modules/xinquan-system/pom.xml b/xinquan-modules/xinquan-system/pom.xml index 86eae5d..7f1b048 100644 --- a/xinquan-modules/xinquan-system/pom.xml +++ b/xinquan-modules/xinquan-system/pom.xml @@ -126,19 +126,6 @@ <version>1.2.47</version> </dependency> - - <dependency> - <groupId>cn.afterturn</groupId> - <artifactId>easypoi-spring-boot-starter</artifactId> - <version>4.0.0</version> - <exclusions> - <exclusion> - <artifactId>guava</artifactId> - <groupId>com.google.guava</groupId> - </exclusion> - </exclusions> - </dependency> - <!-- <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/SysRoleController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/SysRoleController.java index 6816289..d02dd60 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/SysRoleController.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/SysRoleController.java @@ -29,7 +29,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.util.ArrayList; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; import javax.annotation.Resource; @@ -131,7 +130,7 @@ role.setMenuIds(dto.getMenuIds().toArray((new Long[dto.getMenuIds().size()]))); // 添加角色 role.setCreateBy(SecurityUtils.getUsername()); - role.setCreateTime(new Date()); + // role.setCreateTime(new Date()); roleService.insertRole(role); // ArrayList<SysRoleMenu> sysRoleMenus = new ArrayList<>(); // List<Long> menuIds = dto.getMenuIds(); @@ -235,7 +234,7 @@ } // 编辑角色 role.setUpdateBy(SecurityUtils.getUsername()); - role.setUpdateTime(new Date()); + // role.setUpdateTime(new Date()); role.setRoleId(dto.getRoleId()); roleService.updateRole(role); ArrayList<SysRoleMenu> sysRoleMenus = new ArrayList<>(); diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/SysUserController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/SysUserController.java index 8009287..61c4c5c 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/SysUserController.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/SysUserController.java @@ -28,7 +28,6 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import java.io.IOException; -import java.util.Date; import java.util.List; import java.util.Objects; import java.util.Set; @@ -167,8 +166,8 @@ user.setUserName(user.getPhonenumber()); } user.setPassword(null); - user.setUpdateBy(SecurityUtils.getUsername()); - user.setUpdateTime(new Date()); + // user.setUpdateBy(SecurityUtils.getUsername()); + // user.setUpdateTime(new Date()); return toAjax(userService.updateUser(user)); } @@ -205,8 +204,8 @@ @PostMapping("/updateSysUser") public R<Boolean> updateSysUser(@RequestBody SysUser sysUser) { try { - sysUser.setUpdateBy(SecurityUtils.getUsername()); - sysUser.setUpdateTime(new Date()); + // sysUser.setUpdateBy(SecurityUtils.getUsername()); + // sysUser.setUpdateTime(new Date()); userService.updateUser(sysUser); return R.ok(true); } catch (Exception e) { @@ -290,7 +289,7 @@ return R.fail("保存用户'" + username + "'失败,注册账号已存在"); } //添加用户 - userService.save(sysUser); + userService.registerUser(sysUser); return R.ok(sysUser); } /** diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/client/PublicController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/client/PublicController.java index a66ec85..a0ca82f 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/client/PublicController.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/client/PublicController.java @@ -1,6 +1,7 @@ package com.xinquan.system.controller.client; -import com.xinquan.common.core.web.domain.AjaxResult; +import com.xinquan.common.core.domain.R; +import com.xinquan.system.domain.vo.ContentSettingVO; import com.xinquan.system.service.PublicService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -31,8 +32,8 @@ @ApiImplicitParams({ @ApiImplicitParam(name = "key", value = "用户内容 1=用户协议 2=隐私协议 3=关于心泉 4=新手冥想指南 5=课程/冥想音频购买协议", required = true, type = "Integer", paramType = "query")}) - public AjaxResult getContent( + public R<ContentSettingVO> getContent( @RequestParam(value = "key", required = true) Integer key) { - return AjaxResult.success(publicService.getContent(key)); + return R.ok(publicService.getContent(key)); } } diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/inner/InnerBannerController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/inner/InnerBannerController.java new file mode 100644 index 0000000..9c8cee2 --- /dev/null +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/inner/InnerBannerController.java @@ -0,0 +1,40 @@ +package com.xinquan.system.controller.inner; + + +import com.xinquan.common.core.domain.R; +import com.xinquan.common.security.annotation.InnerAuth; +import com.xinquan.system.api.domain.vo.BannerVO; +import com.xinquan.system.service.BannerService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * <p> + * 轮播图控制器 + * </p> + * + * @author mitao + * @since 2024-08-21 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/inner/system/banner") +public class InnerBannerController { + + private final BannerService bannerService; + + /** + * 获取轮播图列表 + * + * @return 轮播图列表 + */ + @InnerAuth + @GetMapping("/getBannerList") + public R<List<BannerVO>> getBannerList() { + return R.ok(bannerService.getBannerList()); + } +} + diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/inner/InnerHotWordsController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/inner/InnerHotWordsController.java new file mode 100644 index 0000000..7ce0b07 --- /dev/null +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/inner/InnerHotWordsController.java @@ -0,0 +1,39 @@ +package com.xinquan.system.controller.inner; + + +import com.xinquan.common.core.domain.R; +import com.xinquan.common.security.annotation.InnerAuth; +import com.xinquan.system.service.HotWordsService; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * <p> + * 热词表 前端控制器 + * </p> + * + * @author mitao + * @since 2024-08-21 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/inner/system/hot-words") +public class InnerHotWordsController { + + private final HotWordsService hotWordsService; + + /** + * 获取热词列表 + * + * @return 热词列表 + */ + @InnerAuth + @GetMapping("/getHotWordList") + public R<List<String>> getHotWordList() { + return R.ok(hotWordsService.getHotWordList()); + } +} + diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/HotWords.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/HotWords.java index 208eefe..e9816aa 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/HotWords.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/HotWords.java @@ -1,10 +1,10 @@ package com.xinquan.system.domain; -import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; -import com.xinquan.common.core.web.domain.BaseModel; -import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.xinquan.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/SysMenus.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/SysMenus.java index 5074dbd..2e4a4df 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/SysMenus.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/SysMenus.java @@ -1,20 +1,11 @@ package com.xinquan.system.domain; -import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonFormat; import com.xinquan.common.core.web.domain.BaseEntity; import io.swagger.annotations.ApiModelProperty; -import lombok.Data; -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Size; import java.util.ArrayList; -import java.util.Date; import java.util.List; +import lombok.Data; /** * 菜单权限表 sys_menu @@ -75,26 +66,6 @@ /** 权限字符串 */ private String perms; - - /** 菜单图标 */ - private String icon; - @TableField("create_by") - private String createBy; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @TableField("create_time") - private Date createTime; - - /** 更新者 */ - @ApiModelProperty(value = "记录修改人,前端忽略") - //@JsonIgnore - @TableField("update_by") - private String updateBy; - - /** 更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @TableField("update_time") - private Date updateTime; /** 备注 */ private String remark; diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/HotWordsMapper.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/HotWordsMapper.java index 5df0dea..9226392 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/HotWordsMapper.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/HotWordsMapper.java @@ -1,7 +1,7 @@ package com.xinquan.system.mapper; -import com.xinquan.system.domain.HotWords; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xinquan.system.domain.HotWords; /** * <p> diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/BannerService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/BannerService.java index 250f87f..58a4f4d 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/BannerService.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/BannerService.java @@ -1,7 +1,9 @@ package com.xinquan.system.service; -import com.xinquan.system.domain.Banner; import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.system.api.domain.vo.BannerVO; +import com.xinquan.system.domain.Banner; +import java.util.List; /** * <p> @@ -13,4 +15,10 @@ */ public interface BannerService extends IService<Banner> { + /** + * 获取轮播图列表 + * + * @return 轮播图列表 + */ + List<BannerVO> getBannerList(); } diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/HotWordsService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/HotWordsService.java index c11a333..9f79729 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/HotWordsService.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/HotWordsService.java @@ -1,7 +1,8 @@ package com.xinquan.system.service; -import com.xinquan.system.domain.HotWords; import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.system.domain.HotWords; +import java.util.List; /** * <p> @@ -13,4 +14,10 @@ */ public interface HotWordsService extends IService<HotWords> { + /** + * 获取热词列表 + * + * @return 热词列表 + */ + List<String> getHotWordList(); } diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/BannerServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/BannerServiceImpl.java index a537def..d32f4bc 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/BannerServiceImpl.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/BannerServiceImpl.java @@ -1,9 +1,12 @@ package com.xinquan.system.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.utils.page.BeanUtils; +import com.xinquan.system.api.domain.vo.BannerVO; import com.xinquan.system.domain.Banner; import com.xinquan.system.mapper.BannerMapper; import com.xinquan.system.service.BannerService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; import org.springframework.stereotype.Service; /** @@ -17,4 +20,14 @@ @Service public class BannerServiceImpl extends ServiceImpl<BannerMapper, Banner> implements BannerService { + /** + * 获取轮播图列表 + * + * @return 轮播图列表 + */ + @Override + public List<BannerVO> getBannerList() { + List<Banner> list = this.lambdaQuery().orderByDesc(Banner::getSortNum).list(); + return BeanUtils.copyList(list, BannerVO.class); + } } diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/HotWordsServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/HotWordsServiceImpl.java index c394f6f..87ef03e 100644 --- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/HotWordsServiceImpl.java +++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/HotWordsServiceImpl.java @@ -1,9 +1,12 @@ package com.xinquan.system.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.common.core.utils.page.CollUtils; import com.xinquan.system.domain.HotWords; import com.xinquan.system.mapper.HotWordsMapper; import com.xinquan.system.service.HotWordsService; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import java.util.List; +import java.util.stream.Collectors; import org.springframework.stereotype.Service; /** @@ -17,4 +20,18 @@ @Service public class HotWordsServiceImpl extends ServiceImpl<HotWordsMapper, HotWords> implements HotWordsService { + /** + * 获取热词列表 + * + * @return 热词列表 + */ + @Override + public List<String> getHotWordList() { + List<String> hotWordList = CollUtils.emptyList(); + List<HotWords> list = this.lambdaQuery().orderByDesc(HotWords::getSortNum).list(); + if (CollUtils.isNotEmpty(list)) { + hotWordList = list.stream().map(HotWords::getWordName).collect(Collectors.toList()); + } + return hotWordList; + } } diff --git a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/SysUserMapper.xml b/xinquan-modules/xinquan-system/src/main/resources/mapper/system/SysUserMapper.xml index 4e566a3..2c6a3e6 100644 --- a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/xinquan-modules/xinquan-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -157,6 +157,7 @@ <if test="status != null and status != ''">status,</if> <if test="createBy != null and createBy != ''">create_by,</if> <if test="remark != null and remark != ''">remark,</if> + <if test="userType != null and userType != ''">user_type,</if> create_time )values( <if test="userId != null and userId != ''">#{userId},</if> @@ -171,6 +172,7 @@ <if test="status != null and status != ''">#{status},</if> <if test="createBy != null and createBy != ''">#{createBy},</if> <if test="remark != null and remark != ''">#{remark},</if> + <if test="userType != null and userType != ''">#{user_type},</if> sysdate() ) </insert> diff --git a/xinquan-modules/xinquan-user/pom.xml b/xinquan-modules/xinquan-user/pom.xml index ed9d8fc..a38d337 100644 --- a/xinquan-modules/xinquan-user/pom.xml +++ b/xinquan-modules/xinquan-user/pom.xml @@ -120,20 +120,7 @@ <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency> - - - <dependency> - <groupId>cn.afterturn</groupId> - <artifactId>easypoi-spring-boot-starter</artifactId> - <version>4.0.0</version> - <exclusions> - <exclusion> - <artifactId>guava</artifactId> - <groupId>com.google.guava</groupId> - </exclusion> - </exclusions> - </dependency> - + </dependencies> <build> diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java index 87bc14d..078516d 100644 --- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java @@ -1,8 +1,21 @@ package com.xinquan.user.controller.client; +import com.xinquan.common.core.domain.R; +import com.xinquan.user.domain.dto.UserAnswerDTO; +import com.xinquan.user.domain.vo.AppUserVO; +import com.xinquan.user.domain.vo.TagVO; +import com.xinquan.user.service.AppUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import java.util.List; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +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.RequestMapping; - import org.springframework.web.bind.annotation.RestController; /** @@ -13,9 +26,52 @@ * @author mitao * @since 2024-08-21 */ +@Api(tags = {"用户相关接口"}) +@Slf4j @RestController @RequestMapping("/client/app-user") +@RequiredArgsConstructor public class ClientAppUserController { + private final AppUserService appUserService; + + /** + * 获取当前登录用户信息 + * + * @return 用户信息 + * @see com.xinquan.user.domain.vo.AppUserVO + */ + @PostMapping("/getCurrentUser") + @ApiOperation(value = "获取当前用户信息", tags = {"用户端-用户信息相关接口"}) + public R<AppUserVO> getCurrentUser() { + return R.ok(appUserService.getCurrentUser()); + } + + /** + * 获取问题二的标签列表 + * + * @return List<TagVO> + */ + @GetMapping("/getTagList") + @ApiOperation(value = "问题二获取用户标签列表", tags = {"用户端-计划引导相关接口"}) + public R<List<TagVO>> getTagList() { + List<TagVO> voList = appUserService.getTagList(); + return R.ok(voList); + } + + /** + * 保存计划引导页用户的答案 + * + * @param dto 用户计划引导答案数据传输对象 + * @return + */ + @PostMapping("/saveUserAnswers") + @ApiOperation(value = "保存计划引导页用户的答案", tags = {"用户端-计划引导相关接口"}) + public R<?> saveUserAnswers(@Validated @RequestBody UserAnswerDTO dto) { + appUserService.saveUserAnswers(dto); + return R.ok(); + } + + } diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserViewingHistoryController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserViewingHistoryController.java new file mode 100644 index 0000000..239e7e4 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserViewingHistoryController.java @@ -0,0 +1,50 @@ +package com.xinquan.user.controller.client; + + +import com.xinquan.common.core.domain.R; +import com.xinquan.user.service.AppUserViewingHistoryService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * <p> + * 用户观看历史 前端控制器 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +@Api(tags = {"用户端-观看历史相关接口"}) +@RestController +@RequiredArgsConstructor +@RequestMapping("/user/app-user-viewing-history") +public class ClientAppUserViewingHistoryController { + + private final AppUserViewingHistoryService appUserViewingHistoryService; + + /** + * 记录用户观看记录 + * + * @param bizId 业务id + * @param viewingType 观看类型 1=疗愈 2=课程 + */ + @PostMapping("/saveViewingHistory") + @ApiOperation(value = "记录用户观看记录", tags = {"用户端-用户相关接口"}) + @ApiImplicitParams({ + @ApiImplicitParam(name = "bizId", value = "业务id", dataType = "Long", required = true), + @ApiImplicitParam(name = "viewingType", value = "观看类型 1=疗愈 2=课程", dataType = "Integer", required = true) + }) + public R<?> saveViewingRecord(@RequestParam("bizId") Long bizId, + @RequestParam("viewingType") Integer viewingType) { + appUserViewingHistoryService.saveViewingRecord(bizId, viewingType); + return R.ok(); + } +} + diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java index 34b057a..cb76bbc 100644 --- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java @@ -3,14 +3,14 @@ import com.xinquan.common.core.domain.R; import com.xinquan.common.security.annotation.InnerAuth; import com.xinquan.system.api.model.AppCaptchaBody; +import com.xinquan.system.api.model.AppLoginUser; import com.xinquan.system.api.model.AppVerifyCellPhoneBody; import com.xinquan.system.api.model.AppWXLoginBody; -import com.xinquan.system.api.model.AppleLoginUser; -import com.xinquan.system.api.model.LoginUser; -import com.xinquan.system.api.model.WXLoginUser; import com.xinquan.user.api.domain.AppUser; import com.xinquan.user.api.domain.dto.AppUserDTO; import com.xinquan.user.service.AppUserService; +import java.util.Collection; +import java.util.List; import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -50,7 +50,7 @@ */ @InnerAuth @PostMapping("/registerAppUser") - R<Boolean> registerAppUser(@RequestBody AppUserDTO appUserDTO){ + R<AppUser> registerAppUser(@RequestBody AppUserDTO appUserDTO) { return R.ok(appUserService.registerAppUser(appUserDTO)); } @@ -62,7 +62,7 @@ */ @InnerAuth @PostMapping("/wxLogin") - R<WXLoginUser> wxLogin(@RequestBody AppWXLoginBody body) { + R<AppLoginUser> wxLogin(@RequestBody AppWXLoginBody body) { return R.ok(appUserService.wxLogin(body)); } @@ -75,7 +75,7 @@ */ @InnerAuth @PostMapping("/appleLogin") - R<AppleLoginUser> appleLogin(@RequestParam("appleId") String appleId) { + R<AppLoginUser> appleLogin(@RequestParam("appleId") String appleId) { return R.ok(appUserService.appleLogin(appleId)); } @@ -87,7 +87,7 @@ */ @InnerAuth @PostMapping("/captchaLogin") - R<LoginUser> appCaptchaLogin(@RequestBody AppCaptchaBody body) { + R<AppLoginUser> appCaptchaLogin(@RequestBody AppCaptchaBody body) { return R.ok(appUserService.appCaptchaLogin(body)); } @@ -99,7 +99,32 @@ */ @InnerAuth @PostMapping("/verifyCellPhone") - R<WXLoginUser> verifyCellPhone(@RequestBody AppVerifyCellPhoneBody body) { + R<AppLoginUser> verifyCellPhone(@RequestBody AppVerifyCellPhoneBody body) { return R.ok(appUserService.verifyCellPhone(body)); } + + /** + * 更新APP用户信息 + * + * @param dto APP用户数据传输对象 + */ + @InnerAuth + @PostMapping("/updateAppUser") + R<?> updateAppUser(@RequestBody AppUserDTO dto) { + appUserService.updateAppUser(dto); + return R.ok(); + } + + /** + * 获取用户列表 + * + * @param appUserIdSet 用户id列表 + * @param source 请求来源 + * @return + */ + @InnerAuth + @PostMapping("/getAppUserList") + R<List<AppUser>> getAppUserList(@RequestBody Collection<Long> appUserIdSet) { + return R.ok(appUserService.listByIds(appUserIdSet)); + } } diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserViewingHistoryController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserViewingHistoryController.java new file mode 100644 index 0000000..baced21 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/management/MgtAppUserViewingHistoryController.java @@ -0,0 +1,20 @@ +package com.xinquan.user.controller.management; + + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * <p> + * 用户观看历史 前端控制器 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +@RestController +@RequestMapping("/user/app-user-viewing-history") +public class MgtAppUserViewingHistoryController { + +} + diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java index fc5627e..a2eefd8 100644 --- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java @@ -1,9 +1,9 @@ package com.xinquan.user.domain; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.xinquan.common.core.web.domain.BaseModel; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -35,7 +35,11 @@ @ApiModelProperty(value = "回答 1:是2:否3:偶尔有") @TableField("answer") - private Integer answer; + private String answer; + + @ApiModelProperty(value = "用户id") + @TableField("app_user_id") + private Long appUserId; } diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserViewingHistory.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserViewingHistory.java new file mode 100644 index 0000000..450c55a --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserViewingHistory.java @@ -0,0 +1,45 @@ +package com.xinquan.user.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.xinquan.common.core.web.domain.BaseModel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * <p> + * 用户观看历史 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("t_app_user_viewing_history") +@ApiModel(value = "AppUserViewingHistory对象", description = "用户观看历史") +public class AppUserViewingHistory extends BaseModel { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "用户树苗id") + @TableId("id") + private Long id; + + @ApiModelProperty(value = "用户id") + @TableField("app_user_id") + private Long appUserId; + + @ApiModelProperty(value = "业务id ") + @TableField("biz_id") + private Long bizId; + + @ApiModelProperty(value = "观看类型 1:疗愈 2:课程") + @TableField("viewing_type") + private Integer viewingType; + + +} diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java index 9e17342..243913e 100644 --- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java @@ -30,6 +30,10 @@ @TableId(value = "id", type = IdType.AUTO) private Long id; + @ApiModelProperty(value = "标签类型") + @TableField(value = "tag_type") + private Integer tagType; + @ApiModelProperty(value = "标签名称") @TableField("tag_name") private String tagName; diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/dto/UserAnswerDTO.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/dto/UserAnswerDTO.java new file mode 100644 index 0000000..adf800b --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/dto/UserAnswerDTO.java @@ -0,0 +1,29 @@ +package com.xinquan.user.domain.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import lombok.Data; + +/** + * @author mitao + * @date 2024/8/27 + */ +@Data +@ApiModel("用户计划引导答案数据传输对象") +public class UserAnswerDTO implements Serializable { + + private static final long serialVersionUID = -5037991196273819118L; + @Valid + @ApiModelProperty(value = "问题一答案", required = true) + @NotEmpty(message = "问题一答案不能为空") + private List<UserAnswerOneDTO> userAnswerOneDTOList; + + @ApiModelProperty(value = "问题二 多个tagId使用英文逗号拼接字符串", required = true) + @NotBlank(message = "问题二答案不能为空") + private String tagIds; +} diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/dto/UserAnswerOneDTO.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/dto/UserAnswerOneDTO.java new file mode 100644 index 0000000..1135a99 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/dto/UserAnswerOneDTO.java @@ -0,0 +1,27 @@ +package com.xinquan.user.domain.dto; + +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author mitao + * @date 2024/8/28 + */ +@Data +public class UserAnswerOneDTO implements Serializable { + + private static final long serialVersionUID = -8938108350024740351L; + + @ApiModelProperty("问题一 问题类型 1:您是否内心纠结敏感多疑?2:您是否辗转反侧彻夜难眠?3:您是否情绪失控暴躁易怒?" + + "4:您是否沉迷情感倍受伤害?5:您是否人生迷茫踌躇彷徨?6:其它补充说明") + @NotNull(message = "问题类型不能为空") + private Integer type; + + @ApiModelProperty("问题一 答案 1:是2:否3:偶尔,其他补充说明") + @NotBlank(message = "答案不能为空") + private String answer; + +} diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/AppUserVO.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/AppUserVO.java new file mode 100644 index 0000000..00efba7 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/AppUserVO.java @@ -0,0 +1,109 @@ +package com.xinquan.user.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/7 + */ +@Data +@ApiModel(value = "用户信息VO") +public class AppUserVO implements Serializable { + + private static final long serialVersionUID = -6948932379350815750L; + + @ApiModelProperty(value = "App用户id") + private Long id; + + @ApiModelProperty(value = "系统用户id") + private Long userId; + + @ApiModelProperty(value = "手机号码") + private String cellPhone; + + @ApiModelProperty(value = "苹果授权登录唯一标识") + private String appleId; + + @ApiModelProperty(value = "微信openId") + private String wxOpenId; + + @ApiModelProperty(value = "头像") + private String avatar; + + @ApiModelProperty(value = "昵称") + private String nickname; + + @ApiModelProperty(value = "签名") + private String signature; + + @ApiModelProperty(value = "性别 1=男 2=女 3=保密") + private Integer gender; + + @ApiModelProperty(value = "生日") + private String birthday; + + @ApiModelProperty(value = "学历") + private String education; + + @ApiModelProperty(value = "行业") + private String industry; + + @ApiModelProperty(value = "公司") + private String company; + + @ApiModelProperty(value = "职业") + private String occupation; + + @ApiModelProperty(value = "所在地") + private String location; + + @ApiModelProperty(value = "故乡") + private String hometown; + + @ApiModelProperty(value = "邮箱") + private String email; + + @ApiModelProperty(value = "会员到期时间") + private LocalDateTime vipExpireTime; + + @ApiModelProperty(value = "用户状态 1=正常 2=冻结 3=注销") + private Integer userStatus; + + @ApiModelProperty(value = "冻结原因") + private String freezingReason; + + @ApiModelProperty(value = "冻结操作人") + private String freezingOperator; + + @ApiModelProperty(value = "梵文权限 1=是 2否") + private Integer sanskritFlag; + + @ApiModelProperty(value = "邀请人id") + private Long inviteUserId; + + @ApiModelProperty(value = "余额") + private BigDecimal balance; + + @ApiModelProperty(value = "收益") + private BigDecimal income; + + @ApiModelProperty(value = "当前累计能量值") + private Integer totalEnergyValue; + + @ApiModelProperty(value = "注册时间") + private LocalDateTime registerTime; + + @ApiModelProperty(value = "注销时间") + private LocalDateTime logoutTime; + + @ApiModelProperty(value = "用户等级id") + private Integer levelSettingId; + + @ApiModelProperty(value = "标签id,多个id使用英文逗号拼接") + private String tagId; +} diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/TagVO.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/TagVO.java new file mode 100644 index 0000000..6440cce --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/TagVO.java @@ -0,0 +1,20 @@ +package com.xinquan.user.domain.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author mitao + * @date 2024/9/4 + */ +@Data +@ApiModel("问题二用户标签视图对象") +public class TagVO { + + @ApiModelProperty(value = "标签id") + private Long id; + + @ApiModelProperty(value = "标签名称") + private String tagName; +} diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserViewingHistoryMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserViewingHistoryMapper.java new file mode 100644 index 0000000..baf0ca0 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserViewingHistoryMapper.java @@ -0,0 +1,16 @@ +package com.xinquan.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xinquan.user.domain.AppUserViewingHistory; + +/** + * <p> + * 用户观看历史 Mapper 接口 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +public interface AppUserViewingHistoryMapper extends BaseMapper<AppUserViewingHistory> { + +} diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java index 31bd3b1..7e3ea26 100644 --- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java @@ -2,13 +2,15 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.xinquan.system.api.model.AppCaptchaBody; +import com.xinquan.system.api.model.AppLoginUser; import com.xinquan.system.api.model.AppVerifyCellPhoneBody; import com.xinquan.system.api.model.AppWXLoginBody; -import com.xinquan.system.api.model.AppleLoginUser; -import com.xinquan.system.api.model.LoginUser; -import com.xinquan.system.api.model.WXLoginUser; import com.xinquan.user.api.domain.AppUser; import com.xinquan.user.api.domain.dto.AppUserDTO; +import com.xinquan.user.domain.dto.UserAnswerDTO; +import com.xinquan.user.domain.vo.AppUserVO; +import com.xinquan.user.domain.vo.TagVO; +import java.util.List; import java.util.Optional; /** @@ -33,7 +35,7 @@ * @param appUserDTO * @return */ - Boolean registerAppUser(AppUserDTO appUserDTO); + AppUser registerAppUser(AppUserDTO appUserDTO); /** * APP微信登录 @@ -41,7 +43,7 @@ * @param body * @return */ - WXLoginUser wxLogin(AppWXLoginBody body); + AppLoginUser wxLogin(AppWXLoginBody body); /** * 苹果登录 @@ -50,7 +52,7 @@ * @param source * @return */ - AppleLoginUser appleLogin(String appleId); + AppLoginUser appleLogin(String appleId); /** * 验证码登录 @@ -58,7 +60,7 @@ * @param body * @return */ - LoginUser appCaptchaLogin(AppCaptchaBody body); + AppLoginUser appCaptchaLogin(AppCaptchaBody body); /** * 微信苹果登录验证手机号码操作 @@ -66,5 +68,34 @@ * @param body * @return */ - WXLoginUser verifyCellPhone(AppVerifyCellPhoneBody body); + AppLoginUser verifyCellPhone(AppVerifyCellPhoneBody body); + + /** + * 保存计划引导页用户的答案 + * + * @param dto 用户计划引导答案数据传输对象 + */ + void saveUserAnswers(UserAnswerDTO dto); + + /** + * 获取问题二的标签列表 + * + * @return List<TagVO> + */ + List<TagVO> getTagList(); + + /** + * 更新APP用户信息 + * + * @param dto APP用户数据传输对象 + */ + void updateAppUser(AppUserDTO dto); + + /** + * 获取当前登录用户信息 + * + * @return 用户信息 + * @see com.xinquan.user.domain.vo.AppUserVO + */ + AppUserVO getCurrentUser(); } diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserViewingHistoryService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserViewingHistoryService.java new file mode 100644 index 0000000..92b8fe5 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserViewingHistoryService.java @@ -0,0 +1,23 @@ +package com.xinquan.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.xinquan.user.domain.AppUserViewingHistory; + +/** + * <p> + * 用户观看历史 服务类 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +public interface AppUserViewingHistoryService extends IService<AppUserViewingHistory> { + + /** + * 记录用户观看记录 + * + * @param bizId 业务id + * @param viewingType 观看类型 1=疗愈 2=课程 + */ + void saveViewingRecord(Long bizId, Integer viewingType); +} diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java index 46fd4ce..09bad30 100644 --- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java @@ -1,36 +1,48 @@ package com.xinquan.user.service.impl; import cn.hutool.core.util.IdUtil; +import cn.hutool.crypto.SecureUtil; import com.alibaba.nacos.common.utils.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xinquan.common.core.constant.Constants; import com.xinquan.common.core.constant.SecurityConstants; import com.xinquan.common.core.domain.R; +import com.xinquan.common.core.enums.AnswerTagEnum; import com.xinquan.common.core.enums.AppUserStatusEnum; import com.xinquan.common.core.enums.DisabledEnum; import com.xinquan.common.core.enums.TreeLevelEnum; import com.xinquan.common.core.exception.ServiceException; import com.xinquan.common.core.utils.page.BeanUtils; +import com.xinquan.common.core.utils.page.CollUtils; import com.xinquan.common.security.utils.SecurityUtils; import com.xinquan.system.api.RemoteUserService; import com.xinquan.system.api.domain.SysUser; import com.xinquan.system.api.feignClient.SysUserClient; import com.xinquan.system.api.model.AppCaptchaBody; +import com.xinquan.system.api.model.AppLoginUser; import com.xinquan.system.api.model.AppVerifyCellPhoneBody; import com.xinquan.system.api.model.AppWXLoginBody; -import com.xinquan.system.api.model.AppleLoginUser; -import com.xinquan.system.api.model.LoginUser; -import com.xinquan.system.api.model.WXLoginUser; import com.xinquan.user.api.domain.AppUser; import com.xinquan.user.api.domain.dto.AppUserDTO; +import com.xinquan.user.domain.AppUserQuestion; import com.xinquan.user.domain.AppUserTree; +import com.xinquan.user.domain.Tag; +import com.xinquan.user.domain.dto.UserAnswerDTO; +import com.xinquan.user.domain.vo.AppUserVO; +import com.xinquan.user.domain.vo.TagVO; import com.xinquan.user.mapper.AppUserMapper; +import com.xinquan.user.service.AppUserQuestionService; import com.xinquan.user.service.AppUserService; import com.xinquan.user.service.AppUserTreeService; +import com.xinquan.user.service.TagService; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Optional; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -50,6 +62,8 @@ private final SysUserClient sysUserClient; private final RemoteUserService remoteUserService; private final AppUserTreeService appUserTreeService; + private final AppUserQuestionService appUserQuestionService; + private final TagService tagService; /** * 获取用户信息 * @@ -74,9 +88,10 @@ * @return */ @Override - public Boolean registerAppUser(AppUserDTO appUserDTO) { + public AppUser registerAppUser(AppUserDTO appUserDTO) { AppUser appUser = BeanUtils.copyBean(appUserDTO, AppUser.class); - return this.save(appUser); + this.save(appUser); + return appUser; } /** @@ -86,33 +101,34 @@ * @return */ @Override - public WXLoginUser wxLogin(AppWXLoginBody body) { - WXLoginUser wxLoginUser = new WXLoginUser(); + public AppLoginUser wxLogin(AppWXLoginBody body) { + AppLoginUser appLoginUser = new AppLoginUser(); Optional<AppUser> optionalAppUser = this.getUserByCondition( AppUserDTO.builder().wxOpenId(body.getWxOpenId()).build()); + AppUser appUser; + SysUser sysUser; // 存在账户,查询关联系统用户 if (optionalAppUser.isPresent()) { - AppUser appUser = optionalAppUser.get(); - SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); - wxLoginUser.setSysUser(sysUser); - if (Objects.nonNull(sysUser.getUserName())) { - wxLoginUser.setBindStatus(1); - wxLoginUser.setCellPhone(appUser.getCellPhone()); + appUser = optionalAppUser.get(); + if (appUser.getUserStatus().equals(AppUserStatusEnum.FROZEN.getCode())) { + throw new ServiceException("账号已被冻结"); } + sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); } else { // 不存在账户,创建账户 // 注册用户信息 - SysUser sysUser = new SysUser(); + sysUser = new SysUser(); sysUser.setNickName(body.getNickname()); sysUser.setAvatar(body.getHeadImgUrl()); - + sysUser.setUserName(body.getNickname()); + sysUser.setUserType("01"); // app用户 R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser, SecurityConstants.INNER); if (registerResult.getCode() == Constants.FAIL) { throw new ServiceException(registerResult.getMsg()); } SysUser sysUserRes = registerResult.getData(); - AppUser appUser = new AppUser(); + appUser = new AppUser(); appUser.setUserId(sysUserRes.getUserId()); appUser.setWxOpenId(body.getWxOpenId()); appUser.setNickname(body.getNickname()); @@ -128,41 +144,45 @@ this.save(appUser); // 初始化用户树苗 initUserTree(appUser.getId()); - wxLoginUser.setSysUser(null); - wxLoginUser.setBindStatus(DisabledEnum.NO.getCode()); } - return wxLoginUser; + appLoginUser.setUserid(sysUser.getUserId()); + appLoginUser.setUsername(appUser.getNickname()); + appLoginUser.setAppUserId(appUser.getId()); + appLoginUser.setSysUser(sysUser); + if (Objects.nonNull(sysUser.getUserName())) { + appLoginUser.setBindStatus(DisabledEnum.YES.getCode()); + appLoginUser.setCellPhone(appUser.getCellPhone()); + } + return appLoginUser; } @Override - public AppleLoginUser appleLogin(String appleId) { - AppleLoginUser appleLoginUser = new AppleLoginUser(); + public AppLoginUser appleLogin(String appleId) { + AppLoginUser appLoginUser = new AppLoginUser(); Optional<AppUser> optionalAppUser = this.getUserByCondition( AppUserDTO.builder().appleId(appleId).build()); + SysUser sysUser; + AppUser appUser; // 存在账户,查询关联系统用户 if (optionalAppUser.isPresent()) { - AppUser appUser = optionalAppUser.get(); - SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); - appleLoginUser.setSysUser(sysUser); - if (Objects.nonNull(sysUser.getUserName())) { - appleLoginUser.setBindStatus(1); - appleLoginUser.setCellPhone(appUser.getCellPhone()); - } + appUser = optionalAppUser.get(); + sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); } else { // 不存在账户,创建账户 // 注册用户信息 - SysUser sysUser = new SysUser(); + sysUser = new SysUser(); String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6); sysUser.setNickName(nickname); sysUser.setAvatar("qwer"); - + sysUser.setUserName(nickname); + sysUser.setUserType("01"); // app用户 R<SysUser> registerResult = remoteUserService.registerAppUserInfo(sysUser, SecurityConstants.INNER); if (registerResult.getCode() == Constants.FAIL) { throw new ServiceException(registerResult.getMsg()); } SysUser sysUserRes = registerResult.getData(); - AppUser appUser = new AppUser(); + appUser = new AppUser(); appUser.setUserId(sysUserRes.getUserId()); appUser.setNickname(nickname); appUser.setAvatar("qwer"); // TODO 待完善默认头像 @@ -176,11 +196,16 @@ this.save(appUser); // 初始化用户树苗 initUserTree(appUser.getId()); - appleLoginUser.setSysUser(null); - appleLoginUser.setBindStatus(DisabledEnum.NO.getCode()); } - - return appleLoginUser; + appLoginUser.setUserid(sysUser.getUserId()); + appLoginUser.setUsername(appUser.getNickname()); + appLoginUser.setAppUserId(appUser.getId()); + appLoginUser.setSysUser(sysUser); + if (Objects.nonNull(sysUser.getUserName())) { + appLoginUser.setBindStatus(DisabledEnum.YES.getCode()); + appLoginUser.setCellPhone(appUser.getCellPhone()); + } + return appLoginUser; } /** @@ -191,21 +216,23 @@ */ @Override @Transactional(rollbackFor = Exception.class) - public LoginUser appCaptchaLogin(AppCaptchaBody body) { - LoginUser loginUser = new LoginUser(); + public AppLoginUser appCaptchaLogin(AppCaptchaBody body) { + AppLoginUser appLoginUser = new AppLoginUser(); Optional<AppUser> optionalAppUser = this.getUserByCondition( AppUserDTO.builder().cellPhone(body.getCellPhone()).build()); + AppUser appUser; + SysUser sysUser; if (optionalAppUser.isPresent()) { - AppUser appUser = optionalAppUser.get(); - SysUser sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); - loginUser.setSysUser(sysUser); + appUser = optionalAppUser.get(); + sysUser = sysUserClient.getSysUser(appUser.getUserId()).getData(); } else { // 注册用户信息 - SysUser sysUser = new SysUser(); + sysUser = new SysUser(); String nickname = "用户" + IdUtil.fastSimpleUUID().substring(0, 6); sysUser.setNickName(nickname); sysUser.setAvatar("qwer"); sysUser.setUserName(body.getCellPhone()); + sysUser.setUserType("01"); // app用户 // 设置默认密码123456 sysUser.setPassword(SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD)); @@ -215,7 +242,7 @@ throw new ServiceException(registerResult.getMsg()); } SysUser sysUserRes = registerResult.getData(); - AppUser appUser = new AppUser(); + appUser = new AppUser(); appUser.setUserId(sysUserRes.getUserId()); appUser.setNickname(nickname); appUser.setCellPhone(body.getCellPhone()); @@ -230,8 +257,14 @@ this.save(appUser); // 初始化用户树苗 initUserTree(appUser.getId()); + } - return loginUser; + appLoginUser.setUserid(sysUser.getUserId()); + appLoginUser.setUsername(appUser.getNickname()); + appLoginUser.setAppUserId(appUser.getId()); + appLoginUser.setSysUser(sysUser); + appLoginUser.setCellPhone(appUser.getCellPhone()); + return appLoginUser; } /** @@ -256,7 +289,7 @@ * @return */ @Override - public WXLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) { + public AppLoginUser verifyCellPhone(AppVerifyCellPhoneBody body) { Integer loginType = body.getLoginType(); String wxOrAppleId = body.getWxOrAppleId(); SysUser sysUser; @@ -296,29 +329,21 @@ } sysUser.setUserName(body.getCellPhone()); sysUser.setPassword( - SecurityUtils.encryptPassword(Constants.DEFAULT_PASSWORD)); // 默认密码为123456 + SecurityUtils.encryptPassword( + SecureUtil.md5(Constants.DEFAULT_PASSWORD).toUpperCase( + Locale.ROOT))) + ; // 默认密码为123456 sysUser.setPhonenumber(body.getCellPhone()); sysUserClient.updateSysUser(sysUser); } // 更新用户信息 this.updateById(appUser); - if (loginType.equals(1)) { - // 微信登录 - WXLoginUser wxLoginUser = new WXLoginUser(); - wxLoginUser.setBindStatus(1); - wxLoginUser.setCellPhone(body.getCellPhone()); - wxLoginUser.setSysUser(sysUser); - return wxLoginUser; - } else { - // 苹果登录 - AppleLoginUser appleLoginUser = new AppleLoginUser(); - appleLoginUser.setBindStatus(1); - appleLoginUser.setCellPhone(body.getCellPhone()); - appleLoginUser.setSysUser(sysUser); - return appleLoginUser; - } + AppLoginUser appLoginUser = new AppLoginUser(); + appLoginUser.setBindStatus(1); + appLoginUser.setCellPhone(body.getCellPhone()); + appLoginUser.setSysUser(sysUser); + return appLoginUser; } - // 定义一个方法来处理用户不存在的情况 private void handleUserNotPresent(Optional<AppUser> userOptional, String errorMessage) { if (!userOptional.isPresent()) { @@ -337,7 +362,104 @@ return this.lambdaQuery() .eq(loginType.equals(1), AppUser::getWxOpenId, wxOrAppleId) .eq(loginType.equals(2), AppUser::getAppleId, wxOrAppleId) - .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT) + .ne(AppUser::getUserStatus, AppUserStatusEnum.LOGOUT.getCode()) .oneOpt(); } + + /** + * 保存计划引导页用户的答案 + * + * @param dto 用户计划引导答案数据传输对象 + */ + @Override + public void saveUserAnswers(UserAnswerDTO dto) { + // 获取当前登录用户 + Long userId = SecurityUtils.getUserId(); + AppUser appUser = this.getUserBySysUserId(userId); + List<AppUserQuestion> appUserQuestionList = BeanUtils.copyList( + dto.getUserAnswerOneDTOList(), AppUserQuestion.class); + // 查询用户已填写的答案 + List<AppUserQuestion> baseAppUserQuestionList = appUserQuestionService.lambdaQuery() + .eq(AppUserQuestion::getAppUserId, appUser.getUserId()) + .list(); + if (CollUtils.isNotEmpty(baseAppUserQuestionList)) { + // 根据类型更新答案 + for (AppUserQuestion appUserQuestion : appUserQuestionList) { + Optional<AppUserQuestion> baseAppUserQuestionOptional = baseAppUserQuestionList.stream() + .filter(baseAppUserQuestion -> baseAppUserQuestion.getType() + .equals(appUserQuestion.getType())).findFirst(); + baseAppUserQuestionOptional.ifPresent( + userQuestion -> appUserQuestion.setId(userQuestion.getId())); + } + } + appUserQuestionService.saveOrUpdateBatch(appUserQuestionList); + // 筛选答案为是和偶尔有的问题,为用户设置对应的标签 + List<AppUserQuestion> appUserQuestionYesList = appUserQuestionList.stream() + .filter(appUserQuestion -> appUserQuestion.getAnswer().equals("1") + || appUserQuestion.getAnswer().equals("3")).collect(Collectors.toList()); + StringBuilder sb = new StringBuilder(); + // 使用 StringBuilder 提高字符串拼接效率 + if (CollUtils.isNotEmpty(appUserQuestionYesList)) { + List<Long> tagIdList = appUserQuestionYesList.stream() + .map(appUserQuestion -> AnswerTagEnum.getEnumByCode(appUserQuestion.getType()) + .getTagId()).collect(Collectors.toList()); + if (CollUtils.isNotEmpty(tagIdList)) { + sb.append(CollUtils.join(tagIdList, ",")); + } + } + sb.append(","); + sb.append(dto.getTagIds()); + appUser.setTagId(sb.toString()); + this.updateById(appUser); + } + + /** + * 获取AppUser + * + * @param userId 系统用户userId + * @return AppUser + */ + private AppUser getUserBySysUserId(Long userId) { + Optional<AppUser> appUserOptional = this.lambdaQuery().eq(AppUser::getUserId, userId) + .oneOpt(); + if (!appUserOptional.isPresent()) { + throw new ServiceException("获取用户信息失败,请重新登录"); + } + return appUserOptional.get(); + } + + /** + * 获取问题二的标签列表 + * + * @return List<TagVO> + */ + @Override + public List<TagVO> getTagList() { + List<Tag> list = tagService.list(Wrappers.lambdaQuery(Tag.class).eq(Tag::getTagType, 2)); + return BeanUtils.copyList(list, TagVO.class); + } + + /** + * 更新APP用户信息 + * + * @param dto APP用户数据传输对象 + */ + @Override + public void updateAppUser(AppUserDTO dto) { + // 拷贝数据 + AppUser appUser = BeanUtils.copyBean(dto, AppUser.class); + this.updateById(appUser); + } + + /** + * 获取当前登录用户信息 + * + * @return 用户信息 + * @see com.xinquan.user.domain.vo.AppUserVO + */ + @Override + public AppUserVO getCurrentUser() { + AppUser appUser = this.getById(SecurityUtils.getUserId()); + return BeanUtils.copyBean(appUser, AppUserVO.class); + } } diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserViewingHistoryServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserViewingHistoryServiceImpl.java new file mode 100644 index 0000000..fa9b192 --- /dev/null +++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserViewingHistoryServiceImpl.java @@ -0,0 +1,35 @@ +package com.xinquan.user.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xinquan.user.domain.AppUserViewingHistory; +import com.xinquan.user.mapper.AppUserViewingHistoryMapper; +import com.xinquan.user.service.AppUserViewingHistoryService; +import org.springframework.stereotype.Service; + +/** + * <p> + * 用户观看历史 服务实现类 + * </p> + * + * @author mitao + * @since 2024-09-06 + */ +@Service +public class AppUserViewingHistoryServiceImpl extends + ServiceImpl<AppUserViewingHistoryMapper, AppUserViewingHistory> implements + AppUserViewingHistoryService { + + /** + * 记录用户观看记录 + * + * @param bizId 业务id + * @param viewingType 观看类型 1=疗愈 2=课程 + */ + @Override + public void saveViewingRecord(Long bizId, Integer viewingType) { + AppUserViewingHistory appUserViewingHistory = new AppUserViewingHistory(); + appUserViewingHistory.setBizId(bizId); + appUserViewingHistory.setViewingType(viewingType); + this.save(appUserViewingHistory); + } +} diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMapper.xml index af1bac2..0e976a7 100644 --- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMapper.xml +++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMapper.xml @@ -38,6 +38,7 @@ <result column="register_time" property="registerTime" /> <result column="logout_time" property="logoutTime" /> <result column="level_setting_id" property="levelSettingId" /> + <result column="tag_id" property="tagId"/> </resultMap> <!-- 通用查询结果列 --> @@ -47,7 +48,7 @@ create_time, update_by, update_time, - id, user_id, cell_phone, apple_id, open_id, avatar, nickname, signature, gender, birthday, education, industry, company, occupation, location, hometown, email, vip_expire_time, user_status, freezing_reason, freezing_operator, sanskrit_flag, invite_user_id, balance, total_energy_value, register_time, logout_time, level_setting_id + id, user_id, cell_phone, apple_id, open_id, avatar, nickname, signature, gender, birthday, education, industry, company, occupation, location, hometown, email, vip_expire_time, user_status, freezing_reason, freezing_operator, sanskrit_flag, invite_user_id, balance, total_energy_value, register_time, logout_time, level_setting_id,tag_id </sql> </mapper> diff --git a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserViewingHistoryMapper.xml similarity index 65% rename from xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml rename to xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserViewingHistoryMapper.xml index 141ee86..60b7b98 100644 --- a/xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationUserOperationMapper.xml +++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserViewingHistoryMapper.xml @@ -1,19 +1,18 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> -<mapper namespace="com.xinquan.meditation.mapper.MeditationUserOperationMapper"> +<mapper namespace="com.xinquan.user.mapper.AppUserViewingHistoryMapper"> <!-- 通用查询映射结果 --> - <resultMap id="BaseResultMap" type="com.xinquan.meditation.domain.MeditationUserOperation"> + <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserViewingHistory"> <id column="id" property="id" /> <result column="del_flag" property="delFlag" /> <result column="create_by" property="createBy" /> <result column="create_time" property="createTime" /> <result column="update_by" property="updateBy" /> <result column="update_time" property="updateTime" /> - <result column="like" property="like" /> - <result column="favorite" property="favorite" /> - <result column="meditation_id" property="meditationId" /> <result column="app_user_id" property="appUserId" /> + <result column="biz_id" property="bizId" /> + <result column="viewing_type" property="viewingType" /> </resultMap> <!-- 通用查询结果列 --> @@ -23,7 +22,7 @@ create_time, update_by, update_time, - id, like, favorite, meditation_id, app_user_id + id, app_user_id, biz_id, viewing_type </sql> </mapper> diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/TagMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/TagMapper.xml index 0601037..43eac87 100644 --- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/TagMapper.xml +++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/TagMapper.xml @@ -5,6 +5,7 @@ <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.xinquan.user.domain.Tag"> <id column="id" property="id" /> + <id column="tag_type" property="tagType"/> <result column="del_flag" property="delFlag" /> <result column="create_by" property="createBy" /> <result column="create_time" property="createTime" /> @@ -20,7 +21,7 @@ create_time, update_by, update_time, - id, tag_name + id, tag_name,tag_type </sql> </mapper> -- Gitblit v1.7.1