xinquan-api/xinquan-api-meditation/src/main/java/com/xinquan/meditation/api/domain/vo/NoticeDetailVO.java
@@ -25,8 +25,7 @@ @ApiModelProperty(value = "通知内容 当类型为系统通知时") private String reply; @ApiModelProperty(value = "消息时间 当类型为系统通知") @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") private LocalDateTime time; private String time; @ApiModelProperty(value = "冥想标题 当类型为回复通知时") private String meditationTitle; xinquan-api/xinquan-api-system/src/main/java/com/xinquan/system/api/domain/NoticeRecord.java
@@ -33,6 +33,9 @@ @ApiModelProperty(value = "APP用户id") @TableField("app_user_id") private Long appUserId; @ApiModelProperty(value = "赠送人id") @TableField("userId") private Long userId; @ApiModelProperty(value = "冥想提问id 类型为回复通知时使用") @TableField("meditation_question_id") @@ -40,6 +43,9 @@ @ApiModelProperty(value = "冥想id") @TableField("meditation_id") private Long meditationId; @ApiModelProperty(value = "课程id") @TableField("course_id") private Long courseId; @ApiModelProperty(value = "查看状态 1:未读 2:已读 ") @TableField("read_status") xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/factory/RemoteAppUserFallbackFactory.java
@@ -33,6 +33,16 @@ public RemoteAppUserService create(Throwable cause) { return new RemoteAppUserService() { @Override public R addNotice(String id, String courseId, String userId, String price) { return null; } @Override public R<AppUser> getUserByPhone(String phone) { return R.fail("后台远程调用 根据手机号 查询用户"); } @Override public R<Long> getMeditationHistoryCount(Long id) { return R.fail("后台远程调用 根据冥想id 获取实际观看人数"); } xinquan-api/xinquan-api-user/src/main/java/com/xinquan/user/api/feign/RemoteAppUserService.java
@@ -29,6 +29,11 @@ */ @FeignClient(contextId = "remoteAppUserService", value = ServiceNameConstants.APP_USER_SERVICE, fallbackFactory = RemoteAppUserFallbackFactory.class) public interface RemoteAppUserService { @GetMapping("/addNotice/{id}/{courseId}/{userId}/{price}") public R addNotice(@PathVariable("id")String id,@PathVariable("courseId")String courseId ,@PathVariable("userId")String userId,@PathVariable("price")String price); @GetMapping("/client/app-user/getUserByPhone/{phone}") public R<AppUser> getUserByPhone(@PathVariable("phone")String phone); @PostMapping("/user/app-user-viewing-history/getMeditationHistoryCount/{id}") public R<Long> getMeditationHistoryCount(@PathVariable("id") Long id); @PostMapping("/user/app-user-viewing-history/getCourseHistoryCount/{id}") xinquan-auth/src/main/java/com/xinquan/auth/controller/TokenController.java
@@ -13,6 +13,7 @@ import com.xinquan.common.security.auth.AuthUtil; 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.SysMenu; import com.xinquan.system.api.domain.SysRole; import com.xinquan.system.api.domain.SysUser; @@ -22,6 +23,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.feign.RemoteAppUserService; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; @@ -30,6 +32,7 @@ import java.util.List; import java.util.Objects; import java.util.Set; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -57,6 +60,8 @@ private SysLoginService sysLoginService; @Autowired private SysUserClient userClient; @Resource private RemoteAppUserService remoteAppUserService; /** * 发送验证码 @@ -71,10 +76,21 @@ public R<?> sendCaptchaCode( @RequestParam(value = "cellPhone", required = true) String cellPhone, @RequestParam("type") Integer type) { if(type == 3){ SysUser sysUser = userClient.queryUserByPhone(cellPhone).getData(); if(Objects.isNull(sysUser)){ return R.fail("该手机号未注册"); if(type==5){ LoginUser loginUser = tokenService.getLoginUser(); if (loginUser==null){ return R.tokenError("登录失效"); } AppUser data1 = remoteAppUserService.getAppUserById(loginUser.getUserid() + "").getData(); if (!cellPhone.equals(data1.getCellPhone())){ return R.fail("手机号错误"); } } if(type==5){ AppUser data = remoteAppUserService.getUserByPhone(cellPhone).getData(); if (data!=null){ return R.fail("当前手机号已被绑定"); } } sysLoginService.sendCaptchaCode(cellPhone, type); xinquan-auth/src/main/java/com/xinquan/auth/service/SysLoginService.java
@@ -296,7 +296,7 @@ TimeUnit.MINUTES); log.info("发送验证码成功,手机号:{} 验证码:{}", cellPhone, code); // TODO 修改sender参数及templateId HuaWeiSMSUtil.sendSms("[\"" + code + "\"]", cellPhone, "8823121426646", HuaWeiSMSUtil.sendSms("[\"" + code + "\"]", cellPhone, "8824110423893", "767ad27dce184a32a4b4863517fbd301\n"); } catch (Exception e) { log.error("发送短信失败", e); xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/controller/client/ClientCourseController.java
@@ -802,10 +802,13 @@ .eq(CourseChapter::getCourseId, record.getId()).list(); // 章节列表累加虚拟学习人数 int temp = 0; int temp1 = 0; for (CourseChapter courseChapter : list) { temp+=courseChapter.getVirtualLearnedNum(); Long data1 = remoteAppUserService.getCourseChapterHistoryCount(courseChapter.getId()).getData(); temp1+=data1; } record.setCount(size1+temp); record.setCount(temp1+temp); } return R.ok(coursePageList); } xinquan-modules/xinquan-course/src/main/java/com/xinquan/course/service/impl/CourseServiceImpl.java
@@ -49,6 +49,7 @@ }else if (cateId!=null){ courseLambdaQueryWrapper.eq(Course::getCateId, cateId); } courseLambdaQueryWrapper.eq(Course::getRecommend,1); courseLambdaQueryWrapper.eq(Course::getListingStatus,1); courseLambdaQueryWrapper.orderByDesc(Course::getSortNum); Page<Course> page = this.page(new Page<>(pageCurr, pageSize),courseLambdaQueryWrapper); xinquan-modules/xinquan-order/src/main/java/com/xinquan/order/controller/client/ClientOrderController.java
@@ -538,7 +538,13 @@ BigDecimal realPayAmount = one.getRealPayAmount(); // 判断订单所属用户是否有上级 是否需要做分佣处理 AppUser data = remoteAppUserService.getAppUserById(one.getAppUserId() + "").getData(); if (one.getGiveUserId()!=null){ remoteAppUserService.addNotice(one.getGiveUserId() + "", one.getBusinessId() + "", one.getAppUserId() + "", one.getTotalAmount() + ""); } if (data.getInviteUserId()!=null) { if (one.getOrderFrom() == 1 || one.getOrderFrom() == 2 || one.getOrderFrom() == 3) { // 查询实际支付价格 不包含余额抵扣价格 OrderPaymentRecord one1 = orderPaymentRecordService.lambdaQuery().eq(OrderPaymentRecord::getOrderId, one.getId()) xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientAppUserController.java
@@ -6,13 +6,17 @@ import com.alibaba.nacos.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xinquan.common.core.constant.CacheConstants; import com.xinquan.common.core.domain.R; import com.xinquan.common.core.exception.ServiceException; import com.xinquan.common.core.utils.WebUtils; 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.domain.BaseModel; import com.xinquan.common.redis.service.RedisService; import com.xinquan.common.security.service.TokenService; import com.xinquan.common.security.utils.SecurityUtils; import com.xinquan.course.api.domain.Course; @@ -114,6 +118,12 @@ private RemoteOrderService remoteOrderService; @Resource private RemoteUserService remoteUserService; @GetMapping("/getUserByPhone/{phone}") public R<AppUser> getUserByPhone(@PathVariable("phone")String phone) { AppUser one = appUserService.lambdaQuery().eq(AppUser::getCellPhone, phone).ne(AppUser::getUserStatus, 3) .one(); return R.ok(one); } @GetMapping("/getAllUserList") public R<List<AppUser>> getAllUserList() { List<AppUser> list = appUserService.list(); @@ -976,8 +986,33 @@ return R.tokenError("登录失效"); } Long userId = loginUser.getUserid(); // 校验验证码 if (!verifyCaptcha(phone, code, CacheConstants.APP_CHANGE_PHONE_CODE_PREFIX)) { throw new ServiceException("验证码不正确"); } AppUser byId = appUserService.getById(userId); byId.setCellPhone(phone); boolean b = appUserService.updateById(byId); return R.ok(); } @Autowired private RedisService redisService; private boolean verifyCaptcha(String cellPhone, String captcha, String keyPrefix) { if (com.xinquan.common.core.utils.StringUtils.isNotBlank(cellPhone) && com.xinquan.common.core.utils.StringUtils.isNotBlank(captcha)) { String key = keyPrefix + cellPhone; String code = redisService.getCacheObject(key); // 万能验证码 if (captcha.equals("123456") || (com.xinquan.common.core.utils.StringUtils.isNotBlank(code) && code.equals( captcha))) { redisService.deleteObject(key); return true; } } return false; } @PostMapping("/deleteUser") @ApiOperation(value = "注销账号", tags = {"设置"}) @@ -1331,6 +1366,7 @@ consecutiveDays++; currentDate = currentDate.minusDays(1); } appUser.setContinuity(consecutiveDays); appUser.setToday(consecutiveDays); // 根据等级查询疗愈名称和图标 UserLevelSetting data = remoteBannerService.getIconNameByLevel(level).getData(); @@ -1503,13 +1539,19 @@ @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); AppUser one = appUserService.lambdaQuery().eq(AppUser::getCellPhone, phone) .ne(AppUser::getUserStatus,3).one(); if (one!=null){ AppUserDetailVO appUserDetailVO = new AppUserDetailVO(); appUserDetailVO.setId(one.getId()); appUserDetailVO.setCellPhone(one.getCellPhone()); appUserDetailVO.setAvatar(one.getAvatar()); appUserDetailVO.setNickname(one.getNickname()); return R.ok(appUserDetailVO); }else { return R.fail("未查询到账户信息"); } } @PostMapping("/getUserBalance") @ApiOperation(value = "查询当前用户余额") xinquan-modules/xinquan-user/src/main/java/com/xinquan/user/controller/client/ClientNoticeRecordController.java
@@ -3,12 +3,15 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xinquan.common.core.domain.R; import com.xinquan.common.core.utils.DateUtils; 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.domain.BaseModel; import com.xinquan.common.security.service.TokenService; import com.xinquan.common.security.utils.SecurityUtils; import com.xinquan.course.api.domain.Course; import com.xinquan.course.api.feign.RemoteCourseService; import com.xinquan.meditation.api.domain.Meditation; import com.xinquan.meditation.api.domain.MeditationQuestion; import com.xinquan.meditation.api.feign.RemoteMeditationService; @@ -22,12 +25,10 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; 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 java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** @@ -48,6 +49,26 @@ private AppUserService appUserService; @Resource private RemoteMeditationService remoteMeditationService; @Resource private RemoteCourseService remoteCourseService; @GetMapping("/addNotice/{id}/{courseId}/{userId}/{price}") public R addNotice(@PathVariable("id")String id,@PathVariable("courseId")String courseId ,@PathVariable("userId")String userId,@PathVariable("price")String price) { NoticeRecord noticeRecord = new NoticeRecord(); noticeRecord.setAppUserId(Long.valueOf(id)); noticeRecord.setCourseId(Long.valueOf(courseId)); noticeRecord.setReadStatus(1); noticeRecord.setNoticeType(1); noticeRecord.setTitle("你收到一个来自好友的赠送课程"); Course data = remoteCourseService.getCourseById(Long.valueOf(courseId)).getData(); if (data!=null){ noticeRecord.setContent("课程名称:"+data.getCourseTitle()+"。"+"课程价值:¥"+price+"。"+"赠送好友:" +appUserService.getById(Long.valueOf(userId)).getNickname()+";"+"快去个人中心/已购课程查看吧!"); } noticeRecord.setUserId(Long.valueOf(userId)); noticeRecordService.save(noticeRecord); return R.ok(); } @PostMapping("/noticeList") @ApiOperation(value = "系统消息列表",tags = "系统消息") @ApiImplicitParams({ @@ -90,6 +111,14 @@ noticeRecordService.updateById(noticeRecord); NoticeDetailVO noticeDetailVO = new NoticeDetailVO(); BeanUtils.copyProperties(noticeRecord,noticeDetailVO); LocalDateTime createTime = noticeRecord.getCreateTime(); // 定义日期时间格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); // 将 LocalDateTime 转换为字符串 String formattedDateTime = createTime.format(formatter); // 将其转化为yyyy-MM-dd HH:mm格式 noticeDetailVO.setTime(formattedDateTime); if (noticeRecord!=null && noticeRecord.getMeditationQuestionId()!=null){ // 远程调用 根据冥想提问id 查询数据 noticeDetailVO.setMeditationQuestionId(noticeRecord.getMeditationQuestionId());