From bd1b400f502a5a9f634763a3684f0d48cd3888fc Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 12 Dec 2025 17:11:35 +0800 Subject: [PATCH] =?UTF-8?q?feat:bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/recent/vo/OperationStatusVo.java | 3 ++ .../app/social/AppSocialUserController.java | 8 +++++ .../service/recent/OperationService.java | 4 +-- .../service/recent/OperationServiceImpl.java | 12 +++---- .../service/recent/RecentServiceImpl.java | 6 ++-- .../main/resources/mapper/OperationMapper.xml | 6 ++-- .../system/api/social/SocialClientApi.java | 5 +++ .../system/enums/ErrorCodeConstants.java | 1 + .../api/social/SocialClientApiImpl.java | 8 +++++ .../service/social/SocialClientService.java | 7 +++- .../social/SocialClientServiceImpl.java | 36 +++++++++++++++---- 11 files changed, 76 insertions(+), 20 deletions(-) diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationStatusVo.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationStatusVo.java index 72e539c..684d76f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationStatusVo.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/OperationStatusVo.java @@ -15,4 +15,7 @@ public class OperationStatusVo { @Schema(description = "是否点赞") private Boolean isLike = false; + @Schema(description = "是否查看微信") + private Boolean isLookWechat = false; + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java index 45900f2..1dd675d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java @@ -68,9 +68,17 @@ public class AppSocialUserController { return success(Base64.encode(wxQrcode)); } + @GetMapping("/wxa-url-scheme") + @Operation(summary = "获取小程序短链") + @PermitAll + public CommonResult getWxUrlScheme(@RequestParam String path, @RequestParam String json) { + return success(socialClientApi.getWxUrlScheme(path, json)); + } + @GetMapping("/get-subscribe-template-list") @Operation(summary = "获得微信小程订阅模板列表") @PermitAll + public CommonResult> getSubscribeTemplateList() { List template = socialClientApi.getWxaSubscribeTemplateList(UserTypeEnum.MEMBER.getValue()); return success(BeanUtils.toBean(template, AppSocialWxaSubscribeTemplateRespVO.class)); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java index 7b09cfc..86b5ba9 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java @@ -61,7 +61,7 @@ public interface OperationService { List getBlackUserIdList(Long memberId); /** - * 获取微信今日查看次数 + * 获取微信查看次数 */ - Integer lookWechatTodayCount(Long operateMemberId, Long memberId); + Integer lookWechatCount(Long operateMemberId, Long memberId); } \ 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/recent/OperationServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java index 1e23489..b16b25c 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java @@ -135,16 +135,16 @@ public class OperationServiceImpl implements OperationService { } /** - * 获取微信今日查看次数 + * 获取微信查看次数 */ @Override - public Integer lookWechatTodayCount(Long operateMemberId, Long memberId) { + public Integer lookWechatCount(Long operateMemberId, Long memberId) { LocalDateTime now = LocalDateTime.now(); Long count = operationMapper.selectCount(new LambdaQueryWrapperX() - .eq(OperationDO::getOperatorMemberId, operateMemberId) - .eqIfPresent(OperationDO::getMemberId, memberId) - .eq(OperationDO::getBizType, MemberRecentOperateEnum.MEMBER_LOOK_WECHAT.getType()) - .between(OperationDO::getCreateTime, now.with(LocalTime.MIN), now.with(LocalTime.MAX)) + .eq(OperationDO::getOperatorMemberId, operateMemberId) + .eqIfPresent(OperationDO::getMemberId, memberId) + .eq(OperationDO::getBizType, MemberRecentOperateEnum.MEMBER_LOOK_WECHAT.getType()) + // .between(OperationDO::getCreateTime, now.with(LocalTime.MIN), now.with(LocalTime.MAX)) ); return Math.toIntExact(count); } 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 9b32d5b..91cc13c 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 @@ -295,12 +295,12 @@ public class RecentServiceImpl implements RecentService { } MemberConfigDO config = memberConfigService.getConfig(); Integer vipLookWechtCout = config.getVipLookWechtCout(); - // 判断今天有没有查看过 - if (operationService.lookWechatTodayCount(operateMemberId, memberId) > 0) { + // 今天有没有查看过他的微信 + if (operationService.lookWechatCount(operateMemberId, memberId) > 0) { return memberWechat; } // 查询用户今天有没有查看次数 - Integer userLookWechtCout = operationService.lookWechatTodayCount(operateMemberId, null); + Integer userLookWechtCout = operationService.lookWechatCount(operateMemberId, null); if (userLookWechtCout > vipLookWechtCout) { throw exception(MemberErrorCode.EMPTY, "今日查看微信次数已用完"); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/OperationMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/OperationMapper.xml index d2687a5..114e7cd 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/OperationMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/OperationMapper.xml @@ -76,7 +76,8 @@ resultType="cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationStatusVo"> select a.member_id, - if(a.biz_type = '4' and a.cancel_time is null, true, false) as isLike + if(a.biz_type = '4' and a.cancel_time is null, true, false) as isLike, + if(a.biz_type = '100' and a.cancel_time is null, true, false) as isLookWechat from member_operation a a.deleted = '0' @@ -97,7 +98,8 @@ resultType="cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationStatusVo"> select a.member_recent_id, - if(a.biz_type = '1' and a.cancel_time is null, true, false) as isLike + if(a.biz_type = '1' and a.cancel_time is null, true, false) as isLike, + if(a.biz_type = '100' and a.cancel_time is null, true, false) as isLookWechat from member_operation a a.deleted = '0' diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java index ef02dd1..62219fa 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApi.java @@ -44,6 +44,11 @@ public interface SocialClientApi { */ SocialWxPhoneNumberInfoRespDTO getWxMaPhoneNumberInfo(Integer userType, String phoneCode); + /** + * 获取小程序短链 + */ + String getWxUrlScheme(String path, String json); + /** * 获得小程序二维码 * diff --git a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java index 6db0e56..bc972b3 100644 --- a/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java +++ b/yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/enums/ErrorCodeConstants.java @@ -121,6 +121,7 @@ public interface ErrorCodeConstants { ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_PHONE_CODE_ERROR = new ErrorCode(1_002_018_200, "获得手机号失败"); ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_QRCODE_ERROR = new ErrorCode(1_002_018_201, "获得小程序码失败"); + ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_URL_SCHEME_ERROR = new ErrorCode(1_002_018_201, "获得小程序短链失败"); ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_TEMPLATE_ERROR = new ErrorCode(1_002_018_202, "获得小程序订阅消息模版失败"); ErrorCode SOCIAL_CLIENT_WEIXIN_MINI_APP_SUBSCRIBE_MESSAGE_ERROR = new ErrorCode(1_002_018_203, "发送小程序订阅消息失败"); ErrorCode SOCIAL_CLIENT_NOT_EXISTS = new ErrorCode(1_002_018_210, "社交客户端不存在"); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java index d0e6040..7d3f545 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialClientApiImpl.java @@ -55,6 +55,14 @@ public class SocialClientApiImpl implements SocialClientApi { return BeanUtils.toBean(info, SocialWxPhoneNumberInfoRespDTO.class); } + /** + * 获取小程序短链 + */ + @Override + public String getWxUrlScheme(String path, String json) { + return socialClientService.getWxUrlScheme(path, json); + } + @Override public byte[] getWxaQrcode(SocialWxQrcodeReqDTO reqVO) { return socialClientService.getWxaQrcode(reqVO); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java index 71c716c..66a704d 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientService.java @@ -57,6 +57,11 @@ public interface SocialClientService { // =================== 微信小程序独有 =================== + /** + * 获取小程序短链 + */ + String getWxUrlScheme(String path, String json); + /** * 获得微信小程序的手机信息 * @@ -76,7 +81,7 @@ public interface SocialClientService { /** * 获得微信小程订阅模板 - * + *

* 缓存的目的:考虑到微信小程序订阅消息选择好模版后几乎不会变动,缓存增加查询效率 * * @param userType 用户类型 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java index 8d1927e..a689934 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialClientServiceImpl.java @@ -5,6 +5,7 @@ import cn.binarywang.wx.miniapp.api.WxMaSubscribeService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo; import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage; +import cn.binarywang.wx.miniapp.bean.scheme.WxMaGenerateSchemeRequest; import cn.binarywang.wx.miniapp.config.impl.WxMaRedisBetterConfigImpl; import cn.binarywang.wx.miniapp.constant.WxMaConstants; import cn.hutool.core.bean.BeanUtil; @@ -74,7 +75,7 @@ public class SocialClientServiceImpl implements SocialClientService { /** * 小程序码要打开的小程序版本 - * + *

* 1. release:正式版 * 2. trial:体验版 * 3. developer:开发版 @@ -83,7 +84,7 @@ public class SocialClientServiceImpl implements SocialClientService { public String envVersion; /** * 订阅消息跳转小程序类型 - * + *

* 1. developer:开发版 * 2. trial:体验版 * 3. formal:正式版 @@ -102,10 +103,10 @@ public class SocialClientServiceImpl implements SocialClientService { private StringRedisTemplate stringRedisTemplate; // WxMpService 需要使用到,所以在 Service 注入了它 /** * 缓存 WxMpService 对象 - * + *

* key:使用微信公众号的 appId + secret 拼接,即 {@link SocialClientDO} 的 clientId 和 clientSecret 属性。 * 为什么 key 使用这种格式?因为 {@link SocialClientDO} 在管理后台可以变更,通过这个 key 存储它的单例。 - * + *

* 为什么要做 WxMpService 缓存?因为 WxMpService 构建成本比较大,所以尽量保证它是单例。 */ private final LoadingCache wxMpServiceCache = CacheUtils.buildAsyncReloadingCache( @@ -126,7 +127,7 @@ public class SocialClientServiceImpl implements SocialClientService { private WxMaProperties wxMaProperties; /** * 缓存 WxMaService 对象 - * + *

* 说明同 {@link #wxMpServiceCache} 变量 */ private final LoadingCache wxMaServiceCache = CacheUtils.buildAsyncReloadingCache( @@ -260,6 +261,29 @@ public class SocialClientServiceImpl implements SocialClientService { } } + /** + * 获取小程序短链 + */ + @Override + public String getWxUrlScheme(String path, String json) { + WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); + try { + String urlScheme = service.getWxMaSchemeService().generate(WxMaGenerateSchemeRequest.newBuilder() + .jumpWxa( + WxMaGenerateSchemeRequest.JumpWxa.newBuilder().path(path).query(json).envVersion("trial").build() + ) + .expireTime((long) (5 * 60 * 1000)) + .expireType(0) + .build() + ); + return urlScheme; + } catch (Exception e) { + e.printStackTrace(); + throw exception(SOCIAL_CLIENT_WEIXIN_MINI_APP_URL_SCHEME_ERROR); + } + } + + @Override public byte[] getWxaQrcode(SocialWxQrcodeReqDTO reqVO) { WxMaService service = getWxMaService(UserTypeEnum.MEMBER.getValue()); @@ -407,7 +431,7 @@ public class SocialClientServiceImpl implements SocialClientService { /** * 校验社交应用是否重复,需要保证 userType + socialType 唯一 - * + *

* 原因是,不同端(userType)选择某个社交登录(socialType)时,需要通过 {@link #buildAuthRequest(Integer, Integer)} 构建对应的请求 * * @param id 编号