From 3f481005be717250a2ea87ff9367aa84d6a3eb13 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期六, 14 九月 2024 10:55:52 +0800
Subject: [PATCH] 课程代码

---
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java                          |    1 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/Tag.java                                       |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserWalletRecordServiceImpl.java              |    2 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserWithdrawMapper.xml                                     |    2 
 xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java                                                  |    2 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationHall.java                        |    5 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/EnergyDetailVO.java                                 |   34 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserService.java                                   |    9 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/UserLevelSettingController.java                |   23 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserViewingHistoryController.java  |  199 ++++
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/inner/InnerAppUserController.java                  |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserBankServiceImpl.java                      |    2 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserTree.java                               |   23 
 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseController.java             |  207 ++++
 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java                          |    2 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserCourse.java                             |   15 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/mapper/MeditationMapper.java                      |    8 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/UserLevelSettingMapper.java                        |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/PrizeRedemptionRecordMapper.java                       |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/PrizeServiceImpl.java                            |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserCourseService.java                             |    2 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserBankMapper.xml                                         |    2 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/impl/MeditationServiceImpl.java           |   23 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserViewingHistoryMapper.xml                               |   29 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserWalletRecord.java                       |    2 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserEnergyRecordMapper.xml                                 |    2 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/ContentSettingController.java                  |   30 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/UserLevelSettingServiceImpl.java             |    2 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserWalletRecordMapper.xml                                 |    2 
 xinquan-modules/xinquan-meditation/src/main/resources/mapper/meditation/MeditationMapper.xml                              |   42 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/PrizeMapper.xml                                               |    2 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/NoticeRecordMapper.xml                                        |    2 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserDetailVO.java                        |   35 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/TagMapper.java                                         |    2 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/service/MeditationService.java                    |    4 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/PrizeRedemptionRecord.java                     |   46 +
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserEnergyRecordServiceImpl.java              |    2 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/UpdateAppUserDTO.java                       |   57 +
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/VipSettingController.java                      |   39 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserTreeMapper.java                                 |    2 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/NoticeRecord.java                              |    2 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/UserLevelSettingService.java                      |    2 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTagMapper.xml                                          |    2 
 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/TutorSpecialColumn.java                            |    3 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/PrizeService.java                                     |    2 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/TreeLevelSetting.java                              |    4 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserViewingHistoryMapper.java                       |    8 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserCourseMapper.java                               |    2 
 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/CourseChapter.java                                 |   12 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserEnergyRecordVO.java                  |   27 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserQuestionService.java                           |    2 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserTag.java                                |    2 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserWithdraw.java                           |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserViewingHistoryService.java                     |    9 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserQuestionMapper.java                             |    2 
 xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java                |   28 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/ExchangeRecordVO.java                               |   34 
 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/TutorCourseVO.java                              |   87 ++
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/EnergyVO.java                                       |   33 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserMeditationService.java                         |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/PrizeRedemptionRecordServiceImpl.java            |    2 
 xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/domain/Course.java                                    |    4 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/TagMapper.xml                                                 |    2 
 xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java                 |   24 
 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientTutorSpecialColumnController.java |   30 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserInfoVO.java                          |   44 +
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserBankService.java                               |    2 
 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/TutorVo.java                                    |    4 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserEnergyRecordMapper.java                         |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/NoticeRecordService.java                              |    2 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/WateringVO.java                             |   34 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserBank.java                               |    2 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMapper.xml                                             |    2 
 xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/domain/Order.java                                       |    4 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserMeditation.java                         |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserCourseServiceImpl.java                    |    2 
 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/ClientCourseVO.java                             |    9 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserEnergyRecordService.java                       |    2 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/CommonQuestion.java                                |    4 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserTagServiceImpl.java                       |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserWithdrawService.java                           |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserServiceImpl.java                          |   13 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java                |  261 +++++
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserCourseMapper.xml                                       |    2 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserQuestionMapper.xml                                     |    2 
 xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/factory/RemoteOrderFallbackFactory.java                 |    5 
 xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java                           |   17 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/PrizeRedemptionRecordMapper.xml                               |    2 
 xinquan-modules/xinquan-system/src/main/resources/mapper/system/UserLevelSettingMapper.xml                                |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/PrizeRedemptionRecordService.java                     |    2 
 xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/vo/StudyPageVO.java                                   |   26 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserTreeService.java                               |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserViewingHistoryServiceImpl.java            |   14 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserQuestion.java                           |    2 
 xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/controller/client/ClientMeditationController.java |   47 +
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTreeMapper.xml                                         |    2 
 xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/feign/RemoteOrderService.java                           |    7 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserViewingHistory.java                     |   18 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/InviteRankListVO.java                       |   35 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/factory/RemoteBannerFallbackFactory.java              |    6 
 xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/StudyCourseVO.java                              |   30 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/NoticeRecordServiceImpl.java                     |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserMapper.java                                     |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/NoticeRecordMapper.java                                |    2 
 xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/domain/R.java                                    |    8 
 xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/CommonQuestionController.java                  |   21 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUser.java                                   |   17 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserWithdrawMapper.java                             |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserTagService.java                                |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserWalletRecordMapper.java                         |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/TagServiceImpl.java                              |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserCourseController.java          |   42 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/RemoteBannerService.java                              |   12 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserVO.java                              |    3 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserTreeController.java            |  413 +++++++++
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserTreeServiceImpl.java                      |    2 
 xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/vo/CourseVO.java                                      |   87 ++
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserWalletRecordService.java                       |    2 
 xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMeditationMapper.xml                                   |    2 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/UserLevelSetting.java                          |    2 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/Prize.java                                     |   15 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserMeditationMapper.java                           |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserQuestionServiceImpl.java                  |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserMeditationServiceImpl.java                |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/PrizeMapper.java                                       |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/TagService.java                                       |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserBankMapper.java                                 |    2 
 /dev/null                                                                                                                 |   63 -
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserWithdrawServiceImpl.java                  |    2 
 xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java                                               |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserTagMapper.java                                  |    2 
 xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientTagController.java                    |   19 
 xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserEnergyRecord.java                       |    2 
 133 files changed, 2,266 insertions(+), 288 deletions(-)

diff --git a/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/domain/Course.java b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/domain/Course.java
index 7ceb6c7..6fa7e91 100644
--- a/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/domain/Course.java
+++ b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/domain/Course.java
@@ -112,4 +112,8 @@
     @TableField("latitude")
     private Double latitude;
 
+    @ApiModelProperty(value = "学习人数")
+    @TableField(exist = false)
+    private Integer count;
+
 }
diff --git a/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/vo/CourseVO.java b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/vo/CourseVO.java
new file mode 100644
index 0000000..143396a
--- /dev/null
+++ b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/vo/CourseVO.java
@@ -0,0 +1,87 @@
+package com.xinquan.course.api.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/9/7
+ */
+@Data
+@ApiModel(value = "课程视图对象")
+public class CourseVO {
+
+    @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 BigDecimal generalPrice;
+
+    @ApiModelProperty(value = "IOS内购价格")
+    private BigDecimal iosPrice;
+
+    @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;
+    @ApiModelProperty(value = "已学习人数")
+    private Integer count;
+    @ApiModelProperty(value = "是否购买 0否1是")
+    private Integer isBuy;
+    @ApiModelProperty(value = "当前用户是否为会员")
+    private Integer isVip;
+    @ApiModelProperty(value = "头像列表")
+    private List<String> headers;
+
+
+}
diff --git a/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/vo/StudyPageVO.java b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/vo/StudyPageVO.java
new file mode 100644
index 0000000..9a3d6f6
--- /dev/null
+++ b/xinquan-api/xinquan-api-course/src/main/java/com/xinquan/course/api/vo/StudyPageVO.java
@@ -0,0 +1,26 @@
+package com.xinquan.course.api.vo;
+
+import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.course.api.domain.Course;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/9/7
+ */
+@Data
+@ApiModel(value = "轮播图视图对象")
+public class StudyPageVO implements Serializable {
+
+    private static final long serialVersionUID = -7433787602665988956L;
+
+    @ApiModelProperty(value = "已购买课程列表")
+    private PageDTO<CourseVO> courseList;
+    @ApiModelProperty(value = "免费课程")
+    private List<Course> freeCourseList;
+}
diff --git a/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/domain/Order.java b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/domain/Order.java
index 5b93fb4..c7357a3 100644
--- a/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/domain/Order.java
+++ b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/domain/Order.java
@@ -64,6 +64,10 @@
     @TableField("commission_amount")
     private BigDecimal commissionAmount;
 
+    @ApiModelProperty(value = "获得分佣的用户id")
+    @TableField("commission_id")
+    private Long commissionId;
+
     @ApiModelProperty(value = "改价金额")
     @TableField("change_price")
     private BigDecimal changePrice;
diff --git a/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/factory/RemoteOrderFallbackFactory.java b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/factory/RemoteOrderFallbackFactory.java
index 4b7a7b8..e53769a 100644
--- a/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/factory/RemoteOrderFallbackFactory.java
+++ b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/factory/RemoteOrderFallbackFactory.java
@@ -20,6 +20,11 @@
                     String source) {
                 return R.fail("获取订单列表失败");
             }
+
+            @Override
+            public R<String> getCommissionByUserIds(String userIds) {
+                return R.fail("通过邀请人ids查询对应佣金失败");
+            }
         };
     }
 }
diff --git a/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/feign/RemoteOrderService.java b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/feign/RemoteOrderService.java
index 1006727..18842ec 100644
--- a/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/feign/RemoteOrderService.java
+++ b/xinquan-api/xinquan-api-order/src/main/java/com/xinquan/order/api/feign/RemoteOrderService.java
@@ -7,9 +7,7 @@
 import com.xinquan.order.api.factory.RemoteOrderFallbackFactory;
 import java.util.List;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestHeader;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @author mitao
@@ -22,4 +20,7 @@
     R<List<Order>> getOrderListByType(@RequestParam("userId") Long userId,
             @RequestParam("orderFrom") Integer orderFrom,
             @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    @GetMapping("/client/order/order/getCommissionByUserIds/{userIds}")
+    public R<String> getCommissionByUserIds(@PathVariable("userIds") String userIds);
 }
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
index 3596b91..d8e6965 100644
--- 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
@@ -3,11 +3,14 @@
 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.UserLevelSetting;
+import com.xinquan.system.api.domain.vo.AppUserVO;
 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.PathVariable;
 import org.springframework.web.bind.annotation.RequestHeader;
 
 /**
@@ -27,4 +30,13 @@
     @GetMapping("/inner/system/banner/getBannerList")
     R<List<BannerVO>> getBannerList(
             @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
+
+    /**
+     * 远程调用根据树苗等级获取疗愈图标和疗愈名称
+     *
+     * @return 用户信息
+     * @see AppUserVO
+     */
+    @GetMapping("/system/user-level-setting/getIconNameByLevel/{level}")
+    R<UserLevelSetting> getIconNameByLevel(@PathVariable("level")Integer level);
 }
diff --git a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/AppUser.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUser.java
similarity index 86%
rename from xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/AppUser.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUser.java
index ad89190..4d2021e 100644
--- a/xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/domain/AppUser.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUser.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.api.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -139,6 +139,9 @@
     @ApiModelProperty(value = "注销时间")
     @TableField("logout_time")
     private LocalDateTime logoutTime;
+    @ApiModelProperty(value = "签到时间 用于判断树苗打卡获取能量值")
+    @TableField("signTime")
+    private LocalDateTime signTime;
 
     @ApiModelProperty(value = "用户等级id")
     @TableField("level_setting_id")
@@ -147,4 +150,16 @@
     @ApiModelProperty(value = "标签id,多个id使用英文逗号拼接")
     @TableField("tag_id")
     private String tagId;
+    @ApiModelProperty(value = "是否弹窗心泉之树提示 1是2否")
+    @TableField("isFirst")
+    private Integer isFirst;
+    @ApiModelProperty(value = "当前剩余能量值")
+    @TableField("energy_value")
+    private Integer energyValue;
+    @ApiModelProperty(value = "帮助人数")
+    @TableField(exist = false)
+    private Integer count;
+    @ApiModelProperty(value = "佣金金额")
+    @TableField(exist = false)
+    private BigDecimal money;
 }
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserBank.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserBank.java
similarity index 97%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserBank.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserBank.java
index 0fe92af..0bb9826 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserBank.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserBank.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableName;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserCourse.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserCourse.java
similarity index 72%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserCourse.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserCourse.java
index 6204316..6c5f053 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserCourse.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserCourse.java
@@ -1,12 +1,12 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.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.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import java.io.Serializable;
+import java.time.LocalDateTime;
+
 import lombok.Data;
 
 /**
@@ -44,5 +44,8 @@
     @TableField("order_id")
     private Long orderId;
 
-
+    @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-user/src/main/java/com/xinquan/user/domain/AppUserEnergyRecord.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserEnergyRecord.java
similarity index 96%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserEnergyRecord.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserEnergyRecord.java
index fe3e986..be20c0a 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserEnergyRecord.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserEnergyRecord.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableName;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserMeditation.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserMeditation.java
similarity index 96%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserMeditation.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserMeditation.java
index 59cca98..40b61a1 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserMeditation.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserMeditation.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableName;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserQuestion.java
similarity index 96%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserQuestion.java
index a2eefd8..756412c 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserQuestion.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserQuestion.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTag.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserTag.java
similarity index 95%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTag.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserTag.java
index 6b88e69..702d890 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTag.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserTag.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTree.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserTree.java
similarity index 65%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTree.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserTree.java
index cb02369..1199fd5 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserTree.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserTree.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -38,17 +38,28 @@
     @TableField("tree_level_type")
     private Integer treeLevelType;
 
-    @ApiModelProperty(value = "成长值")
+    @ApiModelProperty(value = "当前树苗成长值")
     @TableField("growth_value")
     private Integer growthValue;
 
-    @ApiModelProperty(value = "当前能量值")
-    @TableField("current_energy_value")
-    private Integer currentEnergyValue;
 
     @ApiModelProperty(value = "是否重新播种 1=是 2=否")
     @TableField("sow_again")
     private Integer sowAgain;
-
+    @ApiModelProperty(value = "是否枯萎 1=是 2=否")
+    @TableField("status")
+    private Integer status;
+    @ApiModelProperty(value = "每日疗愈30分钟是否完成 1是2否")
+    @TableField(exist = false)
+    private Integer taskOne;
+    @ApiModelProperty(value = "每日疗愈60分钟是否完成 1是2否")
+    @TableField(exist = false)
+    private Integer taskTwo;
+    @ApiModelProperty(value = "是否完成签到 1是 2否")
+    @TableField(exist = false)
+    private Integer isSign;
+    @ApiModelProperty(value = "升到下一等级成长阈值")
+    @TableField(exist = false)
+    private Integer nextLevel;
 
 }
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserViewingHistory.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserViewingHistory.java
similarity index 63%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserViewingHistory.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserViewingHistory.java
index 450c55a..0fd7e5b 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserViewingHistory.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserViewingHistory.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -41,5 +41,19 @@
     @TableField("viewing_type")
     private Integer viewingType;
 
-
+    @ApiModelProperty(value = "上次观看到xx分钟")
+    @TableField("minuteLook")
+    private Integer minuteLook;
+    @ApiModelProperty(value = "上次观看到xx秒")
+    @TableField("secondLook")
+    private Integer secondLook;
+    @ApiModelProperty(value = "章节id 类型为课程存储")
+    @TableField("chapterId")
+    private Long chapterId;
+    @ApiModelProperty(value = "是否观看完毕 1是2否 类型为课程的时候存储")
+    @TableField("isOver")
+    private Integer isOver;
+    @ApiModelProperty(value = "疗愈观看时长 单位秒")
+    @TableField("timeLook")
+    private Integer timeLook;
 }
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserWalletRecord.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserWalletRecord.java
similarity index 97%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserWalletRecord.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserWalletRecord.java
index e3b7a8f..ab09c93 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserWalletRecord.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserWalletRecord.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import java.math.BigDecimal;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserWithdraw.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserWithdraw.java
similarity index 97%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserWithdraw.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserWithdraw.java
index ec5a8bd..d7f90bd 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserWithdraw.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/AppUserWithdraw.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import java.math.BigDecimal;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/NoticeRecord.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/NoticeRecord.java
similarity index 97%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/NoticeRecord.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/NoticeRecord.java
index da4fad4..1d19d9a 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/NoticeRecord.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/NoticeRecord.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Prize.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/Prize.java
similarity index 78%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Prize.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/Prize.java
index dab79c3..569ac22 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Prize.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/Prize.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import java.math.BigDecimal;
@@ -28,13 +28,10 @@
 
     private static final long serialVersionUID = 1L;
 
-    @ApiModelProperty(value = "奖品兑换记录id")
+    @ApiModelProperty(value = "主键id")
     @TableId(value = "id",type = IdType.ASSIGN_ID)
     private Long id;
 
-    @ApiModelProperty(value = "奖品id")
-    @TableField("prize_id")
-    private Long prizeId;
 
     @ApiModelProperty(value = "奖品名称")
     @TableField("`name`")
@@ -52,9 +49,15 @@
     @TableField("energy_value")
     private Integer energyValue;
 
-    @ApiModelProperty(value = "兑换状态 1=兑换中 2=已兑换")
+    @ApiModelProperty(value = "上架状态 1=上架 2=下架")
     @TableField("`status`")
     private Integer status;
+    @ApiModelProperty(value = "排序权重")
+    @TableField("sort_num")
+    private Integer sortNum;
+    @ApiModelProperty(value = "兑换状态 1=已兑换 2=未兑换")
+    @TableField(exist = false)
+    private Integer receiveStatus;
 
     @ApiModelProperty(value = "兑换时间")
     @TableField("redemption_time")
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/PrizeRedemptionRecord.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/PrizeRedemptionRecord.java
new file mode 100644
index 0000000..1d5f630
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/PrizeRedemptionRecord.java
@@ -0,0 +1,46 @@
+package com.xinquan.system.api.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.math.BigDecimal;
+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;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 奖品兑换记录表
+ * </p>
+ *
+ * @author mitao
+ * @since 2024-08-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("t_prize_redemption_record")
+@ApiModel(value="PrizeRedemptionRecord对象", description="奖品兑换记录表")
+public class PrizeRedemptionRecord extends BaseModel {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "id")
+    @TableId(value = "id",type = IdType.ASSIGN_ID)
+    private Long id;
+    @ApiModelProperty(value = "兑换状态1待领取2已兑换")
+    @TableField("status")
+    private Integer status;
+    @ApiModelProperty(value = "奖品id")
+    @TableField("prize_id")
+    private Long prizeId;
+    @ApiModelProperty(value = "用户id")
+    @TableField("app_user_id")
+    private Long appUserId;
+    @ApiModelProperty(value = "兑换码")
+    @TableField("code")
+    private String code;
+
+}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/Tag.java
similarity index 95%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/Tag.java
index 243913e..4ef42d8 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/Tag.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/Tag.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/UserLevelSetting.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/UserLevelSetting.java
similarity index 96%
rename from xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/UserLevelSetting.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/UserLevelSetting.java
index 78022f7..c06ae9f 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/UserLevelSetting.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/UserLevelSetting.java
@@ -1,4 +1,4 @@
-package com.xinquan.system.domain;
+package com.xinquan.system.api.domain;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserDetailVO.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserDetailVO.java
new file mode 100644
index 0000000..4a2f937
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserDetailVO.java
@@ -0,0 +1,35 @@
+package com.xinquan.system.api.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author mitao
+ * @date 2024/9/7
+ */
+@Data
+@ApiModel(value = "根据手机号查询用户信息VO")
+public class AppUserDetailVO implements Serializable {
+
+    private static final long serialVersionUID = -6948932379350815750L;
+
+    @ApiModelProperty(value = "App用户id")
+    private Long id;
+    @ApiModelProperty(value = "手机号码")
+    private String cellPhone;
+    @ApiModelProperty(value = "头像")
+    private String avatar;
+    @ApiModelProperty(value = "昵称")
+    private String nickname;
+
+
+
+
+
+
+}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserEnergyRecord.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserEnergyRecordVO.java
similarity index 65%
copy from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserEnergyRecord.java
copy to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserEnergyRecordVO.java
index fe3e986..98af6ac 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/AppUserEnergyRecord.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserEnergyRecordVO.java
@@ -1,14 +1,17 @@
-package com.xinquan.user.domain;
+package com.xinquan.system.api.domain.vo;
 
 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 com.fasterxml.jackson.annotation.JsonFormat;
