From 262dd1b8ee4701fd6b58619b43bcec95e6290377 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 10 Nov 2025 12:12:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E4=BC=9A=E5=91=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/mysql/recent/member_recent.sql | 2 +- .../member/enums/MemberRecentSceneEnum.java | 4 +- .../enums/opentype/OpenTypeStatusEnum.java | 17 ++++++ .../opentype/OpenTypeUserStatusEnum.java | 17 ++++++ .../admin/opentype/vo/OpenTypePageReqVO.java | 2 +- .../admin/opentype/vo/OpenTypeRespVO.java | 2 +- .../admin/opentype/vo/OpenTypeSaveReqVO.java | 5 +- .../admin/recent/vo/RecentPageResVo.java | 8 +++ .../app/opentype/AppOpenTypeController.java | 55 ++++++++++++++++++ .../app/opentype/vo/AppPayOpenReqType.java | 21 +++++++ .../app/recent/AppRecentController.java | 2 +- .../dal/dataobject/opentype/OpenTypeDO.java | 2 +- .../dataobject/opentype/OpenTypeUserDO.java | 8 +++ .../dal/dataobject/user/MemberUserDO.java | 5 ++ .../dal/mysql/opentype/OpenTypeMapper.java | 20 ++++++- .../mysql/opentype/OpenTypeUserMapper.java | 21 +++++-- .../service/opentype/OpenTypeService.java | 12 ++++ .../service/opentype/OpenTypeServiceImpl.java | 56 +++++++++++++++++++ .../member/service/recent/RecentService.java | 3 +- .../service/recent/RecentServiceImpl.java | 27 ++++++++- 20 files changed, 271 insertions(+), 18 deletions(-) create mode 100644 yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/opentype/OpenTypeStatusEnum.java create mode 100644 yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/opentype/OpenTypeUserStatusEnum.java create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/opentype/AppOpenTypeController.java create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/opentype/vo/AppPayOpenReqType.java diff --git a/sql/mysql/recent/member_recent.sql b/sql/mysql/recent/member_recent.sql index 708001f..d5ff112 100644 --- a/sql/mysql/recent/member_recent.sql +++ b/sql/mysql/recent/member_recent.sql @@ -179,7 +179,7 @@ CREATE TABLE `member_open_type` `original_price` int NOT NULL COMMENT '价格(原价)', `duration` int NOT NULL COMMENT '时长(天)', `status` char(32) NOT NULL COMMENT '状态', - `is_hot` char(32) NOT NULL COMMENT '是否热门', + `is_hot` bit(1) NOT NULL COMMENT '是否热门', `sort` int DEFAULT 0 NOT NULL COMMENT '排序', `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberRecentSceneEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberRecentSceneEnum.java index d275ef3..45e7a8d 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberRecentSceneEnum.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberRecentSceneEnum.java @@ -17,8 +17,8 @@ public enum MemberRecentSceneEnum { DYNAMIC_NEARBY("2", "动态-附近"), SQUARE_SQUARE("3", "广场-广场"), SQUARE_NEW_TIME("4", "广场-最近"), - SQUARE_NEW_PERSON("4", "广场-新人"), - USER("5", "查询用户朋友圈"), + SQUARE_NEW_PERSON("5", "广场-新人"), + USER("6", "查询用户朋友圈"), ; private final String type; private final String description; diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/opentype/OpenTypeStatusEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/opentype/OpenTypeStatusEnum.java new file mode 100644 index 0000000..4db0624 --- /dev/null +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/opentype/OpenTypeStatusEnum.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.module.member.enums.opentype; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 会员开通类型状态 + */ +@Getter +@AllArgsConstructor +public enum OpenTypeStatusEnum { + ENABLE("1", "启用"), + FORBIDDEN("2", "禁用"), + ; + private final String type; + private final String description; +} diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/opentype/OpenTypeUserStatusEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/opentype/OpenTypeUserStatusEnum.java new file mode 100644 index 0000000..f3621a3 --- /dev/null +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/opentype/OpenTypeUserStatusEnum.java @@ -0,0 +1,17 @@ +package cn.iocoder.yudao.module.member.enums.opentype; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 会员开通类型状态 + */ +@Getter +@AllArgsConstructor +public enum OpenTypeUserStatusEnum { + EFFICIENT("1", "有效"), + EXPIRED("2", "过期"), + ; + private final String type; + private final String description; +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypePageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypePageReqVO.java index 7da7a2d..475aa6a 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypePageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypePageReqVO.java @@ -34,7 +34,7 @@ public class OpenTypePageReqVO extends PageParam { private String status; @Schema(description = "是否热门") - private String isHot; + private Boolean isHot; @Schema(description = "排序") private Integer sort; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypeRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypeRespVO.java index 7b29453..a84ea5e 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypeRespVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypeRespVO.java @@ -42,7 +42,7 @@ public class OpenTypeRespVO { @Schema(description = "是否热门", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("是否热门") - private String isHot; + private Boolean isHot; @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("排序") diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypeSaveReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypeSaveReqVO.java index 60bc330..5ae7a5c 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypeSaveReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/opentype/vo/OpenTypeSaveReqVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.controller.admin.opentype.vo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; + import java.util.*; import javax.validation.constraints.*; @@ -36,8 +37,8 @@ public class OpenTypeSaveReqVO { private String status; @Schema(description = "是否热门", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "是否热门不能为空") - private String isHot; + @NotNull(message = "是否热门不能为空") + private Boolean isHot; @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED) @NotNull(message = "排序不能为空") diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageResVo.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageResVo.java index 5706852..8ddaaa7 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageResVo.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageResVo.java @@ -34,6 +34,14 @@ public class RecentPageResVo extends RecentDO { @Schema(description = "用户职业") private String memberOcc; + @Schema(description = "身高(cm)") + private Double memberHeight; + + @Schema(description = "体重(kg)") + private String memberWeight; + + @Schema(description = "城市") + private String memberCity; } @Data diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/opentype/AppOpenTypeController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/opentype/AppOpenTypeController.java new file mode 100644 index 0000000..19a747c --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/opentype/AppOpenTypeController.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.member.controller.app.opentype; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.OpenTypePageReqVO; +import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.OpenTypeRespVO; +import cn.iocoder.yudao.module.member.controller.app.opentype.vo.AppPayOpenReqType; +import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeDO; +import cn.iocoder.yudao.module.member.service.opentype.OpenTypeService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import java.util.List; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 会员类型") +@RestController +@RequestMapping("/member/open-type") +@Validated +public class AppOpenTypeController { + + @Resource + private OpenTypeService openTypeService; + + @GetMapping("/list") + @Operation(summary = "查看全部开通会员列表") + public CommonResult> getOpenTypeList(@Valid OpenTypePageReqVO pageReqVO) { + List pageResult = openTypeService.getOpenTypeList(pageReqVO); + return success(BeanUtils.toBean(pageResult, OpenTypeRespVO.class)); + } + + @GetMapping("/get") + @Operation(summary = "获得会员类型") + @Parameter(name = "id", description = "编号", required = true) + public CommonResult getOpenType(@RequestParam("id") Long id) { + OpenTypeDO openType = openTypeService.getOpenType(id); + return success(BeanUtils.toBean(openType, OpenTypeRespVO.class)); + } + + @PostMapping("/pay") + @Operation(summary = "购买会员") + public CommonResult payOpenType(@RequestBody AppPayOpenReqType dto) { + dto.setMemberId(getLoginUserId()); + return success(openTypeService.payOpenType(dto)); + } + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/opentype/vo/AppPayOpenReqType.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/opentype/vo/AppPayOpenReqType.java new file mode 100644 index 0000000..01ee380 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/opentype/vo/AppPayOpenReqType.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.member.controller.app.opentype.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +/** + * 开通会员 + */ +@Data +public class AppPayOpenReqType { + + @Schema(description = "开通会员id") + @NotNull(message = "开通会员id不能为空") + private Long openTypeId; + + @Schema(description = "会员id") + private Long memberId; + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/AppRecentController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/AppRecentController.java index 84fadd9..f916229 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/AppRecentController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/AppRecentController.java @@ -35,7 +35,7 @@ public class AppRecentController { @Operation(summary = "快速查询朋友圈") public CommonResult> quickPage(@Valid @RequestBody AppRecentQuickPageVO dto) { dto.setOperationMemberId(getLoginUserId()); - return success(recentService.quickPage(BeanUtils.toBean(dto, RecentSaveReqVO.class))); + return success(recentService.quickPage(dto)); } @PostMapping("/create") diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/opentype/OpenTypeDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/opentype/OpenTypeDO.java index e283e1b..4a09297 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/opentype/OpenTypeDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/opentype/OpenTypeDO.java @@ -61,7 +61,7 @@ public class OpenTypeDO extends BaseDO { /** * 是否热门 */ - private String isHot; + private Boolean isHot; /** * 排序 diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/opentype/OpenTypeUserDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/opentype/OpenTypeUserDO.java index 896038f..edd70f0 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/opentype/OpenTypeUserDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/opentype/OpenTypeUserDO.java @@ -1,11 +1,13 @@ package cn.iocoder.yudao.module.member.dal.dataobject.opentype; import lombok.*; + import java.util.*; import java.time.LocalDateTime; import java.time.LocalDateTime; import java.time.LocalDateTime; import java.time.LocalDateTime; + import com.baomidou.mybatisplus.annotation.*; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; @@ -29,26 +31,32 @@ public class OpenTypeUserDO extends BaseDO { */ @TableId private Long id; + /** * 会员开通类型编号 */ private Long openTypeId; + /** * 用户编号 */ private Long memberId; + /** * 购买价格 */ private Integer payPrice; + /** * 开始时间 */ private LocalDateTime startTime; + /** * 结束时间 */ private LocalDateTime endTime; + /** * 状态 */ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java index c7299ad..9d0fae2 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java @@ -42,16 +42,19 @@ public class MemberUserDO extends TenantBaseDO { */ @TableId private Long id; + /** * 手机 */ private String mobile; + /** * 加密后的密码 *

* 因为目前使用 {@link BCryptPasswordEncoder} 加密器,所以无需自己处理 salt 盐 */ private String password; + /** * 帐号状态 *

@@ -171,10 +174,12 @@ public class MemberUserDO extends TenantBaseDO { * 关联 {@link MemberLevelDO#getId()} 字段 */ private Long levelId; + /** * 会员经验 */ private Integer experience; + /** * 用户分组编号 *

diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/opentype/OpenTypeMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/opentype/OpenTypeMapper.java index ea56750..d449e6c 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/opentype/OpenTypeMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/opentype/OpenTypeMapper.java @@ -11,15 +11,13 @@ import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.*; /** * 会员类型 Mapper - * - * @author 聊天交友 */ @Mapper public interface OpenTypeMapper extends BaseMapperX { default PageResult selectPage(OpenTypePageReqVO reqVO) { return selectPage(reqVO, new LambdaQueryWrapperX() - .eqIfPresent(OpenTypeDO::getTitle, reqVO.getTitle()) + .likeIfPresent(OpenTypeDO::getTitle, reqVO.getTitle()) .eqIfPresent(OpenTypeDO::getIcon, reqVO.getIcon()) .eqIfPresent(OpenTypeDO::getPreferentialPrice, reqVO.getPreferentialPrice()) .eqIfPresent(OpenTypeDO::getOriginalPrice, reqVO.getOriginalPrice()) @@ -28,6 +26,22 @@ public interface OpenTypeMapper extends BaseMapperX { .eqIfPresent(OpenTypeDO::getIsHot, reqVO.getIsHot()) .eqIfPresent(OpenTypeDO::getSort, reqVO.getSort()) .betweenIfPresent(OpenTypeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(OpenTypeDO::getSort) + .orderByDesc(OpenTypeDO::getId)); + } + + default List selectList(OpenTypePageReqVO reqVO) { + return selectList(new LambdaQueryWrapperX() + .likeIfPresent(OpenTypeDO::getTitle, reqVO.getTitle()) + .eqIfPresent(OpenTypeDO::getIcon, reqVO.getIcon()) + .eqIfPresent(OpenTypeDO::getPreferentialPrice, reqVO.getPreferentialPrice()) + .eqIfPresent(OpenTypeDO::getOriginalPrice, reqVO.getOriginalPrice()) + .eqIfPresent(OpenTypeDO::getDuration, reqVO.getDuration()) + .eqIfPresent(OpenTypeDO::getStatus, reqVO.getStatus()) + .eqIfPresent(OpenTypeDO::getIsHot, reqVO.getIsHot()) + .eqIfPresent(OpenTypeDO::getSort, reqVO.getSort()) + .betweenIfPresent(OpenTypeDO::getCreateTime, reqVO.getCreateTime()) + .orderByDesc(OpenTypeDO::getSort) .orderByDesc(OpenTypeDO::getId)); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/opentype/OpenTypeUserMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/opentype/OpenTypeUserMapper.java index 9566d34..bd7e1b4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/opentype/OpenTypeUserMapper.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/opentype/OpenTypeUserMapper.java @@ -1,13 +1,14 @@ package cn.iocoder.yudao.module.member.dal.mysql.opentype; -import java.util.*; - -import cn.iocoder.yudao.framework.common.pojo.PageResult; -import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeUserDO; +import cn.iocoder.yudao.module.member.enums.opentype.OpenTypeStatusEnum; +import cn.iocoder.yudao.module.member.enums.opentype.OpenTypeUserStatusEnum; import org.apache.ibatis.annotations.Mapper; +import java.time.LocalDateTime; + /** * 会员开通类型与用户关联 Mapper * @@ -16,5 +17,17 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface OpenTypeUserMapper extends BaseMapperX { + /** + * 查询用户开通的会员 + */ + default OpenTypeUserDO selectEnableByUserId(Long memberId) { + return selectOne(new LambdaQueryWrapperX() + .eq(OpenTypeUserDO::getMemberId, memberId) + .eq(OpenTypeUserDO::getStatus, OpenTypeUserStatusEnum.EFFICIENT.getType()) + .gt(OpenTypeUserDO::getEndTime, LocalDateTime.now()) + .orderByDesc(OpenTypeUserDO::getEndTime) + .last("LIMIT 1") + ); + } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeService.java index 833b7c1..06457e4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeService.java @@ -3,9 +3,12 @@ package cn.iocoder.yudao.module.member.service.opentype; import javax.validation.*; import cn.iocoder.yudao.module.member.controller.admin.opentype.vo.*; +import cn.iocoder.yudao.module.member.controller.app.opentype.vo.AppPayOpenReqType; import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import java.util.List; + /** * 会员类型 Service 接口 */ @@ -36,4 +39,13 @@ public interface OpenTypeService { */ PageResult getOpenTypePage(OpenTypePageReqVO pageReqVO); + /** + * 获得会员类列表 + */ + List getOpenTypeList(OpenTypePageReqVO pageReqVO); + + /** + * 购买会员 + */ + Long payOpenType(AppPayOpenReqType dto); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java index 3eff0c2..1953297 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java @@ -1,10 +1,19 @@ package cn.iocoder.yudao.module.member.service.opentype; +import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.member.controller.app.opentype.vo.AppPayOpenReqType; +import cn.iocoder.yudao.module.member.dal.dataobject.opentype.OpenTypeUserDO; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.dal.mysql.opentype.OpenTypeUserMapper; import cn.iocoder.yudao.module.member.enums.MemberErrorCode; +import cn.iocoder.yudao.module.member.enums.opentype.OpenTypeUserStatusEnum; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -15,6 +24,9 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.member.dal.mysql.opentype.OpenTypeMapper; +import java.time.LocalDateTime; +import java.util.List; + import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; /** @@ -24,8 +36,13 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @Validated public class OpenTypeServiceImpl implements OpenTypeService { + @Resource + private MemberUserService memberUserService; @Resource private OpenTypeMapper openTypeMapper; + @Resource + private OpenTypeUserMapper openTypeUserMapper; + /** * 创建会员类型 @@ -78,6 +95,45 @@ public class OpenTypeServiceImpl implements OpenTypeService { return openTypeMapper.selectPage(pageReqVO); } + /** + * 获得会员类列表 + */ + @Override + public List getOpenTypeList(OpenTypePageReqVO pageReqVO) { + return openTypeMapper.selectList(pageReqVO); + } + + /** + * 购买会员 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Long payOpenType(AppPayOpenReqType dto) { + // 检查用户是否存在 + MemberUserDO user = memberUserService.getUser(dto.getMemberId()); + if (ObjectUtil.isEmpty(user)) throw exception(MemberErrorCode.USER_NOT_EXISTS); + // 查询开通会员 + OpenTypeDO openType = openTypeMapper.selectById(dto.getOpenTypeId()); + if (ObjectUtil.isEmpty(openType)) throw exception(MemberErrorCode.OPEN_TYPE_NOT_EXISTS); + + // TODO支付待实现 + + LocalDateTime now = LocalDateTime.now(); + OpenTypeUserDO openTypeUserObj = OpenTypeUserDO.builder().openTypeId(openType.getId()).memberId(dto.getMemberId()).payPrice(openType.getPreferentialPrice()).startTime(now).status(OpenTypeUserStatusEnum.EFFICIENT.getType()).build(); + + // 查看用户有没有开通过并且没有过期的会员 + OpenTypeUserDO openTypeUserDO = openTypeUserMapper.selectEnableByUserId(dto.getMemberId()); + if (ObjectUtil.isNotEmpty(openTypeUserDO)) { + openTypeUserObj.setEndTime(openTypeUserDO.getEndTime().plusDays(openType.getDuration())); + } else { + openTypeUserObj.setEndTime(now.plusDays(openType.getDuration())); + } + + // 新增会员开通表 + openTypeUserMapper.insert(openTypeUserObj); + return openTypeUserObj.getId(); + } + private void validateOpenTypeExists(Long id) { if (openTypeMapper.selectById(id) == null) { throw exception(MemberErrorCode.OPEN_TYPE_NOT_EXISTS); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java index af15ccb..b0b0029 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java @@ -6,6 +6,7 @@ import javax.validation.*; import cn.iocoder.yudao.module.member.controller.admin.recent.vo.*; import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentLikeReqVo; import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentOperateReqVo; +import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentQuickPageVO; import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentViewRecordReqVo; import cn.iocoder.yudao.module.member.dal.dataobject.recent.RecentDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -56,7 +57,7 @@ public interface RecentService { /** * 快速查询朋友圈 */ - PageResult quickPage(RecentSaveReqVO bean); + PageResult quickPage(AppRecentQuickPageVO bean); /** * 我喜欢-分页查询 diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java index 2e014f2..b938938 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java @@ -8,16 +8,19 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.member.api.thirdauth.ThirdAuthVo; import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentLikeReqVo; import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentOperateReqVo; +import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentQuickPageVO; import cn.iocoder.yudao.module.member.dal.dataobject.location.LocationDO; import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.recent.OperationMapper; import cn.iocoder.yudao.module.member.enums.MemberErrorCode; import cn.iocoder.yudao.module.member.enums.MemberRecentOperateEnum; +import cn.iocoder.yudao.module.member.enums.MemberRecentSceneEnum; import cn.iocoder.yudao.module.member.service.location.LocationService; import cn.iocoder.yudao.module.member.service.thirdauth.ThirdAuthService; import cn.iocoder.yudao.module.member.service.user.MemberUserService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -232,12 +235,32 @@ public class RecentServiceImpl implements RecentService { * 快速查询 */ @Override - public PageResult quickPage(RecentSaveReqVO bean) { + public PageResult quickPage(AppRecentQuickPageVO bean) { RecentPageReqVO result = BeanUtil.toBean(bean, RecentPageReqVO.class); PageResult recentPageList = recentMapper.selectPage(result); List resultList = BeanUtils.toBean(recentPageList.getList(), RecentPageResVo.class); // 为RecentPageResVo设置Member信息 convertRecentPageResVoSetupMember(resultList); + // 查询距离的scene + List locationSceneList = new ArrayList() {{ + add(MemberRecentSceneEnum.SQUARE_SQUARE); + add(MemberRecentSceneEnum.SQUARE_NEW_TIME); + add(MemberRecentSceneEnum.SQUARE_NEW_PERSON); + }}; + if (locationSceneList.contains(bean.getScene())) { + // 查询用户最新的位置 + LocationDO locationDO = locationService.getCurrentUserLastLocation(); + convertRecentPageResVoSetupLocation(resultList, locationDO); + } + // 如果是新人模糊`头像`和`用户名` + if (ObjectUtil.equals(bean.getScene(), MemberRecentSceneEnum.SQUARE_NEW_PERSON)) { + for (RecentPageResVo v : resultList) { + if (ObjectUtil.isNotEmpty(v.getMember()) && ObjectUtil.isNotEmpty(v.getMember().getMemberNickname())) { + int size = v.getMember().getMemberNickname().length() + 1; + v.getMember().setMemberNickname(StringUtils.repeat("*", size)); + } + } + } return new PageResult<>(resultList, recentPageList.getTotal()); } @@ -361,6 +384,8 @@ public class RecentServiceImpl implements RecentService { memberVO.setMemberNickname(member.getNickname()); memberVO.setMemberAge(member.getAge()); memberVO.setMemberOcc(member.getOcc()); + memberVO.setMemberHeight(member.getHeight()); + memberVO.setMemberWeight(member.getWeight()); entity.setMember(memberVO); } }