+import com.xinquan.common.core.web.domain.BaseModel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -19,31 +22,25 @@
  * @since 2024-08-21
  */
 @Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("t_app_user_energy_record")
-@ApiModel(value="AppUserEnergyRecord对象", description="用户能量值记录表")
-public class AppUserEnergyRecord extends BaseModel {
-
-    private static final long serialVersionUID = 1L;
+@ApiModel(value="AppUserEnergyRecordVO对象", description="用户能量值明细")
+public class AppUserEnergyRecordVO  {
 
     @ApiModelProperty(value = "用户能量值记录id")
-    @TableId(value = "id",type = IdType.ASSIGN_ID)
     private Long id;
 
     @ApiModelProperty(value = "用户id")
-    @TableField("app_user_id")
     private Long appUserId;
 
     @ApiModelProperty(value = "变动类型 1=增加 2=减少")
-    @TableField("change_type")
     private Integer changeType;
 
     @ApiModelProperty(value = "能量值")
-    @TableField("energy_value")
     private Integer energyValue;
+    @ApiModelProperty(value = "时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
+    private LocalDateTime createTime;
 
     @ApiModelProperty(value = "原因")
-    @TableField("reason")
     private String reason;
 
 
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserInfoVO.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserInfoVO.java
new file mode 100644
index 0000000..c0f068d
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserInfoVO.java
@@ -0,0 +1,44 @@
+package com.xinquan.system.api.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * @author mitao
+ * @date 2024/9/7
+ */
+@Data
+@ApiModel(value = "个人中心-用户信息VO")
+public class AppUserInfoVO implements Serializable {
+
+    private static final long serialVersionUID = -6948932379350815750L;
+
+    @ApiModelProperty(value = "App用户id")
+    private Long id;
+    @ApiModelProperty(value = "手机号码")
+    private String cellPhone;
+    @ApiModelProperty(value = "头像")
+    private String avatar;
+    @ApiModelProperty(value = "昵称")
+    private String nickname;
+    @ApiModelProperty(value = "累计练习天数")
+    private Integer cumulative;
+    @ApiModelProperty(value = "今日练习时长 单位分钟")
+    private Integer today;
+    @ApiModelProperty(value = "连续练习天数")
+    private Integer continuity;
+    @ApiModelProperty(value = "疗愈等级")
+    private Integer level;
+    @ApiModelProperty(value = "疗愈等级名称")
+    private String levelName;
+    @ApiModelProperty(value = "疗愈等级图标")
+    private String levelIcon;
+    @ApiModelProperty(value = "是否是vip 1是2否")
+    private Integer isVip;
+    @ApiModelProperty(value = "会员到期时间")
+    private String vipExpireTime;
+}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/AppUserVO.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserVO.java
similarity index 98%
rename from xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/AppUserVO.java
rename to xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserVO.java
index 00efba7..14a19f2 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/AppUserVO.java
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/AppUserVO.java
@@ -1,4 +1,4 @@
-package com.xinquan.user.domain.vo;
+package com.xinquan.system.api.domain.vo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -106,4 +106,5 @@
 
     @ApiModelProperty(value = "标签id,多个id使用英文逗号拼接")
     private String tagId;
+
 }
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/InviteRankListVO.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/InviteRankListVO.java
new file mode 100644
index 0000000..bce1914
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/InviteRankListVO.java
@@ -0,0 +1,35 @@
+package com.xinquan.system.api.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author mitao
+ * @date 2024/9/7
+ */
+@Data
+@ApiModel(value = "用户信息VO")
+public class InviteRankListVO implements Serializable {
+
+    private static final long serialVersionUID = -6948932379350815750L;
+
+    @ApiModelProperty(value = "App用户id")
+    private Long id;
+
+    @ApiModelProperty(value = "头像")
+    private String avatar;
+
+    @ApiModelProperty(value = "昵称")
+    private String nickname;
+
+    @ApiModelProperty(value = "帮助人数")
+    private Integer count;
+    @ApiModelProperty(value = "佣金金额")
+    private BigDecimal money;
+
+}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/UpdateAppUserDTO.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/UpdateAppUserDTO.java
new file mode 100644
index 0000000..3c1e090
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/UpdateAppUserDTO.java
@@ -0,0 +1,57 @@
+package com.xinquan.system.api.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author mitao
+ * @date 2024/9/7
+ */
+@Data
+@ApiModel(value = "修改用户信息")
+public class UpdateAppUserDTO implements Serializable {
+
+    private static final long serialVersionUID = -6948932379350815750L;
+
+    @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;
+
+}
diff --git a/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/WateringVO.java b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/WateringVO.java
new file mode 100644
index 0000000..8a60c07
--- /dev/null
+++ b/xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/vo/WateringVO.java
@@ -0,0 +1,34 @@
+package com.xinquan.system.api.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author mitao
+ * @date 2024/9/7
+ */
+@Data
+@ApiModel(value = "浇水返回对象")
+public class WateringVO implements Serializable {
+
+    private static final long serialVersionUID = -6948932379350815750L;
+
+    @ApiModelProperty(value = "是否升级")
+    private Boolean isNext;
+    @ApiModelProperty(value = "浇水后的成长值")
+    private Integer growthValue;
+    @ApiModelProperty(value = "是否枯萎 1是2否(暂时不用)")
+    private Integer status;
+    @ApiModelProperty(value = "阈值")
+    private Integer nextLevel;
+
+
+
+
+
+
+
+}
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
index 64d3d47..bb7975a 100644
--- 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
@@ -2,6 +2,7 @@
 
 import com.xinquan.common.core.domain.R;
 import com.xinquan.system.api.RemoteBannerService;
+import com.xinquan.system.api.domain.UserLevelSetting;
 import com.xinquan.system.api.domain.vo.BannerVO;
 import java.util.List;
 import org.slf4j.Logger;
@@ -26,6 +27,11 @@
             public R<List<BannerVO>> getBannerList(String source) {
                 return R.fail("获取轮播图失败:" + cause.getMessage());
             }
+
+            @Override
+            public R<UserLevelSetting> getIconNameByLevel(Integer level) {
+                return R.fail("远程调用根据树苗等级获取疗愈图标和疗愈名称" + cause.getMessage());
+            }
         };
     }
 }
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 2419983..65f545c 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
@@ -1,11 +1,15 @@
 package com.xinquan.user.api.factory;
 
 import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.system.api.domain.AppUserCourse;
+import com.xinquan.system.api.domain.vo.AppUserVO;
 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.user.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUserViewingHistory;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
 import com.xinquan.user.api.feign.RemoteAppUserService;
 import java.util.Collection;
@@ -26,7 +30,23 @@
     public RemoteAppUserService create(Throwable cause) {
         return new RemoteAppUserService() {
             @Override
-            public R<List<String>> getUserByCourseId(Long courseId) {
+            public R<AppUserVO> getCurrentUser() {
+                return null;
+            }
+
+            @Override
+            public R<PageDTO<AppUserCourse>> getPayCourse(Integer pageCurr, Integer pageSize) {
+                return R.fail("查询用户已购课程失败");
+
+            }
+
+            @Override
+            public R<AppUserViewingHistory> getCourseStudyHistory(Long chapterId) {
+                return null;
+            }
+
+            @Override
+            public R<List<AppUser>> getUserByCourseId(Long courseId) {
                 return R.fail("查询课程加入学习人数");
             }
 
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 b715a68..22c3554 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
@@ -3,15 +3,21 @@
 import com.xinquan.common.core.constant.SecurityConstants;
 import com.xinquan.common.core.constant.ServiceNameConstants;
 import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.system.api.domain.AppUserCourse;
+import com.xinquan.system.api.domain.vo.AppUserVO;
 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.user.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUserViewingHistory;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
 import com.xinquan.user.api.factory.RemoteAppUserFallbackFactory;
 import java.util.Collection;
 import java.util.List;
+
+import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.*;
 
@@ -22,8 +28,15 @@
 @FeignClient(contextId = "remoteAppUserService", value = ServiceNameConstants.APP_USER_SERVICE, fallbackFactory = RemoteAppUserFallbackFactory.class)
 public interface RemoteAppUserService {
 
+    @PostMapping("/client/app-user/getCurrentUser")
+    public R<AppUserVO> getCurrentUser();
+    @GetMapping("/client/app-user-course/getPayCourse/{pageCurr}/{pageSize}")
+    R<PageDTO<AppUserCourse>> getPayCourse(@PathVariable("pageCurr")Integer pageCurr, @PathVariable("pageSize")Integer pageSize);
+    @PostMapping("/user/app-user-viewing-history/getCourseStudyHistory")
+    R<AppUserViewingHistory> getCourseStudyHistory(@RequestParam("chapterId") Long chapterId);
+
     @GetMapping("/client/app-user-course/getUserByCourseId/{courseId}")
-    R<List<String>> getUserByCourseId(@PathVariable("courseId") Long courseId);
+    R<List<AppUser>> getUserByCourseId(@PathVariable("courseId") Long courseId);
 
     /**
      * 获取未注销的用户信息
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 7268679..c9f2e4a 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
@@ -64,7 +64,7 @@
     @ApiOperation(value = "发送验证码",tags = {"APP端"})
     @ApiImplicitParams({
             @ApiImplicitParam(name = "cellPhone", value = "手机号码", required = true, dataType = "String", paramType = "query"),
-            @ApiImplicitParam(name = "type", value = "类型 1=注册 2=验证码登录 3=找回密码 4=第三方登录后验证手机", required = true, dataType = "Integer", paramType = "query")})
+            @ApiImplicitParam(name = "type", value = "类型 1=注册 2=验证码登录 3=找回密码 4=第三方登录后验证手机 5=切换手机号", required = true, dataType = "Integer", paramType = "query")})
     public R<?> sendCaptchaCode(
             @RequestParam(value = "cellPhone", required = true) String cellPhone,
             @RequestParam("type") Integer type) {
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 0b836ed..d93dc14 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
@@ -27,7 +27,7 @@
 import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
 import com.xinquan.system.api.model.AppWXLoginBody;
 import com.xinquan.system.api.model.LoginUser;
-import com.xinquan.user.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUser;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
 import com.xinquan.user.api.feign.RemoteAppUserService;
 import java.math.BigDecimal;
diff --git a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java
index 7810d4d..0b7792e 100644
--- a/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java
+++ b/xinquan-common/xinquan-common-core/src/main/java/com/xinquan/common/core/constant/Constants.java
@@ -51,6 +51,7 @@
      * 成功标记
      */
     public static final Integer SUCCESS = 200;
+    public static final Integer TOKEN_ERROR = 501;
 
     /**
      * 失败标记
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 b0f7ff6..d828d99 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
@@ -15,6 +15,10 @@
 
     /** 成功 */
     public static final int SUCCESS = Constants.SUCCESS;
+    /**
+     * token失效
+     */
+    public static final int TOKEN_ERROR = Constants.TOKEN_ERROR;
 
     /** 失败 */
     public static final int FAIL = Constants.FAIL;
@@ -33,6 +37,10 @@
         return restResult(null, SUCCESS, null);
     }
 
+    public static <T> R<T> tokenError(String msg)
+    {
+        return restResult(null, TOKEN_ERROR, msg);
+    }
     public static <T> R<T> ok(T data)
     {
         return restResult(data, SUCCESS, null);
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 ed40acf..bdb78ec 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
@@ -8,7 +8,10 @@
 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.course.api.domain.Course;
+import com.xinquan.course.api.vo.CourseVO;
+import com.xinquan.course.api.vo.StudyPageVO;
 import com.xinquan.course.domain.CourseChapter;
 import com.xinquan.course.domain.vo.ClientCourseCategoryVO;
 import com.xinquan.course.domain.vo.ClientCourseVO;
@@ -16,22 +19,26 @@
 import com.xinquan.course.service.CourseChapterService;
 import com.xinquan.course.service.CourseService;
 import com.xinquan.system.api.RemoteBannerService;
+import com.xinquan.system.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUserCourse;
+import com.xinquan.system.api.domain.AppUserViewingHistory;
+import com.xinquan.system.api.domain.vo.AppUserVO;
 import com.xinquan.system.api.domain.vo.BannerVO;
 import com.xinquan.user.api.feign.RemoteAppUserService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+
+import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 import io.swagger.models.auth.In;
 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;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 
@@ -52,7 +59,8 @@
     private final CourseCategoryService courseCategoryService;
     private final CourseService courseService;
     private final RemoteBannerService remoteBannerService;
-    private final RemoteAppUserService appUserService;
+    private final RemoteAppUserService remoteAppUserService;
+
     @Resource
     private CourseChapterService courseChapterService;
 
@@ -82,46 +90,71 @@
      *
      * @return 课程详情
      */
-    @GetMapping("/getCourseInfoById")
-    @ApiOperation(value = "根据id获取课程详情-线下课程")
-    public R<Course> getCourseInfoById(String id) {
-        return R.ok(courseService.getById(id));
-    }
+
     /**
      * 课程详情
      *
      * @return 课程详情
      */
-    @GetMapping("/getPayCourseInfoById")
-    @ApiOperation(value = "根据id获取课程详情-付费课程")
+    @PostMapping("/getPayCourseInfoById")
+    @ApiOperation(value = "根据id获取课程详情")
     @ApiImplicitParams({
             @ApiImplicitParam(value = "课程id", name = "id", required = true, dataType = "String"),
-            @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"),
-            @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer")
     })
-    public R<ClientCourseVO> getPayCourseInfoById(@RequestParam(value = "id")Long id,
-                                                  @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
-                                                  @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+    public R<ClientCourseVO> getPayCourseInfoById(@RequestParam(value = "id")Long id) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        AppUserVO data1 = remoteAppUserService.getCurrentUser().getData();
+
         Course byId = courseService.getById(id);
         ClientCourseVO clientCourseVO = new ClientCourseVO();
         BeanUtils.copyProperties(byId, clientCourseVO);
+        if (data1.getVipExpireTime()!=null && data1.getVipExpireTime().isAfter(LocalDateTime.now())){
+            clientCourseVO.setIsVip(1);
+        }else{
+            clientCourseVO.setIsVip(0);
+        }
+        // 查询用户是否已购买该课程
         // 查询章节
-        Page<CourseChapter> page = courseChapterService.lambdaQuery()
+        List<CourseChapter> page = courseChapterService.lambdaQuery()
                 .eq(CourseChapter::getCourseId, id)
                 .orderByDesc(CourseChapter::getSortNum)
-                .page(new Page<>(pageCurr, pageSize));
-        if (CollUtils.isEmpty(page.getRecords())) {
-            PageDTO<CourseChapter> empty = PageDTO.empty(page);
-            clientCourseVO.setList(empty);
-        }
+                .list();
+        clientCourseVO.setIsBuy(0);
         // 查询学习人数和头像列表
-        List<String> data = appUserService.getUserByCourseId(id).getData();
+        List<AppUser> data = remoteAppUserService.getUserByCourseId(id).getData();
         if (data!=null){
             clientCourseVO.setCount(data.size());
+            if (data.size()>=5){
+                clientCourseVO.setHeaders(data.stream().limit(5).map(AppUser::getAvatar).collect(Collectors.toList()));
+            }else{
+                clientCourseVO.setHeaders(data.stream().map(AppUser::getAvatar).collect(Collectors.toList()));
+            }
+            List<Long> collect = data.stream().map(AppUser::getUserId).collect(Collectors.toList());
+            if (!collect.isEmpty()){
+                if (collect.contains(userId)){
+                    clientCourseVO.setIsBuy(1);
+                }
+            }
         }
-        clientCourseVO.setHeaders(data);
         // 查询推荐课程
-
+        List<Course> list = courseService.lambdaQuery().eq(Course::getCateId, byId.getCateId())
+                .eq(Course::getCourseType,1)
+                .eq(Course::getRecommend, 1).list();
+        List<Course> courses = new ArrayList<>();
+        // 随机获取两个课程
+        if (CollUtils.isNotEmpty(list)) {
+            int size = list.size();
+            int index = (int) (Math.random() * size);
+            if (size >= 2){
+                for (int i = 0; i < 2; i++) {
+                    courses.add(list.get(index));
+                }
+            }else{
+                courses.add(list.get(index));
+            }
+        }
+        clientCourseVO.setList2(courses);
         return R.ok(clientCourseVO);
     }
 
@@ -149,5 +182,125 @@
             @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
         return R.ok(courseService.getCoursePageList(courseTitle, cateId, pageCurr, pageSize));
     }
+    @PostMapping("/studyPageByChapterId")
+    @ApiOperation(value = "课程学习页面")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "章节id", name = "chapterId", required = true, dataType = "Long"),
+            @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"),
+            @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer")
+    })
+    public R<PageDTO<CourseChapter>> studyPageByChapterId(@RequestParam(value = "chapterId")Long chapterId,
+                                                  @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
+                                                  @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+        CourseChapter byId1 = courseChapterService.getById(chapterId);
+        Long id = byId1.getCourseId();
+        // 查询章节
+        Page<CourseChapter> page = courseChapterService.lambdaQuery()
+                .eq(CourseChapter::getCourseId, id)
+                .orderByDesc(CourseChapter::getSortNum)
+                .page(new Page<>(pageCurr, pageSize));
+        if (CollUtils.isEmpty(page.getRecords())) {
+            PageDTO<CourseChapter> empty = PageDTO.empty(page);
+            return R.ok(empty);
+        }
+        PageDTO<CourseChapter> courseChapterPageDTO = PageDTO.of(page, CourseChapter.class);
+        if (CollUtils.isNotEmpty(courseChapterPageDTO.getList())) {
+            for (CourseChapter courseChapter : courseChapterPageDTO.getList()) {
+                AppUserViewingHistory data = remoteAppUserService.getCourseStudyHistory(courseChapter.getId()).getData();
+                if (data!=null){
+                    courseChapter.setMinuteLook(data.getMinuteLook());
+                    courseChapter.setSecondLook(data.getSecondLook());
+                    courseChapter.setIsOver(data.getIsOver());
+                }
+            }
+        }
+        return R.ok();
+    }
+    @PostMapping("/confirmOrder")
+    @ApiOperation(value = "确认订单页面")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "课程id", name = "courseId", required = true, dataType = "Long")
+    })
+    public R<Course> studyPageByChapterId(@RequestParam(value = "courseId")Long courseId) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        Course byId = courseService.getById(courseId);
+        return R.ok(byId);
+    }
+    @PostMapping("/successOrder")
+    @ApiOperation(value = "支付成功页面")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "课程id", name = "courseId", required = true, dataType = "Long")
+    })
+    public R<List<Course>> successOrder(@RequestParam(value = "courseId")Long courseId) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        Course byId = courseService.getById(courseId);
+        List<Course> list = courseService.lambdaQuery().eq(Course::getCateId, byId.getCateId())
+                .eq(Course::getCourseType, 1).list();
+        for (Course course : list) {
+            List<AppUser> data = remoteAppUserService.getUserByCourseId(courseId).getData();
+            course.setCount(data.size());
+        }
+        List<Course> courses = new ArrayList<>();
+
+        // 如果list集合数据大于2 随机获取两个返回
+        if (CollUtils.isNotEmpty(list) && list.size() > 4) {
+            int size = list.size();
+            int index = (int) (Math.random() * size);
+            for (int i = 0; i < 4; i++) {
+                courses.add(list.get(index));
+            }
+            return R.ok(courses);
+        }else {
+            return R.ok(list);
+        }
+    }
+    @GetMapping("/studyPage")
+    @ApiOperation(value = "学习")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"),
+            @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer")
+    })
+    public R<StudyPageVO> studyPage(@RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
+                               @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        StudyPageVO studyPageVO = new StudyPageVO();
+
+        PageDTO<AppUserCourse> data = remoteAppUserService.getPayCourse(pageCurr, pageSize).getData();
+        List<AppUserCourse> list = data.getList();
+        if (CollUtils.isNotEmpty(list)) {
+            List<Long> courseIds = list.stream().map(AppUserCourse::getCourseId).collect(Collectors.toList());
+            Page<Course> page = courseService.lambdaQuery()
+                    .in(Course::getId, courseIds)
+                    .page(new Page<>(pageCurr, pageSize));
+            if (CollUtils.isEmpty(page.getRecords())) {
+                PageDTO<CourseVO> empty = PageDTO.empty(page);
+                studyPageVO.setCourseList(empty);
+            }else{
+                PageDTO<CourseVO> courseChapterPageDTO = PageDTO.of(page, CourseVO.class);
+                studyPageVO.setCourseList(courseChapterPageDTO);
+            }
+        }
+        // 查询两个相同类型的线上免费课程
+        List<Course> freeCourseList = courseService.lambdaQuery()
+                .eq(Course::getCourseType, 1)
+                .eq(Course::getChargeType, 1)
+                .list();
+        // 随机获取两个
+        if (CollUtils.isNotEmpty(freeCourseList) && freeCourseList.size() > 2) {
+            int size = freeCourseList.size();
+            int index = (int) (Math.random() * size);
+            List<Course> courses = new ArrayList<>();
+            for (int i = 0; i < 2; i++) {
+                courses.add(freeCourseList.get(index));
+            }
+            studyPageVO.setFreeCourseList(courses);
+        }else{
+            studyPageVO.setFreeCourseList(freeCourseList);
+        }
+        return R.ok(studyPageVO);
+    }
 }
 
diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientTutorSpecialColumnController.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientTutorSpecialColumnController.java
index 4e59057..f2735a5 100644
--- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientTutorSpecialColumnController.java
+++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientTutorSpecialColumnController.java
@@ -11,6 +11,7 @@
 import com.xinquan.course.domain.TutorSpecialColumn;
 import com.xinquan.course.domain.TutorSpecialColumnCourse;
 import com.xinquan.course.domain.vo.ClientCourseVO;
+import com.xinquan.course.domain.vo.TutorCourseVO;
 import com.xinquan.course.domain.vo.TutorVo;
 import com.xinquan.course.service.CourseCategoryService;
 import com.xinquan.course.service.CourseService;
@@ -25,8 +26,11 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -50,30 +54,28 @@
     private CourseService courseService;
     @PostMapping("/getCoursePageList")
     @ApiOperation(value = "导师专栏",tags = "导师专栏")
-    @ApiImplicitParams({
-            @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"),
-            @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer")
-    })
-    public R<TutorVo> getCourseList(
-            @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
-            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+
+    public R<TutorVo> getCourseList() {
         TutorVo tutorVo = new TutorVo();
         TutorSpecialColumn one = tutorSpecialColumnService.lambdaQuery().one();
+        List<TutorCourseVO> clientCourseVOS = new ArrayList<>();
         if (one!=null){
             TutorSpecialColumnCourse one1 = tutorSpecialColumnCourseService.lambdaQuery().eq(TutorSpecialColumnCourse::getTutorSpecialColumnId, one.getId()).one();
             BeanUtils.copyProperties(one, tutorVo);
-            Page<Course> page = courseService.lambdaQuery()
+            List<Course> page = courseService.lambdaQuery()
                     .in(Course::getId, Arrays.asList(one1.getCourseId().split(",")))
-                    .orderByDesc(Course::getSortNum)
-                    .page(new Page<>(pageCurr, pageSize));
-            if (CollUtils.isEmpty(page.getRecords())) {
-                PageDTO.empty(page);
+                    .orderByDesc(Course::getSortNum).list().stream().limit(2).collect(Collectors.toList());
+            for (Course course : page) {
+                TutorCourseVO tutorCourseVO = new TutorCourseVO();
+                BeanUtils.copyProperties(course, tutorCourseVO);
+                clientCourseVOS.add(tutorCourseVO);
             }
-            tutorVo.setList(PageDTO.of(page, ClientCourseVO.class));
+            tutorVo.setList(clientCourseVOS);
+            return R.ok(tutorVo);
         }else{
+            tutorVo.setList(clientCourseVOS);
             return R.ok(tutorVo);
         }
-        return R.ok();
     }
 
 
diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/CourseChapter.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/CourseChapter.java
index fd22ecb..369a6b0 100644
--- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/CourseChapter.java
+++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/CourseChapter.java
@@ -7,6 +7,7 @@
 import com.baomidou.mybatisplus.annotation.TableField;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -56,7 +57,16 @@
 
     @ApiModelProperty(value = "视频时长 单位秒")
     @TableField("duration")
-    private Double duration;
+    private Integer duration;
+    @ApiModelProperty(value = "上次观看到xx分钟")
+    @TableField(exist = false)
+    private Integer minuteLook;
+    @ApiModelProperty(value = "上次观看到xx秒")
+    @TableField(exist = false)
+    private Integer secondLook;
+    @ApiModelProperty(value = "是否观看完成 0否1是")
+    @TableField(exist = false)
+    private Integer isOver;
 
 
 }
diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/TutorSpecialColumn.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/TutorSpecialColumn.java
index 3edf713..0b20a2e 100644
--- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/TutorSpecialColumn.java
+++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/TutorSpecialColumn.java
@@ -33,6 +33,9 @@
     @ApiModelProperty(value = "视频讲解")
     @TableField("video_url")
     private String videoUrl;
+    @ApiModelProperty(value = "视频封面")
+    @TableField("cover_url")
+    private String coverUrl;
 
     @ApiModelProperty(value = "导师简介")
     @TableField("tutor_introduction")
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
index b692514..ddb4486 100644
--- 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
@@ -1,6 +1,7 @@
 package com.xinquan.course.domain.vo;
 
 import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.course.api.domain.Course;
 import com.xinquan.course.domain.CourseChapter;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -78,9 +79,15 @@
     private Double latitude;
     @ApiModelProperty(value = "已学习人数")
     private Integer count;
+    @ApiModelProperty(value = "是否购买 0否1是")
+    private Integer isBuy;
+    @ApiModelProperty(value = "当前用户是否为会员")
+    private Integer isVip;
     @ApiModelProperty(value = "头像列表")
     private List<String> headers;
     @ApiModelProperty(value = "章节列表")
-    private PageDTO<CourseChapter> list;
+    private List<CourseChapter> list;
+    @ApiModelProperty(value = "推荐课程")
+    private List<Course> list2;
 
 }
diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/StudyCourseVO.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/StudyCourseVO.java
new file mode 100644
index 0000000..0506c1d
--- /dev/null
+++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/StudyCourseVO.java
@@ -0,0 +1,30 @@
+package com.xinquan.course.domain.vo;
+
+import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.course.api.domain.Course;
+import com.xinquan.course.domain.CourseChapter;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/9/7
+ */
+@Data
+@ApiModel(value = "课程视图对象")
+public class StudyCourseVO {
+
+    @ApiModelProperty(value = "课程id")
+    private Long id;
+
+    @ApiModelProperty(value = "课程标题")
+    private String courseTitle;
+    @ApiModelProperty(value = "章节列表")
+    private PageDTO<CourseChapter> list;
+
+
+}
diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/TutorCourseVO.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/TutorCourseVO.java
new file mode 100644
index 0000000..0a7f1bf
--- /dev/null
+++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/TutorCourseVO.java
@@ -0,0 +1,87 @@
+package com.xinquan.course.domain.vo;
+
+import com.xinquan.course.api.domain.Course;
+import com.xinquan.course.domain.CourseChapter;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/9/7
+ */
+@Data
+@ApiModel(value = "课程视图对象")
+public class TutorCourseVO {
+
+    @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 BigDecimal generalPrice;
+
+    @ApiModelProperty(value = "IOS内购价格")
+    private BigDecimal iosPrice;
+
+    @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;
+    @ApiModelProperty(value = "已学习人数")
+    private Integer count;
+    @ApiModelProperty(value = "是否购买 0否1是")
+    private Integer isBuy;
+    @ApiModelProperty(value = "当前用户是否为会员")
+    private Integer isVip;
+
+
+}
diff --git a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/TutorVo.java b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/TutorVo.java
index 0315f61..4d47bfe 100644
--- a/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/TutorVo.java
+++ b/xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/domain/vo/TutorVo.java
@@ -6,6 +6,8 @@
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @author mitao
  * @date 2024/9/7
@@ -14,5 +16,5 @@
 @ApiModel(value = "导师专栏对象")
 public class TutorVo extends TutorSpecialColumn {
     @ApiModelProperty(value = "相关课程")
-    private PageDTO<ClientCourseVO> list;
+    private List<TutorCourseVO> list;
 }
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 b18a3c8..d1e6afa 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,10 +1,19 @@
 package com.xinquan.meditation.controller.client;
 
 
+import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.meditation.api.domain.Meditation;
+import com.xinquan.meditation.domain.MeditationHall;
+import com.xinquan.meditation.domain.vo.ClientMeditationQuestionVO;
+import com.xinquan.meditation.service.MeditationHallService;
 import com.xinquan.meditation.service.MeditationService;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * <p>
@@ -20,6 +29,38 @@
 public class ClientMeditationController {
 
     private final MeditationService meditationService;
-    
+    private final MeditationHallService meditationHallService;
+    /**
+     * 获取冥想馆列表
+     */
+    @GetMapping("/getMeditationPage")
+    @ApiOperation(value = "获取冥想馆列表-分页")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "lon", value = "经度", dataType = "String", required = false),
+            @ApiImplicitParam(name = "lat", value = "纬度", dataType = "String", required = false),
+            @ApiImplicitParam(name = "name", value = "名称", dataType = "String", required = false),
+            @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", dataType = "Integer", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true)
+    })
+    public R<PageDTO<MeditationHall>> getMeditationPage(
+             String lon,
+             String lat,
+            String name,
+         Integer pageCurr,
+         Integer pageSize) {
+        PageDTO<MeditationHall> res = meditationService.getMeditationPage(lon,lat,name,pageCurr,pageSize);
+        return R.ok(res);
+    }
+    @GetMapping("/getMeditationInfo")
+    @ApiOperation(value = "获取冥想馆详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", dataType = "Long", required = true),
+    })
+    public R<MeditationHall> getMeditationPage(
+            @RequestParam("id") Long id)
+    {
+        MeditationHall byId = meditationHallService.getById(id);
+        return R.ok(byId);
+    }
 }
 
diff --git a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationHall.java b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationHall.java
index 248f109..98a875b 100644
--- a/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationHall.java
+++ b/xinquan-modules/xinquan-meditation/src/main/java/com/xinquan/meditation/domain/MeditationHall.java
@@ -10,6 +10,8 @@
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 冥想馆表
@@ -77,6 +79,9 @@
     @ApiModelProperty(value = "简介")
     @TableField("brief_introduction")
     private String briefIntroduction;
+    @ApiModelProperty(value = "距离用户xx米")
+    @TableField(exist = false)
+    private BigDecimal distance;
 
 
 }
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 9521925..f845736 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,10 @@
 package com.xinquan.meditation.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.xinquan.common.core.web.page.PageInfo;
 import com.xinquan.meditation.api.domain.Meditation;
+import com.xinquan.meditation.domain.MeditationHall;
+import com.xinquan.meditation.domain.vo.ClientMeditationQuestionVO;
 import com.xinquan.meditation.domain.vo.ClientMeditationVO;
 import java.util.List;
 import java.util.Set;
@@ -26,4 +29,9 @@
      */
     List<ClientMeditationVO> getMeditationListByTagId(@Param("tagIdSet") Set<Long> tagIdSet,
             @Param("sanskritFlag") Integer sanskritFlag);
+
+    List<MeditationHall> getMeditationPage(@Param("pageInfo") PageInfo<MeditationHall> pageInfo,
+                                                       @Param("lon")String lon,
+                                                       @Param("lat")String lat, @Param("name")String name);
+
 }
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 d82ba16..b6d942f 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
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.xinquan.common.core.utils.page.PageDTO;
 import com.xinquan.meditation.api.domain.Meditation;
+import com.xinquan.meditation.domain.MeditationHall;
 import com.xinquan.meditation.domain.vo.ClientMeditationAndCateVO;
 import com.xinquan.meditation.domain.vo.ClientMeditationDetailsVO;
 import com.xinquan.meditation.domain.vo.ClientMeditationQuestionVO;
@@ -87,4 +88,7 @@
      * @param id 冥想音频id
      */
     void favorite(Long id);
+
+    PageDTO<MeditationHall> getMeditationPage(String lon, String lat,String name, Integer pageCurr, Integer pageSize);
+
 }
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 d003d07..c290f1b 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
@@ -10,13 +10,10 @@
 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.core.web.page.PageInfo;
 import com.xinquan.common.security.utils.SecurityUtils;
 import com.xinquan.meditation.api.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.*;
 import com.xinquan.meditation.domain.vo.ClientMeditationAndCateVO;
 import com.xinquan.meditation.domain.vo.ClientMeditationCategoryVO;
 import com.xinquan.meditation.domain.vo.ClientMeditationDetailsVO;
@@ -31,7 +28,7 @@
 import com.xinquan.meditation.service.MeditationUserFavoriteService;
 import com.xinquan.order.api.domain.Order;
 import com.xinquan.order.api.feign.RemoteOrderService;
-import com.xinquan.user.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUser;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
 import com.xinquan.user.api.feign.RemoteAppUserService;
 import java.util.Arrays;
@@ -45,6 +42,7 @@
 import java.util.stream.Collectors;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 
 /**
  * <p>
@@ -303,6 +301,19 @@
         this.updateById(meditation);
     }
 
+    @Override
+    public PageDTO<MeditationHall> getMeditationPage(String lon, String lat,String name, Integer pageCurr, Integer pageSize) {
+        PageInfo<MeditationHall> pageInfo = new PageInfo<>(pageCurr, pageSize);
+        List<MeditationHall> list = this.baseMapper.getMeditationPage(pageInfo,lon, lat,name);
+        if (!StringUtils.hasLength(lon) || !StringUtils.hasLength(lat)){
+            for (MeditationHall meditationHall : list) {
+                meditationHall.setDistance(null);
+            }
+        }
+        pageInfo.setRecords(list);
+        return PageDTO.of(pageInfo, MeditationHall.class);
+    }
+
     /**
      * 获取冥想音频提问列表-分页
      *
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 ef1c8dd..f8c8eb4 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
@@ -55,5 +55,47 @@
         </where>
         ORDER BY sort_num DESC
     </select>
+    <select id="getMeditationPage" resultType="com.xinquan.meditation.domain.MeditationHall">
+
+        SELECT
+        t1.id as id,
+            t1.hall_name as hallName,
+               t1.listing_status as listingStatus,
+               t1.contact_number as contactNumber,
+               t1.address as address,
+               t1.longitude as longitude,
+               t1.latitude as latitude,
+               t1.cover_url as coverUrl,
+               ROUND(
+                       6378.138 * 2 * ASIN(
+                               SQRT(
+                                       POW(
+                                               SIN(
+                                                       (
+                                                           #{lat} * PI() / 180 - t1.lat * PI() / 180
+                                                           ) / 2
+                                               ),
+                                               2
+                                       ) + COS(#{lat} * PI() / 180) * COS(t1.lat * PI() / 180) * POW(
+                                               SIN(
+                                                       (
+                                                           #{lon} * PI() / 180 - t1.lon * PI() / 180
+                                                           ) / 2
+                                               ),
+                                               2
+                                                                                                       )
+                               )
+                                      ) * 1000
+               ) AS distance
+        from t_meditation_hall t1
+        where 1=1
+          and t1.status = 1
+          and t1.del_flag = 0
+        <if test="name!=null and name!=''">
+            and t1.hall_name like CONCAT('%', #{name}, '%')
+        </if>
+
+
+    </select>
 
 </mapper>
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 59e2d49..6ac7f22 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
@@ -2,6 +2,7 @@
 
 
 import com.xinquan.common.core.domain.R;
+import com.xinquan.order.api.domain.Order;
 import com.xinquan.order.domain.vo.ClientPlaceOrderVO;
 import com.xinquan.order.service.OrderService;
 import io.swagger.annotations.Api;
@@ -9,10 +10,10 @@
 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;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.List;
 
 /**
  * <p>
@@ -29,6 +30,25 @@
 public class ClientOrderController {
 
     private OrderService orderService;
+    /**
+     * 根据邀请用户ids 查询对应佣金
+     */
+    @GetMapping("/getCommissionByUserIds/{userIds}")
+    public R<String> getCommissionByUserIds(@PathVariable("userIds") String userIds) {
+        String[] split = userIds.split(",");
+        StringBuilder stringBuilder = new StringBuilder();
+        for (String s : split) {
+            List<Order> list = orderService.lambdaQuery().eq(Order::getAppUserId, s)
+                    .eq(Order::getPaymentStatus, 2).list();
+            BigDecimal commissionAmount = list.stream()
+                    .filter(t -> t.getCommissionAmount()!= null)
+                    .map(Order::getCommissionAmount)
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+            stringBuilder.append(commissionAmount).append(",");
+        }
+        StringBuilder stringBuilder1 = stringBuilder.deleteCharAt(stringBuilder.length() - 1);
+        return R.ok(stringBuilder1.toString());
+    }
 
     /**
      * 创建待支付订单
diff --git a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java
index f3ecd59..2ed5a1d 100644
--- a/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java
+++ b/xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/service/impl/OrderServiceImpl.java
@@ -23,7 +23,7 @@
 import com.xinquan.order.service.OrderService;
 import com.xinquan.order.utils.JuHeFuUtil;
 import com.xinquan.order.utils.OrderUtil;
-import com.xinquan.user.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUser;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
 import com.xinquan.user.api.feign.RemoteAppUserService;
 import java.math.BigDecimal;
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/CommonQuestionController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/CommonQuestionController.java
index 96c0b77..08137b8 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/CommonQuestionController.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/CommonQuestionController.java
@@ -1,9 +1,19 @@
 package com.xinquan.system.controller;
 
 
+import com.xinquan.common.core.domain.R;
+import com.xinquan.common.security.utils.SecurityUtils;
+import com.xinquan.system.api.domain.AppUser;
+import com.xinquan.system.domain.CommonQuestion;
+import com.xinquan.system.service.CommonQuestionService;
+import io.swagger.annotations.ApiOperation;
+import org.omg.CORBA.PRIVATE_MEMBER;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
 
 /**
  * <p>
@@ -16,6 +26,15 @@
 @RestController
 @RequestMapping("/system/common-question")
 public class CommonQuestionController {
-
+    @Resource
+    private CommonQuestionService commonQuestionService;
+    @PostMapping("/getQrCode")
+    @ApiOperation(value = "获取客服微信二维码",tags = "获取客服微信二维码")
+    public R getQrCode() {
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        CommonQuestion one = commonQuestionService.lambdaQuery().eq(CommonQuestion::getType, 2).one();
+        return R.ok(one.getCustomerServiceQrCode());
+    }
 }
 
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/ContentSettingController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/ContentSettingController.java
index 1807feb..b99ee70 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/ContentSettingController.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/ContentSettingController.java
@@ -1,9 +1,20 @@
 package com.xinquan.system.controller;
 
 
+import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.system.domain.ContentSetting;
+import com.xinquan.system.service.ContentSettingService;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+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;
+
+import javax.annotation.Resource;
 
 /**
  * <p>
@@ -16,6 +27,25 @@
 @RestController
 @RequestMapping("/system/content-setting")
 public class ContentSettingController {
+    @Resource
+    private ContentSettingService contentSettingService;
+    /**
+     * 获取协议
+     *
+     */
+    @PostMapping("/getCoursePageList")
+    @ApiOperation(value = "获取内容、协议1=用户协议 2=隐私协议 3=关于心泉 4= 新手冥想指南 5=课程/冥想音频购买协议 6=能量规则说明",tags = "富文本规则说明")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "内容类型 1=用户协议 2=隐私协议 3=关于心泉 4= 新手冥想指南 5=课程/冥想音频购买协议 6=能量规则说明", name = "contentType", required = true, dataType = "int"),
+    })
+    public R<String> getCourseList(@RequestParam(value = "contentType", required = true) int contentType) {
+        ContentSetting one = contentSettingService.lambdaQuery().eq(ContentSetting::getContentType, contentType).one();
+        if (one!=null){
+            return R.ok(one.getContent());
+        }else{
+            return R.ok();
 
+        }
+    }
 }
 
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/UserLevelSettingController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/UserLevelSettingController.java
index 39be3ac..96a90a9 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/UserLevelSettingController.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/UserLevelSettingController.java
@@ -1,9 +1,13 @@
 package com.xinquan.system.controller;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.xinquan.common.core.domain.R;
+import com.xinquan.system.api.domain.vo.AppUserVO;
+import com.xinquan.system.api.domain.UserLevelSetting;
+import com.xinquan.system.service.UserLevelSettingService;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
 
 /**
  * <p>
@@ -16,6 +20,19 @@
 @RestController
 @RequestMapping("/system/user-level-setting")
 public class UserLevelSettingController {
-
+    @Resource
+    private UserLevelSettingService userLevelSettingService;
+    /**
+     * 远程调用根据树苗等级获取疗愈图标和疗愈名称
+     *
+     * @return 用户信息
+     * @see AppUserVO
+     */
+    @GetMapping("/getIconNameByLevel/{level}")
+    public R<UserLevelSetting> getIconNameByLevel(@PathVariable("level")Integer level) {
+        UserLevelSetting one = userLevelSettingService.lambdaQuery()
+                .eq(UserLevelSetting::getTreeLevelType, level).one();
+        return R.ok(one);
+    }
 }
 
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/VipSettingController.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/VipSettingController.java
index 229c91b..f647695 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/VipSettingController.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/controller/VipSettingController.java
@@ -1,9 +1,21 @@
 package com.xinquan.system.controller;
 
 
+import com.xinquan.common.core.domain.R;
+import com.xinquan.system.domain.ContentSetting;
+import com.xinquan.system.domain.VipSetting;
+import com.xinquan.system.service.VipSettingService;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.omg.CORBA.PRIVATE_MEMBER;
+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;
+
+import javax.annotation.Resource;
 
 /**
  * <p>
@@ -16,6 +28,31 @@
 @RestController
 @RequestMapping("/system/vip-setting")
 public class VipSettingController {
-
+    @Resource
+    private VipSettingService vipSettingService;
+    @PostMapping("/getVipPrice")
+    @ApiOperation(value = "安卓-获取月度 季度 年度会员价格",tags = "会员")
+    public R<VipSetting> getVipPrice() {
+        VipSetting one = vipSettingService.lambdaQuery().eq(VipSetting::getClientType, 1)
+                .eq(VipSetting::getSettingType, 1).one();
+        return R.ok(one);
+    }
+    @PostMapping("/getVipPriceApple")
+    @ApiOperation(value = "苹果-获取月度 季度 年度会员价格",tags = "会员")
+    public R<VipSetting> getVipPriceApple() {
+        VipSetting one = vipSettingService.lambdaQuery().eq(VipSetting::getClientType, 2)
+                .eq(VipSetting::getSettingType, 1).one();
+        return R.ok(one);
+    }
+    @PostMapping("/getVipContent")
+    @ApiOperation(value = "获取会员权益介绍/获取会员用户协议/获取续费管理说明",tags = "会员")
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "内容类型 1=会员权益介绍 2=会员用户协议 3=续费管理说明", name = "type", required = true, dataType = "int"),
+    })
+    public R<String> getVipPriceApple(Integer type) {
+        VipSetting one = vipSettingService.lambdaQuery()
+                .eq(VipSetting::getSettingType, type+1).one();
+        return R.ok(one.getContent());
+    }
 }
 
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/CommonQuestion.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/CommonQuestion.java
index 270a063..0dd053e 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/CommonQuestion.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/CommonQuestion.java
@@ -50,5 +50,9 @@
     @TableField("content")
     private String content;
 
+    @ApiModelProperty(value = "类型1问题 2客服微信")
+    @TableField("type")
+    private Integer type;
+
 
 }
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/TreeLevelSetting.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/TreeLevelSetting.java
index eed4d18..5b6bc26 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/TreeLevelSetting.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/domain/TreeLevelSetting.java
@@ -34,10 +34,6 @@
     @TableField("tree_level_type")
     private Integer treeLevelType;
     
-    @ApiModelProperty(value = "树苗阶段")
-    @TableField("level_name")
-    private String levelName;
-
     @ApiModelProperty(value = "成长值")
     @TableField("growth_value")
     private Integer growthValue;
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/UserLevelSettingMapper.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/UserLevelSettingMapper.java
index 10a76ee..a3ce167 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/UserLevelSettingMapper.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/mapper/UserLevelSettingMapper.java
@@ -1,6 +1,6 @@
 package com.xinquan.system.mapper;
 
-import com.xinquan.system.domain.UserLevelSetting;
+import com.xinquan.system.api.domain.UserLevelSetting;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/UserLevelSettingService.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/UserLevelSettingService.java
index 26da795..032089b 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/UserLevelSettingService.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/UserLevelSettingService.java
@@ -1,6 +1,6 @@
 package com.xinquan.system.service;
 
-import com.xinquan.system.domain.UserLevelSetting;
+import com.xinquan.system.api.domain.UserLevelSetting;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
diff --git a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/UserLevelSettingServiceImpl.java b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/UserLevelSettingServiceImpl.java
index 8391ff1..75ef42a 100644
--- a/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/UserLevelSettingServiceImpl.java
+++ b/xinquan-modules/xinquan-system/src/main/java/com/xinquan/system/service/impl/UserLevelSettingServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.system.service.impl;
 
-import com.xinquan.system.domain.UserLevelSetting;
+import com.xinquan.system.api.domain.UserLevelSetting;
 import com.xinquan.system.mapper.UserLevelSettingMapper;
 import com.xinquan.system.service.UserLevelSettingService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/UserLevelSettingMapper.xml b/xinquan-modules/xinquan-system/src/main/resources/mapper/system/UserLevelSettingMapper.xml
index f0e3b46..f224315 100644
--- a/xinquan-modules/xinquan-system/src/main/resources/mapper/system/UserLevelSettingMapper.xml
+++ b/xinquan-modules/xinquan-system/src/main/resources/mapper/system/UserLevelSettingMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.system.mapper.UserLevelSettingMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.system.domain.UserLevelSetting">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.UserLevelSetting">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
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 078516d..9ebadda 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,22 +1,47 @@
 package com.xinquan.user.controller.client;
 
 
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.utils.page.BeanUtils;
+import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.common.core.web.domain.BaseModel;
+import com.xinquan.common.security.utils.SecurityUtils;
+import com.xinquan.order.api.feign.RemoteOrderService;
+import com.xinquan.system.api.RemoteBannerService;
+import com.xinquan.system.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUserTree;
+import com.xinquan.system.api.domain.AppUserViewingHistory;
+import com.xinquan.system.api.domain.UserLevelSetting;
+import com.xinquan.system.api.domain.vo.*;
 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 com.xinquan.user.service.AppUserTreeService;
+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 java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
 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;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+import static com.xinquan.common.core.enums.TreeLevelEnum.TOWERING_TREES;
 
 /**
  * <p>
@@ -34,12 +59,208 @@
 public class ClientAppUserController {
 
     private final AppUserService appUserService;
+    @Resource
+    private AppUserViewingHistoryService appUserViewingHistoryService;
 
+    @Resource
+    private AppUserTreeService appUserTreeService;
+    @Resource
+    private RemoteBannerService remoteBannerService;
+    @Resource
+    private RemoteOrderService remoteOrderService;
+    public static void main(String[] args) {
+        LocalDateTime dateTime = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String formattedDateTime = dateTime.format(formatter);
+        System.err.println(formattedDateTime);
+    }
+    /**
+     * 爱心助力榜单-分页
+     *
+     * @param pageCurr    分页参数,当前页码
+     * @param pageSize    分页参数,每页数量
+     * @return 课程分页列表
+     */
+    @PostMapping("/myInviteRankList")
+    @ApiOperation(value = "我的助力-分页", tags = {"个人中心"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"),
+            @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer")
+    })
+    public R<PageDTO<InviteRankListVO>> myInviteRankList(
+            @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
+            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        Page<AppUser> page = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
+                .eq(AppUser::getInviteUserId, userId)
+                .page(new Page<>(pageCurr, pageSize));
+        // 查询登录用户邀请了哪些人
+        List<Long> collect = page.getRecords().stream().map(AppUser::getId).collect(Collectors.toList());
+        if (collect.isEmpty())return R.ok(PageDTO.empty(page));
+        StringBuilder stringBuilder = new StringBuilder();
+        collect.forEach(id -> stringBuilder.append(id).append(","));
+        // 去除最后一位
+        StringBuilder stringBuilder1 = stringBuilder.deleteCharAt(stringBuilder.length() - 1);
+        String[] split = stringBuilder1.toString().split(",");
+        for (int i = 0; i < page.getRecords().size(); i++) {
+            AppUser appUser = page.getRecords().get(i);
+            appUser.setMoney(new BigDecimal(split[i]));
+        }
+        // 根据佣金金额 从大到小排序
+        page.getRecords().sort((o1, o2) -> o2.getMoney().compareTo(o1.getMoney()));
+        return R.ok(PageDTO.of(page, InviteRankListVO.class));
+    }
+    /**
+     * 爱心助力榜单-分页
+     *
+     * @param pageCurr    分页参数,当前页码
+     * @param pageSize    分页参数,每页数量
+     * @return 课程分页列表
+     */
+    @PostMapping("/inviteRankList")
+    @ApiOperation(value = "爱心助力榜单-分页", tags = {"个人中心"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(value = "分页参数,当前页码", name = "pageCurr", required = true, dataType = "Integer"),
+            @ApiImplicitParam(value = "分页参数,每页数量", name = "pageSize", required = true, dataType = "Integer")
+    })
+    public R<PageDTO<InviteRankListVO>> inviteRankList(
+            @RequestParam(value = "pageCurr", defaultValue = "1") Integer pageCurr,
+            @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
+        Page<AppUser> page = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
+                .page(new Page<>(pageCurr, pageSize));
+        for (AppUser appUser : page.getRecords()) {
+            int size = appUserService.lambdaQuery().ne(AppUser::getUserStatus, 3)
+                    .eq(AppUser::getInviteUserId, appUser.getId())
+                    .list().size();
+            appUser.setCount(size);
+        }
+        // 根据帮助人数 从大到小排序
+        page.getRecords().sort((o1, o2) -> o2.getCount() - o1.getCount());
+        return R.ok(PageDTO.of(page, InviteRankListVO.class)) ;
+    }
+    @PostMapping("/getUserInfo")
+    @ApiOperation(value = "获取用户信息", tags = {"个人中心"})
+    public R<AppUserInfoVO> getUserInfo() {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        AppUserInfoVO appUserInfoVO = new AppUserInfoVO();
+        AppUserVO currentUser = appUserService.getCurrentUser();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        if (currentUser.getVipExpireTime() == null){
+            appUserInfoVO.setIsVip(2);
+        }else if (currentUser.getVipExpireTime().isAfter(LocalDateTime.now())){
+            appUserInfoVO.setIsVip(1);
+            String formattedDateTime =currentUser.getVipExpireTime().format(formatter);
+            appUserInfoVO.setVipExpireTime(formattedDateTime);
+        }else{
+            String formattedDateTime =currentUser.getVipExpireTime().format(formatter);
+            appUserInfoVO.setVipExpireTime(formattedDateTime);
+            appUserInfoVO.setIsVip(2);
+        }
+        // 查询用户累计学习天数
+        List<AppUserViewingHistory> com = appUserViewingHistoryService.cumulative(userId);
+        appUserInfoVO.setCumulative(com.size());
+        // 查询用户今日学习多少分钟
+        int temp = appUserViewingHistoryService.today(userId);
+        if (temp == 0){
+            appUserInfoVO.setToday(0);
+        }else if (temp<60){
+            // 不足一分钟按一分钟计算
+            appUserInfoVO.setToday(1);
+        }else{
+            appUserInfoVO.setToday(temp/60);
+        }
+        // 查询用户连续观看天数
+        List<AppUserViewingHistory> list = appUserViewingHistoryService.lambdaQuery().eq(AppUserViewingHistory::getAppUserId, userId)
+                .eq(AppUserViewingHistory::getViewingType, 1)
+                .orderByDesc(BaseModel::getCreateTime).list();
+        Set<LocalDate> viewingDates = list.stream()
+                .map(record -> LocalDate.parse(record.getCreateTime().toLocalDate().toString(), formatter))
+                .collect(Collectors.toCollection(HashSet::new));
+        // 获取今天的日期
+        LocalDate today = LocalDate.now();
+        // 计算连续观看天数
+        int consecutiveDays = 0;
+        LocalDate currentDate = today;
+        // 如果今天没有观看 也进入循环判断
+        while (viewingDates.contains(currentDate)||LocalDate.parse(currentDate.toString(), formatter).equals(today)) {
+            if (!viewingDates.contains(currentDate)){
+                // 如果今天没有观看
+                currentDate = currentDate.minusDays(1);
+                continue;
+            }
+            consecutiveDays++;
+            currentDate = currentDate.minusDays(1);
+        }
+        appUserInfoVO.setToday(consecutiveDays);
+        List<AppUserTree> list1 = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
+                .list();
+        // 查询用户等级最高的那颗树苗
+        AppUserTree tree = list1.stream().max((o1, o2) -> {
+            if (o1.getTreeLevelType() > o2.getTreeLevelType()) {
+                return 1;
+            } else if (o1.getTreeLevelType() < o2.getTreeLevelType()) {
+                return -1;
+            } else {
+                return 0;
+            }
+        }).orElse(null);
+        // 查询疗愈等级 名称 图标
+        int level = 1;
+        if (tree != null){
+            level = tree.getTreeLevelType();
+        }
+        appUserInfoVO.setLevel(level);
+        // 根据等级查询疗愈名称和图标
+        UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData();
+        appUserInfoVO.setLevelName(data.getLevelName());
+        appUserInfoVO.setLevelIcon(data.getLevelIcon());
+        return R.ok(appUserInfoVO);
+    }
+    @PostMapping("/getUserDetail")
+    @ApiOperation(value = "获取个人资料", tags = {"个人中心"})
+    public R<AppUser> getUserDetail() {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        AppUser appUser = appUserService.lambdaQuery().eq(AppUser::getId, userId).one();
+        return R.ok(appUser);
+    }
+    @PostMapping("/getTotalEnergyValue")
+    @ApiOperation(value = "获取用户当前累计能量值",tags = "树苗打卡站")
+    public R getTotalEnergyValue() {
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        AppUser byId = appUserService.getById(userId);
+        return R.ok(byId.getTotalEnergyValue());
+    }
+    @PostMapping("/updateUserDetail")
+    @ApiOperation(value = "修改个人资料", tags = {"个人中心"})
+    public R<AppUser> updateUserDetail(UpdateAppUserDTO dto) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        AppUser byId = appUserService.getById(userId);
+        BeanUtils.copyProperties(dto, byId);
+//        LambdaUpdateWrapper<AppUser> updateWrapper = new LambdaUpdateWrapper<>(AppUser.class);
+//        updateWrapper.set(AppUser::getNickname, byId.getNickname());
+//        updateWrapper.set(AppUser::getSignature, byId.getSignature());
+//        updateWrapper.set(AppUser::getAvatar, byId.getAvatar());
+//        updateWrapper.set(AppUser::getGender, byId.getGender());
+//        updateWrapper.set(AppUser::getBirthday, byId.getBirthday());
+//        updateWrapper.set(AppUser::getEducation, byId.getEducation());
+//        updateWrapper.set(AppUser::getIndustry, byId.getIndustry());
+//        updateWrapper.set(AppUser::getCompany, byId.getCompany());
+//        updateWrapper.set(AppUser::getOccupation, byId.getOccupation());
+//        updateWrapper.set(AppUser::getLocation, byId.getLocation());
+//        updateWrapper.set(AppUser::getHometown, byId.getHometown());
+//        appUserService.update(byId, )
+        return R.ok();
+    }
     /**
      * 获取当前登录用户信息
      *
      * @return 用户信息
-     * @see com.xinquan.user.domain.vo.AppUserVO
+     * @see AppUserVO
      */
     @PostMapping("/getCurrentUser")
     @ApiOperation(value = "获取当前用户信息", tags = {"用户端-用户信息相关接口"})
@@ -48,6 +269,32 @@
     }
 
     /**
+     * 通过手机号查询用户端用户信息
+     *
+     * @return 用户信息
+     * @see AppUserVO
+     */
+    @PostMapping("/getUserByPhone")
+    @ApiOperation(value = "根据用户手机号查询用户信息")
+    public R<AppUserDetailVO> getCurrentUser(String phone) {
+        AppUser one = appUserService.lambdaQuery().eq(AppUser::getCellPhone, phone).one();
+        AppUserDetailVO appUserDetailVO = new AppUserDetailVO();
+        appUserDetailVO.setId(one.getId());
+        appUserDetailVO.setCellPhone(one.getCellPhone());
+        appUserDetailVO.setAvatar(one.getAvatar());
+        appUserDetailVO.setNickname(one.getNickname());
+        return R.ok(appUserDetailVO);
+    }
+    @PostMapping("/getUserBalance")
+    @ApiOperation(value = "查询当前用户余额")
+    public R<String> getUserBalance() {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        AppUser one = appUserService.lambdaQuery().eq(AppUser::getUserId, userId).one();
+        return R.ok(one.getBalance().toString());
+    }
+
+    /**
      * 获取问题二的标签列表
      *
      * @return List<TagVO>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserCourseController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserCourseController.java
index 69d4a53..6bdb1cb 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserCourseController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserCourseController.java
@@ -1,13 +1,18 @@
 package com.xinquan.user.controller.client;
 
 
+import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.C;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xinquan.common.core.domain.R;
-import com.xinquan.user.api.domain.AppUser;
-import com.xinquan.user.domain.AppUserCourse;
-import com.xinquan.user.domain.vo.AppUserVO;
+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.system.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUserCourse;
+import com.xinquan.system.api.domain.vo.AppUserVO;
 import com.xinquan.user.service.AppUserCourseService;
 import com.xinquan.user.service.AppUserService;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.models.auth.In;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -34,17 +39,38 @@
      * 远程调用 根据课程id 查询拥有课程的用户
      *
      * @return 用户信息
-     * @see com.xinquan.user.domain.vo.AppUserVO
+     * @see AppUserVO
      */
     @GetMapping("/getUserByCourseId/{courseId}")
-    public R<List<String>> getUserByCourseId(@PathVariable("courseId") Long courseId) {
+    public R<List<AppUser>> getUserByCourseId(@PathVariable("courseId") Long courseId) {
         List<Long> collect = appUserCourseService.lambdaQuery().eq(AppUserCourse::getCourseId, courseId).list()
                 .stream().map(AppUserCourse::getAppUserId).collect(Collectors.toList());
         // 批量查询用户头像
-        List<String> collect1 = appUserService.lambdaQuery().in(!collect.isEmpty(), AppUser::getId, collect).list()
-                .stream().map(AppUser::getAvatar).collect(Collectors.toList());
+        List<AppUser> collect1 = appUserService.lambdaQuery().in(!collect.isEmpty(), AppUser::getId, collect).list();
         return R.ok(collect1);
     }
+    /**
+     * 远程调用 查询当前登录用户已购买课程
+     *
+     * @return 用户信息
+     * @see AppUserVO
+     */
+    @GetMapping("/getPayCourse/{pageCurr}/{pageSize}")
+    public R<PageDTO<AppUserCourse>> getPayCourse(@PathVariable("pageCurr")Integer pageCurr
+            ,@PathVariable("pageSize")Integer pageSize) {
+        Page<AppUserCourse> page = appUserCourseService.lambdaQuery()
+                .eq(AppUserCourse::getCourseId, SecurityUtils.getUserId())
+                .orderByDesc(AppUserCourse::getCreateTime)
+                .page(new Page<>(pageCurr, pageSize));
+        if (CollUtils.isEmpty(page.getRecords())) {
+            PageDTO<AppUserCourse> empty = PageDTO.empty(page);
+            return R.ok(empty);
+        }
+        PageDTO<AppUserCourse> courseChapterPageDTO = PageDTO.of(page, AppUserCourse.class);
+        return R.ok(courseChapterPageDTO);
+    }
+
+
 
 }
 
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserTreeController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserTreeController.java
index d3abb7d..9291ca0 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserTreeController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserTreeController.java
@@ -1,9 +1,36 @@
 package com.xinquan.user.controller.client;
 
 
+import cn.hutool.core.util.RandomUtil;
+import com.alibaba.fastjson2.util.UUIDUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.utils.page.CollUtils;
+import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.common.core.web.domain.BaseModel;
+import com.xinquan.common.security.utils.SecurityUtils;
+import com.xinquan.system.api.RemoteUserService;
+import com.xinquan.system.api.domain.*;
+import com.xinquan.system.api.domain.vo.AppUserEnergyRecordVO;
+import com.xinquan.system.api.domain.vo.WateringVO;
+import com.xinquan.user.domain.vo.EnergyVO;
+import com.xinquan.user.domain.vo.ExchangeRecordVO;
+import com.xinquan.user.service.*;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.Mapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p>
@@ -16,6 +43,392 @@
 @RestController
 @RequestMapping("/client/app-user-tree")
 public class ClientAppUserTreeController {
+    @Resource
+    private AppUserTreeService appUserTreeService;
+    @Resource
+    private AppUserViewingHistoryService appUserViewingHistoryService;
+    @Resource
+    private AppUserService appUserService;
+    @Resource
+    private AppUserEnergyRecordService appUserEnergyRecordService;
+    @Resource
+    private PrizeService prizeService;
+    @Resource
+    private PrizeRedemptionRecordService prizeRedemptionRecordService;
 
+    @PostMapping("/getUserTree")
+    @ApiOperation(value = "获取用户树苗",tags = "树苗打卡站")
+    public R<AppUserTree> getUserTree() {
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        AppUser byId = appUserService.getById(userId);
+
+        // 查询用户今日观看疗愈多少秒
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
+        LocalDateTime endOfDay = now.toLocalDate().atTime(LocalTime.MAX);
+        List<AppUserViewingHistory> list = appUserViewingHistoryService
+                .lambdaQuery().eq(AppUserViewingHistory::getAppUserId, userId)
+                .eq(AppUserViewingHistory::getViewingType, 1)
+                .eq(BaseModel::getDelFlag,0)
+                .between(AppUserViewingHistory::getCreateTime, startOfDay,endOfDay).list();
+        int temp = 0;
+        for (AppUserViewingHistory appUserViewingHistory : list) {
+            temp += appUserViewingHistory.getTimeLook();
+        }
+
+        AppUserTree one = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
+                .eq(AppUserTree::getSowAgain,2).one();
+        if (one == null){
+            AppUserTree appUserTree = new AppUserTree();
+            appUserTree.setAppUserId(userId);
+            appUserTree.setTreeLevelType(1);
+            appUserTree.setGrowthValue(0);
+            appUserTree.setSowAgain(2);
+            appUserTree.setCreateTime(LocalDateTime.now());
+            // 如果用户的签到时间是今天 那么修改为已签到
+            if (byId.getSignTime().toLocalDate().equals(LocalDateTime.now().toLocalDate())){
+                appUserTree.setIsSign(1);
+            }else{
+                appUserTree.setIsSign(2);
+            }
+            if (temp>=60){
+                appUserTree.setTaskOne(1);
+                appUserTree.setTaskTwo(1);
+            }
+            else if (temp>=30){
+                appUserTree.setTaskOne(1);
+                appUserTree.setTaskTwo(2);
+            }else{
+                appUserTree.setTaskOne(2);
+                appUserTree.setTaskTwo(2);
+            }
+            appUserTree.setNextLevel(1000);
+            appUserTreeService.save(appUserTree);
+            return R.ok(appUserTree);
+        }else{
+            if (temp>=60){
+                one.setTaskOne(1);
+                one.setTaskTwo(1);
+            }
+            else if (temp>=30){
+                one.setTaskOne(1);
+                one.setTaskTwo(2);
+            }else{
+                one.setTaskOne(2);
+                one.setTaskTwo(2);
+            }
+            // 如果用户的签到时间是今天 那么修改为已签到
+            if (byId.getSignTime().toLocalDate().equals(LocalDateTime.now().toLocalDate())){
+                one.setIsSign(1);
+            }else{
+                one.setIsSign(2);
+            }
+            switch (one.getTreeLevelType()){
+                case 1:
+                    one.setNextLevel(1000);
+                    break;
+                case 2:
+                    one.setNextLevel(1000);
+                    break;
+                case 3:
+                    one.setNextLevel(1000);
+                    break;
+                case 4:
+                    one.setNextLevel(1000);
+                    break;
+                case 5:
+                    one.setNextLevel(2000);
+                    break;
+                case 6:
+                    one.setNextLevel(2000);
+                    break;
+                case 7:
+                    one.setNextLevel(2000);
+                    break;
+                case 8:
+                    one.setNextLevel(2000);
+                    break;
+                case 9:
+                    one.setNextLevel(2400);
+                    break;
+                case 10:
+                    one.setNextLevel(2400);
+                    break;
+            }
+            return R.ok(one);
+
+        }
+    }
+    @PostMapping("/restart")
+    @ApiOperation(value = "重新播种",tags = "树苗打卡站")
+    public R restart() {
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        AppUserTree one = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
+                .eq(AppUserTree::getSowAgain,2).one();
+        one.setSowAgain(1);
+        appUserTreeService.updateById(one);
+        AppUserTree appUserTree = new AppUserTree();
+        appUserTree.setAppUserId(userId);
+        appUserTree.setTreeLevelType(1);
+        appUserTree.setGrowthValue(0);
+        appUserTree.setSowAgain(2);
+        appUserTree.setCreateTime(LocalDateTime.now());
+        appUserTreeService.save(appUserTree);
+        return R.ok();
+    }
+
+    @PostMapping("/watering")
+    @ApiOperation(value = "浇水 返回值true证明升级了 false没升级",tags = "树苗打卡站")
+    public R<WateringVO> watering() {
+        WateringVO wateringVO = new WateringVO();
+
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        AppUser byId = appUserService.getById(userId);
+        AppUserTree one = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
+                .eq(AppUserTree::getSowAgain,2).one();
+        Integer currentEnergyValue = byId.getEnergyValue();
+        byId.setEnergyValue(0);
+        // 判断能否升级
+        int temp = 0;
+        switch (one.getTreeLevelType()){
+            case 1:
+                temp=1000;
+                break;
+            case 2:
+                temp=1000;
+                break;
+            case 3:
+                temp=1000;
+                break;
+            case 4:
+                temp=1000;
+                break;
+            case 5:
+                temp=2000;
+                break;
+            case 6:
+                temp=2000;
+                break;
+            case 7:
+                temp=2000;
+                break;
+            case 8:
+                temp=2000;
+                break;
+            case 9:
+                temp=2400;
+                break;
+            case 10:
+                temp=2400;
+                break;
+        }
+        wateringVO.setNextLevel(temp);
+        // 升级阈值
+        if (one.getGrowthValue()+currentEnergyValue>=temp){
+            // 升级咯 如果当前等级已经为10级
+            if (one.getTreeLevelType()==10){
+                one.setGrowthValue(one.getGrowthValue()+currentEnergyValue);
+                appUserTreeService.updateById(one);
+                wateringVO.setIsNext(false);
+                wateringVO.setNextLevel(2400);
+            }else{
+                // 升级
+                one.setTreeLevelType(one.getTreeLevelType()+1);
+                one.setGrowthValue(one.getGrowthValue()+currentEnergyValue-temp);
+                appUserTreeService.updateById(one);
+                switch (one.getTreeLevelType()+1){
+                    case 2:
+                        temp=1000;
+                        break;
+                    case 3:
+                        temp=1000;
+                        break;
+                    case 4:
+                        temp=1000;
+                        break;
+                    case 5:
+                        temp=2000;
+                        break;
+                    case 6:
+                        temp=2000;
+                        break;
+                    case 7:
+                        temp=2000;
+                        break;
+                    case 8:
+                        temp=2000;
+                        break;
+                    case 9:
+                        temp=2400;
+                        break;
+                    case 10:
+                        temp=2400;
+                        break;
+                }
+                wateringVO.setNextLevel(temp);
+                wateringVO.setIsNext(true);
+            }
+        }else{
+            // 不能升级
+            one.setGrowthValue(one.getGrowthValue()+currentEnergyValue-temp);
+            appUserTreeService.updateById(one);
+            wateringVO.setIsNext(false);
+        }
+        wateringVO.setGrowthValue(one.getGrowthValue());
+        return R.ok(wateringVO);
+    }
+    @PostMapping("/sign")
+    @ApiOperation(value = "签到",tags = "树苗打卡站")
+    public R sign() {
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        // 给用户加10能量
+        AppUser byId = appUserService.getById(userId);
+        byId.setTotalEnergyValue(byId.getTotalEnergyValue()+10);
+        byId.setEnergyValue(byId.getEnergyValue()+10);
+        appUserService.updateById(byId);
+        return R.ok();
+    }
+
+    @PostMapping("/isFirst")
+    @ApiOperation(value = "是否首次进入 ",tags = "树苗打卡站")
+    public R isFirst() {
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        AppUser byId = appUserService.getById(userId);
+        if (byId.getIsFirst() == 1){
+            byId.setIsFirst(2);
+            appUserService.updateById(byId);
+            return R.ok(true);
+        }else{
+            return R.ok(false);
+        }
+    }
+    @PostMapping("/energyDetail")
+    @ApiOperation(value = "能量值明细 ",tags = "树苗打卡站")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "state", value = "状态1全部 2增加 3扣除", dataType = "int", required = false),
+            @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", dataType = "Integer", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true)
+    })
+    public R<PageDTO<AppUserEnergyRecordVO>> energyDetail(Integer state,Integer pageCurr,Integer pageSize) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        EnergyVO energyVO = new EnergyVO();
+        energyVO.setEnergyTotal(appUserService.getById(userId).getTotalEnergyValue());
+        LambdaQueryWrapper<AppUserEnergyRecord> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        if (state!=null){
+            switch (state){
+                case 2:
+                    lambdaQueryWrapper.eq(AppUserEnergyRecord::getChangeType, 1);
+                    break;
+                case 3:
+                    lambdaQueryWrapper.eq(AppUserEnergyRecord::getChangeType, 2);
+                    break;
+            }
+        }
+        lambdaQueryWrapper.eq(AppUserEnergyRecord::getAppUserId, userId).orderByDesc(BaseModel::getCreateTime);
+        Page<AppUserEnergyRecord> page = appUserEnergyRecordService.page(new Page<>(pageCurr, pageSize), lambdaQueryWrapper);
+        if (CollUtils.isEmpty(page.getRecords())){
+            PageDTO<AppUserEnergyRecordVO> empty = PageDTO.empty(page);
+            energyVO.setList(new ArrayList<AppUserEnergyRecordVO>());
+            return R.ok(empty);
+        }
+        PageDTO<AppUserEnergyRecordVO> appUserEnergyRecordVOPageDTO = PageDTO.of(page, AppUserEnergyRecordVO.class);
+        energyVO.setList(appUserEnergyRecordVOPageDTO.getList());
+        return R.ok(appUserEnergyRecordVOPageDTO);
+    }
+    @PostMapping("/goodsList")
+    @ApiOperation(value = "能量兑换礼物列表 ",tags = "树苗打卡站")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", dataType = "Integer", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true)
+    })
+    public R<PageDTO<Prize>> goodsList(Integer pageCurr,Integer pageSize) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        Page<Prize> page = prizeService.lambdaQuery()
+                .eq(Prize::getStatus, 1)
+                .orderByDesc(BaseModel::getCreateTime).page(new Page<>(pageCurr, pageSize));
+
+        if (CollUtils.isEmpty(page.getRecords())){
+            PageDTO<Prize> empty = PageDTO.empty(page);
+            return R.ok(empty);
+        }
+        for (Prize record : page.getRecords()) {
+            PrizeRedemptionRecord one = prizeRedemptionRecordService.lambdaQuery()
+                    .eq(PrizeRedemptionRecord::getPrizeId, record.getId())
+                    .eq(PrizeRedemptionRecord::getAppUserId, userId).one();
+            if (one == null){
+                record.setReceiveStatus(2);
+            }
+        }
+        PageDTO<Prize> res = PageDTO.of(page, Prize.class);
+        return R.ok(res);
+    }
+    @PostMapping("/exchange")
+    @ApiOperation(value = "兑换奖品 ",tags = "树苗打卡站")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "prizeId", value = "奖品id", dataType = "Long", required = true),
+    })
+    public R exchange(Long prizeId) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        AppUser byId1 = appUserService.getById(userId);
+        Prize byId = prizeService.getById(prizeId);
+        if (byId1.getTotalEnergyValue()<=byId.getEnergyValue()){
+            return R.fail("能量值不足");
+        }
+        PrizeRedemptionRecord one = prizeRedemptionRecordService.lambdaQuery()
+                .eq(PrizeRedemptionRecord::getPrizeId, prizeId)
+                .eq(PrizeRedemptionRecord::getAppUserId, userId).one();
+        if (one!=null){
+            return R.fail("奖品已兑换");
+        }
+        PrizeRedemptionRecord prizeRedemptionRecord = new PrizeRedemptionRecord();
+        prizeRedemptionRecord.setStatus(1);
+        prizeRedemptionRecord.setPrizeId(prizeId);
+        prizeRedemptionRecord.setAppUserId(userId);
+        prizeRedemptionRecord.setCreateTime(LocalDateTime.now());
+        String code = RandomUtil.randomNumbers(6);
+        prizeRedemptionRecord.setCode(code);
+        prizeRedemptionRecordService.save(prizeRedemptionRecord);
+        // 随机生成6位纯数字验证码
+        return R.ok();
+    }
+    @PostMapping("/exchangeRecordList")
+    @ApiOperation(value = "兑换记录 ",tags = "树苗打卡站")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", dataType = "Integer", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "分页参数,每页数量", dataType = "Integer", required = true)
+    })
+    public R<PageDTO<ExchangeRecordVO>> exchangeRecordList(Integer pageCurr, Integer pageSize) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId==0)return R.tokenError("登录失效");
+        Page<PrizeRedemptionRecord> page = prizeRedemptionRecordService.lambdaQuery()
+                .eq(PrizeRedemptionRecord::getAppUserId, userId)
+                .orderByDesc(BaseModel::getCreateTime).page(new Page<>(pageCurr, pageSize));
+
+        if (CollUtils.isEmpty(page.getRecords())){
+            PageDTO<ExchangeRecordVO> empty = PageDTO.empty(page);
+            return R.ok(empty);
+        }
+        PageDTO<ExchangeRecordVO> res = PageDTO.of(page, ExchangeRecordVO.class);
+
+        for (ExchangeRecordVO record : res.getList()) {
+            Prize temp = prizeService.lambdaQuery()
+                    .eq(Prize::getId, record.getId()).one();
+            if (temp != null){
+                record.setName(temp.getName());
+                record.setCoverUrl(temp.getCoverUrl());
+                record.setWorth(temp.getWorth());
+                record.setEnergyValue(temp.getEnergyValue());
+            }
+        }
+        return R.ok(res);
+    }
 }
 
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
index 239e7e4..dbab044 100644
--- 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
@@ -2,16 +2,31 @@
 
 
 import com.xinquan.common.core.domain.R;
+import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.common.core.web.domain.BaseModel;
+import com.xinquan.common.security.service.TokenService;
+import com.xinquan.common.security.utils.SecurityUtils;
+import com.xinquan.system.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUserTree;
+import com.xinquan.system.api.domain.AppUserViewingHistory;
+import com.xinquan.system.api.domain.vo.AppUserVO;
+import com.xinquan.user.service.AppUserService;
+import com.xinquan.user.service.AppUserTreeService;
 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 io.swagger.models.auth.In;
+import lombok.Data;
 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;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.Date;
+import java.util.List;
 
 /**
  * <p>
@@ -28,7 +43,12 @@
 public class ClientAppUserViewingHistoryController {
 
     private final AppUserViewingHistoryService appUserViewingHistoryService;
-
+    @Resource
+    private TokenService tokenService;
+    @Resource
+    private AppUserTreeService appUserTreeService;
+    @Resource
+    private AppUserService appUserService;
     /**
      * 记录用户观看记录
      *
@@ -36,15 +56,172 @@
      * @param viewingType 观看类型 1=疗愈 2=课程
      */
     @PostMapping("/saveViewingHistory")
-    @ApiOperation(value = "记录用户观看记录", tags = {"用户端-用户相关接口"})
+    @ApiOperation(value = "记录用户观看冥想记录", tags = {"用户端-用户相关接口"})
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "bizId", value = "业务id", dataType = "Long", required = true),
-            @ApiImplicitParam(name = "viewingType", value = "观看类型 1=疗愈 2=课程", dataType = "Integer", required = true)
+            @ApiImplicitParam(name = "id", value = "冥想id", dataType = "Long", required = true),
+            @ApiImplicitParam(name = "timeLook", value = "播放时长单位秒", dataType = "Integer", required = true)
     })
-    public R<?> saveViewingRecord(@RequestParam("bizId") Long bizId,
-            @RequestParam("viewingType") Integer viewingType) {
-        appUserViewingHistoryService.saveViewingRecord(bizId, viewingType);
+    public R<?> saveViewingRecord(@RequestParam("id") Long id,
+            @RequestParam("timeLook") Integer timeLook) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        AppUser byId = appUserService.getById(userId);
+
+        AppUserViewingHistory appUserViewingHistory = new AppUserViewingHistory();
+        appUserViewingHistory.setAppUserId(userId);
+        appUserViewingHistory.setBizId(id);
+        appUserViewingHistory.setViewingType(1);
+        appUserViewingHistory.setTimeLook(timeLook);
+        appUserViewingHistory.setCreateTime(LocalDateTime.now());
+        appUserViewingHistoryService.save(appUserViewingHistory);
+        // 查询用户今日观看了多久冥想 如果达到30分钟 用户能量+10 如果达到60分钟 用户能量额外增加20
+        // 查询用户今日观看疗愈多少秒
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime startOfDay = now.toLocalDate().atStartOfDay();
+        LocalDateTime endOfDay = now.toLocalDate().atTime(LocalTime.MAX);
+        List<AppUserViewingHistory> list = appUserViewingHistoryService
+                .lambdaQuery().eq(AppUserViewingHistory::getAppUserId, userId)
+                .eq(AppUserViewingHistory::getViewingType, 1)
+                .eq(BaseModel::getDelFlag,0)
+                .between(AppUserViewingHistory::getCreateTime, startOfDay,endOfDay).list();
+        int temp = 0;
+        for (AppUserViewingHistory appUserViewingHistory1 : list) {
+            temp += appUserViewingHistory1.getTimeLook();
+        }
+        AppUserTree one = appUserTreeService.lambdaQuery().eq(AppUserTree::getAppUserId, userId)
+                .eq(AppUserTree::getSowAgain,2).one();
+        if (one == null){
+            AppUserTree appUserTree = new AppUserTree();
+            appUserTree.setAppUserId(userId);
+            appUserTree.setTreeLevelType(1);
+            appUserTree.setGrowthValue(0);
+
+            appUserTree.setSowAgain(2);
+            appUserTree.setCreateTime(LocalDateTime.now());
+            if (temp>=60){
+                byId.setEnergyValue(byId.getEnergyValue()+30);
+            }
+            else if (temp>=30){
+                byId.setEnergyValue(byId.getEnergyValue()+10);
+            }
+            appUserService.updateById(byId);
+            appUserTreeService.save(appUserTree);
+        }else{
+            if (temp>=60){
+                byId.setEnergyValue(byId.getEnergyValue()+30);
+            }
+            else if (temp>=30){
+                byId.setEnergyValue(byId.getEnergyValue()+10);
+            }
+            appUserService.updateById(byId);
+            appUserTreeService.updateById(one);
+        }
         return R.ok();
     }
+    @PostMapping("/saveCourseStudyHistory")
+    @ApiOperation(value = "记录用户观看课程记录", tags = {"用户端-用户相关接口"})
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "chapterId", value = "章节id", dataType = "Long", required = true),
+            @ApiImplicitParam(name = "isOver", value = "是否观看完成 1是2否", dataType = "int", required = true),
+            @ApiImplicitParam(name = "minuteLook", value = "观看到xx分钟", dataType = "int", required = true),
+            @ApiImplicitParam(name = "secondLook", value = "观看到xx秒", dataType = "int", required = true),
+    })
+    public R<?> saveCourseStudyHistory(@RequestParam("chapterId") Long chapterId,
+                                       @RequestParam("minuteLook") Integer minuteLook,
+                                       @RequestParam("secondLook") Integer secondLook,
+                                       @RequestParam("isOver") Integer isOver
+    ) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        AppUserViewingHistory one = appUserViewingHistoryService.lambdaQuery()
+                .eq(AppUserViewingHistory::getAppUserId, userId)
+                .eq(AppUserViewingHistory::getViewingType, 2)
+                .eq(AppUserViewingHistory::getChapterId, chapterId).one();
+        if (one!=null){
+            if (one.getIsOver() == 1){
+                // 如果已经看完了 那么不更新状态 只更新观看时间
+                one.setMinuteLook(minuteLook);
+                one.setSecondLook(secondLook);
+            }else{
+                one.setIsOver(isOver);
+            }
+            appUserViewingHistoryService.updateById(one);
+        }else{
+            AppUserViewingHistory appUserViewingHistory = new AppUserViewingHistory();
+            appUserViewingHistory.setAppUserId(userId);
+            appUserViewingHistory.setBizId(chapterId);
+            appUserViewingHistory.setViewingType(2);
+            appUserViewingHistory.setMinuteLook(minuteLook);
+            appUserViewingHistory.setSecondLook(secondLook);
+            appUserViewingHistory.setChapterId(chapterId);
+            appUserViewingHistory.setIsOver(isOver);
+            appUserViewingHistoryService.save(appUserViewingHistory);
+        }
+        return R.ok();
+    }
+    @PostMapping("/getCourseStudyHistory")
+    public R<AppUserViewingHistory> getCourseStudyHistory(@RequestParam("chapterId") Long chapterId) {
+        Long userId = SecurityUtils.getUserId();
+        if (userId == 0)return R.tokenError("登录失效");
+        AppUserViewingHistory one = appUserViewingHistoryService.lambdaQuery()
+                .eq(AppUserViewingHistory::getAppUserId, userId)
+                .eq(AppUserViewingHistory::getViewingType, 2)
+                .eq(AppUserViewingHistory::getChapterId, chapterId).one();
+        if (one==null){
+            AppUserViewingHistory appUserViewingHistory = new AppUserViewingHistory();
+            appUserViewingHistory.setAppUserId(userId);
+            appUserViewingHistory.setBizId(chapterId);
+            appUserViewingHistory.setViewingType(2);
+            appUserViewingHistory.setMinuteLook(0);
+            appUserViewingHistory.setSecondLook(0);
+            appUserViewingHistory.setChapterId(chapterId);
+            appUserViewingHistory.setIsOver(2);
+            appUserViewingHistoryService.save(appUserViewingHistory);
+            return R.ok(appUserViewingHistory);
+        }
+        return R.ok(one);
+    }
+
+//    @PostMapping("/studyRecord")
+//    @ApiOperation(value = "学习页面记录观看到xx分钟xx秒")
+//    @ApiImplicitParams({
+//            @ApiImplicitParam(value = "章节id", name = "chapterId", required = true, dataType = "String"),
+//            @ApiImplicitParam(value = "上次观看到xx分钟", name = "minuteLook", required = true, dataType = "Integer"),
+//            @ApiImplicitParam(value = "上次观看到xx秒", name = "secondLook", required = true, dataType = "Integer"),
+//            @ApiImplicitParam(value = "是否观看完成", name = "isOver", required = true, dataType = "Integer"),
+//    })
+//    public R studyRecord(@RequestParam(value = "chapterId")Long chapterId,
+//                                                 @RequestParam(value = "minuteLook") Integer minuteLook,
+//                                                 @RequestParam(value = "secondLook") Integer secondLook,
+//                                                 @RequestParam(value = "isOver") Integer isOver
+//    ) {
+//        Long userId = SecurityUtils.getUserId();
+//        if (userId == 0)return R.tokenError("登录失效");
+//        AppUserViewingHistory one = appUserViewingHistoryService.lambdaQuery()
+//                .eq(AppUserViewingHistory::getAppUserId, userId)
+//                .eq(AppUserViewingHistory::getViewingType, 2)
+//                .eq(AppUserViewingHistory::getChapterId, chapterId).one();
+//        if (one!=null){
+//            if (one.getIsOver() == 1){
+//                // 如果已经看完了 那么不更新状态 只更新观看时间
+//                one.setMinuteLook(minuteLook);
+//                one.setSecondLook(secondLook);
+//            }else{
+//                one.setIsOver(isOver);
+//            }
+//            appUserViewingHistoryService.updateById(one);
+//        }else{
+//            AppUserViewingHistory appUserViewingHistory = new AppUserViewingHistory();
+//            appUserViewingHistory.setAppUserId(userId);
+//            appUserViewingHistory.setBizId(chapterId);
+//            appUserViewingHistory.setViewingType(2);
+//            appUserViewingHistory.setMinuteLook(minuteLook);
+//            appUserViewingHistory.setSecondLook(secondLook);
+//            appUserViewingHistory.setChapterId(chapterId);
+//            appUserViewingHistory.setIsOver(isOver);
+//            appUserViewingHistoryService.save(appUserViewingHistory);
+//        }
+//        return R.ok();
+//    }
 }
 
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientTagController.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientTagController.java
index e01703f..a8e4b5f 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientTagController.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientTagController.java
@@ -1,9 +1,20 @@
 package com.xinquan.user.controller.client;
 
 
+import com.xinquan.common.core.domain.R;
+import com.xinquan.system.api.domain.Tag;
+import com.xinquan.user.domain.dto.UserAnswerDTO;
+import com.xinquan.user.service.TagService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+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;
+
+import javax.annotation.Resource;
+import java.util.List;
 
 /**
  * <p>
@@ -16,6 +27,14 @@
 @RestController
 @RequestMapping("/client/tag")
 public class ClientTagController {
+    @Resource
+    private TagService tagService;
+    @PostMapping("/saveUserAnswers")
+    @ApiOperation(value = "获取问题二标签列表", tags = {"用户端-计划引导相关接口"})
+    public R<List<Tag>> saveUserAnswers() {
+        List<Tag> list = tagService.lambdaQuery().eq(Tag::getTagType, 2).list();
 
+        return R.ok(list);
+    }
 }
 
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 cb76bbc..55cd72b 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
@@ -6,7 +6,7 @@
 import com.xinquan.system.api.model.AppLoginUser;
 import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
 import com.xinquan.system.api.model.AppWXLoginBody;
-import com.xinquan.user.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUser;
 import com.xinquan.user.api.domain.dto.AppUserDTO;
 import com.xinquan.user.service.AppUserService;
 import java.util.Collection;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/PrizeRedemptionRecord.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/PrizeRedemptionRecord.java
deleted file mode 100644
index bc9efea..0000000
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/PrizeRedemptionRecord.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.xinquan.user.domain;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import java.math.BigDecimal;
-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;
-import lombok.EqualsAndHashCode;
-
-/**
- * <p>
- * 奖品兑换记录表
- * </p>
- *
- * @author mitao
- * @since 2024-08-21
- */
-@Data
-@EqualsAndHashCode(callSuper = true)
-@TableName("t_prize_redemption_record")
-@ApiModel(value="PrizeRedemptionRecord对象", description="奖品兑换记录表")
-public class PrizeRedemptionRecord extends BaseModel {
-
-    private static final long serialVersionUID = 1L;
-
-    @ApiModelProperty(value = "id")
-    @TableId(value = "id",type = IdType.ASSIGN_ID)
-    private Long id;
-
-    @ApiModelProperty(value = "奖品名称")
-    @TableField("`name`")
-    private String name;
-
-    @ApiModelProperty(value = "上架状态 1=上架 2=下架")
-    @TableField("listing_status")
-    private Integer listingStatus;
-
-    @ApiModelProperty(value = "封面图")
-    @TableField("cover_url")
-    private String coverUrl;
-
-    @ApiModelProperty(value = "奖品价值")
-    @TableField("worth")
-    private BigDecimal worth;
-
-    @ApiModelProperty(value = "所需能量值")
-    @TableField("energy_value")
-    private Integer energyValue;
-
-    @ApiModelProperty(value = "排序权重")
-    @TableField("sort_num")
-    private Integer sortNum;
-
-    @ApiModelProperty(value = "累计兑换次数")
-    @TableField("total_redemption_count")
-    private Integer totalRedemptionCount;
-
-
-}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/EnergyDetailVO.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/EnergyDetailVO.java
new file mode 100644
index 0000000..ff2f090
--- /dev/null
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/EnergyDetailVO.java
@@ -0,0 +1,34 @@
+package com.xinquan.user.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author mitao
+ * @date 2024/9/4
+ */
+@Data
+@ApiModel(value = "能量值明细")
+public class EnergyDetailVO implements Serializable {
+
+    private static final long serialVersionUID = -1776068531441762518L;
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "原因")
+    private String reason;
+
+    @ApiModelProperty(value = "变动类型 1=增加 2=减少")
+    private Integer changeType;
+
+    @ApiModelProperty(value = "能量值")
+    private Integer energy_value;
+
+
+
+}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/EnergyVO.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/EnergyVO.java
new file mode 100644
index 0000000..1f370f4
--- /dev/null
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/EnergyVO.java
@@ -0,0 +1,33 @@
+package com.xinquan.user.domain.vo;
+
+import com.xinquan.common.core.utils.page.PageDTO;
+import com.xinquan.system.api.domain.AppUserEnergyRecord;
+import com.xinquan.system.api.domain.vo.AppUserEnergyRecordVO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2024/9/4
+ */
+@Data
+@ApiModel(value = "能量值对象")
+public class EnergyVO implements Serializable {
+
+    private static final long serialVersionUID = -1776068531441762518L;
+
+
+    @ApiModelProperty(value = "累计能量值")
+    private Integer energyTotal;
+
+    @ApiModelProperty(value = "能量值明细")
+    private List<AppUserEnergyRecordVO> list;
+
+
+
+
+}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/ExchangeRecordVO.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/ExchangeRecordVO.java
new file mode 100644
index 0000000..84c92dd
--- /dev/null
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/domain/vo/ExchangeRecordVO.java
@@ -0,0 +1,34 @@
+package com.xinquan.user.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * @author mitao
+ * @date 2024/9/4
+ */
+@Data
+@ApiModel(value = "奖品兑换记录")
+public class ExchangeRecordVO implements Serializable {
+
+    private static final long serialVersionUID = -1776068531441762518L;
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+    @ApiModelProperty(value = "奖品名称")
+    private String name;
+    @ApiModelProperty(value = "封面图")
+    private String coverUrl;
+    @ApiModelProperty(value = "奖品价值")
+    private BigDecimal worth;
+    @ApiModelProperty(value = "所需能量值")
+    private Integer energyValue;
+    @ApiModelProperty(value = "1待领取 2已领取")
+    private Integer status;
+
+
+}
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserBankMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserBankMapper.java
index 300d9b9..3662725 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserBankMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserBankMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.AppUserBank;
+import com.xinquan.system.api.domain.AppUserBank;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserCourseMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserCourseMapper.java
index d4897cb..951242d 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserCourseMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserCourseMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.AppUserCourse;
+import com.xinquan.system.api.domain.AppUserCourse;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserEnergyRecordMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserEnergyRecordMapper.java
index 1b45e59..147b186 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserEnergyRecordMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserEnergyRecordMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.AppUserEnergyRecord;
+import com.xinquan.system.api.domain.AppUserEnergyRecord;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserMapper.java
index fa5adf6..f7aa3fd 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.api.domain.AppUser;
+import com.xinquan.system.api.domain.AppUser;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserMeditationMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserMeditationMapper.java
index d24e766..59ea4e2 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserMeditationMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserMeditationMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.AppUserMeditation;
+import com.xinquan.system.api.domain.AppUserMeditation;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserQuestionMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserQuestionMapper.java
index 38f61d1..d61fc31 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserQuestionMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserQuestionMapper.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.mapper;
 
-import com.xinquan.user.domain.AppUserQuestion;
+import com.xinquan.system.api.domain.AppUserQuestion;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserTagMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserTagMapper.java
index ef9b52d..cfe20d9 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserTagMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserTagMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.AppUserTag;
+import com.xinquan.system.api.domain.AppUserTag;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserTreeMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserTreeMapper.java
index 607f08f..b22d6b1 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserTreeMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserTreeMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.AppUserTree;
+import com.xinquan.system.api.domain.AppUserTree;
 
 /**
  * <p>
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
index baf0ca0..827335a 100644
--- 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
@@ -1,7 +1,10 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.AppUserViewingHistory;
+import com.xinquan.system.api.domain.AppUserViewingHistory;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,7 @@
  */
 public interface AppUserViewingHistoryMapper extends BaseMapper<AppUserViewingHistory> {
 
+    List<AppUserViewingHistory> cumulative(@Param("userId") Long userId);
+
+    int today(@Param("userId") Long userId);
 }
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserWalletRecordMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserWalletRecordMapper.java
index 4c11546..078161f 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserWalletRecordMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserWalletRecordMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.AppUserWalletRecord;
+import com.xinquan.system.api.domain.AppUserWalletRecord;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserWithdrawMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserWithdrawMapper.java
index 5466bb2..7707f5a 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserWithdrawMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/AppUserWithdrawMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.AppUserWithdraw;
+import com.xinquan.system.api.domain.AppUserWithdraw;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/NoticeRecordMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/NoticeRecordMapper.java
index b117dbb..ebfe697 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/NoticeRecordMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/NoticeRecordMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.NoticeRecord;
+import com.xinquan.system.api.domain.NoticeRecord;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/PrizeMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/PrizeMapper.java
index 748840e..3e4639c 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/PrizeMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/PrizeMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.Prize;
+import com.xinquan.system.api.domain.Prize;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/PrizeRedemptionRecordMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/PrizeRedemptionRecordMapper.java
index 28ec806..d763736 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/PrizeRedemptionRecordMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/PrizeRedemptionRecordMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.PrizeRedemptionRecord;
+import com.xinquan.system.api.domain.PrizeRedemptionRecord;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/TagMapper.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/TagMapper.java
index ae8cc78..2dd555d 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/TagMapper.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/mapper/TagMapper.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.xinquan.user.domain.Tag;
+import com.xinquan.system.api.domain.Tag;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserBankService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserBankService.java
index 4f287f0..94364b6 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserBankService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserBankService.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service;
 
-import com.xinquan.user.domain.AppUserBank;
+import com.xinquan.system.api.domain.AppUserBank;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserCourseService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserCourseService.java
index c2dd1d7..14a3dbc 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserCourseService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserCourseService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.AppUserCourse;
+import com.xinquan.system.api.domain.AppUserCourse;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserEnergyRecordService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserEnergyRecordService.java
index dd82c6a..ee1c6cc 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserEnergyRecordService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserEnergyRecordService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.AppUserEnergyRecord;
+import com.xinquan.system.api.domain.AppUserEnergyRecord;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserMeditationService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserMeditationService.java
index 39d3529..bb0c3f5 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserMeditationService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserMeditationService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.AppUserMeditation;
+import com.xinquan.system.api.domain.AppUserMeditation;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserQuestionService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserQuestionService.java
index bfe63a4..fda8e39 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserQuestionService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserQuestionService.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service;
 
-import com.xinquan.user.domain.AppUserQuestion;
+import com.xinquan.system.api.domain.AppUserQuestion;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 /**
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 110f63a..dbff9fb 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
@@ -1,18 +1,15 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-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.user.api.domain.AppUser;
+import com.xinquan.system.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.system.api.domain.vo.AppUserVO;
 import com.xinquan.user.domain.vo.TagVO;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
 
 import java.util.List;
 import java.util.Optional;
@@ -102,7 +99,7 @@
      * 获取当前登录用户信息
      *
      * @return 用户信息
-     * @see com.xinquan.user.domain.vo.AppUserVO
+     * @see AppUserVO
      */
     AppUserVO getCurrentUser();
 }
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserTagService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserTagService.java
index c53f99f..30b6368 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserTagService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserTagService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.AppUserTag;
+import com.xinquan.system.api.domain.AppUserTag;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserTreeService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserTreeService.java
index 9fa6f1e..374fd39 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserTreeService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserTreeService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.AppUserTree;
+import com.xinquan.system.api.domain.AppUserTree;
 
 /**
  * <p>
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
index 92b8fe5..9035aed 100644
--- 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
@@ -1,7 +1,9 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.AppUserViewingHistory;
+import com.xinquan.system.api.domain.AppUserViewingHistory;
+
+import java.util.List;
 
 /**
  * <p>
@@ -20,4 +22,9 @@
      * @param viewingType 观看类型 1=疗愈 2=课程
      */
     void saveViewingRecord(Long bizId, Integer viewingType);
+
+    List<AppUserViewingHistory> cumulative(Long userId);
+
+    int today(Long userId);
+
 }
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserWalletRecordService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserWalletRecordService.java
index c4ec5fe..1607ea2 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserWalletRecordService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserWalletRecordService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.AppUserWalletRecord;
+import com.xinquan.system.api.domain.AppUserWalletRecord;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserWithdrawService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserWithdrawService.java
index 4690911..b8e59cf 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserWithdrawService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/AppUserWithdrawService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.AppUserWithdraw;
+import com.xinquan.system.api.domain.AppUserWithdraw;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/NoticeRecordService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/NoticeRecordService.java
index bfceea7..5cf3fed 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/NoticeRecordService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/NoticeRecordService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.NoticeRecord;
+import com.xinquan.system.api.domain.NoticeRecord;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/PrizeRedemptionRecordService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/PrizeRedemptionRecordService.java
index b8d2bc7..4ec23e1 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/PrizeRedemptionRecordService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/PrizeRedemptionRecordService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.PrizeRedemptionRecord;
+import com.xinquan.system.api.domain.PrizeRedemptionRecord;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/PrizeService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/PrizeService.java
index e4d3a89..fae3f81 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/PrizeService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/PrizeService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.Prize;
+import com.xinquan.system.api.domain.Prize;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/TagService.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/TagService.java
index 29186d1..f253f94 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/TagService.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/TagService.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.xinquan.user.domain.Tag;
+import com.xinquan.system.api.domain.Tag;
 
 /**
  * <p>
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserBankServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserBankServiceImpl.java
index e954c35..f80c7b8 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserBankServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserBankServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.AppUserBank;
+import com.xinquan.system.api.domain.AppUserBank;
 import com.xinquan.user.mapper.AppUserBankMapper;
 import com.xinquan.user.service.AppUserBankService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserCourseServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserCourseServiceImpl.java
index cb0e480..d404345 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserCourseServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserCourseServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.AppUserCourse;
+import com.xinquan.system.api.domain.AppUserCourse;
 import com.xinquan.user.mapper.AppUserCourseMapper;
 import com.xinquan.user.service.AppUserCourseService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserEnergyRecordServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserEnergyRecordServiceImpl.java
index bdddbfe..a16b2bc 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserEnergyRecordServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserEnergyRecordServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.AppUserEnergyRecord;
+import com.xinquan.system.api.domain.AppUserEnergyRecord;
 import com.xinquan.user.mapper.AppUserEnergyRecordMapper;
 import com.xinquan.user.service.AppUserEnergyRecordService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserMeditationServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserMeditationServiceImpl.java
index dc56923..85a6b37 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserMeditationServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserMeditationServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.AppUserMeditation;
+import com.xinquan.system.api.domain.AppUserMeditation;
 import com.xinquan.user.mapper.AppUserMeditationMapper;
 import com.xinquan.user.service.AppUserMeditationService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserQuestionServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserQuestionServiceImpl.java
index c7ecee7..28779ad 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserQuestionServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserQuestionServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.AppUserQuestion;
+import com.xinquan.system.api.domain.AppUserQuestion;
 import com.xinquan.user.mapper.AppUserQuestionMapper;
 import com.xinquan.user.service.AppUserQuestionService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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 09bad30..ac83773 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
@@ -23,13 +23,13 @@
 import com.xinquan.system.api.model.AppLoginUser;
 import com.xinquan.system.api.model.AppVerifyCellPhoneBody;
 import com.xinquan.system.api.model.AppWXLoginBody;
-import com.xinquan.user.api.domain.AppUser;
+import com.xinquan.system.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.system.api.domain.AppUserQuestion;
+import com.xinquan.system.api.domain.AppUserTree;
+import com.xinquan.system.api.domain.Tag;
 import com.xinquan.user.domain.dto.UserAnswerDTO;
-import com.xinquan.user.domain.vo.AppUserVO;
+import com.xinquan.system.api.domain.vo.AppUserVO;
 import com.xinquan.user.domain.vo.TagVO;
 import com.xinquan.user.mapper.AppUserMapper;
 import com.xinquan.user.service.AppUserQuestionService;
@@ -278,7 +278,6 @@
         appUserTree.setTreeLevelType(TreeLevelEnum.SEED.getCode());
         appUserTree.setGrowthValue(0);
         appUserTree.setSowAgain(2);
-        appUserTree.setCurrentEnergyValue(0);
         appUserTreeService.save(appUserTree);
     }
 
@@ -455,7 +454,7 @@
      * 获取当前登录用户信息
      *
      * @return 用户信息
-     * @see com.xinquan.user.domain.vo.AppUserVO
+     * @see AppUserVO
      */
     @Override
     public AppUserVO getCurrentUser() {
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserTagServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserTagServiceImpl.java
index fcf341d..b1ac5dc 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserTagServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserTagServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.AppUserTag;
+import com.xinquan.system.api.domain.AppUserTag;
 import com.xinquan.user.mapper.AppUserTagMapper;
 import com.xinquan.user.service.AppUserTagService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserTreeServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserTreeServiceImpl.java
index 3c421d1..bf38b35 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserTreeServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserTreeServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.AppUserTree;
+import com.xinquan.system.api.domain.AppUserTree;
 import com.xinquan.user.mapper.AppUserTreeMapper;
 import com.xinquan.user.service.AppUserTreeService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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
index fa9b192..dbd75f2 100644
--- 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
@@ -1,10 +1,12 @@
 package com.xinquan.user.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.xinquan.user.domain.AppUserViewingHistory;
+import com.xinquan.system.api.domain.AppUserViewingHistory;
 import com.xinquan.user.mapper.AppUserViewingHistoryMapper;
 import com.xinquan.user.service.AppUserViewingHistoryService;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * <p>
@@ -32,4 +34,14 @@
         appUserViewingHistory.setViewingType(viewingType);
         this.save(appUserViewingHistory);
     }
+
+    @Override
+    public List<AppUserViewingHistory> cumulative(Long userId) {
+        return this.baseMapper.cumulative(userId);
+    }
+
+    @Override
+    public int today(Long userId) {
+        return this.baseMapper.today(userId);
+    }
 }
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserWalletRecordServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserWalletRecordServiceImpl.java
index c1aab91..242e4c0 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserWalletRecordServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserWalletRecordServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.AppUserWalletRecord;
+import com.xinquan.system.api.domain.AppUserWalletRecord;
 import com.xinquan.user.mapper.AppUserWalletRecordMapper;
 import com.xinquan.user.service.AppUserWalletRecordService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserWithdrawServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserWithdrawServiceImpl.java
index 522479a..ba08484 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserWithdrawServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/AppUserWithdrawServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.AppUserWithdraw;
+import com.xinquan.system.api.domain.AppUserWithdraw;
 import com.xinquan.user.mapper.AppUserWithdrawMapper;
 import com.xinquan.user.service.AppUserWithdrawService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/NoticeRecordServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/NoticeRecordServiceImpl.java
index f5d057c..7cb1280 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/NoticeRecordServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/NoticeRecordServiceImpl.java
@@ -1,7 +1,7 @@
 package com.xinquan.user.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.xinquan.user.domain.NoticeRecord;
+import com.xinquan.system.api.domain.NoticeRecord;
 import com.xinquan.user.mapper.NoticeRecordMapper;
 import com.xinquan.user.service.NoticeRecordService;
 import org.springframework.stereotype.Service;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/PrizeRedemptionRecordServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/PrizeRedemptionRecordServiceImpl.java
index 36d28e7..0d5494f 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/PrizeRedemptionRecordServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/PrizeRedemptionRecordServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.PrizeRedemptionRecord;
+import com.xinquan.system.api.domain.PrizeRedemptionRecord;
 import com.xinquan.user.mapper.PrizeRedemptionRecordMapper;
 import com.xinquan.user.service.PrizeRedemptionRecordService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/PrizeServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/PrizeServiceImpl.java
index 387b5e0..7a4becb 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/PrizeServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/PrizeServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.Prize;
+import com.xinquan.system.api.domain.Prize;
 import com.xinquan.user.mapper.PrizeMapper;
 import com.xinquan.user.service.PrizeService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/TagServiceImpl.java b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/TagServiceImpl.java
index 9f803f6..8e2869e 100644
--- a/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/TagServiceImpl.java
+++ b/xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/service/impl/TagServiceImpl.java
@@ -1,6 +1,6 @@
 package com.xinquan.user.service.impl;
 
-import com.xinquan.user.domain.Tag;
+import com.xinquan.system.api.domain.Tag;
 import com.xinquan.user.mapper.TagMapper;
 import com.xinquan.user.service.TagService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserBankMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserBankMapper.xml
index 778c09b..59e2348 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserBankMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserBankMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserBankMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserBank">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUserBank">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserCourseMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserCourseMapper.xml
index 7e984a3..f074f14 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserCourseMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserCourseMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserCourseMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserCourse">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUserCourse">
         <id column="id" property="id" />
         <result column="app_user_id" property="appUserId" />
         <result column="course_id" property="courseId" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserEnergyRecordMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserEnergyRecordMapper.xml
index addc029..080dada 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserEnergyRecordMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserEnergyRecordMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserEnergyRecordMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserEnergyRecord">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUserEnergyRecord">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
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 0e976a7..e7e82e1 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
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.api.domain.AppUser">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUser">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMeditationMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMeditationMapper.xml
index 4ea2586..0b2992c 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMeditationMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserMeditationMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserMeditationMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserMeditation">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUserMeditation">
         <id column="id" property="id" />
         <result column="app_user_id" property="appUserId" />
         <result column="meditation_id" property="meditationId" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserQuestionMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserQuestionMapper.xml
index 9ac78ec..574ae12 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserQuestionMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserQuestionMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserQuestionMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserQuestion">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUserQuestion">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTagMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTagMapper.xml
index 5da6c86..2d535c4 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTagMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTagMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserTagMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserTag">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUserTag">
         <id column="id" property="id" />
         <result column="app_user_id" property="appUserId" />
         <result column="tag_id" property="tagId" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTreeMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTreeMapper.xml
index 144edf5..deef0e5 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTreeMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserTreeMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserTreeMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserTree">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUserTree">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserViewingHistoryMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserViewingHistoryMapper.xml
index 60b7b98..132975c 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserViewingHistoryMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserViewingHistoryMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserViewingHistoryMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserViewingHistory">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUserViewingHistory">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
@@ -24,5 +24,32 @@
         update_time,
         id, app_user_id, biz_id, viewing_type
     </sql>
+    <select id="cumulative" resultType="com.xinquan.system.api.domain.AppUserViewingHistory">
+        SELECT
+            app_user_id,
+            DATE(create_time) AS view_date
+        FROM
+            t_app_user_viewing_history
+        WHERE
+            app_user_id = #{userId}
+            viewing_type = 1
+          AND del_flag = 0
+        GROUP BY
+            app_user_id,
+            DATE(create_time)
+    </select>
+    <select id="today" resultType="java.lang.Integer">
+        SELECT
+             SUM(timeLook)
+        FROM
+            t_app_user_viewing_history
+        WHERE
+            app_user_id = #{userId}
+          AND viewing_type = 1
+
+          AND DATE(create_time) = CURDATE()
+        GROUP BY
+            app_user_id;
+    </select>
 
 </mapper>
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserWalletRecordMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserWalletRecordMapper.xml
index 2039ab2..c263982 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserWalletRecordMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserWalletRecordMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserWalletRecordMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserWalletRecord">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUserWalletRecord">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserWithdrawMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserWithdrawMapper.xml
index 0821a1c..ff3cd2d 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserWithdrawMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/AppUserWithdrawMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.AppUserWithdrawMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.AppUserWithdraw">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.AppUserWithdraw">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/NoticeRecordMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/NoticeRecordMapper.xml
index ffd9777..451d600 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/NoticeRecordMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/NoticeRecordMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.NoticeRecordMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.NoticeRecord">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.NoticeRecord">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/PrizeMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/PrizeMapper.xml
index 32424b0..a0506ab 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/PrizeMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/PrizeMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.PrizeMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.Prize">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.Prize">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
diff --git a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/PrizeRedemptionRecordMapper.xml b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/PrizeRedemptionRecordMapper.xml
index 188506a..795fa9d 100644
--- a/xinquan-modules/xinquan-user/src/main/resources/mapper/user/PrizeRedemptionRecordMapper.xml
+++ b/xinquan-modules/xinquan-user/src/main/resources/mapper/user/PrizeRedemptionRecordMapper.xml
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.PrizeRedemptionRecordMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.PrizeRedemptionRecord">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.PrizeRedemptionRecord">
         <id column="id" property="id" />
         <result column="del_flag" property="delFlag" />
         <result column="create_by" property="createBy" />
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 43eac87..091cac9 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
@@ -3,7 +3,7 @@
 <mapper namespace="com.xinquan.user.mapper.TagMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="BaseResultMap" type="com.xinquan.user.domain.Tag">
+    <resultMap id="BaseResultMap" type="com.xinquan.system.api.domain.Tag">
         <id column="id" property="id" />
         <id column="tag_type" property="tagType"/>
         <result column="del_flag" property="delFlag" />

--
Gitblit v1.7.1