From e8b6c8e0aa062b531949330a945752000d40aeb0 Mon Sep 17 00:00:00 2001 From: starrySky <1752476835@qq.com> Date: Tue, 9 Apr 2024 10:17:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=BD=91=E9=A1=B5=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/common/aspect/ClerkUserLogin.java | 17 ++ .../common/aspect/ClerkUserLoginAspect.java | 63 +++++ .../admin/common/aspect/CustomUserLogin.java | 17 ++ .../common/aspect/CustomUserLoginAspect.java | 63 +++++ .../admin/common/component/JwtToken.java | 6 +- .../common/conf/ThreadLocalRequestDetail.java | 43 +++ .../mybatis/handler/MyMetaObjectHandler.java | 25 +- .../mybatis/handler/MyTenantLineHandler.java | 2 +- .../admin/common/security/CustomFilter.java | 32 +++ .../security/config/SpringSecurityConfig.java | 2 +- .../filter/JwtAuthenticationTokenFilter.java | 17 +- ...PlayClerkClassificationInfoController.java | 95 +++++++ .../PlayClerkCommodityController.java | 2 +- .../PlayClerkLevelInfoController.java | 4 +- .../PlayClerkUserInfoController.java | 61 ++++- .../PlayClerkClassificationInfoMapper.java | 16 ++ .../PlayClerkClassificationInfoEntity.java | 41 +++ .../entity/PlayClerkUserInfoEntity.java | 17 +- .../entity/PlayClerkUserInfoQueryVo.java | 45 ++++ .../vo/PlayClerkLevelQueryReturnVo.java | 17 ++ .../module/vo/PlayClerkUserAddToWxVo.java | 85 ++++++ .../IPlayClerkClassificationInfoService.java | 71 +++++ .../service/IPlayClerkUserInfoService.java | 30 ++- ...layClerkClassificationInfoServiceImpl.java | 110 ++++++++ .../impl/PlayClerkUserInfoServiceImpl.java | 22 +- .../service/IPlayClearServiceService.java | 4 +- .../service/IPlayServiceInfoService.java | 2 +- .../impl/PlayClearServiceServiceImpl.java | 2 +- .../impl/PlayServiceInfoServiceImpl.java | 2 +- .../PlayCustomUserInfoController.java | 92 +++++++ .../mapper/PlayCustomUserInfoMapper.java | 16 ++ .../entity/PlayCustomUserInfoEntity.java | 150 +++++++++++ .../service/IPlayCustomUserInfoService.java | 72 +++++ .../impl/PlayCustomUserInfoServiceImpl.java | 105 ++++++++ .../order/mapper/OrderLogInfoMapper.java | 2 +- .../module/entity/OrderDetailsInfoEntity.java | 2 +- .../order/module/entity/OrderInfoEntity.java | 2 +- .../order/module/vo/OrderInfoQueryVo.java | 2 +- .../order/module/vo/OrderInfoRefundVo.java | 2 +- .../order/module/vo/OrderInfoRewardVo.java | 2 +- .../order/service/IOrderLogInfoService.java | 30 +-- .../service/impl/OrderLogInfoServiceImpl.java | 30 +-- .../controller/PlayNoticeInfoController.java | 84 ++++++ .../play/mapper/PlayNoticeInfoMapper.java | 16 ++ .../module/entity/PlayNoticeInfoEntity.java | 46 ++++ .../module/entity/PlayUserInfoEntity.java | 5 + .../play/module/vo/PlayNoticeInfoAddVo.java | 31 +++ .../play/module/vo/PlayUserInfoUpdateVo.java | 3 + .../play/service/IPlayNoticeInfoService.java | 70 +++++ .../impl/PlayNoticeInfoServiceImpl.java | 104 ++++++++ .../AdministrativeAreaDictInfoController.java | 76 ++++++ .../SysAdministrativeAreaDictInfoEntity.java | 46 ++++ .../SysAdministrativeAreaDictInfoMapper.java | 20 ++ ...ISysAdministrativeAreaDictInfoService.java | 73 ++++++ ...AdministrativeAreaDictInfoServiceImpl.java | 111 ++++++++ .../vo/AdministrativeAreaQueryReturnVo.java | 34 +++ .../weichat/builder/AbstractBuilder.java | 13 - .../modules/weichat/builder/ImageBuilder.java | 21 -- .../modules/weichat/builder/TextBuilder.java | 22 -- .../weichat/config/CommonConstants.java | 24 -- .../modules/weichat/config/WebConfig.java | 36 --- .../weichat/config/WxMpConfiguration.java | 111 -------- .../weichat/constant/ConfigConstant.java | 2 +- .../weichat/constant/MyReturnCode.java | 2 +- .../weichat/constant/WxReturnCode.java | 2 +- .../controller/WxAutoReplyController.java | 132 ---------- .../weichat/controller/WxDraftController.java | 129 --------- .../controller/WxFreePublishController.java | 66 ----- .../controller/WxMaterialController.java | 246 ------------------ .../weichat/controller/WxMenuController.java | 63 ----- .../controller/WxMpTestController.java | 29 --- .../weichat/controller/WxMsgController.java | 209 --------------- .../weichat/controller/WxOauthController.java | 132 ++++++++++ .../controller/WxPortalController.java | 110 -------- .../controller/WxSummaryController.java | 108 -------- .../weichat/controller/WxUserController.java | 174 ------------- .../controller/WxUserTagsController.java | 159 ----------- .../weichat/entity/CustomWxMpProperties.java | 32 --- .../modules/weichat/entity/ImageManager.java | 22 -- .../admin/modules/weichat/entity/Menu.java | 40 --- .../modules/weichat/entity/MenuButton.java | 68 ----- .../weichat/entity/PlayWxUserInfoEntity.java | 69 +++++ .../modules/weichat/entity/ThirdSession.java | 28 -- .../modules/weichat/entity/WxAutoReply.java | 119 --------- .../admin/modules/weichat/entity/WxMenu.java | 117 --------- .../admin/modules/weichat/entity/WxMsg.java | 145 ----------- .../admin/modules/weichat/entity/WxMsgVO.java | 27 -- .../modules/weichat/entity/WxOpenDataDTO.java | 20 -- .../admin/modules/weichat/entity/WxUser.java | 153 ----------- .../modules/weichat/entity/WxUserLoginVo.java | 13 + ...agsDict.java => WxUserQueryAddressVo.java} | 7 +- .../weichat/handler/AbstractHandler.java | 12 - .../weichat/handler/KfSessionHandler.java | 25 -- .../weichat/handler/LocationHandler.java | 44 ---- .../modules/weichat/handler/LogHandler.java | 39 --- .../modules/weichat/handler/MenuHandler.java | 172 ------------ .../modules/weichat/handler/MsgHandler.java | 194 -------------- .../modules/weichat/handler/NullHandler.java | 24 -- .../modules/weichat/handler/ScanHandler.java | 24 -- .../handler/StoreCheckNotifyHandler.java | 27 -- .../weichat/handler/SubscribeHandler.java | 84 ------ .../weichat/handler/UnsubscribeHandler.java | 48 ---- .../interceptor/ThirdSessionInterceptor.java | 72 ----- .../weichat/mapper/PlayWxUserInfoMapper.java | 16 ++ .../weichat/mapper/WxAutoReplyMapper.java | 15 -- .../modules/weichat/mapper/WxMenuMapper.java | 14 - .../modules/weichat/mapper/WxMsgMapper.java | 27 -- .../modules/weichat/mapper/WxUserMapper.java | 14 - .../modules/weichat/service/Constants.java | 152 +++++++++++ .../weichat/service/WxAutoReplyService.java | 14 - .../weichat/service/WxMenuService.java | 28 -- .../modules/weichat/service/WxMpApi.java | 109 -------- .../modules/weichat/service/WxMsgService.java | 25 -- .../weichat/service/WxOauthService.java | 143 ++++++++++ .../weichat/service/WxTokenService.java | 226 ++++++++++++++++ .../weichat/service/WxUserService.java | 46 ---- .../service/impl/WxAutoReplyServiceImpl.java | 18 -- .../service/impl/WxMenuServiceImpl.java | 163 ------------ .../service/impl/WxMsgServiceImpl.java | 37 --- .../service/impl/WxUserServiceImpl.java | 174 ------------- .../modules/weichat/utils/FileUtils.java | 67 ----- .../modules/weichat/utils/JsonUtils.java | 16 -- .../weichat/utils/LocalDateTimeUtils.java | 93 ------- .../weichat/utils/ThirdSessionHolder.java | 46 ---- .../weichat/utils/WxMpPropertiesUtils.java | 48 ---- .../src/main/resources/application-test.yml | 32 +++ .../com/starry/common/constant/Constants.java | 14 + pom.xml | 13 +- 128 files changed, 2861 insertions(+), 4243 deletions(-) create mode 100644 play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLogin.java create mode 100644 play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLoginAspect.java create mode 100644 play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLogin.java create mode 100644 play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLoginAspect.java create mode 100644 play-admin/src/main/java/com/starry/admin/common/conf/ThreadLocalRequestDetail.java create mode 100644 play-admin/src/main/java/com/starry/admin/common/security/CustomFilter.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkClassificationInfoController.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/clear/mapper/PlayClerkClassificationInfoMapper.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkClassificationInfoEntity.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoQueryVo.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkLevelQueryReturnVo.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserAddToWxVo.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkClassificationInfoService.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkClassificationInfoServiceImpl.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomUserInfoController.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/custom/mapper/PlayCustomUserInfoMapper.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomUserInfoEntity.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/custom/service/IPlayCustomUserInfoService.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/custom/service/impl/PlayCustomUserInfoServiceImpl.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/play/controller/PlayNoticeInfoController.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/play/mapper/PlayNoticeInfoMapper.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayNoticeInfoEntity.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/play/module/vo/PlayNoticeInfoAddVo.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/play/service/IPlayNoticeInfoService.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/play/service/impl/PlayNoticeInfoServiceImpl.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/system/controller/AdministrativeAreaDictInfoController.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/system/entity/SysAdministrativeAreaDictInfoEntity.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/system/mapper/SysAdministrativeAreaDictInfoMapper.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/system/service/ISysAdministrativeAreaDictInfoService.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/system/vo/AdministrativeAreaQueryReturnVo.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/builder/AbstractBuilder.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/builder/ImageBuilder.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/builder/TextBuilder.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/config/CommonConstants.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/config/WebConfig.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/config/WxMpConfiguration.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxAutoReplyController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxDraftController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxFreePublishController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMaterialController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMenuController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMpTestController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMsgController.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxPortalController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxSummaryController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxUserController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxUserTagsController.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/CustomWxMpProperties.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/ImageManager.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/Menu.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/MenuButton.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayWxUserInfoEntity.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/ThirdSession.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxAutoReply.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMenu.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMsg.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMsgVO.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxOpenDataDTO.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUser.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUserLoginVo.java rename play-admin/src/main/java/com/starry/admin/modules/weichat/entity/{WxUserTagsDict.java => WxUserQueryAddressVo.java} (56%) delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/AbstractHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/KfSessionHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/LocationHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/LogHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/MenuHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/MsgHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/NullHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/ScanHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/StoreCheckNotifyHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/SubscribeHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/handler/UnsubscribeHandler.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/interceptor/ThirdSessionInterceptor.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/PlayWxUserInfoMapper.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxAutoReplyMapper.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxMenuMapper.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxMsgMapper.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxUserMapper.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/Constants.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxAutoReplyService.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMenuService.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMpApi.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMsgService.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java create mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxTokenService.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxUserService.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxAutoReplyServiceImpl.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxMenuServiceImpl.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxMsgServiceImpl.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxUserServiceImpl.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/utils/FileUtils.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/utils/JsonUtils.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/utils/LocalDateTimeUtils.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/utils/ThirdSessionHolder.java delete mode 100644 play-admin/src/main/java/com/starry/admin/modules/weichat/utils/WxMpPropertiesUtils.java diff --git a/play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLogin.java b/play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLogin.java new file mode 100644 index 0000000..744fd62 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLogin.java @@ -0,0 +1,17 @@ +package com.starry.admin.common.aspect; + +import java.lang.annotation.*; + +/** + * 陪玩登录注解 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface ClerkUserLogin { + + + boolean manage() default false; +} diff --git a/play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLoginAspect.java b/play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLoginAspect.java new file mode 100644 index 0000000..174623f --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/aspect/ClerkUserLoginAspect.java @@ -0,0 +1,63 @@ +package com.starry.admin.common.aspect; + +import com.starry.admin.common.conf.ThreadLocalRequestDetail; +import com.starry.admin.common.exception.ServiceException; +import com.starry.admin.modules.clear.mapper.PlayClerkUserInfoMapper; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.weichat.service.WxTokenService; +import com.starry.common.constant.Constants; +import com.starry.common.constant.HttpStatus; +import com.starry.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; + +/** + * 限流处理 + * + * @author ruoyi + */ +@Slf4j +@Aspect +@Component +public class ClerkUserLoginAspect { + + @Resource + private PlayClerkUserInfoMapper userMapper; + @Resource + private WxTokenService tokenService; + @Resource + private HttpServletRequest request; + + + @Before("@annotation(clerkUserLogin)") + public void doBefore(JoinPoint point, ClerkUserLogin clerkUserLogin) { + String userToken = request.getHeader(Constants.CLERK_USER_LOGIN_TOKEN); + if (StringUtils.isEmpty(userToken)) { + throw new ServiceException("token为空", HttpStatus.UNAUTHORIZED); + } + userToken = userToken.replace(Constants.TOKEN_PREFIX, ""); + // 解析token + String userId; + try { + userId = tokenService.getMiniUserIdByToken(userToken); + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); + } + PlayClerkUserInfoEntity entity = userMapper.selectById(userId); + if (Objects.isNull(entity)) { + throw new ServiceException("未查询到有效用户", HttpStatus.UNAUTHORIZED); + } + if (!userToken.equals(entity.getToken())) { + throw new ServiceException("token异常", HttpStatus.UNAUTHORIZED); + } + ThreadLocalRequestDetail.setRequestDetail(entity); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLogin.java b/play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLogin.java new file mode 100644 index 0000000..e1f9977 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLogin.java @@ -0,0 +1,17 @@ +package com.starry.admin.common.aspect; + +import java.lang.annotation.*; + +/** + * 客户登录注解 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface CustomUserLogin { + + + boolean manage() default false; +} diff --git a/play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLoginAspect.java b/play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLoginAspect.java new file mode 100644 index 0000000..c377b7e --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/aspect/CustomUserLoginAspect.java @@ -0,0 +1,63 @@ +package com.starry.admin.common.aspect; + +import com.starry.admin.common.conf.ThreadLocalRequestDetail; +import com.starry.admin.common.exception.ServiceException; +import com.starry.admin.modules.custom.mapper.PlayCustomUserInfoMapper; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.weichat.service.WxTokenService; +import com.starry.common.constant.Constants; +import com.starry.common.constant.HttpStatus; +import com.starry.common.utils.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Objects; + +/** + * 限流处理 + * + * @author ruoyi + */ +@Slf4j +@Aspect +@Component +public class CustomUserLoginAspect { + + @Resource + private PlayCustomUserInfoMapper userMapper; + @Resource + private WxTokenService tokenService; + @Resource + private HttpServletRequest request; + + + @Before("@annotation(customUserLogin)") + public void doBefore(JoinPoint point, CustomUserLogin customUserLogin) { + String userToken = request.getHeader(Constants.CUSTOM_USER_LOGIN_TOKEN); + if (StringUtils.isEmpty(userToken)) { + throw new ServiceException("token为空", HttpStatus.UNAUTHORIZED); + } + userToken = userToken.replace(Constants.TOKEN_PREFIX, ""); + // 解析token + String userId; + try { + userId = tokenService.getMiniUserIdByToken(userToken); + } catch (Exception e) { + log.error(e.getMessage(), e); + throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED); + } + PlayCustomUserInfoEntity entity = userMapper.selectById(userId); + if (Objects.isNull(entity)) { + throw new ServiceException("未查询到有效用户", HttpStatus.UNAUTHORIZED); + } + if (!userToken.equals(entity.getToken())) { + throw new ServiceException("token异常", HttpStatus.UNAUTHORIZED); + } + ThreadLocalRequestDetail.setRequestDetail(entity); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/common/component/JwtToken.java b/play-admin/src/main/java/com/starry/admin/common/component/JwtToken.java index e03c3a8..664d07e 100644 --- a/play-admin/src/main/java/com/starry/admin/common/component/JwtToken.java +++ b/play-admin/src/main/java/com/starry/admin/common/component/JwtToken.java @@ -98,7 +98,7 @@ public class JwtToken { String token = IdUtil.fastSimpleUUID(); jwtUser.setToken(token); setUserAgent(jwtUser); - refresToken(jwtUser); + refersToken(jwtUser); Map claims = new HashMap<>(); claims.put(Constants.LOGIN_USER_KEY, token); @@ -167,7 +167,7 @@ public class JwtToken { jwtUser.setOs(userAgent.getOs().getName()); } - public void refresToken(JwtUser jwtUser) { + public void refersToken(JwtUser jwtUser) { jwtUser.setLoginTime(System.currentTimeMillis()); jwtUser.setExpireTime(jwtUser.getLoginTime() + expire * 1000); String userKey = getTokenKey(jwtUser.getToken()); @@ -224,7 +224,7 @@ public class JwtToken { long expireTime = jwtUser.getExpireTime(); long currentTime = System.currentTimeMillis(); if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { - refresToken(jwtUser); + refersToken(jwtUser); } } diff --git a/play-admin/src/main/java/com/starry/admin/common/conf/ThreadLocalRequestDetail.java b/play-admin/src/main/java/com/starry/admin/common/conf/ThreadLocalRequestDetail.java new file mode 100644 index 0000000..5ee8e1d --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/conf/ThreadLocalRequestDetail.java @@ -0,0 +1,43 @@ +package com.starry.admin.common.conf; + +import com.alibaba.ttl.TransmittableThreadLocal; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; + +/** + * @author : huchuansai + * @since : 2024/4/2 12:10 AM + */ +public class ThreadLocalRequestDetail { + private static final TransmittableThreadLocal threadLocal = new TransmittableThreadLocal<>(); + + /** + * 设置请求信息到当前线程中 + */ + public static void setRequestDetail(Object data) { + threadLocal.set(data); + } + + /** + * 从当前线程中获取请求信息 + */ + public static Object getRequestDetail() { + return threadLocal.get(); + } + + public static PlayClerkUserInfoEntity getClerkUserInfo() { + return (PlayClerkUserInfoEntity) threadLocal.get(); + } + + public static PlayCustomUserInfoEntity getCustomUserInfo() { + return (PlayCustomUserInfoEntity) threadLocal.get(); + } + + /** + * 销毁 + */ + public static void remove() { + threadLocal.remove(); + } + +} diff --git a/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java b/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java index cd46206..0a9b141 100644 --- a/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java +++ b/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyMetaObjectHandler.java @@ -1,7 +1,6 @@ package com.starry.admin.common.mybatis.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import com.starry.admin.utils.SecurityUtils; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; @@ -23,23 +22,23 @@ public class MyMetaObjectHandler implements MetaObjectHandler { this.setFieldValByName("createdTime", new Date(), metaObject); this.setFieldValByName("deleted", false, metaObject); this.setFieldValByName("version", 1L, metaObject); - Object createUser = this.getFieldValByName("createdBy", metaObject); - if (createUser == null) { - if (SecurityUtils.isLogin()) { - this.setFieldValByName("createdBy", SecurityUtils.getUserId(), metaObject); - } - } +// Object createUser = this.getFieldValByName("createdBy", metaObject); +// if (createUser == null) { +// if (SecurityUtils.isLogin()) { +// this.setFieldValByName("createdBy", SecurityUtils.getUserId(), metaObject); +// } +// } } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill ...."); this.setFieldValByName("updatedTime", new Date(), metaObject); - Object createUser = this.getFieldValByName("updatedBy", metaObject); - if (createUser == null) { - if (SecurityUtils.isLogin()) { - this.setFieldValByName("updatedBy", SecurityUtils.getUserId(), metaObject); - } - } +// Object createUser = this.getFieldValByName("updatedBy", metaObject); +// if (createUser == null) { +// if (SecurityUtils.isLogin()) { +// this.setFieldValByName("updatedBy", SecurityUtils.getUserId(), metaObject); +// } +// } } } diff --git a/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyTenantLineHandler.java b/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyTenantLineHandler.java index d0e527d..dc0f0b3 100644 --- a/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyTenantLineHandler.java +++ b/play-admin/src/main/java/com/starry/admin/common/mybatis/handler/MyTenantLineHandler.java @@ -23,7 +23,7 @@ public class MyTenantLineHandler implements TenantLineHandler { /** * 排除过滤的表 */ - private static final String[] TABLE_FILTER = {"sys_user", "sys_menu", "sys_tenant_package", "sys_tenant", "sys_dict", "sys_dict_data"}; + private static final String[] TABLE_FILTER = {"sys_user", "sys_menu", "sys_tenant_package", "sys_tenant", "sys_dict", "sys_dict_data", "sys_administrative_area_dict_info"}; /** * 排除过滤的表前缀 diff --git a/play-admin/src/main/java/com/starry/admin/common/security/CustomFilter.java b/play-admin/src/main/java/com/starry/admin/common/security/CustomFilter.java new file mode 100644 index 0000000..5a99786 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/common/security/CustomFilter.java @@ -0,0 +1,32 @@ +package com.starry.admin.common.security; + +import javax.servlet.*; +import java.io.IOException; + +/** + * @author admin + * @since 2024/4/7 17:17 + **/ +public class CustomFilter implements Filter { + @Override + public void init(FilterConfig filterConfig) { + // 初始化代码 + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + // 在请求处理之前可以进行一些操作 + // 例如,可以记录请求开始时间 + System.out.println("--------------------"); + // 继续调用下一个Filter或servlet + chain.doFilter(request, response); + + // 在请求处理之后可以进行一些操作 + // 例如,可以记录请求结束时间并计算耗时 + } + + @Override + public void destroy() { + // 销毁代码 + } +} diff --git a/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java b/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java index d221270..e835c75 100644 --- a/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java +++ b/play-admin/src/main/java/com/starry/admin/common/security/config/SpringSecurityConfig.java @@ -65,7 +65,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { "/v2/api-docs/**" ).permitAll() // 对登录注册要允许匿名访问 - .antMatchers("/login", "/captcha/get-captcha", "/wx/test/**","/wp/clear/**").permitAll() + .antMatchers("/login", "/captcha/get-captcha", "/wx/**").permitAll() // 跨域请求会先进行一次options请求 .antMatchers(HttpMethod.OPTIONS).permitAll() .anyRequest()// 除上面外的所有请求全部需要鉴权认证 diff --git a/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java b/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java index 24bcae7..32096c0 100644 --- a/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java +++ b/play-admin/src/main/java/com/starry/admin/common/security/filter/JwtAuthenticationTokenFilter.java @@ -34,24 +34,9 @@ public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { @Resource private JwtToken jwtToken; - @Override - protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException { - String url = request.getRequestURL().toString(); - log.debug("url ={}", url); - // 指定URL不拦截 - if (url.contains("/wp/clear/")) { - return true; - } - // 指定URL不拦截 - if (url.contains("/wp/custom/")) { - return true; - } - return false; - } - @Override - protected void doFilterInternal(@NotNull HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { + protected void doFilterInternal(@NotNull HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { LoginUser jwtUser = jwtToken.getNewLoginUser(httpServletRequest); if (null != jwtUser && null == SecurityContextHolder.getContext().getAuthentication()) { jwtToken.verifyToken(jwtUser); diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkClassificationInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkClassificationInfoController.java new file mode 100644 index 0000000..bc1d4f3 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkClassificationInfoController.java @@ -0,0 +1,95 @@ +package com.starry.admin.modules.clear.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.starry.admin.modules.clear.module.entity.PlayClerkClassificationInfoEntity; +import com.starry.admin.modules.clear.service.IPlayClerkClassificationInfoService; +import com.starry.common.annotation.Log; +import com.starry.common.enums.BusinessType; +import com.starry.common.result.R; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 店员分类Controller + * + * @author admin + * @since 2024-04-06 + */ +@RestController +@RequestMapping("/clerk/class") +public class PlayClerkClassificationInfoController { + @Resource + private IPlayClerkClassificationInfoService playClerkClassificationInfoService; + + /** + * 查询店员分类列表 + */ + @PreAuthorize("@customSs.hasPermission('play:info:list')") + @GetMapping("/listAll") + public R listAll() { + List list = playClerkClassificationInfoService.selectPlayClerkClassificationInfo(); + return R.ok(list); + } + + + /** + * 查询店员分类列表 + */ + @PreAuthorize("@customSs.hasPermission('play:info:list')") + @GetMapping("/list") + public R list(PlayClerkClassificationInfoEntity playClerkClassificationInfo) { + IPage list = playClerkClassificationInfoService.selectPlayClerkClassificationInfoByPage(playClerkClassificationInfo); + return R.ok(list); + } + + /** + * 获取店员分类详细信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:query')") + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable("id") String id) { + return R.ok(playClerkClassificationInfoService.selectPlayClerkClassificationInfoById(id)); + } + + /** + * 新增店员分类 + */ + @PreAuthorize("@customSs.hasPermission('play:info:create')") + @Log(title = "店员分类", businessType = BusinessType.INSERT) + @PostMapping("/create") + public R create(@RequestBody PlayClerkClassificationInfoEntity playClerkClassificationInfo) { + boolean success = playClerkClassificationInfoService.create(playClerkClassificationInfo); + if (success) { + return R.ok(); + } + return R.error("添加失败"); + } + + /** + * 修改店员分类 + */ + @PreAuthorize("@customSs.hasPermission('play:info:edit')") + @Log(title = "店员分类", businessType = BusinessType.UPDATE) + @PostMapping(value = "/update/{id}") + public R update(@PathVariable String id, @RequestBody PlayClerkClassificationInfoEntity playClerkClassificationInfo) { + playClerkClassificationInfo.setId(id); + boolean success = playClerkClassificationInfoService.update(playClerkClassificationInfo); + if (success) { + return R.ok(); + } + return R.error("修改失败"); + } + + /** + * 删除店员分类 + */ + @PreAuthorize("@customSs.hasPermission('play:info:remove')") + @Log(title = "店员分类", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@PathVariable String[] ids) { + return R.ok(playClerkClassificationInfoService.deletePlayClerkClassificationInfoByIds(ids)); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkCommodityController.java b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkCommodityController.java index d2b1b8c..b2a3efd 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkCommodityController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkCommodityController.java @@ -23,7 +23,7 @@ import java.util.List; * @since 2024-03-31 */ @RestController -@RequestMapping("/clark/commodity") +@RequestMapping("/clerk/commodity") public class PlayClerkCommodityController { @Resource private IPlayClerkCommodityService playClerkCommodityService; diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkLevelInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkLevelInfoController.java index 873ea7c..4cd74b4 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkLevelInfoController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkLevelInfoController.java @@ -30,8 +30,8 @@ public class PlayClerkLevelInfoController { * 查询店员等级列表 */ @PreAuthorize("@customSs.hasPermission('play:info:list')") - @GetMapping("/list") - public R list() { + @GetMapping("/listAll") + public R listAll() { return R.ok(playClerkLevelInfoService.selectAll()); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java index 751b814..7fee439 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/controller/PlayClerkUserInfoController.java @@ -1,11 +1,19 @@ package com.starry.admin.modules.clear.controller; +import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.starry.admin.modules.clear.module.entity.PlayClerkLevelInfoEntity; import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoQueryVo; +import com.starry.admin.modules.clear.module.vo.PlayClerkLevelQueryReturnVo; +import com.starry.admin.modules.clear.module.vo.PlayClerkUserAddToWxVo; import com.starry.admin.modules.clear.module.vo.PlayClerkUserAddVo; import com.starry.admin.modules.clear.module.vo.PlayClerkUserEditVo; import com.starry.admin.modules.clear.service.IPlayClerkCommodityService; +import com.starry.admin.modules.clear.service.IPlayClerkLevelInfoService; import com.starry.admin.modules.clear.service.IPlayClerkUserInfoService; +import com.starry.admin.modules.play.module.entity.PlayUserInfoEntity; +import com.starry.admin.modules.play.service.IPlayUserInfoService; import com.starry.common.annotation.Log; import com.starry.common.enums.BusinessType; import com.starry.common.result.R; @@ -25,19 +33,44 @@ import javax.annotation.Resource; @RestController @RequestMapping("/clerk/user") public class PlayClerkUserInfoController { + + @Resource + private IPlayUserInfoService playUserInfoService; @Resource private IPlayClerkUserInfoService playClerkUserInfoService; @Resource private IPlayClerkCommodityService clerkCommodityService; + + @Resource + private IPlayClerkLevelInfoService clerkLevelInfoService; + + @GetMapping("/queryLevel") + public R queryLevel() { + PlayClerkLevelInfoEntity entity = clerkLevelInfoService.selectPlayClerkLevelInfoById(playClerkUserInfoService.queryByUserId().getId()); + return R.ok(ConvertUtil.entityToVo(entity, PlayClerkLevelQueryReturnVo.class)); + } + + + /** + * 查询店员列表 + */ + @PreAuthorize("@customSs.hasPermission('play:info:list')") + @GetMapping("/wx/listByPage") + public R listByPage(PlayClerkUserInfoQueryVo vo) { + IPage list = playClerkUserInfoService.selectPlayClerkUserInfoByPage(vo); + return R.ok(list); + } + + /** * 查询店员列表 */ @PreAuthorize("@customSs.hasPermission('play:info:list')") @GetMapping("/list") - public R list(PlayClerkUserInfoEntity playClerkUserInfo) { - IPage list = playClerkUserInfoService.selectPlayClerkUserInfoByPage(playClerkUserInfo); + public R list(PlayClerkUserInfoQueryVo vo) { + IPage list = playClerkUserInfoService.selectPlayClerkUserInfoByPage(vo); return R.ok(list); } @@ -50,6 +83,30 @@ public class PlayClerkUserInfoController { return R.ok(playClerkUserInfoService.selectPlayClerkUserInfoById(id)); } + + /** + * 微信端口新增店员 + */ + @PreAuthorize("@customSs.hasPermission('play:info:create')") + @Log(title = "店员", businessType = BusinessType.INSERT) + @PostMapping("/wx/add") + public R add(@Validated @RequestBody PlayClerkUserAddToWxVo vo) { + //微信申请成为店员,需要先创建账户。 + PlayUserInfoEntity userInfoEntity = ConvertUtil.entityToVo(vo, PlayUserInfoEntity.class); + userInfoEntity.setId(IdUtil.fastSimpleUUID()); + playUserInfoService.create(userInfoEntity); + //账号创建完成后,创建店员 + PlayClerkUserInfoEntity clerkUserInfoEntity = ConvertUtil.entityToVo(vo, PlayClerkUserInfoEntity.class); + clerkUserInfoEntity.setPlayUserId(userInfoEntity.getId()); + boolean success = playClerkUserInfoService.create(clerkUserInfoEntity); + if (success) { + clerkCommodityService.initClerkCommodity(userInfoEntity.getId()); + return R.ok(); + } + return R.error("添加失败"); + } + + /** * 新增店员 */ diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/mapper/PlayClerkClassificationInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/clear/mapper/PlayClerkClassificationInfoMapper.java new file mode 100644 index 0000000..6046b83 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/mapper/PlayClerkClassificationInfoMapper.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.clear.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.starry.admin.modules.clear.module.entity.PlayClerkClassificationInfoEntity; + +/** + * 店员分类Mapper接口 + * + * @author admin + * @since 2024-04-06 + */ +public interface PlayClerkClassificationInfoMapper extends BaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkClassificationInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkClassificationInfoEntity.java new file mode 100644 index 0000000..0585f0f --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkClassificationInfoEntity.java @@ -0,0 +1,41 @@ +package com.starry.admin.modules.clear.module.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 店员分类对象 play_clerk_classification_info + * + * @author admin + * @since 2024-04-06 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("play_clerk_classification_info") +public class PlayClerkClassificationInfoEntity extends BaseEntity { + + + /** + * UUID + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 类型名称 + */ + private String name; + + /** + * (排序字段) + */ + private Integer sort; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoEntity.java index f5c19a2..d4784f7 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoEntity.java @@ -1,12 +1,13 @@ package com.starry.admin.modules.clear.module.entity; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.starry.common.domain.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; /** - * 【请填写功能名称】对象 play_clerk_user_info + * 店员对象 play_clerk_user_info * * @author admin * @since 2024-03-30 @@ -47,6 +48,11 @@ public class PlayClerkUserInfoEntity extends BaseEntity */ private String levelId; + /** + * 店员类型 + */ + private String typeId; + /** * 店员性别(1:男:0:女) */ @@ -112,8 +118,9 @@ public class PlayClerkUserInfoEntity extends BaseEntity */ private String remark; + /** - * 在职状态(1:在职,1:离职) + * 在职状态(1:在职,0:离职) */ private String onboardingState; @@ -157,5 +164,11 @@ public class PlayClerkUserInfoEntity extends BaseEntity */ private String randomOrder; + /** + * 最近一次登录token + */ + @JsonIgnore + private String token; + } diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoQueryVo.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoQueryVo.java new file mode 100644 index 0000000..290dc0b --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/entity/PlayClerkUserInfoQueryVo.java @@ -0,0 +1,45 @@ +package com.starry.admin.modules.clear.module.entity; + +import com.starry.common.domain.BasePageEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 店员对象 play_clerk_user_info + * + * @author admin + * @since 2024-03-30 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class PlayClerkUserInfoQueryVo extends BasePageEntity { + + + /** + * 店员等级 + */ + private String levelId; + + + /** + * 店员类型 + */ + private String typeId; + + /** + * 店员性别(1:男:0:女) + */ + private String sex; + + /** + * 所在省份 + */ + private String province; + + /** + * 上架状态【1:上架,0:下架】 + */ + private String listingState; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkLevelQueryReturnVo.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkLevelQueryReturnVo.java new file mode 100644 index 0000000..2a1197b --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkLevelQueryReturnVo.java @@ -0,0 +1,17 @@ +package com.starry.admin.modules.clear.module.vo; + +import lombok.Data; + +/** + * 店员等级查询接口 + */ +@Data +public class PlayClerkLevelQueryReturnVo { + + /** + * 登记名称 + */ + private String name; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserAddToWxVo.java b/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserAddToWxVo.java new file mode 100644 index 0000000..6934853 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/module/vo/PlayClerkUserAddToWxVo.java @@ -0,0 +1,85 @@ +package com.starry.admin.modules.clear.module.vo; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + + +@Data +public class PlayClerkUserAddToWxVo { + + /** + * 店员昵称 + */ + @NotBlank(message = "昵称不能为空") + private String nickname; + + + /** + * 店员性别(1:男:0:女) + */ + @NotNull(message = "性别不能为空") + private Integer sex; + + /** + * 年龄 + */ + @NotNull(message = "年龄不能为空") + private int age; + + + /** + * 微信号 + */ + @NotBlank(message = "微信号不能为空") + private String weChat; + + + /** + * 手机号码区号 + */ + @NotBlank(message = "微信号不能为空") + private String areaCode; + + /** + * 手机号码 + */ + @NotBlank(message = "微信号不能为空") + private String phone; + + /** + * 音频 + */ + @NotBlank(message = "音频不能为空") + private String audioFrequency; + + + /** + * 所在国家 + */ + private String country = "中国"; + + /** + * 所在省份 + */ + @NotBlank(message = "省份不能为空") + private String province; + + /** + * 所在城市 + */ + @NotBlank(message = "城市不能为空") + private String city; + + /** + * 备注 + */ + private String remark; + + /** + * 账户状态(1:审批通过,0:注册未审批) + */ + private String accountState = "0"; + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkClassificationInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkClassificationInfoService.java new file mode 100644 index 0000000..a89daf9 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkClassificationInfoService.java @@ -0,0 +1,71 @@ +package com.starry.admin.modules.clear.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.starry.admin.modules.clear.module.entity.PlayClerkClassificationInfoEntity; + +import java.util.List; + +/** + * 店员分类Service接口 + * + * @author admin + * @since 2024-04-06 + */ +public interface IPlayClerkClassificationInfoService extends IService { + /** + * 查询店员分类 + * + * @param id 店员分类主键 + * @return 店员分类 + */ + PlayClerkClassificationInfoEntity selectPlayClerkClassificationInfoById(String id); + + /** + * 查询店员分类列表 + * + * @return 店员分类集合 + */ + List selectPlayClerkClassificationInfo(); + + + /** + * 查询店员分类列表 + * + * @param playClerkClassificationInfo 店员分类 + * @return 店员分类集合 + */ + IPage selectPlayClerkClassificationInfoByPage(PlayClerkClassificationInfoEntity playClerkClassificationInfo); + + /** + * 新增店员分类 + * + * @param playClerkClassificationInfo 店员分类 + * @return 结果 + */ + boolean create(PlayClerkClassificationInfoEntity playClerkClassificationInfo); + + /** + * 修改店员分类 + * + * @param playClerkClassificationInfo 店员分类 + * @return 结果 + */ + boolean update(PlayClerkClassificationInfoEntity playClerkClassificationInfo); + + /** + * 批量删除店员分类 + * + * @param ids 需要删除的店员分类主键集合 + * @return 结果 + */ + int deletePlayClerkClassificationInfoByIds(String[] ids); + + /** + * 删除店员分类信息 + * + * @param id 店员分类主键 + * @return 结果 + */ + int deletePlayClerkClassificationInfoById(String id); +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java index a8a0125..8dcf9bd 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/service/IPlayClerkUserInfoService.java @@ -3,31 +3,52 @@ package com.starry.admin.modules.clear.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoQueryVo; /** * 店员Service接口 * * @author admin - * @since 2024-03-30 + * @since 2024-03-30 */ public interface IPlayClerkUserInfoService extends IService { + + /** + * 根据账户ID查询店员 + * + * @return 店员 + */ + PlayClerkUserInfoEntity queryByUserId(); + + /** * 查询店员 + * + * @param openId 微信ID + * @return 店员 + */ + PlayClerkUserInfoEntity selectByOpenid(String openId); + + /** + * 查询店员 + * * @param id 店员主键 * @return 店员 */ - PlayClerkUserInfoEntity selectPlayClerkUserInfoById(String id); + PlayClerkUserInfoEntity selectPlayClerkUserInfoById(String id); /** * 查询店员列表 - * @param playClerkUserInfo 店员 + * + * @param vo 店员查询对象 * @return 店员集合 */ - IPage selectPlayClerkUserInfoByPage(PlayClerkUserInfoEntity playClerkUserInfo); + IPage selectPlayClerkUserInfoByPage(PlayClerkUserInfoQueryVo vo); /** * 新增店员 + * * @param playClerkUserInfo 店员 * @return 结果 */ @@ -35,6 +56,7 @@ public interface IPlayClerkUserInfoService extends IService implements IPlayClerkClassificationInfoService { + @Resource + private PlayClerkClassificationInfoMapper playClerkClassificationInfoMapper; + + /** + * 查询店员分类 + * + * @param id 店员分类主键 + * @return 店员分类 + */ + @Override + public PlayClerkClassificationInfoEntity selectPlayClerkClassificationInfoById(String id) { + return this.baseMapper.selectById(id); + } + + + /** + * 查询店员分类列表 + * + * @return 店员分类 + */ + @Override + public List selectPlayClerkClassificationInfo() { + return this.baseMapper.selectList(new LambdaQueryWrapper<>()); + } + + + /** + * 查询店员分类列表 + * + * @param playClerkClassificationInfo 店员分类 + * @return 店员分类 + */ + @Override + public IPage selectPlayClerkClassificationInfoByPage(PlayClerkClassificationInfoEntity playClerkClassificationInfo) { + Page page = new Page<>(1, 10); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper()); + } + + /** + * 新增店员分类 + * + * @param playClerkClassificationInfo 店员分类 + * @return 结果 + */ + @Override + public boolean create(PlayClerkClassificationInfoEntity playClerkClassificationInfo) { + if (StrUtil.isBlankIfStr(playClerkClassificationInfo.getId())) { + playClerkClassificationInfo.setId(IdUtil.fastSimpleUUID()); + } + return save(playClerkClassificationInfo); + } + + /** + * 修改店员分类 + * + * @param playClerkClassificationInfo 店员分类 + * @return 结果 + */ + @Override + public boolean update(PlayClerkClassificationInfoEntity playClerkClassificationInfo) { + return updateById(playClerkClassificationInfo); + } + + /** + * 批量删除店员分类 + * + * @param ids 需要删除的店员分类主键 + * @return 结果 + */ + @Override + public int deletePlayClerkClassificationInfoByIds(String[] ids) { + return playClerkClassificationInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除店员分类信息 + * + * @param id 店员分类主键 + * @return 结果 + */ + @Override + public int deletePlayClerkClassificationInfoById(String id) { + return playClerkClassificationInfoMapper.deleteById(id); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkUserInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkUserInfoServiceImpl.java index 9536ca8..b685f4d 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkUserInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/clear/service/impl/PlayClerkUserInfoServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.starry.admin.modules.clear.mapper.PlayClerkUserInfoMapper; import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoQueryVo; import com.starry.admin.modules.clear.service.IPlayClerkUserInfoService; import org.springframework.stereotype.Service; @@ -26,6 +27,21 @@ public class PlayClerkUserInfoServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlayClerkUserInfoEntity::getPlayUserId, "123456"); + return this.baseMapper.selectOne(lambdaQueryWrapper); + } + + @Override + public PlayClerkUserInfoEntity selectByOpenid(String openId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlayClerkUserInfoEntity::getPlayUserId, openId); + return this.baseMapper.selectOne(lambdaQueryWrapper); + } + /** * 查询店员 * @@ -40,12 +56,12 @@ public class PlayClerkUserInfoServiceImpl extends ServiceImpl selectPlayClerkUserInfoByPage(PlayClerkUserInfoEntity playClerkUserInfo) { - Page page = new Page<>(1, 10); + public IPage selectPlayClerkUserInfoByPage(PlayClerkUserInfoQueryVo vo) { + Page page = new Page<>(vo.getPageNum(), vo.getPageSize()); return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>()); } diff --git a/play-admin/src/main/java/com/starry/admin/modules/commodity/service/IPlayClearServiceService.java b/play-admin/src/main/java/com/starry/admin/modules/commodity/service/IPlayClearServiceService.java index 889dfde..a853c0e 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/commodity/service/IPlayClearServiceService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/commodity/service/IPlayClearServiceService.java @@ -17,7 +17,7 @@ public interface IPlayClearServiceService extends IService * 查询所有的服务项目 * * @return List - * @author 杭州世平信息科技有限公司-xuhq + * @author admin * @since 2024/3/28 11:18 **/ List selectPlayServiceInfoAll(); diff --git a/play-admin/src/main/java/com/starry/admin/modules/commodity/service/impl/PlayClearServiceServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/commodity/service/impl/PlayClearServiceServiceImpl.java index 037558d..9efe661 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/commodity/service/impl/PlayClearServiceServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/commodity/service/impl/PlayClearServiceServiceImpl.java @@ -66,7 +66,7 @@ public class PlayClearServiceServiceImpl extends ServiceImpl selectPlayClearServiceByPage(PlayClearServiceEntity playClearService) { Page page = new Page<>(1, 10); - return this.baseMapper.selectPage(page, new LambdaQueryWrapper()); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>()); } /** diff --git a/play-admin/src/main/java/com/starry/admin/modules/commodity/service/impl/PlayServiceInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/commodity/service/impl/PlayServiceInfoServiceImpl.java index fca9b68..8542e33 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/commodity/service/impl/PlayServiceInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/commodity/service/impl/PlayServiceInfoServiceImpl.java @@ -53,7 +53,7 @@ public class PlayServiceInfoServiceImpl extends ServiceImpl selectPlayServiceInfoByPage(PlayServiceInfoEntity playServiceInfo) { Page page = new Page<>(1, 10); - return this.baseMapper.selectPage(page, new LambdaQueryWrapper()); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>()); } /** diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomUserInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomUserInfoController.java new file mode 100644 index 0000000..006cfa4 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/controller/PlayCustomUserInfoController.java @@ -0,0 +1,92 @@ +package com.starry.admin.modules.custom.controller; + +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; +import com.starry.common.enums.BusinessType; +import com.starry.common.result.R; + + +import com.starry.common.annotation.Log; +import org.springframework.security.access.prepost.PreAuthorize; + +import javax.annotation.Resource; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 顾客Controller + * + * @author admin + * @since 2024-04-08 + */ +@RestController +@RequestMapping("/play/info") +public class PlayCustomUserInfoController { + @Resource + private IPlayCustomUserInfoService playCustomUserInfoService; + +/** + * 查询顾客列表 + */ +@PreAuthorize("@customSs.hasPermission('play:info:list')") +@GetMapping("/list") + public R list(PlayCustomUserInfoEntity playCustomUserInfo) { + IPage list = playCustomUserInfoService.selectPlayCustomUserInfoByPage(playCustomUserInfo); + return R.ok(list); + } + + /** + * 获取顾客详细信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:query')") + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable("id") String id) { + return R.ok(playCustomUserInfoService.selectPlayCustomUserInfoById(id)); + } + + /** + * 新增顾客 + */ + @PreAuthorize("@customSs.hasPermission('play:info:create')") + @Log(title = "顾客", businessType = BusinessType.INSERT) + @PostMapping("/create") + public R create(@RequestBody PlayCustomUserInfoEntity playCustomUserInfo) { + boolean success = playCustomUserInfoService.create(playCustomUserInfo); + if (success) { + return R.ok(); + } + return R.error("添加失败"); + } + + /** + * 修改顾客 + */ + @PreAuthorize("@customSs.hasPermission('play:info:edit')") + @Log(title = "顾客", businessType = BusinessType.UPDATE) + @PostMapping(value = "/update/{id}") + public R update(@PathVariable String id, @RequestBody PlayCustomUserInfoEntity playCustomUserInfo) { + playCustomUserInfo.setId(id); + boolean success = playCustomUserInfoService.update(playCustomUserInfo); + if (success) { + return R.ok(); + } + return R.error("修改失败"); + } + + /** + * 删除顾客 + */ + @PreAuthorize("@customSs.hasPermission('play:info:remove')") + @Log(title = "顾客", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@PathVariable String[] ids) { + return R.ok(playCustomUserInfoService.deletePlayCustomUserInfoByIds(ids)); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/mapper/PlayCustomUserInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/custom/mapper/PlayCustomUserInfoMapper.java new file mode 100644 index 0000000..e7063e3 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/mapper/PlayCustomUserInfoMapper.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.custom.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; + +/** + * 顾客Mapper接口 + * + * @author admin + * @since 2024-04-08 + */ +public interface PlayCustomUserInfoMapper extends BaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomUserInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomUserInfoEntity.java new file mode 100644 index 0000000..212a6cf --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/module/entity/PlayCustomUserInfoEntity.java @@ -0,0 +1,150 @@ +package com.starry.admin.modules.custom.module.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 顾客对象 play_custom_user_info + * + * @author admin + * @since 2024-04-08 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("play_custom_user_info") +public class PlayCustomUserInfoEntity extends BaseEntity { + + + /** + * UUID + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户的标识,对当前公众号唯一 + */ + private String openid; + + /** + * 用户的标识,对当前公众号唯一 + */ + private String unionid; + + /** + * 店员昵称 + */ + private String nickname; + + /** + * 店员性别(0:位置;1:男,2:女) + */ + private Integer sex; + + /** + * 头像 + */ + private String avatar; + + /** + * 电话号码 + */ + private String phone; + + /** + * 等级 + */ + private String levelId; + + /** + * 所在国家 + */ + private String country; + + /** + * 所在省份 + */ + private String province; + + /** + * 所在城市 + */ + private String city; + + /** + * 账户余额(单位分) + */ + private String accountBalance; + + /** + * 余额状态[0:不存在余额,1:存在余额] + */ + private String accountState; + + /** + * 关注状态[0:未关注,1:已关注] + */ + private String subscribeState; + + /** + * 黑名单状态[0:黑名单,1:非黑名单] + */ + private String blacklistState; + + /** + * 违规状态[0:违规,1:未违规] + */ + private String violationState; + + /** + * 是否下单状态[0:未未下单,1:下单过] + */ + private String purchaseState; + + /** + * 绑定手机状态[0:未绑定,1:绑定] + */ + private String mobilePhoneState; + + /** + * 注册时间 + */ + private Date registrationTime; + + /** + * 上次登录时间 + */ + private Date lastLoginTime; + + /** + * 首次下单时间 + */ + private Date firstPurchaseTime; + + /** + * 最后一次下单时间 + */ + private Date lastPurchaseTime; + + /** + * 备注 + */ + private String remark; + + /** + * 最近一次登录token + */ + @JsonIgnore + private String token; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/service/IPlayCustomUserInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/custom/service/IPlayCustomUserInfoService.java new file mode 100644 index 0000000..87e9f9e --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/service/IPlayCustomUserInfoService.java @@ -0,0 +1,72 @@ +package com.starry.admin.modules.custom.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; + +/** + * 顾客Service接口 + * + * @author admin + * @since 2024-04-08 + */ +public interface IPlayCustomUserInfoService extends IService { + + + /** + * 查询顾客 + * + * @param openId 顾客主键 + * @return 顾客 + */ + PlayCustomUserInfoEntity selectByOpenid(String openId); + + + /** + * 查询顾客 + * + * @param id 顾客主键 + * @return 顾客 + */ + PlayCustomUserInfoEntity selectPlayCustomUserInfoById(String id); + + /** + * 查询顾客列表 + * + * @param playCustomUserInfo 顾客 + * @return 顾客集合 + */ + IPage selectPlayCustomUserInfoByPage(PlayCustomUserInfoEntity playCustomUserInfo); + + /** + * 新增顾客 + * + * @param playCustomUserInfo 顾客 + * @return 结果 + */ + boolean create(PlayCustomUserInfoEntity playCustomUserInfo); + + /** + * 修改顾客 + * + * @param playCustomUserInfo 顾客 + * @return 结果 + */ + boolean update(PlayCustomUserInfoEntity playCustomUserInfo); + + /** + * 批量删除顾客 + * + * @param ids 需要删除的顾客主键集合 + * @return 结果 + */ + int deletePlayCustomUserInfoByIds(String[] ids); + + /** + * 删除顾客信息 + * + * @param id 顾客主键 + * @return 结果 + */ + int deletePlayCustomUserInfoById(String id); +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/custom/service/impl/PlayCustomUserInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/custom/service/impl/PlayCustomUserInfoServiceImpl.java new file mode 100644 index 0000000..a36e97a --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/custom/service/impl/PlayCustomUserInfoServiceImpl.java @@ -0,0 +1,105 @@ +package com.starry.admin.modules.custom.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.starry.admin.modules.custom.mapper.PlayCustomUserInfoMapper; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; + +/** + * 顾客Service业务层处理 + * + * @author admin + * @since 2024-04-08 + */ +@Service +public class PlayCustomUserInfoServiceImpl extends ServiceImpl implements IPlayCustomUserInfoService { + @Resource + private PlayCustomUserInfoMapper playCustomUserInfoMapper; + + + @Override + public PlayCustomUserInfoEntity selectByOpenid(String openId) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PlayCustomUserInfoEntity::getOpenid, openId); + return this.baseMapper.selectOne(lambdaQueryWrapper); + } + + /** + * 查询顾客 + * + * @param id 顾客主键 + * @return 顾客 + */ + @Override + public PlayCustomUserInfoEntity selectPlayCustomUserInfoById(String id) { + return this.baseMapper.selectById(id); + } + + /** + * 查询顾客列表 + * + * @param playCustomUserInfo 顾客 + * @return 顾客 + */ + @Override + public IPage selectPlayCustomUserInfoByPage(PlayCustomUserInfoEntity playCustomUserInfo) { + Page page = new Page<>(1, 10); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>()); + } + + /** + * 新增顾客 + * + * @param playCustomUserInfo 顾客 + * @return 结果 + */ + @Override + public boolean create(PlayCustomUserInfoEntity playCustomUserInfo) { + if (StrUtil.isBlankIfStr(playCustomUserInfo.getId())) { + playCustomUserInfo.setId(IdUtil.fastSimpleUUID()); + } + return save(playCustomUserInfo); + } + + /** + * 修改顾客 + * + * @param playCustomUserInfo 顾客 + * @return 结果 + */ + @Override + public boolean update(PlayCustomUserInfoEntity playCustomUserInfo) { + return updateById(playCustomUserInfo); + } + + /** + * 批量删除顾客 + * + * @param ids 需要删除的顾客主键 + * @return 结果 + */ + @Override + public int deletePlayCustomUserInfoByIds(String[] ids) { + return playCustomUserInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除顾客信息 + * + * @param id 顾客主键 + * @return 结果 + */ + @Override + public int deletePlayCustomUserInfoById(String id) { + return playCustomUserInfoMapper.deleteById(id); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderLogInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderLogInfoMapper.java index 293db6b..40474db 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderLogInfoMapper.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/mapper/OrderLogInfoMapper.java @@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.starry.admin.modules.order.module.entity.OrderLogInfoEntity; /** - * 【请填写功能名称】Mapper接口 + * 订单日志Mapper接口 * * @author admin * @since 2024-03-22 diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderDetailsInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderDetailsInfoEntity.java index 0d176a9..f511b4e 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderDetailsInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderDetailsInfoEntity.java @@ -6,7 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; /** - * 【请填写功能名称】对象 order_details_info + * 订单详细对象 order_details_info * * @author admin * @since 2024-03-20 diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderInfoEntity.java index 4e99f11..ac8c08c 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/module/entity/OrderInfoEntity.java @@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode; import java.util.Date; /** - * 【请填写功能名称】对象 order_info + * 订单对象 order_info * * @author admin * @since 2024-03-20 diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoQueryVo.java b/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoQueryVo.java index cb8436c..8ad9b33 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoQueryVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoQueryVo.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; import java.util.Date; /** - * 【请填写功能名称】对象 order_info + * 订单对象 order_info * * @author admin * @since 2024-03-20 diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoRefundVo.java b/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoRefundVo.java index 81788f8..d493f65 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoRefundVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoRefundVo.java @@ -6,7 +6,7 @@ import lombok.Data; import javax.validation.constraints.NotNull; /** - * 【请填写功能名称】对象 order_info + * 订单信息对象 order_info * * @author admin * @since 2024-03-20 diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoRewardVo.java b/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoRewardVo.java index 24def51..bb6153f 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoRewardVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/module/vo/OrderInfoRewardVo.java @@ -7,7 +7,7 @@ import lombok.EqualsAndHashCode; import javax.validation.constraints.NotBlank; /** - * 【请填写功能名称】对象 order_info + * 订单信息对象 order_info * * @author admin * @since 2024-03-20 diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderLogInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderLogInfoService.java index 570ac75..b916bd8 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderLogInfoService.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/service/IOrderLogInfoService.java @@ -5,56 +5,56 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.starry.admin.modules.order.module.entity.OrderLogInfoEntity; /** - * 【请填写功能名称】Service接口 + * 订单日志Service接口 * * @author admin * @since 2024-03-22 */ public interface IOrderLogInfoService extends IService { /** - * 查询【请填写功能名称】 + * 查询订单日志 * - * @param id 【请填写功能名称】主键 - * @return 【请填写功能名称】 + * @param id 订单日志主键 + * @return 订单日志 */ OrderLogInfoEntity selectOrderLogInfoById(String id); /** - * 查询【请填写功能名称】列表 + * 查询订单日志列表 * - * @param orderLogInfo 【请填写功能名称】 - * @return 【请填写功能名称】集合 + * @param orderLogInfo 订单日志 + * @return 订单日志集合 */ IPage selectOrderLogInfoByPage(OrderLogInfoEntity orderLogInfo); /** - * 新增【请填写功能名称】 + * 新增订单日志 * - * @param orderLogInfo 【请填写功能名称】 + * @param orderLogInfo 订单日志 * @return 结果 */ boolean create(OrderLogInfoEntity orderLogInfo); /** - * 修改【请填写功能名称】 + * 修改订单日志 * - * @param orderLogInfo 【请填写功能名称】 + * @param orderLogInfo 订单日志 * @return 结果 */ boolean update(OrderLogInfoEntity orderLogInfo); /** - * 批量删除【请填写功能名称】 + * 批量删除订单日志 * - * @param ids 需要删除的【请填写功能名称】主键集合 + * @param ids 需要删除的订单日志主键集合 * @return 结果 */ int deleteOrderLogInfoByIds(String[] ids); /** - * 删除【请填写功能名称】信息 + * 删除订单日志信息 * - * @param id 【请填写功能名称】主键 + * @param id 订单日志主键 * @return 结果 */ int deleteOrderLogInfoById(String id); diff --git a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderLogInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderLogInfoServiceImpl.java index 0156933..8fe0127 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderLogInfoServiceImpl.java +++ b/play-admin/src/main/java/com/starry/admin/modules/order/service/impl/OrderLogInfoServiceImpl.java @@ -16,7 +16,7 @@ import java.util.Arrays; /** - * 【请填写功能名称】Service业务层处理 + * 订单日志Service业务层处理 * * @author admin * @since 2024-03-22 @@ -27,10 +27,10 @@ public class OrderLogInfoServiceImpl extends ServiceImpl selectOrderLogInfoByPage(OrderLogInfoEntity orderLogInfo) { @@ -50,9 +50,9 @@ public class OrderLogInfoServiceImpl extends ServiceImpl list = playNoticeInfoService.selectPlayNoticeInfoByPage(playNoticeInfo); + return R.ok(list); + } + + /** + * 查询公告列表 + */ + @PreAuthorize("@customSs.hasPermission('play:info:list')") + @GetMapping("/list") + public R list(PlayNoticeInfoEntity playNoticeInfo) { + IPage list = playNoticeInfoService.selectPlayNoticeInfoByPage(playNoticeInfo); + return R.ok(list); + } + + /** + * 获取公告详细信息 + */ + @PreAuthorize("@customSs.hasPermission('play:info:query')") + @GetMapping(value = "/{id}") + public R getInfo(@PathVariable("id") String id) { + return R.ok(playNoticeInfoService.selectPlayNoticeInfoById(id)); + } + + /** + * 新增公告 + */ + @PreAuthorize("@customSs.hasPermission('play:info:create')") + @Log(title = "公告", businessType = BusinessType.INSERT) + @PostMapping("/create") + public R create(@Valid @RequestBody PlayNoticeInfoAddVo vo) { + PlayNoticeInfoEntity entity = ConvertUtil.entityToVo(vo, PlayNoticeInfoEntity.class); + boolean success = playNoticeInfoService.create(entity); + if (success) { + return R.ok(); + } + return R.error("添加失败"); + } + + + /** + * 删除公告 + */ + @PreAuthorize("@customSs.hasPermission('play:info:remove')") + @Log(title = "公告", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@PathVariable String[] ids) { + return R.ok(playNoticeInfoService.deletePlayNoticeInfoByIds(ids)); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/play/mapper/PlayNoticeInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/play/mapper/PlayNoticeInfoMapper.java new file mode 100644 index 0000000..7802940 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/play/mapper/PlayNoticeInfoMapper.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.play.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.starry.admin.modules.play.module.entity.PlayNoticeInfoEntity; + +/** + * 公告Mapper接口 + * + * @author admin + * @since 2024-04-06 + */ +public interface PlayNoticeInfoMapper extends BaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayNoticeInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayNoticeInfoEntity.java new file mode 100644 index 0000000..d821a80 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayNoticeInfoEntity.java @@ -0,0 +1,46 @@ +package com.starry.admin.modules.play.module.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 公告对象 play_notice_info + * + * @author admin + * @since 2024-04-06 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("play_notice_info") +public class PlayNoticeInfoEntity extends BaseEntity { + + + /** + * + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 公告类型【0:公告,1:消息】 + */ + private String noticeType; + + /** + * 标题 + */ + private String title; + + /** + * 内容 + */ + private String content; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayUserInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayUserInfoEntity.java index b198afb..e35b8fc 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayUserInfoEntity.java +++ b/play-admin/src/main/java/com/starry/admin/modules/play/module/entity/PlayUserInfoEntity.java @@ -37,4 +37,9 @@ public class PlayUserInfoEntity extends BaseEntity { */ private String areaCode; + /** + * 账户状态(1:审批通过,0:注册未审批) + */ + private String accountState; + } diff --git a/play-admin/src/main/java/com/starry/admin/modules/play/module/vo/PlayNoticeInfoAddVo.java b/play-admin/src/main/java/com/starry/admin/modules/play/module/vo/PlayNoticeInfoAddVo.java new file mode 100644 index 0000000..9caca77 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/play/module/vo/PlayNoticeInfoAddVo.java @@ -0,0 +1,31 @@ +package com.starry.admin.modules.play.module.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; + +/** + * 公告对象 play_notice_info + * + * @author admin + * @since 2024-04-06 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class PlayNoticeInfoAddVo { + + /** + * 标题 + */ + @NotBlank(message = "标题不能为空") + private String title; + + /** + * 内容 + */ + @NotBlank(message = "内容不能为空") + private String content; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/play/module/vo/PlayUserInfoUpdateVo.java b/play-admin/src/main/java/com/starry/admin/modules/play/module/vo/PlayUserInfoUpdateVo.java index b9f14ea..b3f410f 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/play/module/vo/PlayUserInfoUpdateVo.java +++ b/play-admin/src/main/java/com/starry/admin/modules/play/module/vo/PlayUserInfoUpdateVo.java @@ -4,6 +4,9 @@ import lombok.Data; import javax.validation.constraints.NotBlank; +/** + * @author admin + */ @Data public class PlayUserInfoUpdateVo { diff --git a/play-admin/src/main/java/com/starry/admin/modules/play/service/IPlayNoticeInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/play/service/IPlayNoticeInfoService.java new file mode 100644 index 0000000..3bdd325 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/play/service/IPlayNoticeInfoService.java @@ -0,0 +1,70 @@ +package com.starry.admin.modules.play.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.starry.admin.modules.play.module.entity.PlayNoticeInfoEntity; + +import java.util.List; + +/** + * 公告Service接口 + * + * @author admin + * @since 2024-04-06 + */ +public interface IPlayNoticeInfoService extends IService { + /** + * 查询公告 + * + * @param id 公告主键 + * @return 公告 + */ + PlayNoticeInfoEntity selectPlayNoticeInfoById(String id); + + /** + * 查询公告列表 + * + * @return 公告集合 + */ + List selectPlayNoticeInfo(); + + /** + * 查询公告列表 + * + * @param playNoticeInfo 公告 + * @return 公告集合 + */ + IPage selectPlayNoticeInfoByPage(PlayNoticeInfoEntity playNoticeInfo); + + /** + * 新增公告 + * + * @param playNoticeInfo 公告 + * @return 结果 + */ + boolean create(PlayNoticeInfoEntity playNoticeInfo); + + /** + * 修改公告 + * + * @param playNoticeInfo 公告 + * @return 结果 + */ + boolean update(PlayNoticeInfoEntity playNoticeInfo); + + /** + * 批量删除公告 + * + * @param ids 需要删除的公告主键集合 + * @return 结果 + */ + int deletePlayNoticeInfoByIds(String[] ids); + + /** + * 删除公告信息 + * + * @param id 公告主键 + * @return 结果 + */ + int deletePlayNoticeInfoById(String id); +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/play/service/impl/PlayNoticeInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/play/service/impl/PlayNoticeInfoServiceImpl.java new file mode 100644 index 0000000..b208906 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/play/service/impl/PlayNoticeInfoServiceImpl.java @@ -0,0 +1,104 @@ +package com.starry.admin.modules.play.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.starry.admin.modules.play.mapper.PlayNoticeInfoMapper; +import com.starry.admin.modules.play.module.entity.PlayNoticeInfoEntity; +import com.starry.admin.modules.play.service.IPlayNoticeInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + +/** + * 公告Service业务层处理 + * + * @author admin + * @since 2024-04-06 + */ +@Service +public class PlayNoticeInfoServiceImpl extends ServiceImpl implements IPlayNoticeInfoService { + @Resource + private PlayNoticeInfoMapper playNoticeInfoMapper; + + /** + * 查询公告 + * + * @param id 公告主键 + * @return 公告 + */ + @Override + public PlayNoticeInfoEntity selectPlayNoticeInfoById(String id) { + return this.baseMapper.selectById(id); + } + + + @Override + public List selectPlayNoticeInfo() { + return this.baseMapper.selectList(new LambdaQueryWrapper<>()); + } + + /** + * 查询公告列表 + * + * @param playNoticeInfo 公告 + * @return 公告 + */ + @Override + public IPage selectPlayNoticeInfoByPage(PlayNoticeInfoEntity playNoticeInfo) { + Page page = new Page<>(1, 10); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper<>()); + } + + /** + * 新增公告 + * + * @param playNoticeInfo 公告 + * @return 结果 + */ + @Override + public boolean create(PlayNoticeInfoEntity playNoticeInfo) { + if (StrUtil.isBlankIfStr(playNoticeInfo.getId())) { + playNoticeInfo.setId(IdUtil.fastSimpleUUID()); + } + return save(playNoticeInfo); + } + + /** + * 修改公告 + * + * @param playNoticeInfo 公告 + * @return 结果 + */ + @Override + public boolean update(PlayNoticeInfoEntity playNoticeInfo) { + return updateById(playNoticeInfo); + } + + /** + * 批量删除公告 + * + * @param ids 需要删除的公告主键 + * @return 结果 + */ + @Override + public int deletePlayNoticeInfoByIds(String[] ids) { + return playNoticeInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除公告信息 + * + * @param id 公告主键 + * @return 结果 + */ + @Override + public int deletePlayNoticeInfoById(String id) { + return playNoticeInfoMapper.deleteById(id); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/controller/AdministrativeAreaDictInfoController.java b/play-admin/src/main/java/com/starry/admin/modules/system/controller/AdministrativeAreaDictInfoController.java new file mode 100644 index 0000000..44600c8 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/system/controller/AdministrativeAreaDictInfoController.java @@ -0,0 +1,76 @@ +package com.starry.admin.modules.system.controller; + +import cn.hutool.core.io.FileUtil; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.starry.admin.modules.system.entity.SysAdministrativeAreaDictInfoEntity; +import com.starry.admin.modules.system.service.ISysAdministrativeAreaDictInfoService; +import com.starry.admin.modules.system.vo.AdministrativeAreaQueryReturnVo; +import com.starry.common.result.R; +import com.starry.common.utils.ConvertUtil; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +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; +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 行政区域字典信息Controller + * + * @author admin + * @since 2024-04-03 + */ +@RestController +@RequestMapping("/sys/area") +public class AdministrativeAreaDictInfoController { + @Resource + private ISysAdministrativeAreaDictInfoService playAdministrativeAreaDictInfoService; + + /** + * 查询省/市行政区域代码 + */ + @PreAuthorize("@customSs.hasPermission('play:info:list')") + @GetMapping("/tree") + public R list() { + List result = new ArrayList<>(); + List list = playAdministrativeAreaDictInfoService.selectAll(); + Map> collect = list.stream().filter(a -> a != null && a.getPCode() != null).collect(Collectors.groupingBy(SysAdministrativeAreaDictInfoEntity::getPCode)); + if (collect.containsKey("00")) { + result = ConvertUtil.entityToVoList(collect.get("00"), AdministrativeAreaQueryReturnVo.class); + } + for (AdministrativeAreaQueryReturnVo vo : result) { + vo.setChild(ConvertUtil.entityToVoList(collect.get(vo.getCode()), AdministrativeAreaQueryReturnVo.class)); + } + return R.ok(result); + } + + @GetMapping("/add") + public R add(@RequestParam("index") String index) { + String fileName = "D:\\" + index + ".txt"; + JSONArray array = JSONArray.parse(FileUtil.readString(new File(fileName), "UTF-8")); + List list = new ArrayList<>(); + for (int i = 0; i < array.size(); i++) { + JSONObject jsonObject = array.getJSONObject(i); + SysAdministrativeAreaDictInfoEntity entity = new SysAdministrativeAreaDictInfoEntity(); + entity.setCode(jsonObject.getString("code")); + entity.setName(jsonObject.getString("name")); + if (index.equals("1")) { + entity.setPCode("00"); + } else { + entity.setPCode(jsonObject.getString("provinceCode")); + } + entity.setLevel(index); + list.add(entity); + } + playAdministrativeAreaDictInfoService.saveBatch(list); + return R.ok(""); + } + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/entity/SysAdministrativeAreaDictInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/system/entity/SysAdministrativeAreaDictInfoEntity.java new file mode 100644 index 0000000..69a2fa5 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/system/entity/SysAdministrativeAreaDictInfoEntity.java @@ -0,0 +1,46 @@ +package com.starry.admin.modules.system.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 行政区域字典信息对象 play_administrative_area_dict_info + * + * @author admin + * @since 2024-04-03 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("sys_administrative_area_dict_info") +public class SysAdministrativeAreaDictInfoEntity extends BaseEntity { + + + /** + * UUID + */ + private String id; + + /** + * 行政单位编码 + */ + private String code; + + /** + * 新增单位名称 + */ + private String name; + + /** + * 上级单位编码 + */ + private String pCode; + + /** + * 行政单位等级 + **/ + private String level; + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/mapper/SysAdministrativeAreaDictInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/system/mapper/SysAdministrativeAreaDictInfoMapper.java new file mode 100644 index 0000000..cc2b6d9 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/system/mapper/SysAdministrativeAreaDictInfoMapper.java @@ -0,0 +1,20 @@ +package com.starry.admin.modules.system.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.starry.admin.modules.system.entity.SysAdministrativeAreaDictInfoEntity; +import org.apache.ibatis.annotations.Mapper; + +; + +/** + * 行政区域字典信息Mapper接口 + * + * @author admin + * @since 2024-04-03 + */ +@Mapper +public interface SysAdministrativeAreaDictInfoMapper extends BaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/service/ISysAdministrativeAreaDictInfoService.java b/play-admin/src/main/java/com/starry/admin/modules/system/service/ISysAdministrativeAreaDictInfoService.java new file mode 100644 index 0000000..f7f5959 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/system/service/ISysAdministrativeAreaDictInfoService.java @@ -0,0 +1,73 @@ +package com.starry.admin.modules.system.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.starry.admin.modules.system.entity.SysAdministrativeAreaDictInfoEntity; + +import java.util.List; + +/** + * 行政区域字典信息Service接口 + * + * @author admin + * @since 2024-04-03 + */ +public interface ISysAdministrativeAreaDictInfoService extends IService { + + /** + * 查询行政区域字典信息 + * + * @param id 行政区域字典信息主键 + * @return 行政区域字典信息 + */ + SysAdministrativeAreaDictInfoEntity selectPlayAdministrativeAreaDictInfoById(String id); + + + /** + * 查询所有行政区域字典信息列表 + * + * @return 行政区域字典信息集合 + */ + List selectAll(); + + /** + * 查询行政区域字典信息列表 + * + * @param playAdministrativeAreaDictInfo 行政区域字典信息 + * @return 行政区域字典信息集合 + */ + IPage selectPlayAdministrativeAreaDictInfoByPage(SysAdministrativeAreaDictInfoEntity playAdministrativeAreaDictInfo); + + /** + * 新增行政区域字典信息 + * + * @param playAdministrativeAreaDictInfo 行政区域字典信息 + * @return 结果 + */ + boolean create(SysAdministrativeAreaDictInfoEntity playAdministrativeAreaDictInfo); + boolean create(List list); + + /** + * 修改行政区域字典信息 + * + * @param playAdministrativeAreaDictInfo 行政区域字典信息 + * @return 结果 + */ + boolean update(SysAdministrativeAreaDictInfoEntity playAdministrativeAreaDictInfo); + + /** + * 批量删除行政区域字典信息 + * + * @param ids 需要删除的行政区域字典信息主键集合 + * @return 结果 + */ + int deletePlayAdministrativeAreaDictInfoByIds(String[] ids); + + /** + * 删除行政区域字典信息信息 + * + * @param id 行政区域字典信息主键 + * @return 结果 + */ + int deletePlayAdministrativeAreaDictInfoById(String id); +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java new file mode 100644 index 0000000..8629be2 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/system/service/impl/SysAdministrativeAreaDictInfoServiceImpl.java @@ -0,0 +1,111 @@ +package com.starry.admin.modules.system.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.starry.admin.modules.system.mapper.SysAdministrativeAreaDictInfoMapper; +import com.starry.admin.modules.system.entity.SysAdministrativeAreaDictInfoEntity; +import com.starry.admin.modules.system.service.ISysAdministrativeAreaDictInfoService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.List; + +/** + * 行政区域字典信息Service业务层处理 + * + * @author admin + * @since 2024-04-03 + */ +@Service +public class SysAdministrativeAreaDictInfoServiceImpl extends ServiceImpl implements ISysAdministrativeAreaDictInfoService { + @Resource + private SysAdministrativeAreaDictInfoMapper sysAdministrativeAreaDictInfoMapper; + + /** + * 查询行政区域字典信息 + * + * @param id 行政区域字典信息主键 + * @return 行政区域字典信息 + */ + @Override + public SysAdministrativeAreaDictInfoEntity selectPlayAdministrativeAreaDictInfoById(String id) { + return this.baseMapper.selectById(id); + } + + + @Override + public List selectAll() { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper(); + lambdaQueryWrapper.eq(SysAdministrativeAreaDictInfoEntity::getLevel, "1").or().eq(SysAdministrativeAreaDictInfoEntity::getLevel, "2"); + return this.baseMapper.selectList(lambdaQueryWrapper); + } + + /** + * 查询行政区域字典信息列表 + * + * @param playAdministrativeAreaDictInfo 行政区域字典信息 + * @return 行政区域字典信息 + */ + @Override + public IPage selectPlayAdministrativeAreaDictInfoByPage(SysAdministrativeAreaDictInfoEntity playAdministrativeAreaDictInfo) { + Page page = new Page<>(1, 10); + return this.baseMapper.selectPage(page, new LambdaQueryWrapper()); + } + + /** + * 新增行政区域字典信息 + * + * @param playAdministrativeAreaDictInfo 行政区域字典信息 + * @return 结果 + */ + @Override + public boolean create(SysAdministrativeAreaDictInfoEntity playAdministrativeAreaDictInfo) { + if (StrUtil.isBlankIfStr(playAdministrativeAreaDictInfo.getId())) { + playAdministrativeAreaDictInfo.setId(IdUtil.fastSimpleUUID()); + } + return save(playAdministrativeAreaDictInfo); + } + + @Override + public boolean create(List list) { + return this.saveBatch(list); + } + + /** + * 修改行政区域字典信息 + * + * @param playAdministrativeAreaDictInfo 行政区域字典信息 + * @return 结果 + */ + @Override + public boolean update(SysAdministrativeAreaDictInfoEntity playAdministrativeAreaDictInfo) { + return updateById(playAdministrativeAreaDictInfo); + } + + /** + * 批量删除行政区域字典信息 + * + * @param ids 需要删除的行政区域字典信息主键 + * @return 结果 + */ + @Override + public int deletePlayAdministrativeAreaDictInfoByIds(String[] ids) { + return sysAdministrativeAreaDictInfoMapper.deleteBatchIds(Arrays.asList(ids)); + } + + /** + * 删除行政区域字典信息信息 + * + * @param id 行政区域字典信息主键 + * @return 结果 + */ + @Override + public int deletePlayAdministrativeAreaDictInfoById(String id) { + return sysAdministrativeAreaDictInfoMapper.deleteById(id); + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/system/vo/AdministrativeAreaQueryReturnVo.java b/play-admin/src/main/java/com/starry/admin/modules/system/vo/AdministrativeAreaQueryReturnVo.java new file mode 100644 index 0000000..fd8d38e --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/system/vo/AdministrativeAreaQueryReturnVo.java @@ -0,0 +1,34 @@ +package com.starry.admin.modules.system.vo; + +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +/** + * 行政区域信息集合 play_administrative_area_dict_info + * + * @author admin + * @since 2024-04-03 + */ +@Data +public class AdministrativeAreaQueryReturnVo { + + + /** + * 编码 + */ + private String code; + + /** + * 名称 + */ + private String name; + + /** + * 区域集合 + **/ + private List child = new ArrayList<>(); + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/builder/AbstractBuilder.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/builder/AbstractBuilder.java deleted file mode 100644 index b4fdd5b..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/builder/AbstractBuilder.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.starry.admin.modules.weichat.builder; - -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; - -/** - * @author admin - */ -public abstract class AbstractBuilder { - - public abstract WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, WxMpService service); -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/builder/ImageBuilder.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/builder/ImageBuilder.java deleted file mode 100644 index a694101..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/builder/ImageBuilder.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.starry.admin.modules.weichat.builder; - -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; - -/** - * @author admin - */ -public class ImageBuilder extends AbstractBuilder { - - @Override - public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, - WxMpService service) { - - return WxMpXmlOutMessage.IMAGE().mediaId(content) - .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) - .build(); - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/builder/TextBuilder.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/builder/TextBuilder.java deleted file mode 100644 index 741b649..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/builder/TextBuilder.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.starry.admin.modules.weichat.builder; - -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage; - -/** - * @author admin - */ -public class TextBuilder extends AbstractBuilder { - - @Override - public WxMpXmlOutMessage build(String content, WxMpXmlMessage wxMessage, - WxMpService service) { - WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content(content) - .fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) - .build(); - return m; - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/config/CommonConstants.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/config/CommonConstants.java deleted file mode 100644 index 8f7038d..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/config/CommonConstants.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.starry.admin.modules.weichat.config; - -/** - * @author admin - */ -public interface CommonConstants { - /** - * 是 - */ - String YES = "1"; - /** - * 否 - */ - String NO = "0"; - - /** - * 树形父类ID - */ - String PARENT_ID = "0"; - /** - * 编码 - */ - String UTF8 = "UTF-8"; -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/config/WebConfig.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/config/WebConfig.java deleted file mode 100644 index 3fa1ce5..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/config/WebConfig.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.starry.admin.modules.weichat.config; - -import com.starry.admin.modules.weichat.interceptor.ThirdSessionInterceptor; -import lombok.AllArgsConstructor; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -/** - * web配置 - * - * @author admin - */ -@Configuration -@AllArgsConstructor -public class WebConfig implements WebMvcConfigurer { - - /** - * 拦截器 - * - * @param registry InterceptorRegistry - */ - @Override - public void addInterceptors(InterceptorRegistry registry) { - /* - 进入ThirdSession拦截器 - */ - registry.addInterceptor(new ThirdSessionInterceptor()) - // 拦截/api/**接口 - .addPathPatterns("/weixin/api/**") - // 放行接口 - .excludePathPatterns("/weixin/api/ma/wxuser/login", - "/weixin/api/ma/orderinfo/notify-order", "/weixin/api/ma/orderinfo/notify-logisticsr", - "/weixin/api/ma/orderinfo/notify-refunds"); - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/config/WxMpConfiguration.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/config/WxMpConfiguration.java deleted file mode 100644 index d954b74..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/config/WxMpConfiguration.java +++ /dev/null @@ -1,111 +0,0 @@ -// package com.starry.admin.modules.weichat.config; -// -// -// import cn.hutool.core.util.StrUtil; -// import com.starry.admin.modules.weichat.entity.CustomWxMpProperties; -// import com.starry.admin.modules.weichat.handler.*; -// import com.starry.admin.modules.weichat.utils.WxMpPropertiesUtils; -// import lombok.AllArgsConstructor; -// import me.chanjar.weixin.common.api.WxConsts; -// import me.chanjar.weixin.mp.api.WxMpMessageRouter; -// import me.chanjar.weixin.mp.api.WxMpService; -// import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; -// import me.chanjar.weixin.mp.config.WxMpConfigStorage; -// import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl; -// import org.springframework.context.annotation.Bean; -// import org.springframework.context.annotation.Configuration; -// -// import java.util.HashMap; -// import java.util.Map; -// -// import static me.chanjar.weixin.common.api.WxConsts.EventType.SUBSCRIBE; -// import static me.chanjar.weixin.common.api.WxConsts.EventType.UNSUBSCRIBE; -// import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType.EVENT; -// import static me.chanjar.weixin.mp.constant.WxMpEventConstants.CustomerService.*; -// import static me.chanjar.weixin.mp.constant.WxMpEventConstants.POI_CHECK_NOTIFY; -// -///** -// * wechat mp configuration -// * -// * @author admin -// */ -//@AllArgsConstructor -//@Configuration -// public class WxMpConfiguration { -// private final LogHandler logHandler; -// private final NullHandler nullHandler; -// private final KfSessionHandler kfSessionHandler; -// private final StoreCheckNotifyHandler storeCheckNotifyHandler; -// private final LocationHandler locationHandler; -// private final MenuHandler menuHandler; -// private final MsgHandler msgHandler; -// private final UnsubscribeHandler unsubscribeHandler; -// private final SubscribeHandler subscribeHandler; -// private final ScanHandler scanHandler; -// -// @Bean -// public WxMpService wxMpService() { -// CustomWxMpProperties customWxMpProperties = WxMpPropertiesUtils.getWeiChatProperties(); -// if (StrUtil.isBlankIfStr(customWxMpProperties.getAppid()) || StrUtil.isBlankIfStr(customWxMpProperties.getAppid()) || StrUtil.isBlankIfStr(customWxMpProperties.getAppid()) || StrUtil.isBlankIfStr(customWxMpProperties.getAppid())) { -// throw new RuntimeException("微信配置文件出错"); -// } -// return getWxMpService(customWxMpProperties); -// } -// -// private static WxMpService getWxMpService(CustomWxMpProperties customWxMpProperties) { -// Map multiConfigStorages = new HashMap<>(); -// WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl(); -// configStorage.setAppId(customWxMpProperties.getAppid()); -// configStorage.setSecret(customWxMpProperties.getSecret()); -// configStorage.setToken(customWxMpProperties.getToken()); -// configStorage.setAesKey(customWxMpProperties.getAesKey()); -// -// -// WxMpService mpService = new WxMpServiceImpl(); -// mpService.setMultiConfigStorages(multiConfigStorages); -// return mpService; -// } -// -// @Bean -// public WxMpMessageRouter messageRouter(WxMpService wxMpService) { -// final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService); -// -// // 记录所有事件的日志 (异步执行) -// newRouter.rule().handler(this.logHandler).next(); -// -// // 接收客服会话管理事件 -// newRouter.rule().async(false).msgType(EVENT).event(KF_CREATE_SESSION).handler(this.kfSessionHandler).end(); -// newRouter.rule().async(false).msgType(EVENT).event(KF_CLOSE_SESSION).handler(this.kfSessionHandler).end(); -// newRouter.rule().async(false).msgType(EVENT).event(KF_SWITCH_SESSION).handler(this.kfSessionHandler).end(); -// -// // 门店审核事件 -// newRouter.rule().async(false).msgType(EVENT).event(POI_CHECK_NOTIFY).handler(this.storeCheckNotifyHandler).end(); -// -// // 自定义菜单事件 -// newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.CLICK).handler(this.menuHandler).end(); -// -// // 点击菜单连接事件 -// newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.VIEW).handler(this.nullHandler).end(); -// -// // 关注事件 -// newRouter.rule().async(false).msgType(EVENT).event(SUBSCRIBE).handler(this.subscribeHandler).end(); -// -// // 取消关注事件 -// newRouter.rule().async(false).msgType(EVENT).event(UNSUBSCRIBE).handler(this.unsubscribeHandler).end(); -// -// // 上报地理位置事件 -// newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.LOCATION).handler(this.locationHandler).end(); -// -// // 接收地理位置消息 -// newRouter.rule().async(false).msgType(WxConsts.XmlMsgType.LOCATION).handler(this.locationHandler).end(); -// -// // 扫码事件 -// newRouter.rule().async(false).msgType(EVENT).event(WxConsts.EventType.SCAN).handler(this.scanHandler).end(); -// -// // 默认 -// newRouter.rule().async(false).handler(this.msgHandler).end(); -// -// return newRouter; -// } -// -//} \ No newline at end of file diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/ConfigConstant.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/ConfigConstant.java index 94272b5..3d75aa1 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/ConfigConstant.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/ConfigConstant.java @@ -23,7 +23,7 @@ public interface ConfigConstant { String SUBSCRIBE_TYPE_WEBLIEN = "2"; /** - * 应用类型 1:小程序 + * 应用类型 1:微信 */ String WX_APP_TYPE_1 = "1"; /** diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/MyReturnCode.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/MyReturnCode.java index d0252d7..40f0ced 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/MyReturnCode.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/MyReturnCode.java @@ -2,7 +2,7 @@ package com.starry.admin.modules.weichat.constant; /** * 全局返回码 - * 小程序用6开头,例60001 + * 微信用6开头,例60001 * * @author admin * 2019年7月25日 diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/WxReturnCode.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/WxReturnCode.java index 2c84fd5..797e9bf 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/WxReturnCode.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/constant/WxReturnCode.java @@ -9,7 +9,7 @@ package com.starry.admin.modules.weichat.constant; @SuppressWarnings("") public enum WxReturnCode { - SUC_0("0", "请求成功") {}, ERR_1("-1", "系统繁忙,此时请开发者稍候再试") {}, ERR_10001("10001", "涉嫌广告 ") {}, ERR_20001("20001", "涉嫌政治 ") {}, ERR_20002("20002", "涉嫌色情 ") {}, ERR_20004("20004", "涉嫌社会 ") {}, ERR_20006("20006", "涉嫌违法犯罪 ") {}, ERR_20008("20008", "涉嫌欺诈 ") {}, ERR_20013("20013", "涉嫌版权 ") {}, ERR_21000("21000", "涉嫌其他 ") {}, ERR_22000("22000", "涉嫌互推(互相宣传) ") {}, ERR_30001("30001", "原创校验出现系统错误且用户选择了被判为转载就不群发 ") {}, ERR_30002("30002", "原创校验被判定为不能群发 ") {}, ERR_30003("30003", "原创校验被判定为转载文且用户选择了被判为转载就不群发 ") {}, ERR_40001("40001", "获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口") {}, ERR_40002("40002", "不合法的凭证类型") {}, ERR_40003("40003", "不合法的OpenID,请开发者确认OpenID(该用户)是否已关注公众号,或是否是其他公众号的OpenID") {}, ERR_40004("40004", "不合法的媒体文件类型") {}, ERR_40005("40005", "不合法的文件类型") {}, ERR_40006("40006", "不合法的文件大小") {}, ERR_40007("40007", "不合法的媒体文件id") {}, ERR_40008("40008", "不合法的消息类型") {}, ERR_40009("40009", "不合法的图片文件大小") {}, ERR_40010("40010", "不合法的语音文件大小") {}, ERR_40011("40011", "不合法的视频文件大小") {}, ERR_40012("40012", "不合法的缩略图文件大小") {}, ERR_40013("40013", "不合法的AppID,请开发者检查AppID的正确性,避免异常字符,注意大小写") {}, ERR_40014("40014", "不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口") {}, ERR_40015("40015", "不合法的菜单类型") {}, ERR_40016("40016", "不合法的按钮个数") {}, ERR_40017("40017", "不合法的按钮个数") {}, ERR_40018("40018", "不合法的按钮名字长度") {}, ERR_40019("40019", "不合法的按钮KEY长度") {}, ERR_40020("40020", "不合法的按钮URL长度") {}, ERR_40021("40021", "不合法的菜单版本号") {}, ERR_40022("40022", "不合法的子菜单级数") {}, ERR_40023("40023", "不合法的子菜单按钮个数") {}, ERR_40024("40024", "不合法的子菜单按钮类型") {}, ERR_40025("40025", "不合法的子菜单按钮名字长度") {}, ERR_40026("40026", "不合法的子菜单按钮KEY长度") {}, ERR_40027("40027", "不合法的子菜单按钮URL长度") {}, ERR_40028("40028", "不合法的自定义菜单使用用户") {}, ERR_40029("40029", "不合法的oauth_code") {}, ERR_40030("40030", "不合法的refresh_token") {}, ERR_40031("40031", "不合法的openid列表") {}, ERR_40032("40032", "不合法的openid列表个数") {}, ERR_40033("40033", "不合法的请求字符,不能包含xxxx格式的字符") {}, ERR_40035("40035", "不合法的参数") {}, ERR_40055("40055", "不完整的url,前面要加http://") {}, ERR_40037("40037", "template_id不正确") {}, ERR_40038("40038", "不合法的请求格式") {}, ERR_40039("40039", "不合法的URL长度") {}, ERR_40050("40050", "不合法的分组id") {}, ERR_40051("40051", "分组名字不合法") {}, ERR_40062("40062", "标题长度不合法") {}, ERR_40097("40097", "参数不合法") {}, ERR_40113("40113", "文件名称不合法,需包含正确后缀") {}, ERR_40117("40117", "分组名字不合法") {}, ERR_40118("40118", "media_id大小不合法") {}, ERR_40119("40119", "button类型错误") {}, ERR_40120("40120", "button类型错误") {}, ERR_40121("40121", "不合法的media_id类型") {}, ERR_40125("40125", "不合法的AppSecret,请开发者检查AppSecret的正确性,避免异常字符,注意大小写") {}, ERR_40130("40130", "至少需要同时发送两个用户") {}, ERR_40132("40132", "微信号不合法") {}, ERR_40137("40137", "不支持的图片格式") {}, ERR_40164("40164", "调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置") {}, ERR_41001("41001", "缺少access_token参数") {}, ERR_41002("41002", "缺少appid参数") {}, ERR_41003("41003", "缺少refresh_token参数") {}, ERR_41004("41004", "缺少secret参数") {}, ERR_41005("41005", "缺少多媒体文件数据") {}, ERR_41006("41006", "缺少media_id参数") {}, ERR_41007("41007", "缺少子菜单数据") {}, ERR_41008("41008", "缺少oauth code") {}, ERR_41009("41009", "缺少openid") {}, ERR_41028("41028", "form_id不正确,或者过期") {}, ERR_41029("41029", "form_id已被使用") {}, ERR_41030("41030", "page不正确") {}, ERR_42001("42001", "access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明") {}, ERR_42002("42002", "refresh_token超时") {}, ERR_42003("42003", "oauth_code超时") {}, ERR_43001("43001", "需要GET请求") {}, ERR_43002("43002", "需要POST请求") {}, ERR_43003("43003", "需要HTTPS请求") {}, ERR_43004("43004", "需要接收者关注") {}, ERR_43005("43005", "需要好友关系") {}, ERR_44001("44001", "多媒体文件为空") {}, ERR_44002("44002", "POST的数据包为空") {}, ERR_44003("44003", "图文消息内容为空") {}, ERR_44004("44004", "文本消息内容为空") {}, ERR_45001("45001", "多媒体文件大小超过限制") {}, ERR_45002("45002", "消息内容超过限制") {}, ERR_45003("45003", "标题字段超过限制") {}, ERR_45004("45004", "描述字段超过限制") {}, ERR_45005("45005", "链接字段超过限制") {}, ERR_45006("45006", "图片链接字段超过限制") {}, ERR_45007("45007", "语音播放时间超过限制") {}, ERR_45008("45008", "图文消息超过限制") {}, ERR_45009("45009", "接口调用超过限制") {}, ERR_45010("45010", "创建菜单个数超过限制") {}, ERR_45015("45015", "回复时间超过限制") {}, ERR_45016("45016", "系统分组,不允许修改") {}, ERR_45017("45017", "分组名字过长") {}, ERR_45018("45018", "分组数量超过上限") {}, ERR_45028("45028", "没有群发的配额,配额已经用完") {}, ERR_45047("45047", "客服下行消息超过上限") {}, ERR_45157("45157", "标签名非法,请注意不能和其他标签重名") {}, ERR_45158("45158", "标签名长度超过30个字节") {}, ERR_45056("45056", "创建的标签数过多,请注意不能超过100个") {}, ERR_45058("45058", "不能修改0/1/2这三个系统默认保留的标签") {}, ERR_45057("45057", "该标签下粉丝数超过10w,不允许直接删除") {}, ERR_45059("45059", "有粉丝身上的标签数已经超过限制") {}, ERR_45159("45159", "非法的tag_id") {}, ERR_46001("46001", "不存在媒体数据") {}, ERR_46002("46002", "不存在的菜单版本") {}, ERR_46003("46003", "不存在的菜单数据") {}, ERR_46004("46004", "不存在的用户") {}, ERR_47001("47001", "解析JSON/XML内容错误") {}, ERR_48001("48001", "api功能未授权,请确认公众号已获得该接口,可以在公众平台官网-开发者中心页中查看接口权限") {}, ERR_48002("48002", "粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” )") {}, ERR_48004("48004", "api 接口被封禁,请登录 admin.weixin.qq.com 查看详情") {}, ERR_48005("48005", "api 禁止删除被自动回复和自定义菜单引用的素材") {}, ERR_48006("48006", "api 禁止清零调用次数,因为清零次数达到上限") {}, ERR_48008("48008", "没有该类型消息的发送权限") {}, ERR_49003("49003", "传入的openid不属于此AppID") {}, ERR_50001("50001", "用户未授权该api") {}, ERR_50002("50002", "用户受限,可能是违规后接口被封禁") {}, ERR_50005("50005", "用户未关注公众号") {}, ERR_61003("61003", "请确认是否取消授权(第三方平台授权)") {}, ERR_61004("61004", "当前ip未在白名单中,直接获取本地ip添加") {}, ERR_61005("61005", " 组件 ticket已失效,重新接受授权url反馈的ticket") {}, ERR_61006("61006", "获取componentTicket为null") {}, ERR_61007("61007", "当前公众号或者小程序已在公众平台解绑") {}, ERR_61009("61009", "授权码失效,重新授权") {}, ERR_61451("61451", "参数错误(invalid parameter)") {}, ERR_61452("61452", "无效客服账号(invalid kf_account)") {}, ERR_61453("61453", "客服帐号已存在(kf_account exsited)") {}, ERR_61454("61454", "客服帐号名长度超过限制(仅允许10个英文字符,不包括@及@后的公众号的微信号)(invalid kf_acount length)") {}, ERR_61455("61455", "客服帐号名包含非法字符(仅允许英文+数字)(illegal character in kf_account)") {}, ERR_61456("61456", "客服帐号个数超过限制(10个客服账号)(kf_account count exceeded)") {}, ERR_61457("61457", "无效头像文件类型(invalid file type)") {}, ERR_61450("61450", "系统错误(system error)") {}, ERR_61500("61500", "日期格式错误") {}, ERR_61501("61501", "日期范围错误") {}, ERR_65400("65400", "API不可用,即没有开通/升级到新版客服功能") {}, ERR_65401("65401", "无效客服帐号") {}, ERR_65403("65403", "客服昵称不合法") {}, ERR_65404("65404", "客服帐号不合法") {}, ERR_65405("65405", "帐号数目已达到上限,不能继续添加") {}, ERR_65406("65406", "已经存在的客服帐号") {}, ERR_65407("65407", "邀请对象已经是该公众号客服") {}, ERR_65408("65408", "本公众号已经有一个邀请给该微信") {}, ERR_65409("65409", "无效的微信号") {}, ERR_65410("65410", "邀请对象绑定公众号客服数达到上限(目前每个微信号可以绑定5个公众号客服帐号)") {}, ERR_65411("65411", "该帐号已经有一个等待确认的邀请,不能重复邀请") {}, ERR_65412("65412", "该帐号已经绑定微信号,不能进行邀请") {}, ERR_99999("99999", "无法获取到文件名") {}, ERR_9001001("9001001", "POST数据参数不合法") {}, ERR_9001002("9001002", "远端服务不可用") {}, ERR_9001003("9001003", "Ticket不合法") {}, ERR_9001004("9001004", "获取摇周边用户信息失败") {}, ERR_9001005("9001005", "获取商户信息失败") {}, ERR_9001006("9001006", "获取OpenID失败") {}, ERR_9001007("9001007", "上传文件缺失") {}, ERR_9001008("9001008", "上传素材的文件类型不合法") {}, ERR_9001009("9001009", "上传素材的文件尺寸不合法") {}, ERR_9001010("9001010", "上传失败") {}, ERR_9001020("9001020", "帐号不合法") {}, ERR_9001021("9001021", "已有设备激活率低于50%,不能新增设备") {}, ERR_9001022("9001022", "设备申请数不合法,必须为大于0的数字") {}, ERR_9001023("9001023", "已存在审核中的设备ID申请") {}, ERR_9001024("9001024", "一次查询设备ID数量不能超过50") {}, ERR_9001025("9001025", "设备ID不合法") {}, ERR_9001026("9001026", "页面ID不合法") {}, ERR_9001027("9001027", "页面参数不合法") {}, ERR_9001028("9001028", "一次删除页面ID数量不能超过10") {}, ERR_9001029("9001029", "页面已应用在设备中,请先解除应用关系再删除") {}, ERR_9001030("9001030", "一次查询页面ID数量不能超过50") {}, ERR_9001031("9001031", "时间区间不合法") {}, ERR_9001032("9001032", "保存设备与页面的绑定关系参数错误") {}, ERR_9001033("9001033", "门店ID不合法") {}, ERR_9001034("9001034", "设备备注信息过长") {}, ERR_9001035("9001035", "设备申请参数不合法") {}, ERR_9001036("9001036", "查询起始值begin不合法") {}; + SUC_0("0", "请求成功") {}, ERR_1("-1", "系统繁忙,此时请开发者稍候再试") {}, ERR_10001("10001", "涉嫌广告 ") {}, ERR_20001("20001", "涉嫌政治 ") {}, ERR_20002("20002", "涉嫌色情 ") {}, ERR_20004("20004", "涉嫌社会 ") {}, ERR_20006("20006", "涉嫌违法犯罪 ") {}, ERR_20008("20008", "涉嫌欺诈 ") {}, ERR_20013("20013", "涉嫌版权 ") {}, ERR_21000("21000", "涉嫌其他 ") {}, ERR_22000("22000", "涉嫌互推(互相宣传) ") {}, ERR_30001("30001", "原创校验出现系统错误且用户选择了被判为转载就不群发 ") {}, ERR_30002("30002", "原创校验被判定为不能群发 ") {}, ERR_30003("30003", "原创校验被判定为转载文且用户选择了被判为转载就不群发 ") {}, ERR_40001("40001", "获取access_token时AppSecret错误,或者access_token无效。请开发者认真比对AppSecret的正确性,或查看是否正在为恰当的公众号调用接口") {}, ERR_40002("40002", "不合法的凭证类型") {}, ERR_40003("40003", "不合法的OpenID,请开发者确认OpenID(该用户)是否已关注公众号,或是否是其他公众号的OpenID") {}, ERR_40004("40004", "不合法的媒体文件类型") {}, ERR_40005("40005", "不合法的文件类型") {}, ERR_40006("40006", "不合法的文件大小") {}, ERR_40007("40007", "不合法的媒体文件id") {}, ERR_40008("40008", "不合法的消息类型") {}, ERR_40009("40009", "不合法的图片文件大小") {}, ERR_40010("40010", "不合法的语音文件大小") {}, ERR_40011("40011", "不合法的视频文件大小") {}, ERR_40012("40012", "不合法的缩略图文件大小") {}, ERR_40013("40013", "不合法的AppID,请开发者检查AppID的正确性,避免异常字符,注意大小写") {}, ERR_40014("40014", "不合法的access_token,请开发者认真比对access_token的有效性(如是否过期),或查看是否正在为恰当的公众号调用接口") {}, ERR_40015("40015", "不合法的菜单类型") {}, ERR_40016("40016", "不合法的按钮个数") {}, ERR_40017("40017", "不合法的按钮个数") {}, ERR_40018("40018", "不合法的按钮名字长度") {}, ERR_40019("40019", "不合法的按钮KEY长度") {}, ERR_40020("40020", "不合法的按钮URL长度") {}, ERR_40021("40021", "不合法的菜单版本号") {}, ERR_40022("40022", "不合法的子菜单级数") {}, ERR_40023("40023", "不合法的子菜单按钮个数") {}, ERR_40024("40024", "不合法的子菜单按钮类型") {}, ERR_40025("40025", "不合法的子菜单按钮名字长度") {}, ERR_40026("40026", "不合法的子菜单按钮KEY长度") {}, ERR_40027("40027", "不合法的子菜单按钮URL长度") {}, ERR_40028("40028", "不合法的自定义菜单使用用户") {}, ERR_40029("40029", "不合法的oauth_code") {}, ERR_40030("40030", "不合法的refresh_token") {}, ERR_40031("40031", "不合法的openid列表") {}, ERR_40032("40032", "不合法的openid列表个数") {}, ERR_40033("40033", "不合法的请求字符,不能包含xxxx格式的字符") {}, ERR_40035("40035", "不合法的参数") {}, ERR_40055("40055", "不完整的url,前面要加http://") {}, ERR_40037("40037", "template_id不正确") {}, ERR_40038("40038", "不合法的请求格式") {}, ERR_40039("40039", "不合法的URL长度") {}, ERR_40050("40050", "不合法的分组id") {}, ERR_40051("40051", "分组名字不合法") {}, ERR_40062("40062", "标题长度不合法") {}, ERR_40097("40097", "参数不合法") {}, ERR_40113("40113", "文件名称不合法,需包含正确后缀") {}, ERR_40117("40117", "分组名字不合法") {}, ERR_40118("40118", "media_id大小不合法") {}, ERR_40119("40119", "button类型错误") {}, ERR_40120("40120", "button类型错误") {}, ERR_40121("40121", "不合法的media_id类型") {}, ERR_40125("40125", "不合法的AppSecret,请开发者检查AppSecret的正确性,避免异常字符,注意大小写") {}, ERR_40130("40130", "至少需要同时发送两个用户") {}, ERR_40132("40132", "微信号不合法") {}, ERR_40137("40137", "不支持的图片格式") {}, ERR_40164("40164", "调用接口的IP地址不在白名单中,请在接口IP白名单中进行设置") {}, ERR_41001("41001", "缺少access_token参数") {}, ERR_41002("41002", "缺少appid参数") {}, ERR_41003("41003", "缺少refresh_token参数") {}, ERR_41004("41004", "缺少secret参数") {}, ERR_41005("41005", "缺少多媒体文件数据") {}, ERR_41006("41006", "缺少media_id参数") {}, ERR_41007("41007", "缺少子菜单数据") {}, ERR_41008("41008", "缺少oauth code") {}, ERR_41009("41009", "缺少openid") {}, ERR_41028("41028", "form_id不正确,或者过期") {}, ERR_41029("41029", "form_id已被使用") {}, ERR_41030("41030", "page不正确") {}, ERR_42001("42001", "access_token超时,请检查access_token的有效期,请参考基础支持-获取access_token中,对access_token的详细机制说明") {}, ERR_42002("42002", "refresh_token超时") {}, ERR_42003("42003", "oauth_code超时") {}, ERR_43001("43001", "需要GET请求") {}, ERR_43002("43002", "需要POST请求") {}, ERR_43003("43003", "需要HTTPS请求") {}, ERR_43004("43004", "需要接收者关注") {}, ERR_43005("43005", "需要好友关系") {}, ERR_44001("44001", "多媒体文件为空") {}, ERR_44002("44002", "POST的数据包为空") {}, ERR_44003("44003", "图文消息内容为空") {}, ERR_44004("44004", "文本消息内容为空") {}, ERR_45001("45001", "多媒体文件大小超过限制") {}, ERR_45002("45002", "消息内容超过限制") {}, ERR_45003("45003", "标题字段超过限制") {}, ERR_45004("45004", "描述字段超过限制") {}, ERR_45005("45005", "链接字段超过限制") {}, ERR_45006("45006", "图片链接字段超过限制") {}, ERR_45007("45007", "语音播放时间超过限制") {}, ERR_45008("45008", "图文消息超过限制") {}, ERR_45009("45009", "接口调用超过限制") {}, ERR_45010("45010", "创建菜单个数超过限制") {}, ERR_45015("45015", "回复时间超过限制") {}, ERR_45016("45016", "系统分组,不允许修改") {}, ERR_45017("45017", "分组名字过长") {}, ERR_45018("45018", "分组数量超过上限") {}, ERR_45028("45028", "没有群发的配额,配额已经用完") {}, ERR_45047("45047", "客服下行消息超过上限") {}, ERR_45157("45157", "标签名非法,请注意不能和其他标签重名") {}, ERR_45158("45158", "标签名长度超过30个字节") {}, ERR_45056("45056", "创建的标签数过多,请注意不能超过100个") {}, ERR_45058("45058", "不能修改0/1/2这三个系统默认保留的标签") {}, ERR_45057("45057", "该标签下粉丝数超过10w,不允许直接删除") {}, ERR_45059("45059", "有粉丝身上的标签数已经超过限制") {}, ERR_45159("45159", "非法的tag_id") {}, ERR_46001("46001", "不存在媒体数据") {}, ERR_46002("46002", "不存在的菜单版本") {}, ERR_46003("46003", "不存在的菜单数据") {}, ERR_46004("46004", "不存在的用户") {}, ERR_47001("47001", "解析JSON/XML内容错误") {}, ERR_48001("48001", "api功能未授权,请确认公众号已获得该接口,可以在公众平台官网-开发者中心页中查看接口权限") {}, ERR_48002("48002", "粉丝拒收消息(粉丝在公众号选项中,关闭了 “ 接收消息 ” )") {}, ERR_48004("48004", "api 接口被封禁,请登录 admin.weixin.qq.com 查看详情") {}, ERR_48005("48005", "api 禁止删除被自动回复和自定义菜单引用的素材") {}, ERR_48006("48006", "api 禁止清零调用次数,因为清零次数达到上限") {}, ERR_48008("48008", "没有该类型消息的发送权限") {}, ERR_49003("49003", "传入的openid不属于此AppID") {}, ERR_50001("50001", "用户未授权该api") {}, ERR_50002("50002", "用户受限,可能是违规后接口被封禁") {}, ERR_50005("50005", "用户未关注公众号") {}, ERR_61003("61003", "请确认是否取消授权(第三方平台授权)") {}, ERR_61004("61004", "当前ip未在白名单中,直接获取本地ip添加") {}, ERR_61005("61005", " 组件 ticket已失效,重新接受授权url反馈的ticket") {}, ERR_61006("61006", "获取componentTicket为null") {}, ERR_61007("61007", "当前公众号或者微信已在公众平台解绑") {}, ERR_61009("61009", "授权码失效,重新授权") {}, ERR_61451("61451", "参数错误(invalid parameter)") {}, ERR_61452("61452", "无效客服账号(invalid kf_account)") {}, ERR_61453("61453", "客服帐号已存在(kf_account exsited)") {}, ERR_61454("61454", "客服帐号名长度超过限制(仅允许10个英文字符,不包括@及@后的公众号的微信号)(invalid kf_acount length)") {}, ERR_61455("61455", "客服帐号名包含非法字符(仅允许英文+数字)(illegal character in kf_account)") {}, ERR_61456("61456", "客服帐号个数超过限制(10个客服账号)(kf_account count exceeded)") {}, ERR_61457("61457", "无效头像文件类型(invalid file type)") {}, ERR_61450("61450", "系统错误(system error)") {}, ERR_61500("61500", "日期格式错误") {}, ERR_61501("61501", "日期范围错误") {}, ERR_65400("65400", "API不可用,即没有开通/升级到新版客服功能") {}, ERR_65401("65401", "无效客服帐号") {}, ERR_65403("65403", "客服昵称不合法") {}, ERR_65404("65404", "客服帐号不合法") {}, ERR_65405("65405", "帐号数目已达到上限,不能继续添加") {}, ERR_65406("65406", "已经存在的客服帐号") {}, ERR_65407("65407", "邀请对象已经是该公众号客服") {}, ERR_65408("65408", "本公众号已经有一个邀请给该微信") {}, ERR_65409("65409", "无效的微信号") {}, ERR_65410("65410", "邀请对象绑定公众号客服数达到上限(目前每个微信号可以绑定5个公众号客服帐号)") {}, ERR_65411("65411", "该帐号已经有一个等待确认的邀请,不能重复邀请") {}, ERR_65412("65412", "该帐号已经绑定微信号,不能进行邀请") {}, ERR_99999("99999", "无法获取到文件名") {}, ERR_9001001("9001001", "POST数据参数不合法") {}, ERR_9001002("9001002", "远端服务不可用") {}, ERR_9001003("9001003", "Ticket不合法") {}, ERR_9001004("9001004", "获取摇周边用户信息失败") {}, ERR_9001005("9001005", "获取商户信息失败") {}, ERR_9001006("9001006", "获取OpenID失败") {}, ERR_9001007("9001007", "上传文件缺失") {}, ERR_9001008("9001008", "上传素材的文件类型不合法") {}, ERR_9001009("9001009", "上传素材的文件尺寸不合法") {}, ERR_9001010("9001010", "上传失败") {}, ERR_9001020("9001020", "帐号不合法") {}, ERR_9001021("9001021", "已有设备激活率低于50%,不能新增设备") {}, ERR_9001022("9001022", "设备申请数不合法,必须为大于0的数字") {}, ERR_9001023("9001023", "已存在审核中的设备ID申请") {}, ERR_9001024("9001024", "一次查询设备ID数量不能超过50") {}, ERR_9001025("9001025", "设备ID不合法") {}, ERR_9001026("9001026", "页面ID不合法") {}, ERR_9001027("9001027", "页面参数不合法") {}, ERR_9001028("9001028", "一次删除页面ID数量不能超过10") {}, ERR_9001029("9001029", "页面已应用在设备中,请先解除应用关系再删除") {}, ERR_9001030("9001030", "一次查询页面ID数量不能超过50") {}, ERR_9001031("9001031", "时间区间不合法") {}, ERR_9001032("9001032", "保存设备与页面的绑定关系参数错误") {}, ERR_9001033("9001033", "门店ID不合法") {}, ERR_9001034("9001034", "设备备注信息过长") {}, ERR_9001035("9001035", "设备申请参数不合法") {}, ERR_9001036("9001036", "查询起始值begin不合法") {}; private String code; private String msg; diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxAutoReplyController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxAutoReplyController.java deleted file mode 100644 index be039de..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxAutoReplyController.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.starry.admin.modules.weichat.constant.ConfigConstant; -import com.starry.admin.modules.weichat.entity.WxAutoReply; -import com.starry.admin.modules.weichat.service.WxAutoReplyService; -import com.starry.common.result.R; -import lombok.AllArgsConstructor; -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 消息自动回复 - * - * @author admin - * @since 2019-04-18 15:40:39 - */ -@RestController -@AllArgsConstructor -@RequestMapping("/wxautoreply") -public class WxAutoReplyController { - - @Resource - WxAutoReplyService wxAutoReplyService; - - /** - * 分页查询 - * - * @param page 分页对象 - * @param wxAutoReply 消息自动回复 - * @return - */ - @GetMapping("/page") - @PreAuthorize("@customSs.hasPermission('wxmp:wxautoreply:index')") - public R getWxAutoReplyPage(Page page, WxAutoReply wxAutoReply) { - return R.ok(wxAutoReplyService.page(page, Wrappers.query(wxAutoReply))); - } - - - /** - * 通过id查询消息自动回复 - * - * @param id id - * @return R - */ - @GetMapping("/{id}") - @PreAuthorize("@customSs.hasPermission('wxmp:wxautoreply:get')") - public R getById(@PathVariable("id") String id) { - return R.ok(wxAutoReplyService.getById(id)); - } - - /** - * 新增消息自动回复 - * - * @param wxAutoReply 消息自动回复 - * @return R - */ - @PostMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxautoreply:add')") - public R save(@RequestBody WxAutoReply wxAutoReply) { - this.jude(wxAutoReply); - return R.ok(wxAutoReplyService.save(wxAutoReply)); - } - - /** - * 修改消息自动回复 - * - * @param wxAutoReply 消息自动回复 - * @return R - */ - @PutMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxautoreply:edit')") - public R updateById(@RequestBody WxAutoReply wxAutoReply) { - this.jude(wxAutoReply); - return R.ok(wxAutoReplyService.updateById(wxAutoReply)); - } - - /** - * 通过id删除消息自动回复 - * - * @param id id - * @return R - */ - @DeleteMapping("/{id}") - @PreAuthorize("@customSs.hasPermission('wxmp:wxautoreply:del')") - public R removeById(@PathVariable String id) { - return R.ok(wxAutoReplyService.removeById(id)); - } - - /** - * //校验参数 - * - * @param wxAutoReply - */ - public void jude(WxAutoReply wxAutoReply) { - if (ConfigConstant.WX_AUTO_REPLY_TYPE_2.equals(wxAutoReply.getType())) { - Wrapper queryWrapper = Wrappers.lambdaQuery() - .eq(WxAutoReply::getReqType, wxAutoReply.getReqType()); - List list = wxAutoReplyService.list(queryWrapper); - if (StringUtils.isNotBlank(wxAutoReply.getId())) { - if (list != null && list.size() == 1) { - if (!list.get(0).getId().equals(wxAutoReply.getId())) { - throw new RuntimeException("请求消息类型重复"); - } - } - if (list != null && list.size() > 1) { - throw new RuntimeException("请求消息类型重复"); - } - } - } - if (ConfigConstant.WX_AUTO_REPLY_TYPE_3.equals(wxAutoReply.getType())) { - Wrapper queryWrapper = Wrappers.lambdaQuery() - .eq(WxAutoReply::getReqKey, wxAutoReply.getReqKey()) - .eq(WxAutoReply::getRepType, wxAutoReply.getRepMate()); - List list = wxAutoReplyService.list(queryWrapper); - if (list != null && list.size() == 1) { - if (!list.get(0).getId().equals(wxAutoReply.getId())) { - throw new RuntimeException("关键词重复"); - } - } - if (list != null && list.size() > 1) { - throw new RuntimeException("关键词重复"); - } - } - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxDraftController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxDraftController.java deleted file mode 100644 index 5c7db55..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxDraftController.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.starry.common.result.R; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.api.WxMpDraftService; -import me.chanjar.weixin.mp.api.WxMpFreePublishService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.draft.WxMpAddDraft; -import me.chanjar.weixin.mp.bean.draft.WxMpDraftArticles; -import me.chanjar.weixin.mp.bean.draft.WxMpUpdateDraft; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 微信草稿箱 - * - * @author admin - * @since 2022-03-10 21:26:35 - */ -@Slf4j -@RestController -@AllArgsConstructor -@RequestMapping("/wxdraft") -@Api(value = "wxdraft", tags = "微信草稿箱") -public class WxDraftController { - - @Resource - WxMpService wxService; - - /** - * 新增图文消息 - * - * @param data - * @return - */ - @ApiOperation(value = "新增草稿箱") - @PostMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxdraft:add')") - public R add(@RequestBody JSONObject data) throws Exception { - JSONArray jSONArray = data.getJSONArray("articles"); - List articles = jSONArray.toList(WxMpDraftArticles.class); - WxMpAddDraft wxMpAddDraft = new WxMpAddDraft(); - wxMpAddDraft.setArticles(articles); - WxMpDraftService wxMpDraftService = wxService.getDraftService(); - String rs = wxMpDraftService.addDraft(wxMpAddDraft); - return R.ok(rs); - } - - /** - * 修改微信草稿箱 - * - * @param data - * @return - */ - @ApiOperation(value = "修改微信草稿箱") - @PutMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxdraft:edit')") - public R edit(@RequestBody JSONObject data) throws Exception { - String mediaId = data.getStr("mediaId"); - JSONArray jSONArray = data.getJSONArray("articles"); - List articles = jSONArray.toList(WxMpDraftArticles.class); - WxMpDraftService wxMpDraftService = wxService.getDraftService(); - WxMpUpdateDraft wxMpUpdateDraft = new WxMpUpdateDraft(); - wxMpUpdateDraft.setMediaId(mediaId); - int index = 0; - for (WxMpDraftArticles article : articles) { - wxMpUpdateDraft.setIndex(index); - wxMpUpdateDraft.setArticles(article); - wxMpDraftService.updateDraft(wxMpUpdateDraft); - index++; - } - return R.ok(); - } - - /** - * 通过id删除微信草稿箱 - * - * @param - * @return R - */ - @ApiOperation(value = "通过id删除微信草稿箱") - @DeleteMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxdraft:del')") - public R del(String id) throws Exception { - WxMpDraftService wxMpDraftService = wxService.getDraftService(); - return R.ok(wxMpDraftService.delDraft(id)); - } - - /** - * 分页查询 - * - * @param page 分页对象 - * @param - * @return - */ - @ApiOperation(value = "分页查询") - @GetMapping("/page") - @PreAuthorize("@customSs.hasPermission('wxmp:wxdraft:index')") - public R getPage(Page page) throws Exception { - WxMpDraftService wxMpDraftService = wxService.getDraftService(); - int count = (int) page.getSize(); - int offset = (int) page.getCurrent() * count - count; - return R.ok(wxMpDraftService.listDraft(offset, count)); - } - - /** - * 发布草稿箱 - * - * @param id - * @return - */ - @ApiOperation(value = "发布草稿箱") - @PostMapping("/publish/{id}") - @PreAuthorize("@customSs.hasPermission('wxmp:wxdraft:publish')") - public R publish(@PathVariable String id) throws Exception { - WxMpFreePublishService wxMpFreePublishService = wxService.getFreePublishService(); - wxMpFreePublishService.submit(id); - return R.ok(); - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxFreePublishController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxFreePublishController.java deleted file mode 100644 index f690c05..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxFreePublishController.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.starry.common.result.R; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.api.WxMpFreePublishService; -import me.chanjar.weixin.mp.api.WxMpService; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -/** - * 微信发布 - * - * @author admin - * @since 2022-03-10 21:26:35 - */ -@Slf4j -@RestController -@AllArgsConstructor -@RequestMapping("/freepublish") -@Api(value = "freepublish", tags = "微信发布") -public class WxFreePublishController { - - @Resource - WxMpService wxService; - - /** - * 删除发布 - * - * @param - * @return R - */ - @ApiOperation(value = "删除发布") - @DeleteMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxfreepublish:del')") - public R del(String id) throws Exception { - WxMpFreePublishService wxMpFreePublishService = wxService.getFreePublishService(); - return R.ok(wxMpFreePublishService.deletePushAllArticle(id)); - } - - /** - * 获取成功发布列表 - * - * @param page 获取成功发布列表 - * @param - * @return - */ - @ApiOperation(value = "获取成功发布列表") - @GetMapping("/page") - @PreAuthorize("@customSs.hasPermission('wxmp:wxfreepublish:index')") - public R getPage(Page page) throws Exception { - WxMpFreePublishService wxMpFreePublishService = wxService.getFreePublishService(); - int count = (int) page.getSize(); - int offset = (int) page.getCurrent() * count - count; - return R.ok(wxMpFreePublishService.getPublicationRecords(offset, count)); - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMaterialController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMaterialController.java deleted file mode 100644 index b778e37..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMaterialController.java +++ /dev/null @@ -1,246 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.starry.admin.modules.weichat.entity.ImageManager; -import com.starry.admin.modules.weichat.utils.FileUtils; -import com.starry.common.result.R; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpMaterialService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.material.WxMediaImgUploadResult; -import me.chanjar.weixin.mp.bean.material.WxMpMaterial; -import me.chanjar.weixin.mp.bean.material.WxMpMaterialFileBatchGetResult; -import me.chanjar.weixin.mp.bean.material.WxMpMaterialUploadResult; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.annotation.Resource; -import java.io.File; -import java.io.InputStream; -import java.net.URLEncoder; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * 微信素材 - * - * @author admin - * @since 2019-03-23 21:26:35 - */ -@Slf4j -@RestController -@AllArgsConstructor -@RequestMapping("/wxmaterial") -public class WxMaterialController { - - @Resource - WxMpService wxService; - - /** - * 上传非图文微信素材 - * - * @param mulFile - * @param mediaType - * @return - */ - @PostMapping("/materialFileUpload") - // @PreAuthorize("@customSs.hasPermission('wxmp:wxmaterial:add')") - public R materialFileUpload(@RequestParam("file") MultipartFile mulFile, - @RequestParam("title") String title, - @RequestParam("introduction") String introduction, - @RequestParam("mediaType") String mediaType) { - try { - WxMpMaterial material = new WxMpMaterial(); - material.setName(mulFile.getOriginalFilename()); - if (WxConsts.MediaFileType.VIDEO.equals(mediaType)) { - material.setVideoTitle(title); - material.setVideoIntroduction(introduction); - } - File file = FileUtils.multipartFileToFile(mulFile); - material.setFile(file); - WxMpMaterialService wxMpMaterialService = wxService.getMaterialService(); - WxMpMaterialUploadResult wxMpMaterialUploadResult = wxMpMaterialService.materialFileUpload(mediaType, material); - WxMpMaterialFileBatchGetResult.WxMaterialFileBatchGetNewsItem wxMpMaterialFileBatchGetResult = new WxMpMaterialFileBatchGetResult.WxMaterialFileBatchGetNewsItem(); - wxMpMaterialFileBatchGetResult.setName(file.getName()); - wxMpMaterialFileBatchGetResult.setMediaId(wxMpMaterialUploadResult.getMediaId()); - wxMpMaterialFileBatchGetResult.setUrl(wxMpMaterialUploadResult.getUrl()); - return R.ok(wxMpMaterialFileBatchGetResult); - } catch (WxErrorException e) { - log.error("上传非图文微信素材失败" + e); - return R.error(e.getMessage()); - } catch (Exception e) { - log.error("上传失败", e); - return R.error(e.getLocalizedMessage()); - } - } - - /** - * 上传图文消息内的图片获取URL - * - * @param mulFile - * @return - */ - @PostMapping("/newsImgUpload") - // @PreAuthorize("@customSs.hasPermission('wxmp:wxmaterial:add')") - public String newsImgUpload(@RequestParam("file") MultipartFile mulFile) throws Exception { - File file = FileUtils.multipartFileToFile(mulFile); - WxMpMaterialService wxMpMaterialService = wxService.getMaterialService(); - WxMediaImgUploadResult wxMediaImgUploadResult = wxMpMaterialService.mediaImgUpload(file); - Map responseData = new HashMap<>(); - responseData.put("link", wxMediaImgUploadResult.getUrl()); - return JSONUtil.toJsonStr(responseData); - } - - /** - * 通过id删除微信素材 - * - * @param - * @return R - */ - @DeleteMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxmaterial:del')") - public R materialDel(String id) { - WxMpMaterialService wxMpMaterialService = wxService.getMaterialService(); - try { - return R.ok(wxMpMaterialService.materialDelete(id)); - } catch (WxErrorException e) { - - log.error("删除微信素材失败", e); - return R.error(e.getMessage()); - } - } - - /** - * 分页查询 - * - * @param page 分页对象 - * @param type - * @return - */ - @GetMapping("/page") - @PreAuthorize("@customSs.hasPermission('wxmp:wxmaterial:index')") - public R getWxMaterialPage(Page page, String type) { - try { - WxMpMaterialService wxMpMaterialService = wxService.getMaterialService(); - int count = (int) page.getSize(); - int offset = (int) page.getCurrent() * count - count; - if (WxConsts.MaterialType.NEWS.equals(type)) { - return R.ok(wxMpMaterialService.materialNewsBatchGet(offset, count)); - } else { - return R.ok(wxMpMaterialService.materialFileBatchGet(type, offset, count)); - } - } catch (WxErrorException e) { - - log.error("查询素材失败", e); - return R.error(e.getMessage()); - } - } - - /** - * 分页查询2 - * - * @param type - * @return - */ - @GetMapping("/page-manager") -// @PreAuthorize("@customSs.hasPermission('wxmp:wxmaterial:index')") - public String getWxMaterialPageManager(Integer count, Integer offset, String type) throws WxErrorException { - List listImageManager = new ArrayList<>(); - WxMpMaterialService wxMpMaterialService = wxService.getMaterialService(); - List list = wxMpMaterialService.materialFileBatchGet(type, offset, count).getItems(); - list.forEach(wxMaterialFileBatchGetNewsItem -> { - ImageManager imageManager = new ImageManager(); - imageManager.setName(wxMaterialFileBatchGetNewsItem.getMediaId()); - imageManager.setUrl(wxMaterialFileBatchGetNewsItem.getUrl()); - imageManager.setThumb(wxMaterialFileBatchGetNewsItem.getUrl()); - listImageManager.add(imageManager); - }); - return JSONUtil.toJsonStr(listImageManager); - } - - /** - * 获取微信视频素材 - * - * @param - * @return R - */ - @GetMapping("/materialVideo") - @PreAuthorize("@customSs.hasPermission('wxmp:wxmaterial:get')") - public R getMaterialVideo(String mediaId) { - WxMpMaterialService wxMpMaterialService = wxService.getMaterialService(); - try { - return R.ok(wxMpMaterialService.materialVideoInfo(mediaId)); - } catch (WxErrorException e) { - - log.error("获取微信视频素材失败", e); - return R.error(e.getMessage()); - } - } - - /** - * 获取微信素材直接文件 - * - * @param - * @return R - */ - @GetMapping("/materialOther") - @PreAuthorize("@customSs.hasPermission('wxmp:wxmaterial:get')") - public ResponseEntity getMaterialOther(String mediaId, String fileName) throws Exception { - try { - WxMpMaterialService wxMpMaterialService = wxService.getMaterialService(); - // 获取文件 - InputStream is = wxMpMaterialService.materialImageOrVoiceDownload(mediaId); - byte[] body = new byte[is.available()]; - is.read(body); - HttpHeaders headers = new HttpHeaders(); - // 设置文件类型 - headers.add("Content-Disposition", "attchement;filename=" + URLEncoder.encode(fileName, "UTF-8")); - headers.add("Content-Type", "application/octet-stream"); - HttpStatus statusCode = HttpStatus.OK; - // 返回数据 - return new ResponseEntity<>(body, headers, statusCode); - } catch (WxErrorException e) { - - log.error("获取微信素材直接文件失败", e); - return null; - } - } - - /** - * 获取微信临时素材直接文件 - * - * @param - * @return R - */ - @GetMapping("/tempMaterialOther") - @PreAuthorize("@customSs.hasPermission('wxmp:wxmsg:index')") - public ResponseEntity getTempMaterialOther(String mediaId, String fileName) throws Exception { - WxMpMaterialService wxMpMaterialService = wxService.getMaterialService(); - try (InputStream is = Files.newInputStream(wxMpMaterialService.mediaDownload(mediaId).toPath())) { - byte[] body = new byte[is.available()]; - is.read(body); - HttpHeaders headers = new HttpHeaders(); - // 设置文件类型 - headers.add("Content-Disposition", "attchement;filename=" + URLEncoder.encode(fileName, "UTF-8")); - headers.add("Content-Type", "application/octet-stream"); - HttpStatus statusCode = HttpStatus.OK; - // 返回数据 - return new ResponseEntity<>(body, headers, statusCode); - } catch (WxErrorException e) { - - log.error("获取微信素材直接文件失败", e); - return null; - } - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMenuController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMenuController.java deleted file mode 100644 index 2d2f59b..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMenuController.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.starry.admin.modules.weichat.service.WxMenuService; -import com.starry.common.result.R; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; - -/** - * 自定义菜单 - * - * @author admin - * @since 2019-03-27 16:52:10 - */ -@Slf4j -@RestController -@AllArgsConstructor -@RequestMapping("/wxmenu") -public class WxMenuController { - - @Resource - WxMenuService wxMenuService; - - /** - * 通过appId查询自定义菜单 - * - * @return R - */ - @GetMapping("/list") - @PreAuthorize("@customSs.hasPermission('wxmp:wxmenu:get')") - public R getWxMenuButton() { - return R.ok(wxMenuService.getWxMenuButton()); - } - - /** - * 保存并发布菜单 - * - * @param - * @return R - */ - @PostMapping("/release") - @PreAuthorize("@customSs.hasPermission('wxmp:wxmenu:add')") - public R saveAndRelease(@RequestBody String data) { - JSONObject jSONObject = JSONUtil.parseObj(data); - String strWxMenu = jSONObject.getStr("strWxMenu"); - String appId = jSONObject.getStr("appId"); - try { - wxMenuService.saveAndRelease(strWxMenu); - return R.ok(); - } catch (WxErrorException e) { - - log.error("发布自定义菜单失败appID:" + appId + ":" + e.getMessage()); - return R.error(e.getMessage()); - } - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMpTestController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMpTestController.java deleted file mode 100644 index 0cb2c73..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMpTestController.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import com.starry.admin.modules.weichat.service.WxMpApi; -import com.starry.common.result.R; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * @Author: huchuansai - * @Date: 2024/3/27 10:39 PM - * @Description: - */ -@RestController -@RequestMapping("/wx/test") -@RequiredArgsConstructor -public class WxMpTestController { - - - private final WxMpApi wxMpApi; - - - @GetMapping("/getToken") - public R getToken(String appId, String secret) { - return R.ok(wxMpApi.getAccessToken(appId, secret, true)); - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMsgController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMsgController.java deleted file mode 100644 index 160dbe8..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxMsgController.java +++ /dev/null @@ -1,209 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.starry.admin.modules.weichat.config.CommonConstants; -import com.starry.admin.modules.weichat.constant.ConfigConstant; -import com.starry.admin.modules.weichat.entity.WxMsg; -import com.starry.admin.modules.weichat.entity.WxMsgVO; -import com.starry.admin.modules.weichat.entity.WxUser; -import com.starry.admin.modules.weichat.service.WxMsgService; -import com.starry.admin.modules.weichat.service.WxUserService; -import com.starry.common.result.R; -import io.swagger.annotations.Api; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpKefuService; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -/** - * 微信消息 - * - * @author admin - * @since 2019-05-28 16:12:10 - */ -@Slf4j -@RestController -@AllArgsConstructor -@RequestMapping("/wxmsg") -@Api(value = "wxmsg", tags = "wxmsg管理") -public class WxMsgController { - - @Resource - WxMsgService wxMsgService; - - @Resource - WxUserService wxUserService; - - @Resource - WxMpService wxService; - - /** - * 分页查询 - * - * @param page 分页对象 - * @param wxMsgVO 微信消息 - * @return - */ - @GetMapping("/page") - @PreAuthorize("@customSs.hasPermission('wxmp:wxmsg:index')") - public R getWxMsgPage(Page page, WxMsgVO wxMsgVO) { - if (StringUtils.isNotBlank(wxMsgVO.getNotInRepType())) { - return R.ok(wxMsgService.listWxMsgMapGroup(page, wxMsgVO)); - } - // 标记为已读 - if (StringUtils.isNotBlank(wxMsgVO.getWxUserId())) { - WxMsg wxMsg = new WxMsg(); - wxMsg.setReadFlag(CommonConstants.YES); - Wrapper queryWrapper = Wrappers.lambdaQuery().eq(WxMsg::getWxUserId, wxMsgVO.getWxUserId()).eq(WxMsg::getReadFlag, CommonConstants.NO); - wxMsgService.update(wxMsg, queryWrapper); - } - return R.ok(wxMsgService.page(page, Wrappers.query(wxMsgVO))); - } - - /** - * 通过id查询微信消息 - * - * @param id id - * @return R - */ - @GetMapping("/{id}") - @PreAuthorize("@customSs.hasPermission('wxmp:wxmsg:get')") - public R getById(@PathVariable("id") String id) { - return R.ok(wxMsgService.getById(id)); - } - - /** - * 新增微信消息 - * - * @param wxMsg 微信消息 - * @return R - */ - @PostMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxmsg:add')") - public R save(@RequestBody WxMsg wxMsg) { - try { - WxUser wxUser = wxUserService.getById(wxMsg.getWxUserId()); - // 入库 - wxMsg.setNickName(wxUser.getNickName()); - wxMsg.setHeadimgUrl(wxUser.getHeadimgUrl()); - wxMsg.setCreateTime(LocalDateTime.now()); - wxMsg.setType(ConfigConstant.WX_MSG_TYPE_2); - WxMpKefuMessage wxMpKefuMessage = null; - if (WxConsts.KefuMsgType.TEXT.equals(wxMsg.getRepType())) { - wxMsg.setRepContent(wxMsg.getRepContent()); - wxMpKefuMessage = WxMpKefuMessage.TEXT().build(); - wxMpKefuMessage.setContent(wxMsg.getRepContent()); - } - if (WxConsts.KefuMsgType.IMAGE.equals(wxMsg.getRepType())) {// 图片 - wxMsg.setRepName(wxMsg.getRepName()); - wxMsg.setRepUrl(wxMsg.getRepUrl()); - wxMsg.setRepMediaId(wxMsg.getRepMediaId()); - wxMpKefuMessage = WxMpKefuMessage.IMAGE().build(); - wxMpKefuMessage.setMediaId(wxMsg.getRepMediaId()); - } - if (WxConsts.KefuMsgType.VOICE.equals(wxMsg.getRepType())) { - wxMsg.setRepName(wxMsg.getRepName()); - wxMsg.setRepUrl(wxMsg.getRepUrl()); - wxMsg.setRepMediaId(wxMsg.getRepMediaId()); - wxMpKefuMessage = WxMpKefuMessage.VOICE().build(); - wxMpKefuMessage.setMediaId(wxMsg.getRepMediaId()); - } - if (WxConsts.KefuMsgType.VIDEO.equals(wxMsg.getRepType())) { - wxMsg.setRepName(wxMsg.getRepName()); - wxMsg.setRepDesc(wxMsg.getRepDesc()); - wxMsg.setRepUrl(wxMsg.getRepUrl()); - wxMsg.setRepMediaId(wxMsg.getRepMediaId()); - wxMpKefuMessage = WxMpKefuMessage.VIDEO().build(); - wxMpKefuMessage.setMediaId(wxMsg.getRepMediaId()); - wxMpKefuMessage.setTitle(wxMsg.getRepName()); - wxMpKefuMessage.setDescription(wxMsg.getRepDesc()); - } - if (WxConsts.KefuMsgType.MUSIC.equals(wxMsg.getRepType())) { - wxMsg.setRepName(wxMsg.getRepName()); - wxMsg.setRepDesc(wxMsg.getRepDesc()); - wxMsg.setRepUrl(wxMsg.getRepUrl()); - wxMsg.setRepHqUrl(wxMsg.getRepHqUrl()); - wxMpKefuMessage = WxMpKefuMessage.MUSIC().build(); - wxMpKefuMessage.setTitle(wxMsg.getRepName()); - wxMpKefuMessage.setDescription(wxMsg.getRepDesc()); - wxMpKefuMessage.setMusicUrl(wxMsg.getRepUrl()); - wxMpKefuMessage.setHqMusicUrl(wxMsg.getRepHqUrl()); - wxMpKefuMessage.setThumbMediaId(wxMsg.getRepThumbMediaId()); - } - if (WxConsts.KefuMsgType.NEWS.equals(wxMsg.getRepType())) { - List list = new ArrayList<>(); - JSONArray jSONArray = wxMsg.getContent().getJSONArray("articles"); - WxMpKefuMessage.WxArticle t; - for (Object object : jSONArray) { - JSONObject jSONObject = JSONUtil.parseObj(JSONUtil.toJsonStr(object)); - t = new WxMpKefuMessage.WxArticle(); - t.setTitle(jSONObject.getStr("title")); - t.setDescription(jSONObject.getStr("digest")); - t.setPicUrl(jSONObject.getStr("thumbUrl")); - t.setUrl(jSONObject.getStr("url")); - list.add(t); - } - wxMsg.setRepName(wxMsg.getRepName()); - wxMsg.setRepDesc(wxMsg.getRepDesc()); - wxMsg.setRepUrl(wxMsg.getRepUrl()); - wxMsg.setRepMediaId(wxMsg.getRepMediaId()); - wxMsg.setContent(wxMsg.getContent()); - wxMpKefuMessage = WxMpKefuMessage.NEWS().build(); - wxMpKefuMessage.setArticles(list); - } - if (wxMpKefuMessage != null) { - WxMpKefuService wxMpKefuService = wxService.getKefuService(); - wxMpKefuMessage.setToUser(wxUser.getOpenId()); - wxMpKefuService.sendKefuMessage(wxMpKefuMessage); - wxMsgService.save(wxMsg); - return R.ok(wxMsg); - } else { - return R.error("非法消息类型"); - } - } catch (WxErrorException e) { - log.error("新增微信消息失败" + e.getMessage()); - return R.error(e.getMessage()); - } - } - - /** - * 修改微信消息 - * - * @param wxMsg 微信消息 - * @return R - */ - @PutMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxmsg:edit')") - public R updateById(@RequestBody WxMsg wxMsg) { - return R.ok(wxMsgService.updateById(wxMsg)); - } - - /** - * 通过id删除微信消息 - * - * @param id id - * @return R - */ - @DeleteMapping("/{id}") - @PreAuthorize("@customSs.hasPermission('wxmp:wxmsg:del')") - public R removeById(@PathVariable String id) { - return R.ok(wxMsgService.removeById(id)); - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java new file mode 100644 index 0000000..2f43e86 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxOauthController.java @@ -0,0 +1,132 @@ +package com.starry.admin.modules.weichat.controller; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson2.JSONObject; +import com.starry.admin.common.aspect.ClerkUserLogin; +import com.starry.admin.common.aspect.CustomUserLogin; +import com.starry.admin.common.conf.ThreadLocalRequestDetail; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.clear.service.IPlayClerkUserInfoService; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; +import com.starry.admin.modules.weichat.entity.WxUserLoginVo; +import com.starry.admin.modules.weichat.entity.WxUserQueryAddressVo; +import com.starry.admin.modules.weichat.service.WxOauthService; +import com.starry.admin.modules.weichat.service.WxTokenService; +import com.starry.common.result.R; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.mp.api.WxMpService; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Date; + +import static com.starry.common.constant.Constants.*; + +/** + * 微信用户 + * + * @author admin + * @since 2019-03-25 15:39:39 + */ +@Slf4j +@RestController +@RequestMapping("/wx/oauth2") +public class WxOauthController { + + + @Resource + private WxMpService wxMpService; + + @Resource + private IPlayCustomUserInfoService customUserInfoService; + + @Resource + private IPlayClerkUserInfoService clerkUserInfoService; + + @Resource + private WxTokenService tokenService; + + @Resource + private WxOauthService wxOauthService; + + + @GetMapping("/getClerkLoginAddress") + public R getClerkLoginAddress(@RequestBody WxUserQueryAddressVo vo) { + // 默认回调地址 + String defaultAddress = "http://july.hucs.top/api/wx/oauth2/clerkLoginCallback"; + if (!StrUtil.isBlankIfStr(vo.getUrl())) { + defaultAddress = vo.getUrl(); + } + String url = wxMpService.getOAuth2Service().buildAuthorizationUrl(defaultAddress, "snsapi_userinfo", "STATE"); + return R.ok(url); + } + + + @GetMapping("/clerkLoginCallback") + public void clerkLoginCallback(@RequestParam("code") String code) { + } + + + @GetMapping("/clark/login") + public R clerkLogin(@Valid @RequestBody WxUserLoginVo vo) { + String userId = wxOauthService.clarkUserLogin(vo.getCode()); + PlayClerkUserInfoEntity entity = clerkUserInfoService.selectPlayClerkUserInfoById(userId); + JSONObject jsonObject = JSONObject.from(entity); + String tokenForMiniUser = tokenService.createMiniUserToken(entity.getId()); + jsonObject.put("tokenValue", TOKEN_PREFIX + tokenForMiniUser); + jsonObject.put("tokenName", CLERK_USER_LOGIN_TOKEN); + jsonObject.put("accountRole", "user"); + jsonObject.put("loginDate", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + return R.ok(jsonObject); + } + + @ClerkUserLogin + @GetMapping("/clark/logout") + public R clerkLogout() { + wxOauthService.clarkUserLogout(ThreadLocalRequestDetail.getClerkUserInfo()); + return R.ok("登出成功"); + } + + + @GetMapping("/getCustomLoginAddress") + public R getCustomLoginAddress(@RequestBody WxUserQueryAddressVo vo) { + // 默认回调地址 + String defaultAddress = "http://july.hucs.top/api/wx/oauth2/customLoginCallback"; + if (!StrUtil.isBlankIfStr(vo.getUrl())) { + defaultAddress = vo.getUrl(); + } + String url = wxMpService.getOAuth2Service().buildAuthorizationUrl(defaultAddress, "snsapi_userinfo", "STATE"); + return R.ok(url); + } + + @GetMapping("/customLoginCallback") + public void customLoginCallback(@RequestParam("code") String code) { + + } + + + @GetMapping("/custom/login") + public R customLogin(@Valid @RequestBody WxUserLoginVo vo) { + String userId = wxOauthService.customUserLogin(vo.getCode()); + PlayCustomUserInfoEntity entity = customUserInfoService.selectPlayCustomUserInfoById(userId); + JSONObject jsonObject = JSONObject.from(entity); + String tokenForMiniUser = tokenService.createMiniUserToken(entity.getId()); + jsonObject.put("tokenValue", TOKEN_PREFIX + tokenForMiniUser); + jsonObject.put("tokenName", CUSTOM_USER_LOGIN_TOKEN); + jsonObject.put("accountRole", "user"); + jsonObject.put("loginDate", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); + return R.ok(jsonObject); + } + + + @GetMapping("/custom/logout") + @CustomUserLogin + public R customLogout(@Valid @RequestBody WxUserLoginVo vo) { + wxOauthService.customUserLogout(ThreadLocalRequestDetail.getCustomUserInfo()); + return R.ok("登出成功"); + } + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxPortalController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxPortalController.java deleted file mode 100644 index 706975d..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxPortalController.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.apache.commons.lang3.StringUtils; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; - -/** - * @author admin - */ -@Slf4j -@AllArgsConstructor -@RestController -@RequestMapping("/weixin/portal/{appid}") -public class WxPortalController { - - @Resource - private final WxMpService wxService; - - //@Resource - // private final WxMpMessageRouter messageRouter; - - @GetMapping(produces = "text/plain;charset=utf-8") - public String authGet(@PathVariable String appid, - @RequestParam(name = "signature", required = false) String signature, - @RequestParam(name = "timestamp", required = false) String timestamp, - @RequestParam(name = "nonce", required = false) String nonce, - @RequestParam(name = "echostr", required = false) String echostr) { - - log.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature, - timestamp, nonce, echostr); - if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) { - throw new IllegalArgumentException("请求参数非法,请核实!"); - } - - if (!this.wxService.switchover(appid)) { - throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid)); - } - - if (wxService.checkSignature(timestamp, nonce, signature)) { - return echostr; - } - - return "非法请求"; - } - - @PostMapping(produces = "application/xml; charset=UTF-8") - public String post(@PathVariable String appid, - @RequestBody String requestBody, - @RequestParam("signature") String signature, - @RequestParam("timestamp") String timestamp, - @RequestParam("nonce") String nonce, - @RequestParam("openid") String openid, - @RequestParam(name = "encrypt_type", required = false) String encType, - @RequestParam(name = "msg_signature", required = false) String msgSignature) { - log.info("\n接收微信请求:[openid=[{}], [signature=[{}], encType=[{}], msgSignature=[{}]," - + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", - openid, signature, encType, msgSignature, timestamp, nonce, requestBody); - - if (!this.wxService.switchover(appid)) { - throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid)); - } - - if (!wxService.checkSignature(timestamp, nonce, signature)) { - throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); - } - - String out = null; - if (encType == null) { - // 明文传输的消息 - WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(requestBody); - WxMpXmlOutMessage outMessage = this.route(inMessage); - if (outMessage == null) { - return ""; - } - - out = outMessage.toXml(); - } else if ("aes".equalsIgnoreCase(encType)) { - // aes加密的消息 - WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(requestBody, wxService.getWxMpConfigStorage(), - timestamp, nonce, msgSignature); - log.debug("\n消息解密后内容为:\n{} ", inMessage.toString()); - WxMpXmlOutMessage outMessage = this.route(inMessage); - if (outMessage == null) { - return ""; - } - - out = outMessage.toEncryptedXml(wxService.getWxMpConfigStorage()); - } - - log.debug("\n组装回复信息:{}", out); - return out; - } - - private WxMpXmlOutMessage route(WxMpXmlMessage message) { - // try { - // return this.messageRouter.route(message); - //} catch (Exception e) { - // log.error("路由消息时出现异常!", e); - //} - - return null; - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxSummaryController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxSummaryController.java deleted file mode 100644 index d476206..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxSummaryController.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import com.starry.common.result.R; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpDataCubeService; -import me.chanjar.weixin.mp.api.WxMpService; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; -import java.text.SimpleDateFormat; - -/** - * 微信账号配置 - * - * @author admin - * @since 2019-03-23 21:26:35 - */ -@Slf4j -@RestController -@AllArgsConstructor -@RequestMapping("/wxsummary") -public class WxSummaryController { - - @Resource - WxMpService wxService; - - /** - * 获取用户增减数据 - * - * @param appId - * @param startDate - * @param endDate - * @return - */ - @GetMapping("/usersummary") -// @PreAuthorize("@customSs.hasPermission('wxmp:wxsummary:index')") - public R getUsersummary(String appId, String startDate, String endDate) { - try { - WxMpDataCubeService wxMpDataCubeService = wxService.getDataCubeService(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - return R.ok(wxMpDataCubeService.getUserSummary(sdf.parse(startDate), sdf.parse(endDate))); - } catch (WxErrorException e) { - - log.error("获取用户增减数据失败", e); - return R.error(e.getMessage()); - } catch (Exception e) { - - log.error("获取用户增减数据失败", e); - return R.error("获取用户增减数据失败"); - } - } - - /** - * 获取累计用户数据 - * - * @param appId - * @param startDate - * @param endDate - * @return - */ - @GetMapping("/usercumulate") -// @PreAuthorize("@customSs.hasPermission('wxmp:wxsummary:index')") - public R getUserCumulate(String appId, String startDate, String endDate) { - try { - WxMpDataCubeService wxMpDataCubeService = wxService.getDataCubeService(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - return R.ok(wxMpDataCubeService.getUserCumulate(sdf.parse(startDate), sdf.parse(endDate))); - } catch (WxErrorException e) { - - log.error("获取累计用户数据失败", e); - return R.error(e.getMessage()); - } catch (Exception e) { - - log.error("获取用户增减数据失败", e); - return R.error("获取用户增减数据失败"); - } - } - - /** - * 获取接口分析数据 - * - * @param appId - * @param startDate - * @param endDate - * @return - */ - @GetMapping("/interfacesummary") -// @PreAuthorize("@customSs.hasPermission('wxmp:wxsummary:index')") - public R getInterfaceSummary(String appId, String startDate, String endDate) { - try { - WxMpDataCubeService wxMpDataCubeService = wxService.getDataCubeService(); - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); - return R.ok(wxMpDataCubeService.getInterfaceSummary(sdf.parse(startDate), sdf.parse(endDate))); - } catch (WxErrorException e) { - - log.error("获取接口分析数据失败", e); - return R.error(e.getMessage()); - } catch (Exception e) { - - log.error("获取接口分析数据失败", e); - return R.error("获取接口分析数据失败"); - } - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxUserController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxUserController.java deleted file mode 100644 index 3300eca..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxUserController.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; -import com.baomidou.mybatisplus.core.conditions.Wrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.starry.admin.modules.weichat.entity.WxUser; -import com.starry.admin.modules.weichat.service.WxUserService; -import com.starry.common.result.R; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; - -/** - * 微信用户 - * - * @author admin - * @since 2019-03-25 15:39:39 - */ -@Slf4j -@RestController -@AllArgsConstructor -@RequestMapping("/wxuser") -public class WxUserController { - - @Resource - WxUserService wxUserService; - - /** - * 分页查询 - * - * @param page 分页对象 - * @param wxUser 微信用户 - * @return - */ - @GetMapping("/page") - @PreAuthorize("@customSs.hasPermission('wxmp:wxuser:index')") - public R getWxUserPage(Page page, WxUser wxUser, String tagId) { - Wrapper queryWrapper; - if (StringUtils.isNotBlank(tagId)) { - queryWrapper = Wrappers.lambdaQuery(wxUser) - .and(wrapper -> wrapper - .eq(WxUser::getTagidList, "[" + tagId + "]") - .or() - .like(WxUser::getTagidList, "," + tagId + ",") - .or() - .likeRight(WxUser::getTagidList, "[" + tagId + ",") - .or() - .likeLeft(WxUser::getTagidList, "," + tagId + "]")); - } else if (StrUtil.isNotBlank(wxUser.getNickName())) { - String nickName = wxUser.getNickName(); - wxUser.setNickName(null); - queryWrapper = Wrappers.lambdaQuery(wxUser) - .like(WxUser::getNickName, nickName); - } else { - queryWrapper = Wrappers.lambdaQuery(wxUser); - } - return R.ok(wxUserService.page(page, queryWrapper)); - } - - - /** - * 通过id查询微信用户 - * - * @param id id - * @return R - */ - @GetMapping("/{id}") - @PreAuthorize("@customSs.hasPermission('wxmp:wxuser:get')") - public R getById(@PathVariable("id") String id) { - return R.ok(wxUserService.getById(id)); - } - - /** - * 新增微信用户 - * - * @param wxUser 微信用户 - * @return R - */ - @PostMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxuser:add')") - public R save(@RequestBody WxUser wxUser) { - return R.ok(wxUserService.save(wxUser)); - } - - /** - * 修改微信用户 - * - * @param wxUser 微信用户 - * @return R - */ - @PutMapping - @PreAuthorize("@customSs.hasPermission('wxmp:wxuser:edit')") - public R updateById(@RequestBody WxUser wxUser) { - return R.ok(wxUserService.updateById(wxUser)); - } - - /** - * 通过id删除微信用户 - * - * @param id id - * @return R - */ - @DeleteMapping("/{id}") - @PreAuthorize("@customSs.hasPermission('wxmp:wxuser:del')") - public R removeById(@PathVariable String id) { - return R.ok(wxUserService.removeById(id)); - } - - @PostMapping("/synchron") - @PreAuthorize("@customSs.hasPermission('wxmp:wxuser:synchro')") - public R synchron() { - try { - wxUserService.synchroWxUser(); - return R.ok(); - } catch (WxErrorException e) { - - log.error("同步微信用户失败", e); - return R.error(e.getMessage()); - } - } - - /** - * 修改微信用户备注 - * - * @param wxUser - * @return - */ - @PutMapping("/remark") - @PreAuthorize("@customSs.hasPermission('wxmp:wxuser:edit:remark')") - public R remark(@RequestBody WxUser wxUser) { - try { - return R.ok(wxUserService.updateRemark(wxUser)); - } catch (WxErrorException e) { - - log.error("修改微信用户备注失败", e); - return R.error(e.getMessage()); - } - } - - /** - * 打标签 - * - * @param data - * @return - */ - @PutMapping("/tagid-list") - @PreAuthorize("@customSs.hasPermission('wxmp:wxuser:tagging')") - public R tagidList(@RequestBody JSONObject data) { - try { - String appId = data.getStr("appId"); - String taggingType = data.getStr("taggingType"); - JSONArray tagIdsArray = data.getJSONArray("tagIds"); - JSONArray openIdsArray = data.getJSONArray("openIds"); - String[] openIds = openIdsArray.toArray(new String[0]); - for (Object tagId : tagIdsArray) { - wxUserService.tagging(taggingType, Long.valueOf(String.valueOf(tagId)), openIds); - } - return R.ok(); - } catch (WxErrorException e) { - - log.error("修改微信用户备注失败", e); - return R.error(e.getMessage()); - } - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxUserTagsController.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxUserTagsController.java deleted file mode 100644 index b7a6d69..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/controller/WxUserTagsController.java +++ /dev/null @@ -1,159 +0,0 @@ -package com.starry.admin.modules.weichat.controller; - -import cn.hutool.json.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.starry.admin.modules.weichat.entity.WxUser; -import com.starry.admin.modules.weichat.entity.WxUserTagsDict; -import com.starry.admin.modules.weichat.service.WxUserService; -import com.starry.common.result.R; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.api.WxMpUserTagService; -import me.chanjar.weixin.mp.bean.tag.WxUserTag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; - -/** - * 微信用户标签 - * - * @author admin - * @since 2019-03-25 15:39:39 - */ -@Slf4j -@RestController -@AllArgsConstructor -@RequestMapping("/wxusertags") -public class WxUserTagsController { - - @Resource - WxMpService wxService; - - @Resource - WxUserService wxUserService; - - /** - * 获取微信用户标签 - * - * @return - */ - @PreAuthorize("@customSs.hasPermission('wxmp:wxusertags:list')") - @GetMapping("/list") - public R getWxUserList(String appId) { - WxMpUserTagService wxMpUserTagService = wxService.getUserTagService(); - try { - List listWxUserTag = wxMpUserTagService.tagGet(); - return R.ok(listWxUserTag); - } catch (WxErrorException e) { - - log.error("获取微信用户标签失败", e); - return R.error(e.getMessage()); - } - } - - /** - * 获取微信用户标签字典 - * - * @param appId - * @return - */ - @PreAuthorize("@customSs.hasPermission('wxmp:wxusertags:list')") - @GetMapping("/dict") - public R getWxUserTagsDict(String appId) { - WxMpUserTagService wxMpUserTagService = wxService.getUserTagService(); - try { - List listWxUserTag = wxMpUserTagService.tagGet(); - List listWxUserTagsDict = new ArrayList<>(); - WxUserTagsDict wxUserTagsDict; - for (WxUserTag wxUserTag : listWxUserTag) { - wxUserTagsDict = new WxUserTagsDict(); - wxUserTagsDict.setName(wxUserTag.getName()); - wxUserTagsDict.setValue(wxUserTag.getId()); - listWxUserTagsDict.add(wxUserTagsDict); - } - return R.ok(listWxUserTagsDict); - } catch (WxErrorException e) { - - log.error("获取微信用户标签字典失败", e); - return R.error(e.getMessage()); - } - } - - /** - * 新增微信用户标签 - * - * @return - */ - @PreAuthorize("@customSs.hasPermission('wxmp:wxusertags:add')") - @PostMapping - public R save(@RequestBody JSONObject data) { - String appId = data.getStr("appId"); - String name = data.getStr("name"); - WxMpUserTagService wxMpUserTagService = wxService.getUserTagService(); - try { - return R.ok(wxMpUserTagService.tagCreate(name)); - } catch (WxErrorException e) { - - log.error("新增微信用户标签失败", e); - return R.error(e.getMessage()); - } - } - - /** - * 修改微信用户标签 - * - * @return - */ - @PreAuthorize("@customSs.hasPermission('wxmp:wxusertags:edit')") - @PutMapping - public R updateById(@RequestBody JSONObject data) { - String appId = data.getStr("appId"); - Long id = data.getLong("id"); - String name = data.getStr("name"); - WxMpUserTagService wxMpUserTagService = wxService.getUserTagService(); - try { - return R.ok(wxMpUserTagService.tagUpdate(id, name)); - } catch (WxErrorException e) { - - log.error("修改微信用户标签失败", e); - return R.error(e.getMessage()); - } - } - - /** - * 删除微信用户标签 - * - * @param id - * @param appId - * @return - */ - @PreAuthorize("@customSs.hasPermission('wxmp:wxusertags:del')") - @DeleteMapping - public R removeById(Long id, String appId) { - int count = (int) wxUserService.count(Wrappers.lambdaQuery() - .and(wrapper -> wrapper - .eq(WxUser::getTagidList, "[" + id + "]") - .or() - .like(WxUser::getTagidList, "," + id + ",") - .or() - .likeRight(WxUser::getTagidList, "[" + id + ",") - .or() - .likeLeft(WxUser::getTagidList, "," + id + "]"))); - if (count > 0) { - return R.error("该标签下有用户存在,无法删除"); - } - WxMpUserTagService wxMpUserTagService = wxService.getUserTagService(); - try { - return R.ok(wxMpUserTagService.tagDelete(id)); - } catch (WxErrorException e) { - - log.error("删除微信用户标签失败", e); - return R.error(e.getMessage()); - } - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/CustomWxMpProperties.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/CustomWxMpProperties.java deleted file mode 100644 index a779b76..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/CustomWxMpProperties.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -import lombok.Data; - -/** - * @author admin - */ -@Data -public class CustomWxMpProperties { - - /** - * 微信APPID - */ - public String appid = "wx917f3f747c7dc5dd"; - - /** - * 微信公众号的app secret - */ - public String secret = "85012dec2ba8bdc9d0174dd800ef1dec"; - - /** - * 微信公众号的token - */ - public String token = "AkzAW8yqUhOWAFN550"; - - /** - * 微信公众号的EncodingAESKey - */ - public String aesKey = "tsoM88UUQ5uEHJ29xgNiaHHaoswZapS5ijWpaN6hUZF"; - - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/ImageManager.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/ImageManager.java deleted file mode 100644 index 6d75ef3..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/ImageManager.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -import lombok.Data; - -import java.io.Serializable; - -/** - * imageManager - * - * @author admin - * @since 2019-03-23 21:26:35 - */ -@Data -public class ImageManager implements Serializable { - private static final long serialVersionUID = 1L; - - private String url; - private String thumb; - private String tag; - private String name; - private Integer id; -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/Menu.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/Menu.java deleted file mode 100644 index a135203..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/Menu.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -import cn.hutool.json.JSONUtil; -import lombok.Data; -import me.chanjar.weixin.common.bean.menu.WxMenuRule; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * 自定义菜单模型 - * - * @author admin - */ -@Data -public class Menu implements Serializable { - private static final long serialVersionUID = -7083914585539687746L; - - private List button = new ArrayList<>(); - - private WxMenuRule matchrule; - - /** - * 反序列化 - */ - public static Menu fromJson(String json) { - return JSONUtil.parseObj(json).toBean(Menu.class); - } - - public String toJson() { - return JSONUtil.toJsonStr(this); - } - - @Override - public String toString() { - return this.toJson(); - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/MenuButton.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/MenuButton.java deleted file mode 100644 index 7b66143..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/MenuButton.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -import cn.hutool.json.JSONObject; -import lombok.Data; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * 自定义菜单模型 - * - * @author admin - */ -@Data -public class MenuButton implements Serializable { - - private String type; - - private String name; - - private String key; - - private String url; - - private String media_id; - - private String appid; - - private String pagepath; - - private List sub_button = new ArrayList<>(); - /** - * content内容 - */ - private JSONObject content; - - private String repContent; - /** - * 消息类型 - */ - private String repType; - /** - * 消息名 - */ - private String repName; - /** - * 视频和音乐的描述 - */ - private String repDesc; - /** - * 视频和音乐的描述 - */ - private String repUrl; - /** - * 高质量链接 - */ - private String repHqUrl; - /** - * 缩略图的媒体id - */ - private String repThumbMediaId; - /** - * 缩略图url - */ - private String repThumbUrl; - private String article_id; -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayWxUserInfoEntity.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayWxUserInfoEntity.java new file mode 100644 index 0000000..2ce23a7 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/PlayWxUserInfoEntity.java @@ -0,0 +1,69 @@ +package com.starry.admin.modules.weichat.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.starry.common.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 微信用户对象 play_wx_user_info + * + * @author admin + * @since 2024-04-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("play_wx_user_info") +public class PlayWxUserInfoEntity extends BaseEntity { + + /** + * UUID + */ + private String id; + + /** + * 租户ID + */ + private String tenantId; + + /** + * 用户的标识,对当前公众号唯一 + */ + private String openid; + + /** + * 用户的标识,对当前公众号唯一 + */ + private String unionid; + + /** + * 昵称 + */ + private String nickname; + + /** + * 性别,值为1时是男性,值为2时是女性,值为0时是未知 + */ + private Integer sex; + + /** + * 所在城市 + */ + private String city; + + /** + * 所在国家 + */ + private String country; + + /** + * 所在省份 + */ + private String province; + + /** + * 所在省份 + */ + private String avatar; + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/ThirdSession.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/ThirdSession.java deleted file mode 100644 index 427360d..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/ThirdSession.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -import lombok.Data; - -import java.io.Serializable; - -/** - * @author admin - */ -@Data -public class ThirdSession implements Serializable { - /** - * 微信用户ID - */ - private String wxUserId; - /** - * 配置项ID - */ - private String appId; - /** - * 微信sessionKey - */ - private String sessionKey; - /** - * 用户标识 - */ - private String openId; -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxAutoReply.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxAutoReply.java deleted file mode 100644 index 3c96803..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxAutoReply.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -import cn.hutool.json.JSONObject; -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.extension.activerecord.Model; -import com.starry.common.config.typehandler.JsonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.apache.ibatis.type.JdbcType; - -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -/** - * 消息自动回复 - * - * @author admin - * @since 2019-04-18 15:40:39 - */ -@Data -@TableName("wx_auto_reply") -@EqualsAndHashCode(callSuper = true) -public class WxAutoReply extends Model { - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(type = IdType.ASSIGN_ID) - private String id; - /** - * 创建者 - */ - private String createId; - /** - * 创建时间 - */ - private LocalDateTime createTime; - /** - * 更新者 - */ - private String updateId; - /** - * 更新时间 - */ - private LocalDateTime updateTime; - /** - * 备注 - */ - private String remark; - /** - * 逻辑删除标记(0:显示;1:隐藏) - */ - private String delFlag; - /** - * 类型(1、关注时回复;2、消息回复;3、关键词回复) - */ - @NotNull(message = "类型不能为空") - private String type; - /** - * 关键词 - */ - private String reqKey; - /** - * 请求消息类型(text:文本;image:图片;voice:语音;video:视频;shortvideo:小视频;location:地理位置) - */ - private String reqType; - /** - * 回复消息类型(text:文本;image:图片;voice:语音;video:视频;music:音乐;news:图文) - */ - @NotNull(message = "回复消息类型不能为空") - private String repType; - /** - * 回复类型文本匹配类型(1、全匹配,2、半匹配) - */ - private String repMate; - /** - * 回复类型文本保存文字 - */ - private String repContent; - /** - * 回复的素材名、视频和音乐的标题 - */ - private String repName; - /** - * 回复类型imge、voice、news、video的mediaID或音乐缩略图的媒体id - */ - private String repMediaId; - /** - * 视频和音乐的描述 - */ - private String repDesc; - /** - * 链接 - */ - private String repUrl; - /** - * 高质量链接 - */ - private String repHqUrl; - /** - * 缩略图的媒体id - */ - private String repThumbMediaId; - /** - * 缩略图url - */ - private String repThumbUrl; - - /** - * 图文消息的内容 - */ - @TableField(typeHandler = JsonTypeHandler.class, jdbcType = JdbcType.VARCHAR) - private JSONObject content; - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMenu.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMenu.java deleted file mode 100644 index 352bb48..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMenu.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -import cn.hutool.json.JSONObject; -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.extension.activerecord.Model; -import com.starry.common.config.typehandler.JsonTypeHandler; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.apache.ibatis.type.JdbcType; - -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -/** - * 自定义菜单 - * - * @author admin - * @since 2019-03-27 16:52:10 - */ -@Data -@TableName("wx_menu") -@EqualsAndHashCode(callSuper = true) -public class WxMenu extends Model { - private static final long serialVersionUID = 1L; - - /** - * 菜单ID(click、scancode_push、scancode_waitmsg、pic_sysphoto、pic_photo_or_album、pic_weixin、location_select:保存key) - */ - @TableId(type = IdType.ASSIGN_ID) - private String id; - /** - * 父菜单ID - */ - private String parentId; - /** - * 排序值 - */ - private Integer sort; - /** - * 创建时间 - */ - private LocalDateTime createTime; - /** - * 更新时间 - */ - private LocalDateTime updateTime; - /** - * 逻辑删除标记(0:显示;1:隐藏) - */ - private String delFlag; - /** - * 菜单类型click、view、miniprogram、scancode_push、scancode_waitmsg、pic_sysphoto、pic_photo_or_album、pic_weixin、location_select、media_id、view_limited等 - */ - @NotNull(message = "菜单类型不能为空") - private String type; - /** - * 菜单名 - */ - @NotNull(message = "菜单名不能为空") - private String name; - /** - * View:保存链接到url - */ - private String url; - /** - * Img、voice、News:保存mediaID - */ - private String repMediaId; - /** - * 回复消息类型(text:文本;image:图片;voice:语音;video:视频;music:音乐;news:图文) - */ - private String repType; - /** - * 素材名、视频和音乐的标题 - */ - private String repName; - /** - * Text:保存文字 - */ - private String repContent; - /** - * 小程序的appid - */ - private String maAppId; - /** - * 小程序的页面路径 - */ - private String maPagePath; - /** - * 视频和音乐的描述 - */ - private String repDesc; - /** - * 视频和音乐的描述 - */ - private String repUrl; - /** - * 高质量链接 - */ - private String repHqUrl; - /** - * 缩略图的媒体id - */ - private String repThumbMediaId; - /** - * 缩略图url - */ - private String repThumbUrl; - /** - * 图文消息的内容 - */ - @TableField(typeHandler = JsonTypeHandler.class, jdbcType = JdbcType.VARCHAR) - private JSONObject content; -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMsg.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMsg.java deleted file mode 100644 index eb6b0f2..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMsg.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -import cn.hutool.json.JSONObject; -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.extension.activerecord.Model; -import com.starry.common.config.typehandler.JsonTypeHandler; -import io.swagger.annotations.ApiModel; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.apache.ibatis.type.JdbcType; - -import java.time.LocalDateTime; - -/** - * 微信消息 - * - * @author admin - * @since 2019-05-28 16:12:10 - */ -@Data -@TableName("wx_msg") -@EqualsAndHashCode(callSuper = true) -@ApiModel(description = "微信消息") -public class WxMsg extends Model { - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(type = IdType.ASSIGN_ID) - private String id; - /** - * 创建者 - */ - private String createId; - /** - * 创建时间 - */ - private LocalDateTime createTime; - /** - * 更新者 - */ - private String updateId; - /** - * 更新时间 - */ - private LocalDateTime updateTime; - /** - * 备注 - */ - private String remark; - /** - * 逻辑删除标记(0:显示;1:隐藏) - */ - private String delFlag; - /** - * 公众号名称 - */ - private String appName; - /** - * 公众号logo - */ - private String appLogo; - /** - * 微信用户ID - */ - private String wxUserId; - /** - * 昵称 - */ - private String nickName; - /** - * 头像 - */ - private String headimgUrl; - /** - * 消息分类(1、用户发给公众号;2、公众号发给用户;) - */ - private String type; - /** - * 消息类型(text:文本;image:图片;voice:语音;video:视频;shortvideo:小视频;location:地理位置;music:音乐;news:图文;event:推送事件) - */ - private String repType; - /** - * 事件类型(subscribe:关注;unsubscribe:取关;CLICK、VIEW:菜单事件) - */ - private String repEvent; - /** - * 回复类型文本保存文字 - */ - private String repContent; - /** - * 回复类型imge、voice、news、video的mediaID或音乐缩略图的媒体id - */ - private String repMediaId; - /** - * 回复的素材名、视频和音乐的标题 - */ - private String repName; - /** - * 视频和音乐的描述 - */ - private String repDesc; - /** - * 链接 - */ - private String repUrl; - /** - * 高质量链接 - */ - private String repHqUrl; - /** - * 图文消息的内容 - */ - @TableField(typeHandler = JsonTypeHandler.class, jdbcType = JdbcType.VARCHAR) - private JSONObject content; - /** - * 缩略图的媒体id - */ - private String repThumbMediaId; - /** - * 缩略图url - */ - private String repThumbUrl; - /** - * 地理位置维度 - */ - private Double repLocationX; - /** - * 地理位置经度 - */ - private Double repLocationY; - /** - * 地图缩放大小 - */ - private Double repScale; - /** - * 已读标记(0:是;1:否) - */ - private String readFlag; - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMsgVO.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMsgVO.java deleted file mode 100644 index 634ecaa..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxMsgVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 微信消息 - * - * @author admin - * @since 2019-05-28 16:12:10 - */ -@EqualsAndHashCode(callSuper = true) -@Data -public class WxMsgVO extends WxMsg { - private static final long serialVersionUID = 1L; - - /** - * 数量 - */ - private Integer countMsg; - - /** - * repType not in筛选 - */ - private String notInRepType; - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxOpenDataDTO.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxOpenDataDTO.java deleted file mode 100644 index c8e3702..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxOpenDataDTO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -import lombok.Data; - -/** - * 微信开发数据 - * - * @author admin - */ -@Data -public class WxOpenDataDTO { - private String appId; - private String userId; - private String encryptedData; - private String errMsg; - private String iv; - private String rawData; - private String signature; - private String sessionKey; -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUser.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUser.java deleted file mode 100644 index 47ebe84..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUser.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.starry.admin.modules.weichat.entity; - -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.extension.activerecord.Model; -import com.starry.common.config.typehandler.ArrayLongTypeHandler; -import com.starry.common.sensitive.Sensitive; -import com.starry.common.sensitive.SensitiveTypeEnum; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.apache.ibatis.type.JdbcType; - -import java.time.LocalDateTime; - -/** - * 微信用户 - * - * @author admin - * @since 2019-03-25 15:39:39 - */ -@Data -@TableName("wx_user") -@EqualsAndHashCode(callSuper = true) -public class WxUser extends Model { - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(type = IdType.ASSIGN_ID) - private String id; - /** - * 创建者 - */ - private String createId; - /** - * 创建时间 - */ - private LocalDateTime createTime; - /** - * 更新者 - */ - private String updateId; - /** - * 更新时间 - */ - private LocalDateTime updateTime; - /** - * 备注信息 - */ - private String remark; - /** - * 逻辑删除标记(0:显示;1:隐藏) - */ - private String delFlag; - /** - * 应用类型(1:小程序,2:公众号) - */ - private String appType; - /** - * 是否订阅(0:是;1:否;2:网页授权用户) - */ - private String subscribe; - /** - * 返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENEPROFILE LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他 - */ - private String subscribeScene; - /** - * 关注时间 - */ - private LocalDateTime subscribeTime; - /** - * 关注次数 - */ - private Integer subscribeNum; - /** - * 取消关注时间 - */ - private LocalDateTime cancelSubscribeTime; - /** - * 用户标识 - */ - private String openId; - /** - * 昵称 - */ - private String nickName; - /** - * 性别(1:男,2:女,0:未知) - */ - private String sex; - /** - * 所在城市 - */ - private String city; - /** - * 所在国家 - */ - private String country; - /** - * 所在省份 - */ - private String province; - /** - * 手机号码 - */ - @Sensitive(type = SensitiveTypeEnum.MOBILE_PHONE) - private String phone; - /** - * 用户语言 - */ - private String language; - /** - * 头像 - */ - private String headimgUrl; - /** - * union_id - */ - private String unionId; - /** - * 用户组 - */ - private String groupId; - /** - * 标签列表 - */ - @TableField(typeHandler = ArrayLongTypeHandler.class, jdbcType = JdbcType.VARCHAR) - private Long[] tagidList; - /** - * 二维码扫码场景 - */ - private String qrSceneStr; - /** - * 地理位置纬度 - */ - private Double latitude; - /** - * 地理位置经度 - */ - private Double longitude; - /** - * 地理位置精度 - */ - @TableField(value = "`precision`") - private Double precision; - /** - * 会话密钥 - */ - private String sessionKey; -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUserLoginVo.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUserLoginVo.java new file mode 100644 index 0000000..118852d --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUserLoginVo.java @@ -0,0 +1,13 @@ +package com.starry.admin.modules.weichat.entity; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class WxUserLoginVo { + + + @NotBlank(message = "code不能为空") + private String code; +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUserTagsDict.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUserQueryAddressVo.java similarity index 56% rename from play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUserTagsDict.java rename to play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUserQueryAddressVo.java index c328331..ad27a42 100644 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUserTagsDict.java +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/entity/WxUserQueryAddressVo.java @@ -6,7 +6,8 @@ import lombok.Data; * @author admin */ @Data -public class WxUserTagsDict { - private String name; - private Long value; +public class WxUserQueryAddressVo { + + + private String url; } diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/AbstractHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/AbstractHandler.java deleted file mode 100644 index f21e11a..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/AbstractHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import me.chanjar.weixin.mp.api.WxMpMessageHandler; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * @author admin - */ -public abstract class AbstractHandler implements WxMpMessageHandler { - protected Logger logger = LoggerFactory.getLogger(getClass()); -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/KfSessionHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/KfSessionHandler.java deleted file mode 100644 index f77df09..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/KfSessionHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * @author admin - */ -@Component -public class KfSessionHandler extends AbstractHandler { - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, - Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - // TODO 对会话做处理 - return null; - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/LocationHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/LocationHandler.java deleted file mode 100644 index 03ef33d..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/LocationHandler.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import com.starry.admin.modules.weichat.builder.TextBuilder; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Component; - -import java.util.Map; - -import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType; - -/** - * @author admin - */ -@Component -public class LocationHandler extends AbstractHandler { - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, - Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - if (wxMessage.getMsgType().equals(XmlMsgType.LOCATION)) { - // TODO 接收处理用户发送的地理位置消息 - try { - String content = "感谢反馈,您的的地理位置已收到!"; - return new TextBuilder().build(content, wxMessage, null); - } catch (Exception e) { - this.logger.error("位置消息接收处理失败", e); - return null; - } - } - - // 上报地理位置事件 - this.logger.info("上报地理位置,纬度 : {},经度 : {},精度 : {}", - wxMessage.getLatitude(), wxMessage.getLongitude(), wxMessage.getPrecision()); - - // TODO 可以将用户地理位置信息保存到本地数据库,以便以后使用 - - return null; - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/LogHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/LogHandler.java deleted file mode 100644 index ccfe889..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/LogHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import cn.hutool.core.util.StrUtil; -import com.starry.admin.modules.weichat.utils.JsonUtils; -import com.starry.common.utils.HttpUtils; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * @author admin - */ -@Component -public class LogHandler extends AbstractHandler { - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, - Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - this.logger.info("\n接收到请求消息,内容:{}", JsonUtils.toJson(wxMessage)); - // 以下为测试代码,自行删除不影响系统功能 - if (wxMessage.getMsgType().equals(WxConsts.XmlMsgType.EVENT)) { - if (wxMessage.getEvent().equals(WxConsts.EventType.SUBSCRIBE) || - wxMessage.getEvent().equals(WxConsts.EventType.SCAN)) { - if (wxMessage.getEventKey().contains("jl-wiki")) { - String openId = wxMessage.getFromUser(); - String sceneStr = StrUtil.split(wxMessage.getEventKey(), ":").get(1); - String rs = HttpUtils.sendPost("http://127.0.0.1:8083/joolun-open/user", StrUtil.format("openId={}&sceneStr={}", openId, sceneStr)); - } - } - } - return null; - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/MenuHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/MenuHandler.java deleted file mode 100644 index f1a3af7..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/MenuHandler.java +++ /dev/null @@ -1,172 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.starry.admin.modules.weichat.config.CommonConstants; -import com.starry.admin.modules.weichat.constant.ConfigConstant; -import com.starry.admin.modules.weichat.entity.WxMenu; -import com.starry.admin.modules.weichat.entity.WxMsg; -import com.starry.admin.modules.weichat.entity.WxUser; -import com.starry.admin.modules.weichat.mapper.WxMenuMapper; -import com.starry.admin.modules.weichat.mapper.WxMsgMapper; -import com.starry.admin.modules.weichat.mapper.WxUserMapper; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage; -import me.chanjar.weixin.mp.bean.result.WxMpUser; -import me.chanjar.weixin.mp.builder.outxml.*; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * @author admin - */ -@Slf4j -@Component -@AllArgsConstructor -public class MenuHandler extends AbstractHandler { - - private final WxMenuMapper wxMenuMapper; - private final WxUserMapper wxUserMapper; - private final WxMsgMapper wxMsgMapper; - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, - Map context, WxMpService weixinService, - WxSessionManager sessionManager) throws WxErrorException { - // 消息记录 - WxMenu wxMenu; - if (WxConsts.EventType.CLICK.equals(wxMessage.getEvent()) - || WxConsts.EventType.SCANCODE_WAITMSG.equals(wxMessage.getEvent())) { - wxMenu = wxMenuMapper.selectById(wxMessage.getEventKey()); - if (wxMenu == null) {// 菜单过期 - return new TextBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).content("非常抱歉,该菜单已删除!").build(); - } - } else { - wxMenu = new WxMenu(); - } - WxUser wxUser = wxUserMapper.selectOne(Wrappers.lambdaQuery() - .eq(WxUser::getOpenId, wxMessage.getFromUser())); - if (wxUser == null) {// 库中无此用户 - WxMpUser userWxInfo = weixinService.getUserService() - .userInfo(wxMessage.getFromUser(), null); - wxUser = new WxUser(); - wxUser.setSubscribeNum(1); - SubscribeHandler.setWxUserValue(wxUser, userWxInfo); - wxUserMapper.insert(wxUser); - } - // 组装菜单回复消息 - return getWxMpXmlOutMessage(wxMessage, wxMenu, wxUser); - } - - /** - * 组装菜单回复消息 - * - * @param wxMessage - * @param wxMenu - * @return - */ - public WxMpXmlOutMessage getWxMpXmlOutMessage(WxMpXmlMessage wxMessage, WxMenu wxMenu, WxUser wxUser) { - WxMpXmlOutMessage wxMpXmlOutMessage = null; - // 记录接收消息 - WxMsg wxMsg = new WxMsg(); -// wxMsg.setTenantId(wxApp.getTenantId()); - wxMsg.setWxUserId(wxUser.getId()); - wxMsg.setNickName(wxUser.getNickName()); - wxMsg.setHeadimgUrl(wxUser.getHeadimgUrl()); - wxMsg.setType(ConfigConstant.WX_MSG_TYPE_1); - wxMsg.setRepEvent(wxMessage.getEvent()); - wxMsg.setRepType(wxMessage.getMsgType()); - wxMsg.setRepName(wxMenu.getName()); - if (WxConsts.EventType.VIEW.equals(wxMessage.getEvent())) { - wxMsg.setRepUrl(wxMessage.getEventKey()); - } - if (WxConsts.EventType.SCANCODE_WAITMSG.equals(wxMessage.getEvent())) { - wxMsg.setRepContent(wxMessage.getScanCodeInfo().getScanResult()); - } - wxMsg.setReadFlag(CommonConstants.NO); - LocalDateTime now = LocalDateTime.now(); - wxMsg.setCreateTime(now); - wxMsgMapper.insert(wxMsg); - if (WxConsts.MenuButtonType.CLICK.equals(wxMenu.getType()) - || WxConsts.MenuButtonType.SCANCODE_WAITMSG.equals(wxMenu.getType())) { - // 记录回复消息 - wxMsg = new WxMsg(); - wxMsg.setWxUserId(wxUser.getId()); - wxMsg.setNickName(wxUser.getNickName()); - wxMsg.setHeadimgUrl(wxUser.getHeadimgUrl()); - wxMsg.setCreateTime(now.plusSeconds(1)); - wxMsg.setType(ConfigConstant.WX_MSG_TYPE_2); - wxMsg.setRepType(wxMenu.getRepType()); - if (WxConsts.KefuMsgType.TEXT.equals(wxMenu.getRepType())) { - wxMsg.setRepContent(wxMenu.getRepContent()); - wxMpXmlOutMessage = new TextBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).content(wxMenu.getRepContent()).build(); - } - if (WxConsts.KefuMsgType.IMAGE.equals(wxMenu.getRepType())) { - wxMsg.setRepName(wxMenu.getRepName()); - wxMsg.setRepUrl(wxMenu.getRepUrl()); - wxMsg.setRepMediaId(wxMenu.getRepMediaId()); - wxMpXmlOutMessage = new ImageBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).mediaId(wxMenu.getRepMediaId()).build(); - } - if (WxConsts.KefuMsgType.VOICE.equals(wxMenu.getRepType())) { - wxMsg.setRepName(wxMenu.getRepName()); - wxMsg.setRepUrl(wxMenu.getRepUrl()); - wxMsg.setRepMediaId(wxMenu.getRepMediaId()); - wxMpXmlOutMessage = new VoiceBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).mediaId(wxMenu.getRepMediaId()).build(); - } - if (WxConsts.KefuMsgType.VIDEO.equals(wxMenu.getRepType())) { - wxMsg.setRepName(wxMenu.getRepName()); - wxMsg.setRepDesc(wxMenu.getRepDesc()); - wxMsg.setRepUrl(wxMenu.getRepUrl()); - wxMsg.setRepMediaId(wxMenu.getRepMediaId()); - wxMpXmlOutMessage = new VideoBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).mediaId(wxMenu.getRepMediaId()) - .title(wxMenu.getRepName()).description(wxMenu.getRepDesc()).build(); - } - if (WxConsts.KefuMsgType.MUSIC.equals(wxMenu.getRepType())) { - wxMsg.setRepName(wxMenu.getRepName()); - wxMsg.setRepDesc(wxMenu.getRepDesc()); - wxMsg.setRepUrl(wxMenu.getRepUrl()); - wxMsg.setRepHqUrl(wxMenu.getRepHqUrl()); - wxMsg.setRepThumbMediaId(wxMenu.getRepThumbMediaId()); - wxMsg.setRepThumbUrl(wxMenu.getRepThumbUrl()); - wxMpXmlOutMessage = new MusicBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()) - .thumbMediaId(wxMenu.getRepThumbMediaId()) - .title(wxMenu.getRepName()).description(wxMenu.getRepDesc()) - .musicUrl(wxMenu.getRepUrl()).hqMusicUrl(wxMenu.getRepHqUrl()).build(); - } - if (WxConsts.KefuMsgType.NEWS.equals(wxMenu.getRepType())) { - List list = new ArrayList<>(); - List listJSONObject = JSONUtil.toList(wxMenu.getContent().getJSONArray("articles"), JSONObject.class); - WxMpXmlOutNewsMessage.Item t; - for (JSONObject jSONObject : listJSONObject) { - t = new WxMpXmlOutNewsMessage.Item(); - t.setTitle(jSONObject.getStr("title")); - t.setDescription(jSONObject.getStr("digest")); - t.setPicUrl(jSONObject.getStr("thumbUrl")); - t.setUrl(jSONObject.getStr("url")); - list.add(t); - } - wxMsg.setRepName(wxMenu.getRepName()); - wxMsg.setRepDesc(wxMenu.getRepDesc()); - wxMsg.setRepUrl(wxMenu.getRepUrl()); - wxMsg.setRepMediaId(wxMenu.getRepMediaId()); - wxMsg.setContent(wxMenu.getContent()); - wxMpXmlOutMessage = new NewsBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).articles(list).build(); - } - wxMsgMapper.insert(wxMsg); - } - return wxMpXmlOutMessage; - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/MsgHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/MsgHandler.java deleted file mode 100644 index 012e359..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/MsgHandler.java +++ /dev/null @@ -1,194 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import cn.hutool.json.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.starry.admin.modules.weichat.config.CommonConstants; -import com.starry.admin.modules.weichat.constant.ConfigConstant; -import com.starry.admin.modules.weichat.constant.WebSocketConstant; -import com.starry.admin.modules.weichat.entity.WxAutoReply; -import com.starry.admin.modules.weichat.entity.WxMsg; -import com.starry.admin.modules.weichat.entity.WxUser; -import com.starry.admin.modules.weichat.mapper.WxUserMapper; -import com.starry.admin.modules.weichat.service.WxAutoReplyService; -import com.starry.admin.modules.weichat.service.WxMsgService; -import lombok.AllArgsConstructor; -import me.chanjar.weixin.common.api.WxConsts; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage; -import me.chanjar.weixin.mp.builder.outxml.*; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType; - -/** - * @author admin - */ -@Component -@AllArgsConstructor -public class MsgHandler extends AbstractHandler { - - private final WxAutoReplyService wxAutoReplyService; - private final WxUserMapper wxUserMapper; - private final WxMsgService wxMsgService; - - /** - * 组装回复消息,并记录消息 - * - * @param wxMessage - * @param listWxAutoReply - * @return - */ - public static WxMpXmlOutMessage getWxMpXmlOutMessage(WxMpXmlMessage wxMessage, List listWxAutoReply, WxUser wxUser, WxMsgService wxMsgService) { - WxMpXmlOutMessage wxMpXmlOutMessage = null; - // 记录接收消息 - WxMsg wxMsg = new WxMsg(); - wxMsg.setWxUserId(wxUser.getId()); - wxMsg.setNickName(wxUser.getNickName()); - wxMsg.setHeadimgUrl(wxUser.getHeadimgUrl()); - wxMsg.setType(ConfigConstant.WX_MSG_TYPE_1); - wxMsg.setRepEvent(wxMessage.getEvent()); - wxMsg.setRepType(wxMessage.getMsgType()); - wxMsg.setRepMediaId(wxMessage.getMediaId()); - if (XmlMsgType.TEXT.equals(wxMessage.getMsgType())) { - wxMsg.setRepContent(wxMessage.getContent()); - } - if (XmlMsgType.VOICE.equals(wxMessage.getMsgType())) { - wxMsg.setRepName(wxMessage.getMediaId() + "." + wxMessage.getFormat()); - wxMsg.setRepContent(wxMessage.getRecognition()); - } - if (XmlMsgType.IMAGE.equals(wxMessage.getMsgType())) { - wxMsg.setRepUrl(wxMessage.getPicUrl()); - } - if (XmlMsgType.LINK.equals(wxMessage.getMsgType())) { - wxMsg.setRepName(wxMessage.getTitle()); - wxMsg.setRepDesc(wxMessage.getDescription()); - wxMsg.setRepUrl(wxMessage.getUrl()); - } - if (WxConsts.MediaFileType.FILE.equals(wxMessage.getMsgType())) { - wxMsg.setRepName(wxMessage.getTitle()); - wxMsg.setRepDesc(wxMessage.getDescription()); - } - if (XmlMsgType.VIDEO.equals(wxMessage.getMsgType())) { - wxMsg.setRepThumbMediaId(wxMessage.getThumbMediaId()); - } - if (XmlMsgType.LOCATION.equals(wxMessage.getMsgType())) { - wxMsg.setRepLocationX(wxMessage.getLocationX()); - wxMsg.setRepLocationY(wxMessage.getLocationY()); - wxMsg.setRepScale(wxMessage.getScale()); - wxMsg.setRepContent(wxMessage.getLabel()); - } - wxMsg.setReadFlag(CommonConstants.NO); - LocalDateTime now = LocalDateTime.now(); - wxMsg.setCreateTime(now); - wxMsgService.save(wxMsg); - // 推送websocket - String destination = WebSocketConstant.USER_DESTINATION_PREFIX + WebSocketConstant.WX_MSG + wxMsg.getWxUserId(); - if (listWxAutoReply != null && !listWxAutoReply.isEmpty()) { - WxAutoReply wxAutoReply = listWxAutoReply.get(0); - // 记录回复消息 - wxMsg = new WxMsg(); - wxMsg.setWxUserId(wxUser.getId()); - wxMsg.setNickName(wxUser.getNickName()); - wxMsg.setHeadimgUrl(wxUser.getHeadimgUrl()); - wxMsg.setCreateTime(now.plusSeconds(1)); - wxMsg.setType(ConfigConstant.WX_MSG_TYPE_2); - wxMsg.setRepType(wxAutoReply.getRepType()); - - if (WxConsts.KefuMsgType.TEXT.equals(wxAutoReply.getRepType())) {// 文本 - wxMsg.setRepContent(wxAutoReply.getRepContent()); - wxMpXmlOutMessage = new TextBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).content(wxAutoReply.getRepContent()).build(); - } - if (WxConsts.KefuMsgType.IMAGE.equals(wxAutoReply.getRepType())) {// 图片 - wxMsg.setRepName(wxAutoReply.getRepName()); - wxMsg.setRepUrl(wxAutoReply.getRepUrl()); - wxMsg.setRepMediaId(wxAutoReply.getRepMediaId()); - wxMpXmlOutMessage = new ImageBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).mediaId(wxAutoReply.getRepMediaId()).build(); - } - if (WxConsts.KefuMsgType.VOICE.equals(wxAutoReply.getRepType())) { - wxMsg.setRepName(wxAutoReply.getRepName()); - wxMsg.setRepUrl(wxAutoReply.getRepUrl()); - wxMsg.setRepMediaId(wxAutoReply.getRepMediaId()); - wxMpXmlOutMessage = new VoiceBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).mediaId(wxAutoReply.getRepMediaId()).build(); - } - if (WxConsts.KefuMsgType.VIDEO.equals(wxAutoReply.getRepType())) { - wxMsg.setRepName(wxAutoReply.getRepName()); - wxMsg.setRepDesc(wxAutoReply.getRepDesc()); - wxMsg.setRepUrl(wxAutoReply.getRepUrl()); - wxMsg.setRepMediaId(wxAutoReply.getRepMediaId()); - wxMpXmlOutMessage = new VideoBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).mediaId(wxAutoReply.getRepMediaId()).title(wxAutoReply.getRepName()).description(wxAutoReply.getRepDesc()).build(); - } - if (WxConsts.KefuMsgType.MUSIC.equals(wxAutoReply.getRepType())) { - wxMsg.setRepName(wxAutoReply.getRepName()); - wxMsg.setRepDesc(wxAutoReply.getRepDesc()); - wxMsg.setRepUrl(wxAutoReply.getRepUrl()); - wxMsg.setRepHqUrl(wxAutoReply.getRepHqUrl()); - wxMsg.setRepThumbMediaId(wxAutoReply.getRepThumbMediaId()); - wxMsg.setRepThumbUrl(wxAutoReply.getRepThumbUrl()); - wxMpXmlOutMessage = new MusicBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).thumbMediaId(wxAutoReply.getRepThumbMediaId()).title(wxAutoReply.getRepName()).description(wxAutoReply.getRepDesc()).musicUrl(wxAutoReply.getRepUrl()).hqMusicUrl(wxAutoReply.getRepHqUrl()).build(); - } - if (WxConsts.KefuMsgType.NEWS.equals(wxAutoReply.getRepType())) { - List list = new ArrayList<>(); - List listJSONObject = wxAutoReply.getContent().getJSONArray("articles").toList(JSONObject.class); - WxMpXmlOutNewsMessage.Item t; - for (JSONObject jSONObject : listJSONObject) { - t = new WxMpXmlOutNewsMessage.Item(); - t.setTitle(jSONObject.getStr("title")); - t.setDescription(jSONObject.getStr("digest")); - t.setPicUrl(jSONObject.getStr("thumbUrl")); - t.setUrl(jSONObject.getStr("url")); - list.add(t); - } - wxMsg.setRepName(wxAutoReply.getRepName()); - wxMsg.setRepDesc(wxAutoReply.getRepDesc()); - wxMsg.setRepUrl(wxAutoReply.getRepUrl()); - wxMsg.setRepMediaId(wxAutoReply.getRepMediaId()); - wxMsg.setContent(wxAutoReply.getContent()); - wxMpXmlOutMessage = new NewsBuilder().fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).articles(list).build(); - } - wxMsgService.save(wxMsg); - } - return wxMpXmlOutMessage; - } - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) { - // 组装回复消息 - if (!wxMessage.getMsgType().equals(XmlMsgType.EVENT)) { - WxMpXmlOutMessage rs; - // TODO 可以选择将消息保存到本地 - WxUser wxUser = wxUserMapper.selectOne(Wrappers.lambdaQuery().eq(WxUser::getOpenId, wxMessage.getFromUser())); - if (WxConsts.KefuMsgType.TEXT.equals(wxMessage.getMsgType())) {// 1、先处理是否有文本关键字回复 - // 先全匹配 - List listWxAutoReply = wxAutoReplyService.list(Wrappers.query().lambda().eq(WxAutoReply::getType, ConfigConstant.WX_AUTO_REPLY_TYPE_3).eq(WxAutoReply::getRepMate, ConfigConstant.WX_REP_MATE_1).eq(WxAutoReply::getReqKey, wxMessage.getContent())); - if (listWxAutoReply != null && !listWxAutoReply.isEmpty()) { - rs = this.getWxMpXmlOutMessage(wxMessage, listWxAutoReply, wxUser, wxMsgService); - if (rs != null) { - return rs; - } - } - // 再半匹配 - listWxAutoReply = wxAutoReplyService.list(Wrappers.query().lambda().eq(WxAutoReply::getType, ConfigConstant.WX_AUTO_REPLY_TYPE_3).eq(WxAutoReply::getRepMate, ConfigConstant.WX_REP_MATE_2).like(WxAutoReply::getReqKey, wxMessage.getContent())); - if (listWxAutoReply != null && !listWxAutoReply.isEmpty()) { - rs = this.getWxMpXmlOutMessage(wxMessage, listWxAutoReply, wxUser, wxMsgService); - if (rs != null) { - return rs; - } - } - } - // 2、再处理消息回复 - List listWxAutoReply = wxAutoReplyService.list(Wrappers.query().lambda().eq(WxAutoReply::getType, ConfigConstant.WX_AUTO_REPLY_TYPE_2).eq(WxAutoReply::getReqType, wxMessage.getMsgType())); - rs = this.getWxMpXmlOutMessage(wxMessage, listWxAutoReply, wxUser, wxMsgService); - return rs; - } - return null; - - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/NullHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/NullHandler.java deleted file mode 100644 index 3266d9b..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/NullHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * @author admin - */ -@Component -public class NullHandler extends AbstractHandler { - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, - Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - return null; - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/ScanHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/ScanHandler.java deleted file mode 100644 index 843a49e..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/ScanHandler.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * @author admin - */ -@Component -public class ScanHandler extends AbstractHandler { - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMpXmlMessage, Map map, - WxMpService wxMpService, WxSessionManager wxSessionManager) throws WxErrorException { - // 扫码事件处理 - return null; - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/StoreCheckNotifyHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/StoreCheckNotifyHandler.java deleted file mode 100644 index 1a8a486..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/StoreCheckNotifyHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * 门店审核事件处理 - * - * @author admin - */ -@Component -public class StoreCheckNotifyHandler extends AbstractHandler { - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, - Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - // TODO 处理门店审核事件 - return null; - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/SubscribeHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/SubscribeHandler.java deleted file mode 100644 index 84d74c8..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/SubscribeHandler.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.starry.admin.modules.weichat.constant.ConfigConstant; -import com.starry.admin.modules.weichat.entity.WxAutoReply; -import com.starry.admin.modules.weichat.entity.WxUser; -import com.starry.admin.modules.weichat.mapper.WxUserMapper; -import com.starry.admin.modules.weichat.service.WxAutoReplyService; -import com.starry.admin.modules.weichat.service.WxMsgService; -import com.starry.admin.modules.weichat.utils.LocalDateTimeUtils; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import me.chanjar.weixin.mp.bean.result.WxMpUser; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -/** - * @author admin - */ -@Slf4j -@Component -@AllArgsConstructor -public class SubscribeHandler extends AbstractHandler { - private final WxAutoReplyService wxAutoReplyService; - private final WxUserMapper wxUserMapper; - private final WxMsgService wxMsgService; - - public static void setWxUserValue(WxUser wxUser, WxMpUser userWxInfo) { - wxUser.setAppType(ConfigConstant.WX_APP_TYPE_2); - wxUser.setSubscribe(ConfigConstant.SUBSCRIBE_TYPE_YES); - wxUser.setSubscribeScene(userWxInfo.getSubscribeScene()); - if (null != userWxInfo.getSubscribeTime()) { - wxUser.setSubscribeTime(LocalDateTimeUtils.timestamToDatetime(userWxInfo.getSubscribeTime() * 1000)); - } - wxUser.setOpenId(userWxInfo.getOpenId()); - wxUser.setLanguage(userWxInfo.getLanguage()); - wxUser.setRemark(userWxInfo.getRemark()); - wxUser.setUnionId(userWxInfo.getUnionId()); - wxUser.setGroupId(JSONUtil.toJsonStr(userWxInfo.getGroupId())); - wxUser.setTagidList(userWxInfo.getTagIds()); - wxUser.setQrSceneStr(userWxInfo.getQrSceneStr()); - } - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService weixinService, WxSessionManager sessionManager) { - log.info("新关注用户 OPENID: " + wxMessage.getFromUser()); - // 获取微信用户基本信息 - try { - WxMpUser userWxInfo = weixinService.getUserService().userInfo(wxMessage.getFromUser(), null); - if (userWxInfo != null) { - // TODO 添加关注用户到本地数据库 - WxUser wxUser = wxUserMapper.selectOne(Wrappers.lambdaQuery().eq(WxUser::getOpenId, userWxInfo.getOpenId())); - if (wxUser == null) { - // 第一次关注 - wxUser = new WxUser(); - wxUser.setSubscribeNum(1); - setWxUserValue(wxUser, userWxInfo); - // wxUser.setTenantId(wxApp.getTenantId()); - wxUserMapper.insert(wxUser); - } else { - // 曾经关注过 - wxUser.setSubscribeNum(wxUser.getSubscribeNum() + 1); - setWxUserValue(wxUser, userWxInfo); - // wxUser.setTenantId(wxApp.getTenantId()); - wxUserMapper.updateById(wxUser); - } - // 发送关注消息 - List listWxAutoReply = wxAutoReplyService.list(Wrappers.query().lambda().eq(WxAutoReply::getType, ConfigConstant.WX_AUTO_REPLY_TYPE_1)); - return MsgHandler.getWxMpXmlOutMessage(wxMessage, listWxAutoReply, wxUser, wxMsgService); - } - } catch (Exception e) { - log.error("用户关注出错:" + e.getMessage()); - } - return null; - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/UnsubscribeHandler.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/UnsubscribeHandler.java deleted file mode 100644 index 4492ed4..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/handler/UnsubscribeHandler.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.starry.admin.modules.weichat.handler; - -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.starry.admin.modules.weichat.constant.ConfigConstant; -import com.starry.admin.modules.weichat.entity.WxUser; -import com.starry.admin.modules.weichat.mapper.WxUserMapper; -import com.starry.admin.modules.weichat.service.WxMsgService; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.session.WxSessionManager; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; -import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.Map; - -/** - * @author admin - */ -@Slf4j -@Component -@AllArgsConstructor -public class UnsubscribeHandler extends AbstractHandler { - - private final WxMsgService wxMsgService; - private final WxUserMapper wxUserMapper; - - @Override - public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, - Map context, WxMpService wxMpService, - WxSessionManager sessionManager) { - String openId = wxMessage.getFromUser(); - log.info("取消关注用户 OPENID: " + openId); - WxUser wxUser = wxUserMapper.selectOne(Wrappers.lambdaQuery() - .eq(WxUser::getOpenId, openId)); - if (wxUser != null) { - wxUser.setSubscribe(ConfigConstant.SUBSCRIBE_TYPE_NO); - wxUser.setCancelSubscribeTime(LocalDateTime.now()); - wxUserMapper.updateById(wxUser); - // 消息记录 - MsgHandler.getWxMpXmlOutMessage(wxMessage, null, wxUser, wxMsgService); - } - return null; - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/interceptor/ThirdSessionInterceptor.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/interceptor/ThirdSessionInterceptor.java deleted file mode 100644 index 19e23df..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/interceptor/ThirdSessionInterceptor.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.starry.admin.modules.weichat.interceptor; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONUtil; -import com.starry.admin.modules.weichat.config.CommonConstants; -import com.starry.admin.modules.weichat.constant.ConfigConstant; -import com.starry.admin.modules.weichat.constant.MyReturnCode; -import com.starry.admin.modules.weichat.constant.WxMaConstants; -import com.starry.admin.modules.weichat.entity.ThirdSession; -import com.starry.admin.modules.weichat.utils.ThirdSessionHolder; -import com.starry.common.result.R; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * ThirdSession拦截器,校验每个请求的ThirdSession - * - * @author admin - */ -@Slf4j -@Component -public class ThirdSessionInterceptor implements HandlerInterceptor { - - @Resource - RedisTemplate redisTemplate; - - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { - // 获取header中的thirdSession - String thirdSessionHeader = request.getHeader(ConfigConstant.HEADER_THIRDSESSION); - if (StrUtil.isNotBlank(thirdSessionHeader)) { - // 获取缓存中的ThirdSession - String key = WxMaConstants.THIRD_SESSION_BEGIN + ":" + thirdSessionHeader; - Object thirdSessionObj = redisTemplate.opsForValue().get(key); - if (thirdSessionObj == null) { - // session过期 - R r = R.error(MyReturnCode.ERR_60001.getCode(), MyReturnCode.ERR_60001.getMsg()); - this.writerPrint(response, r); - return Boolean.FALSE; - } else { - String thirdSessionStr = String.valueOf(thirdSessionObj); - ThirdSession thirdSession = JSONUtil.toBean(thirdSessionStr, ThirdSession.class); - // 设置thirdSession - ThirdSessionHolder.setThirdSession(thirdSession); - } - } else { - R r = R.error(MyReturnCode.ERR_60002.getCode(), MyReturnCode.ERR_60002.getMsg()); - this.writerPrint(response, r); - return Boolean.FALSE; - } - return Boolean.TRUE; - } - - private void writerPrint(HttpServletResponse response, R r) throws IOException { - // 返回超时错误码,触发小程序重新登录 - response.setCharacterEncoding(CommonConstants.UTF8); - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - PrintWriter writer = response.getWriter(); - writer.print(JSONUtil.parseObj(r)); - writer.close(); - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/PlayWxUserInfoMapper.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/PlayWxUserInfoMapper.java new file mode 100644 index 0000000..e37b74c --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/PlayWxUserInfoMapper.java @@ -0,0 +1,16 @@ +package com.starry.admin.modules.weichat.mapper; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.starry.admin.modules.weichat.entity.PlayWxUserInfoEntity; + +/** + * 微信用户Mapper接口 + * + * @author admin + * @since 2024-04-07 + */ +public interface PlayWxUserInfoMapper extends BaseMapper { + + +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxAutoReplyMapper.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxAutoReplyMapper.java deleted file mode 100644 index 724af31..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxAutoReplyMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.starry.admin.modules.weichat.mapper; - - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.starry.admin.modules.weichat.entity.WxAutoReply; - -/** - * 消息自动回复 - * - * @author admin - * @since 2019-04-18 15:40:39 - */ -public interface WxAutoReplyMapper extends BaseMapper { - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxMenuMapper.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxMenuMapper.java deleted file mode 100644 index 7be061e..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxMenuMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.starry.admin.modules.weichat.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.starry.admin.modules.weichat.entity.WxMenu; - -/** - * 自定义菜单 - * - * @author admin - * @since 2019-03-27 16:52:10 - */ -public interface WxMenuMapper extends BaseMapper { - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxMsgMapper.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxMsgMapper.java deleted file mode 100644 index f1021c1..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxMsgMapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.starry.admin.modules.weichat.mapper; - - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.starry.admin.modules.weichat.entity.WxMsg; -import com.starry.admin.modules.weichat.entity.WxMsgVO; -import org.apache.ibatis.annotations.Param; - -/** - * 微信消息 - * - * @author admin - * @since 2019-05-28 16:12:10 - */ -public interface WxMsgMapper extends BaseMapper { - - /** - * 获取分组后的消息列表 - * - * @param page - * @param wxMsgVO - * @return - */ - IPage listWxMsgMapGroup(Page page, @Param("query") WxMsgVO wxMsgVO); -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxUserMapper.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxUserMapper.java deleted file mode 100644 index 12cbc63..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/mapper/WxUserMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.starry.admin.modules.weichat.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.starry.admin.modules.weichat.entity.WxUser; - -/** - * 微信用户 - * - * @author admin - * @since 2019-03-25 15:39:39 - */ -public interface WxUserMapper extends BaseMapper { - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/Constants.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/Constants.java new file mode 100644 index 0000000..b70107f --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/Constants.java @@ -0,0 +1,152 @@ +package com.starry.admin.modules.weichat.service; + +import io.jsonwebtoken.Claims; + +/** + * 通用常量信息 + * + * @author ruoyi + */ +public class Constants +{ + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * www主域 + */ + public static final String WWW = "www."; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + public static final String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + public static final String FAIL = "1"; + + /** + * 登录成功 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + public static final String LOGOUT = "Logout"; + + public static final String CHANGE_PHONE = "CHANGE_PHONE"; + + /** + * 注册 + */ + public static final String REGISTER = "Register"; + + /** + * 登录失败 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 验证码有效期(分钟) + */ + public static final Integer CAPTCHA_EXPIRATION = 2; + + /** + * 令牌 + */ + public static final String TOKEN = "token"; + + /** + * 令牌前缀 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + public static final String MINI_USER_LOGIN_TOKEN = "usertoken"; + public static final String MINI_COSER_LOGIN_TOKEN = "cosertoken"; + + /** + * 令牌前缀 + */ + public static final String LOGIN_USER_KEY = "login_user_key"; + public static final String LOGIN_USER_KEY_MINI = "login_user_key_mini"; + public static final String LOGIN_USER_KEY_COSER = "login_user_key_coser"; + + /** + * 用户ID + */ + public static final String JWT_USERID = "userid"; + + /** + * 用户名称 + */ + public static final String JWT_USERNAME = Claims.SUBJECT; + + /** + * 用户头像 + */ + public static final String JWT_AVATAR = "avatar"; + + /** + * 创建时间 + */ + public static final String JWT_CREATED = "created"; + + /** + * 用户权限 + */ + public static final String JWT_AUTHORITIES = "authorities"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile"; + + public static final String MINI_USER_DE_AVATAR = "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/cdn/img/1881712023451_.pic.jpg"; + public static final String MINI_COSER_DE_AVATAR = "https://live-cloud-cvoon.oss-cn-hangzhou.aliyuncs.com/cdn/img/1891712023452_.pic.jpg"; + + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + */ + public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" }; + + /** + * 定时任务违规的字符 + */ + public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config" }; +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxAutoReplyService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxAutoReplyService.java deleted file mode 100644 index 4756ff8..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxAutoReplyService.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.starry.admin.modules.weichat.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.starry.admin.modules.weichat.entity.WxAutoReply; - -/** - * 消息自动回复 - * - * @author admin - * @since 2019-04-18 15:40:39 - */ -public interface WxAutoReplyService extends IService { - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMenuService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMenuService.java deleted file mode 100644 index e2ade35..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMenuService.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.starry.admin.modules.weichat.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.starry.admin.modules.weichat.entity.WxMenu; -import me.chanjar.weixin.common.error.WxErrorException; - -/** - * 自定义菜单 - * - * @author admin - * @since 2019-03-27 16:52:10 - */ -public interface WxMenuService extends IService { - - /*** - * 获取WxApp下的菜单 - * @return - */ - String getWxMenuButton(); - - /** - * 保存并发布菜单 - * - * @param - */ - void saveAndRelease(String strWxMenu) throws WxErrorException; - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMpApi.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMpApi.java deleted file mode 100644 index 732c5a3..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMpApi.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.starry.admin.modules.weichat.service; - -import com.baomidou.mybatisplus.core.toolkit.StringUtils; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.starry.admin.common.exception.CustomException; -import com.starry.admin.modules.platform.entity.SysTenantEntity; -import com.starry.admin.modules.platform.service.ISysTenantService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.config.impl.WxMpMapConfigImpl; -import org.springframework.stereotype.Service; - -import java.util.Objects; - -/** - * @Author: huchuansai - * @Date: 2024/3/27 10:27 PM - * @Description: - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class WxMpApi { - - private final WxMpService mpService; - private final ISysTenantService sysTenantService; - - - public String getAccessToken(String appId, boolean forceUpdate) { - SysTenantEntity tenant = sysTenantService.getOne(Wrappers.lambdaQuery(SysTenantEntity.class).eq(SysTenantEntity::getAppId, appId)); - if (Objects.isNull(tenant)) { - throw new CustomException("该APPID未查询到相关租户"); - } - if (StringUtils.isEmpty(tenant.getSecret())) { - throw new CustomException("公众号秘钥不能为空"); - } - return getAccessToken(appId, tenant.getSecret(), forceUpdate); - } - - public String getAccessToken(String appId, String secret, boolean forceUpdate) { - WxMpService wxMpService = this.proxyWxMpService(appId, secret); - try { - return wxMpService.getAccessToken(forceUpdate); - } catch (WxErrorException e) { - log.error(e.getMessage(), e); - throw new RuntimeException(e); - } - } - - private WxMpService proxyWxMpService(String appId, String secret) { - WxMpMapConfigImpl config = new WxMpMapConfigImpl(); - config.setAppId(appId); - config.setSecret(secret); - config.setUseStableAccessToken(true); - mpService.addConfigStorage(appId, config); - return mpService.switchoverTo(appId); - } - - public String getOauth2Url(String url) { - if (StringUtils.isEmpty(url)) { - throw new RuntimeException("oauth url不能为空"); - } - return mpService.getOAuth2Service().buildAuthorizationUrl(url, "snsapi_userinfo", "mystate"); - } - - // public String oauth2Callback(String code, String appId) { - // if (StringUtils.isEmpty(code)) { - // throw new RuntimeException("授权码不能为空"); - // } - // synchronized (code.intern()) { - // String openId; - // String key = "mpOauth2code:" + code; - // Object cacheObject = redisCache.getCacheObject(key); - // WxOAuth2UserInfo userInfo = null; - // if (Objects.nonNull(cacheObject)) { - // openId = cacheObject.toString(); - // } else { - // // 通过code换取accessToken - // WxOAuth2AccessToken accessTokenResult; - // try { - // accessTokenResult = mpService.getOAuth2Service().getAccessToken(code); - // userInfo = mpService.getOAuth2Service().getUserInfo(accessTokenResult, null); - // } catch (WxErrorException e) { - // throw new RuntimeException(e); - // } - // openId = accessTokenResult.getOpenId(); - // } - // // 返回token 和 userInfo - // SysUser user = userMapper.selectOne(Wrappers.lambdaQuery(SysUser.class).eq(SysUser::getOpenid, openId).eq(SysUser::getDelFlag, "0")); - // if (Objects.isNull(user)) { - // user = new SysUser(); - // user.setOpenid(openId); - // user.setUserName("mp" + RandomUtil.randomString(6)); - // user.setNickName(userInfo.getNickname()); - // user.setAvartar(userInfo.getHeadImgUrl()); - // user.setAvartar(userInfo.getSex()); - // user.setPassword(SecurityUtils.encryptPassword("123456")); - // userMapper.insert(user); - // } - // // 制作token - // LoginUser loginUser = new LoginUser(user.getUserId(), user.getDeptId(), user, new LinkedHashSet<>()); - // String token = tokenService.createToken(loginUser); - // redisCache.setCacheObject(key, openId, 1, TimeUnit.HOURS); - // return Constants.TOKEN_PREFIX + token; - // } - //} -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMsgService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMsgService.java deleted file mode 100644 index ee716e6..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxMsgService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.starry.admin.modules.weichat.service; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.IService; -import com.starry.admin.modules.weichat.entity.WxMsg; -import com.starry.admin.modules.weichat.entity.WxMsgVO; - -/** - * 微信消息 - * - * @author admin - * @since 2019-05-28 16:12:10 - */ -public interface WxMsgService extends IService { - - /** - * 获取分组后的消息列表 - * - * @param page - * @param wxMsgVO - * @return - */ - IPage listWxMsgMapGroup(Page page, WxMsgVO wxMsgVO); -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java new file mode 100644 index 0000000..d1faf11 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxOauthService.java @@ -0,0 +1,143 @@ +package com.starry.admin.modules.weichat.service; + + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import com.starry.admin.common.exception.CustomException; +import com.starry.admin.modules.clear.module.entity.PlayClerkUserInfoEntity; +import com.starry.admin.modules.clear.service.IPlayClerkUserInfoService; +import com.starry.admin.modules.custom.module.entity.PlayCustomUserInfoEntity; +import com.starry.admin.modules.custom.service.IPlayCustomUserInfoService; +import com.starry.common.utils.ConvertUtil; +import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.bean.WxOAuth2UserInfo; +import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.api.WxMpService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Slf4j +@Service +public class WxOauthService { + + + @Resource + private WxMpService wxMpService; + + + @Resource + private IPlayCustomUserInfoService customUserInfoService; + + @Resource + private IPlayClerkUserInfoService clerkUserInfoService; + + @Resource + private WxTokenService tokenService; + + + public String clarkUserLogin(String code) { + WxOAuth2AccessToken token = getWxOAuth2AccessToken(code); + String openId = getOpenId(token); + WxOAuth2UserInfo userInfo = new WxOAuth2UserInfo(); + PlayClerkUserInfoEntity item = clerkUserInfoService.selectByOpenid(openId); + if (item == null) { + PlayClerkUserInfoEntity entity = ConvertUtil.entityToVo(userInfo, PlayClerkUserInfoEntity.class); + entity.setAvatar(userInfo.getHeadImgUrl()); + entity.setId(IdUtil.fastSimpleUUID()); + clerkUserInfoService.create(entity); + return entity.getId(); + } else { + item.setAvatar(userInfo.getHeadImgUrl()); + clerkUserInfoService.update(item); + return item.getId(); + } + } + + + public void clarkUserLogout(PlayClerkUserInfoEntity entity) { + entity.setToken("empty"); + clerkUserInfoService.update(entity); + } + + + public void customUserLogout(PlayCustomUserInfoEntity entity) { + entity.setToken("empty"); + customUserInfoService.update(entity); + } + + + public String customUserLogin(String code) { + WxOAuth2AccessToken token = getWxOAuth2AccessToken(code); + String openId = getOpenId(token); + WxOAuth2UserInfo userInfo = getWxOAuth2UserInfo(token); + PlayCustomUserInfoEntity entity = new PlayCustomUserInfoEntity(); + ConvertUtil.entityToVo(userInfo, PlayClerkUserInfoEntity.class); + entity.setAvatar(userInfo.getHeadImgUrl()); + PlayCustomUserInfoEntity item = customUserInfoService.selectByOpenid(openId); + entity.setId(item != null ? item.getId() : IdUtil.fastSimpleUUID()); + customUserInfoService.saveOrUpdate(entity); + return entity.getId(); + } + + + /** + * 获取微信授权Token + * + * @param code code + * @return WxOAuth2AccessToken + * @author admin + * @since 2024/4/8 14:47 + **/ + public WxOAuth2AccessToken getWxOAuth2AccessToken(String code) { + if (StrUtil.isBlankIfStr(code)) { + throw new CustomException("不能为空"); + } + synchronized (code.intern()) { + try { + return wxMpService.getOAuth2Service().getAccessToken(code); + } catch (WxErrorException e) { + throw new RuntimeException(e); + } + } + } + + /** + * 获取微信用户ID + * + * @param token code + * @return WxOAuth2AccessToken + * @author admin + * @since 2024/4/8 14:47 + **/ + public String getOpenId(WxOAuth2AccessToken token) { + if (token == null) { + throw new CustomException("获取微信授权异常,WxOAuth2AccessToken不能为空"); + } + String openId = token.getOpenId(); + if (StrUtil.isBlankIfStr(openId)) { + throw new CustomException("获取微信授权异常,openId不能为空"); + } + return openId; + } + + /** + * 获取微信用户ID + * + * @param token WxOAuth2AccessToken + * @return WxOAuth2UserInfo + * @author admin + * @since 2024/4/8 14:47 + **/ + public WxOAuth2UserInfo getWxOAuth2UserInfo(WxOAuth2AccessToken token) { + if (token == null) { + throw new CustomException("获取微信授权异常,WxOAuth2AccessToken不能为空"); + } + try { + return wxMpService.getOAuth2Service().getUserInfo(token, null); + } catch (WxErrorException e) { + throw new RuntimeException(e); + } + } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxTokenService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxTokenService.java new file mode 100644 index 0000000..b23bca0 --- /dev/null +++ b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxTokenService.java @@ -0,0 +1,226 @@ +package com.starry.admin.modules.weichat.service; + +import cn.hutool.core.date.DateUtil; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * token验证处理 + * + * @author ruoyi + */ +@Slf4j +@Service +public class WxTokenService { + // 令牌自定义标识 + @Value("${token.header}") + private String header; + + // 令牌秘钥 + @Value("${token.secret}") + private String secret; + + // 令牌有效期(默认30分钟) + @Value("${token.expireTime}") + private int expireTime; + + protected static final long MILLIS_SECOND = 1000; + + protected static final long MILLIS_MINUTE = 60 * MILLIS_SECOND; + + private static final Long MILLIS_MINUTE_TEN = 20 * 60 * 1000L; +// +// @Autowired +// private RedisCache redisCache; + +// /** +// * 获取用户身份信息 +// * +// * @return 用户信息 +// */ +// public LoginUser getLoginUser(HttpServletRequest request) { +// // 获取请求携带的令牌 +// String token = getToken(request); +// if (StringUtils.isNotEmpty(token)) { +// try { +// Claims claims = parseToken(token); +// // 解析对应的权限以及用户信息 +// String uuid = (String) claims.get(Constants.LOGIN_USER_KEY); +// String userKey = getTokenKey(uuid); +// LoginUser user = redisCache.getCacheObject(userKey); +// return user; +// } catch (Exception e) { +// } +// } +// return null; +// } +// +// +// /** +// * 设置用户身份信息 +// */ +// public void setLoginUser(LoginUser loginUser) { +// if (StringUtils.isNotNull(loginUser) && StringUtils.isNotEmpty(loginUser.getToken())) { +// refreshToken(loginUser); +// } +// } +// +// /** +// * 删除用户身份信息 +// */ +// public void delLoginUser(String token) { +// if (StringUtils.isNotEmpty(token)) { +// String userKey = getTokenKey(token); +// redisCache.deleteObject(userKey); +// } +// } +// +// /** +// * 创建令牌 +// * +// * @param loginUser 用户信息 +// * @return 令牌 +// */ +// public String createToken(LoginUser loginUser) { +// String token = IdUtils.fastUUID(); +// loginUser.setToken(token); +// setUserAgent(loginUser); +// refreshToken(loginUser); +// +// Map claims = new HashMap<>(); +// claims.put(Constants.LOGIN_USER_KEY, token); +// return createToken(claims); +// } + + // 小程序端-委托人 + public String createMiniUserToken(String miniUserId) { + if (Objects.isNull(miniUserId)) { + throw new RuntimeException("用户id不能为空"); + } + Map claims = new HashMap<>(); + claims.put(Constants.LOGIN_USER_KEY_MINI, miniUserId); + return Jwts.builder().setClaims(claims).setExpiration(DateUtil.offsetMinute(new Date(), expireTime)).signWith(SignatureAlgorithm.HS512, secret).compact(); + } + + // 小程序端-委托人 + public String getMiniUserIdByToken(String token) { + if (StringUtils.isEmpty(token)) { + throw new RuntimeException("token不能为空"); + } + Claims claims = parseToken(token); + return claims.get(Constants.LOGIN_USER_KEY_MINI).toString(); + } +// +// // 小程序端-coser +// public String createMiniCoserToken(Long miniCoserId) { +// if (Objects.isNull(miniCoserId)) { +// throw new RuntimeException("用户id不能为空"); +// } +// Map claims = new HashMap<>(); +// claims.put(Constants.LOGIN_USER_KEY_COSER, miniCoserId); +// return Jwts.builder().setClaims(claims).setExpiration(DateUtil.offsetMinute(new Date(), expireTime)).signWith(SignatureAlgorithm.HS512, secret).compact(); +// } +// +// // 小程序端-coser +// public Long getMiniCoserIdByToken(String token) { +// if (StringUtils.isEmpty(token)) { +// throw new RuntimeException("token不能为空"); +// } +// Claims claims = parseToken(token); +// String userId = claims.get(Constants.LOGIN_USER_KEY_COSER).toString(); +// return Long.parseLong(userId); +// } +// +// +// /** +// * 验证令牌有效期,相差不足20分钟,自动刷新缓存 +// * +// * @param loginUser +// * @return 令牌 +// */ +// public void verifyToken(LoginUser loginUser) { +// long expireTime = loginUser.getExpireTime(); +// long currentTime = System.currentTimeMillis(); +// if (expireTime - currentTime <= MILLIS_MINUTE_TEN) { +// refreshToken(loginUser); +// } +// } +// +// /** +// * 刷新令牌有效期 +// * +// * @param loginUser 登录信息 +// */ +// public void refreshToken(LoginUser loginUser) { +// loginUser.setLoginTime(System.currentTimeMillis()); +// loginUser.setExpireTime(loginUser.getLoginTime() + expireTime * MILLIS_MINUTE); +// // 根据uuid将loginUser缓存 +// String userKey = getTokenKey(loginUser.getToken()); +// redisCache.setCacheObject(userKey, loginUser, expireTime, TimeUnit.MINUTES); +// } +// +// +// /** +// * 设置用户代理信息 +// * +// * @param loginUser 登录信息 +// */ +// public void setUserAgent(LoginUser loginUser) { +// UserAgent userAgent = UserAgent.parseUserAgentString(ServletUtils.getRequest().getHeader("User-Agent")); +// String ip = IpUtils.getIpAddr(); +// loginUser.setIpaddr(ip); +// loginUser.setLoginLocation(AddressUtils.getRealAddressByIP(ip)); +// loginUser.setBrowser(userAgent.getBrowser().getName()); +// loginUser.setOs(userAgent.getOperatingSystem().getName()); +// } +// +// /** +// * 从数据声明生成令牌 +// * +// * @param claims 数据声明 +// * @return 令牌 +// */ +// private String createToken(Map claims) { +// String token = Jwts.builder().setClaims(claims).signWith(SignatureAlgorithm.HS512, secret).compact(); +// return token; +// } +// + + /** + * 从令牌中获取数据声明 + * + * @param token 令牌 + * @return 数据声明 + */ + private Claims parseToken(String token) { + return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); + } +// +// /** +// * 获取请求token +// * +// * @param request +// * @return token +// */ +// private String getToken(HttpServletRequest request) { +// String token = request.getHeader(header); +// if (StringUtils.isNotEmpty(token) && token.startsWith(Constants.TOKEN_PREFIX)) { +// token = token.replace(Constants.TOKEN_PREFIX, ""); +// } +// return token; +// } +// +// private String getTokenKey(String uuid) { +// return CacheConstants.LOGIN_TOKEN_KEY + uuid; +// } +} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxUserService.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxUserService.java deleted file mode 100644 index 71b4fd7..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/WxUserService.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.starry.admin.modules.weichat.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.starry.admin.modules.weichat.entity.WxUser; -import me.chanjar.weixin.common.error.WxErrorException; - -/** - * 微信用户 - * - * @author admin - * @since 2019-03-25 15:39:39 - */ -public interface WxUserService extends IService { - - /** - * 同步微信用户 - */ - void synchroWxUser() throws WxErrorException; - - /** - * 修改用户备注 - * - * @param entity - * @return - */ - boolean updateRemark(WxUser entity) throws WxErrorException; - - /** - * 认识标签 - * - * @param taggingType - * @param tagId - * @param openIds - * @throws WxErrorException - */ - void tagging(String taggingType, Long tagId, String[] openIds) throws WxErrorException; - - /** - * 根据openId获取用户 - * - * @param openId - * @return - */ - WxUser getByOpenId(String openId); -} - diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxAutoReplyServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxAutoReplyServiceImpl.java deleted file mode 100644 index 72ec61d..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxAutoReplyServiceImpl.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.starry.admin.modules.weichat.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.starry.admin.modules.weichat.entity.WxAutoReply; -import com.starry.admin.modules.weichat.mapper.WxAutoReplyMapper; -import com.starry.admin.modules.weichat.service.WxAutoReplyService; -import org.springframework.stereotype.Service; - -/** - * 消息自动回复 - * - * @author admin - * @since 2019-04-18 15:40:39 - */ -@Service -public class WxAutoReplyServiceImpl extends ServiceImpl implements WxAutoReplyService { - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxMenuServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxMenuServiceImpl.java deleted file mode 100644 index 3a0efc4..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxMenuServiceImpl.java +++ /dev/null @@ -1,163 +0,0 @@ -package com.starry.admin.modules.weichat.service.impl; - -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.starry.admin.modules.weichat.config.CommonConstants; -import com.starry.admin.modules.weichat.entity.Menu; -import com.starry.admin.modules.weichat.entity.MenuButton; -import com.starry.admin.modules.weichat.entity.WxMenu; -import com.starry.admin.modules.weichat.mapper.WxMenuMapper; -import com.starry.admin.modules.weichat.service.WxMenuService; -import lombok.AllArgsConstructor; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; - -/** - * 自定义菜单 - * - * @author admin - * @since 2019-03-27 16:52:10 - */ -@Service -@AllArgsConstructor -public class WxMenuServiceImpl extends ServiceImpl implements WxMenuService { - private final WxMpService wxService; - - /*** - * 获取WxApp下的菜单树结构 - * @return - */ - @Override - public String getWxMenuButton() { - // 查出一级菜单 - List listWxMenu = baseMapper.selectList(Wrappers - .query().lambda() - .eq(WxMenu::getParentId, CommonConstants.PARENT_ID).orderByAsc(WxMenu::getSort)); - Menu menu = new Menu(); - List listMenuButton = new ArrayList<>(); - MenuButton menuButton; - List subButtons; - MenuButton subButton; - if (listWxMenu != null && !listWxMenu.isEmpty()) { - for (WxMenu wxMenu : listWxMenu) { - menuButton = new MenuButton(); - menuButton.setName(wxMenu.getName()); - String type = wxMenu.getType(); - if (StringUtils.isNotBlank(type)) {// 无二级菜单 - menuButton.setType(type); - setButtonValue(menuButton, wxMenu); - } else {// 有二级菜单 - // 查出二级菜单 - List listWxMenu1 = baseMapper.selectList(Wrappers - .query().lambda() - .eq(WxMenu::getParentId, wxMenu.getId()).orderByAsc(WxMenu::getSort)); - subButtons = new ArrayList<>(); - for (WxMenu wxMenu1 : listWxMenu1) { - subButton = new MenuButton(); - String type1 = wxMenu1.getType(); - subButton.setName(wxMenu1.getName()); - subButton.setType(type1); - setButtonValue(subButton, wxMenu1); - subButtons.add(subButton); - } - menuButton.setSub_button(subButtons); - } - listMenuButton.add(menuButton); - } - } - menu.setButton(listMenuButton); - return menu.toString(); - } - - void setButtonValue(MenuButton menuButton, WxMenu wxMenu) { - menuButton.setKey(wxMenu.getId()); - menuButton.setUrl(wxMenu.getUrl()); - menuButton.setContent(wxMenu.getContent()); - menuButton.setRepContent(wxMenu.getRepContent()); - menuButton.setMedia_id(wxMenu.getRepMediaId()); - menuButton.setRepType(wxMenu.getRepType()); - menuButton.setRepName(wxMenu.getRepName()); - menuButton.setAppid(wxMenu.getMaAppId()); - menuButton.setPagepath(wxMenu.getMaPagePath()); - menuButton.setUrl(wxMenu.getUrl()); - menuButton.setRepUrl(wxMenu.getRepUrl()); - menuButton.setRepHqUrl(wxMenu.getRepHqUrl()); - menuButton.setRepDesc(wxMenu.getRepDesc()); - menuButton.setRepThumbMediaId(wxMenu.getRepThumbMediaId()); - menuButton.setRepThumbUrl(wxMenu.getRepThumbUrl()); - } - - /** - * 保存并发布菜单 - * - * @param - */ - @Override - @Transactional(rollbackFor = Exception.class) - public void saveAndRelease(String strWxMenu) throws WxErrorException { - Menu menu = Menu.fromJson(strWxMenu); - List buttons = menu.getButton(); - // 先删除 - baseMapper.delete(Wrappers - .query().lambda()); - WxMenu wxMenu = null; - WxMenu wxMenu1 = null; - int sort1 = 1; - int sort2 = 1; - // 入库 - for (MenuButton menuButton : buttons) { - wxMenu = new WxMenu(); - setWxMenuValue(wxMenu, menuButton); - wxMenu.setSort(sort1); - wxMenu.setParentId(CommonConstants.PARENT_ID); - baseMapper.insert(wxMenu); - menuButton.setKey(wxMenu.getId()); - sort1++; - for (MenuButton menuButton1 : menuButton.getSub_button()) { - wxMenu1 = new WxMenu(); - setWxMenuValue(wxMenu1, menuButton1); - wxMenu1.setSort(sort2); - wxMenu1.setParentId(wxMenu.getId()); - baseMapper.insert(wxMenu1); - menuButton1.setKey(wxMenu1.getId()); - sort2++; - } - } - // 创建菜单 - wxService.getMenuService().menuCreate(menu.toString()); - } - - void setWxMenuValue(WxMenu wxMenu, MenuButton menuButton) { - wxMenu.setId(menuButton.getKey()); - wxMenu.setType(menuButton.getType()); - wxMenu.setName(menuButton.getName()); - wxMenu.setUrl(menuButton.getUrl()); - wxMenu.setRepMediaId(menuButton.getMedia_id()); - wxMenu.setRepType(menuButton.getRepType()); - wxMenu.setRepName(menuButton.getRepName()); - wxMenu.setMaAppId(menuButton.getAppid()); - wxMenu.setMaPagePath(menuButton.getPagepath()); - wxMenu.setRepContent(menuButton.getRepContent()); - wxMenu.setContent(menuButton.getContent()); - wxMenu.setRepUrl(menuButton.getRepUrl()); - wxMenu.setRepHqUrl(menuButton.getRepHqUrl()); - wxMenu.setRepDesc(menuButton.getRepDesc()); - wxMenu.setRepThumbMediaId(menuButton.getRepThumbMediaId()); - wxMenu.setRepThumbUrl(menuButton.getRepThumbUrl()); - menuButton.setRepUrl(null); - menuButton.setRepDesc(null); - menuButton.setRepHqUrl(null); - menuButton.setContent(null); - menuButton.setRepContent(null); - menuButton.setRepType(null); - menuButton.setRepName(null); - menuButton.setRepThumbMediaId(null); - menuButton.setRepThumbUrl(null); - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxMsgServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxMsgServiceImpl.java deleted file mode 100644 index 3b3d07b..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxMsgServiceImpl.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.starry.admin.modules.weichat.service.impl; - -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.starry.admin.modules.weichat.entity.WxMsg; -import com.starry.admin.modules.weichat.entity.WxMsgVO; -import com.starry.admin.modules.weichat.mapper.WxMsgMapper; -import com.starry.admin.modules.weichat.service.WxMsgService; -import org.springframework.stereotype.Service; - -/** - * 微信消息 - * - * @author admin - * @since 2019-05-28 16:12:10 - */ -@Service -public class WxMsgServiceImpl extends ServiceImpl implements WxMsgService { - - @Override - public IPage listWxMsgMapGroup(Page page, WxMsgVO vo) { - -// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); -// if (StrUtil.isBlankIfStr(vo.getType())) { -// queryWrapper.eq(WxMsg::getType, vo.getType()); -// } -// if (StrUtil.isBlankIfStr(vo.getReadFlag())) { -// queryWrapper.eq(WxMsg::getReadFlag, vo.getReadFlag()); -// } -// if (StrUtil.isBlankIfStr(vo.getRepType())) { -// queryWrapper.eq(WxMsg::getRepType, vo.getRepType()); -// } - - return baseMapper.listWxMsgMapGroup(page, vo); - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxUserServiceImpl.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxUserServiceImpl.java deleted file mode 100644 index c45d50b..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/service/impl/WxUserServiceImpl.java +++ /dev/null @@ -1,174 +0,0 @@ -package com.starry.admin.modules.weichat.service.impl; - -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.starry.admin.modules.weichat.constant.ConfigConstant; -import com.starry.admin.modules.weichat.entity.WxUser; -import com.starry.admin.modules.weichat.handler.SubscribeHandler; -import com.starry.admin.modules.weichat.mapper.WxUserMapper; -import com.starry.admin.modules.weichat.service.WxUserService; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.mp.api.WxMpService; -import me.chanjar.weixin.mp.api.WxMpUserService; -import me.chanjar.weixin.mp.api.WxMpUserTagService; -import me.chanjar.weixin.mp.bean.result.WxMpUser; -import me.chanjar.weixin.mp.bean.result.WxMpUserList; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * 微信用户 - * - * @author admin - * @since 2019-03-25 15:39:39 - */ -@Slf4j -@Service -@AllArgsConstructor -public class WxUserServiceImpl extends ServiceImpl implements WxUserService { - - private final WxMpService wxService; - private final RedisTemplate redisTemplate; - - @Override - @Transactional(rollbackFor = Exception.class) - public boolean updateRemark(WxUser entity) throws WxErrorException { - String id = entity.getId(); - String remark = entity.getRemark(); - String openId = entity.getOpenId(); - entity = new WxUser(); - entity.setId(id); - entity.setRemark(remark); - super.updateById(entity); - WxMpUserService wxMpUserService = wxService.getUserService(); - wxMpUserService.userUpdateRemark(openId, remark); - return true; - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void tagging(String taggingType, Long tagId, String[] openIds) throws WxErrorException { - WxMpUserTagService wxMpUserTagService = wxService.getUserTagService(); - WxUser wxUser; - if ("tagging".equals(taggingType)) { - for (String openId : openIds) { - wxUser = baseMapper.selectOne(Wrappers.lambdaQuery() - .eq(WxUser::getOpenId, openId)); - Long[] tagidList = wxUser.getTagidList(); - List list = Arrays.asList(tagidList); - list = new ArrayList<>(list); - if (!list.contains(tagId)) { - list.add(tagId); - tagidList = list.toArray(new Long[list.size()]); - wxUser.setTagidList(tagidList); - this.updateById(wxUser); - } - } - wxMpUserTagService.batchTagging(tagId, openIds); - } - if ("unTagging".equals(taggingType)) { - for (String openId : openIds) { - wxUser = baseMapper.selectOne(Wrappers.lambdaQuery() - .eq(WxUser::getOpenId, openId)); - Long[] tagidList = wxUser.getTagidList(); - List list = Arrays.asList(tagidList); - list = new ArrayList<>(list); - if (list.contains(tagId)) { - list.remove(tagId); - tagidList = list.toArray(new Long[list.size()]); - wxUser.setTagidList(tagidList); - this.updateById(wxUser); - } - } - wxMpUserTagService.batchUntagging(tagId, openIds); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void synchroWxUser() throws WxErrorException { - // 先将已关注的用户取关 - WxUser wxUser = new WxUser(); - wxUser.setSubscribe(ConfigConstant.SUBSCRIBE_TYPE_NO); - this.baseMapper.update(wxUser, Wrappers.lambdaQuery() - .eq(WxUser::getSubscribe, ConfigConstant.SUBSCRIBE_TYPE_YES)); - WxMpUserService wxMpUserService = wxService.getUserService(); - this.recursionGet(wxMpUserService, null); - } - - /** - * 递归获取 - * - * @param nextOpenid - */ - void recursionGet(WxMpUserService wxMpUserService, String nextOpenid) throws WxErrorException { - WxMpUserList userList = wxMpUserService.userList(nextOpenid); - List listWxUser = new ArrayList<>(); - List listWxMpUser = getWxMpUserList(wxMpUserService, userList.getOpenids()); - listWxMpUser.forEach(wxMpUser -> { - WxUser wxUser = baseMapper.selectOne(Wrappers.lambdaQuery() - .eq(WxUser::getOpenId, wxMpUser.getOpenId())); - if (wxUser == null) {// 用户未存在 - wxUser = new WxUser(); - wxUser.setSubscribeNum(1); - } - SubscribeHandler.setWxUserValue(wxUser, wxMpUser); - listWxUser.add(wxUser); - }); - this.saveOrUpdateBatch(listWxUser); - if (userList.getCount() >= 10000) { - this.recursionGet(wxMpUserService, userList.getNextOpenid()); - } - } - - /** - * 分批次获取微信粉丝信息 每批100条 - * - * @param wxMpUserService - * @param openidsList - * @return - * @throws WxErrorException - * @author - */ - private List getWxMpUserList(WxMpUserService wxMpUserService, List openidsList) throws WxErrorException { - // 粉丝openid数量 - int count = openidsList.size(); - if (count <= 0) { - return new ArrayList<>(); - } - List list = new ArrayList<>(); - List followersInfoList; - int a = count % 100 > 0 ? count / 100 + 1 : count / 100; - for (int i = 0; i < a; i++) { - if (i + 1 < a) { - log.debug("i:{},from:{},to:{}", i, i * 100, (i + 1) * 100); - followersInfoList = wxMpUserService.userInfoList(openidsList.subList(i * 100, ((i + 1) * 100))); - if (null != followersInfoList && !followersInfoList.isEmpty()) { - list.addAll(followersInfoList); - } - } else { - log.debug("i:{},from:{},to:{}", i, i * 100, count - i * 100); - followersInfoList = wxMpUserService.userInfoList(openidsList.subList(i * 100, count)); - if (null != followersInfoList && !followersInfoList.isEmpty()) { - list.addAll(followersInfoList); - } - } - } - log.debug("本批次获取微信粉丝数:{}", list.size()); - return list; - } - - @Override - public WxUser getByOpenId(String openId) { - return this.baseMapper.selectOne(Wrappers.lambdaQuery() - .eq(WxUser::getOpenId, openId)); - } - -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/FileUtils.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/FileUtils.java deleted file mode 100644 index 3228006..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/FileUtils.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.starry.admin.modules.weichat.utils; - -import cn.hutool.core.lang.UUID; -import org.springframework.web.multipart.MultipartFile; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.file.Files; - -/** - * file工具 - * - * @author admin - */ -public class FileUtils { - - /** - * 将MultipartFile转为File - * - * @param mulFile - * @return - */ - public static File multipartFileToFile(MultipartFile mulFile) throws IOException { - InputStream ins = mulFile.getInputStream(); - String fileName = mulFile.getOriginalFilename(); - String prefix = getFileNameNoEx(fileName) + UUID.fastUUID(); - String suffix = "." + getExtensionName(fileName); - File toFile = File.createTempFile(prefix, suffix); - OutputStream os = Files.newOutputStream(toFile.toPath()); - int bytesRead; - byte[] buffer = new byte[8192]; - while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) { - os.write(buffer, 0, bytesRead); - } - os.close(); - ins.close(); - return toFile; - } - - /** - * 获取文件扩展名 - */ - public static String getExtensionName(String filename) { - if ((filename != null) && (!filename.isEmpty())) { - int dot = filename.lastIndexOf('.'); - if ((dot > -1) && (dot < (filename.length() - 1))) { - return filename.substring(dot + 1); - } - } - return filename; - } - - /** - * 获取不带扩展名的文件名 - */ - public static String getFileNameNoEx(String filename) { - if ((filename != null) && (!filename.isEmpty())) { - int dot = filename.lastIndexOf('.'); - if (dot > -1) { - return filename.substring(0, dot); - } - } - return filename; - } -} \ No newline at end of file diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/JsonUtils.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/JsonUtils.java deleted file mode 100644 index 5739ced..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/JsonUtils.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.starry.admin.modules.weichat.utils; - -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -/** - * @author admin - */ -public class JsonUtils { - public static String toJson(Object obj) { - Gson gson = new GsonBuilder() - .setPrettyPrinting() - .create(); - return gson.toJson(obj); - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/LocalDateTimeUtils.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/LocalDateTimeUtils.java deleted file mode 100644 index 27098df..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/LocalDateTimeUtils.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.starry.admin.modules.weichat.utils; - -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.time.temporal.ChronoField; - -/** - * LocalDateTime时间工具 - * - * @author admin - */ -public class LocalDateTimeUtils { - - public static final String YYYY = "yyyy"; - public static final String YYYYMM = "yyyyMM"; - public static final String YYYYMMDD = "yyyyMMdd"; - public static final String YYYYMMDDHH = "yyyyMMddHH"; - public static final String YYYYMMDDHHMM = "yyyyMMddHHmm"; - public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; - public static final String YYYY_MM = "yyyy-MM"; - public static final String YYYY_MM_DD = "yyyy-MM-dd"; - public static final String YYYY_MM_DD_HH = "yyyy-MM-dd HH"; - public static final String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm"; - public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; - - private static final String BASE_TIME_FORMAT = "[yyyyMMddHHmmss][yyyyMMddHHmm][yyyyMMddHH][yyyyMMdd][yyyyMM][yyyy][[-][/][.]MM][[-][/][.]dd][ ][HH][[:][.]mm][[:][.]ss][[:][.]SSS]"; - - /** - * 【推荐】解析常用时间字符串,支持,并不局限于以下形式: - * [yyyy][yyyy-MM][yyyy-MM-dd][yyyy-MM-dd HH][yyyy-MM-dd HH:mm][yyyy-MM-dd HH:mm:ss][yyyy-MM-dd HH:mm:ss:SSS] - * [yyyy][yyyy/MM][yyyy/MM/dd][yyyy/MM/dd HH][yyyy/MM/dd HH:mm][yyyy/MM/dd HH:mm:ss][yyyy/MM/dd HH:mm:ss:SSS] - * [yyyy][yyyy.MM][yyyy.MM.dd][yyyy.MM.dd HH][yyyy.MM.dd HH.mm][yyyy.MM.dd HH.mm.ss][yyyy.MM.dd HH.mm.ss.SSS] - * [yyyy][yyyyMM][yyyyMMdd][yyyyMMddHH][yyyyMMddHHmm][yyyyMMddHHmmss] - * [MM-dd] - * 不支持yyyyMMddHHmmssSSS,因为本身DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS")就不支持这个形式 - * - * @param timeString - * @return - */ - public static LocalDateTime parse(String timeString) { - return LocalDateTime.parse(timeString, getDateTimeFormatterByPattern(BASE_TIME_FORMAT)); - } - - /** - * 根据传进来的pattern返回LocalDateTime,自动补齐 - * - * @param timeString - * @param pattern - * @return - */ - public static LocalDateTime parseByPattern(String timeString, String pattern) { - return LocalDateTime.parse(timeString, getDateTimeFormatterByPattern(pattern)); - } - - private static DateTimeFormatter getDateTimeFormatterByPattern(String pattern) { - return new DateTimeFormatterBuilder() - .appendPattern(pattern) - .parseDefaulting(ChronoField.YEAR_OF_ERA, LocalDateTime.now().getYear()) - .parseDefaulting(ChronoField.MONTH_OF_YEAR, LocalDateTime.now().getMonthValue()) - .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) - .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) - .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) - .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) - .parseDefaulting(ChronoField.NANO_OF_SECOND, 0) - .toFormatter(); - } - - /** - * 将timestamp转为LocalDateTime - * - * @param timestamp - * @return - */ - public static LocalDateTime timestamToDatetime(long timestamp) { - Instant instant = Instant.ofEpochMilli(timestamp); - return LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); - } - - /** - * 将LocalDataTime转为timestamp - * - * @param ldt - * @return - */ - public static long datatimeToTimestamp(LocalDateTime ldt) { - ZoneId zone = ZoneId.systemDefault(); - return ldt.atZone(zone).toInstant().toEpochMilli(); - } - -} \ No newline at end of file diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/ThirdSessionHolder.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/ThirdSessionHolder.java deleted file mode 100644 index b716a82..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/ThirdSessionHolder.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.starry.admin.modules.weichat.utils; - -import com.alibaba.ttl.TransmittableThreadLocal; -import com.starry.admin.modules.weichat.entity.ThirdSession; -import lombok.experimental.UtilityClass; - -/** - * @author thirdSession工具类 - */ -@UtilityClass -public class ThirdSessionHolder { - - private final ThreadLocal THREAD_LOCAL_THIRD_SESSION = new TransmittableThreadLocal<>(); - - /** - * 获取TTL中的thirdSession - * - * @return - */ - public ThirdSession getThirdSession() { - return THREAD_LOCAL_THIRD_SESSION.get(); - } - - /** - * TTL 设置thirdSession - * - * @param thirdSession - */ - public void setThirdSession(ThirdSession thirdSession) { - THREAD_LOCAL_THIRD_SESSION.set(thirdSession); - } - - public void clear() { - THREAD_LOCAL_THIRD_SESSION.remove(); - } - - - /** - * 获取用户商城ID - * - * @return - */ - public String getWxUserId() { - return THREAD_LOCAL_THIRD_SESSION.get().getWxUserId(); - } -} diff --git a/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/WxMpPropertiesUtils.java b/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/WxMpPropertiesUtils.java deleted file mode 100644 index b70f37d..0000000 --- a/play-admin/src/main/java/com/starry/admin/modules/weichat/utils/WxMpPropertiesUtils.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.starry.admin.modules.weichat.utils; - -import cn.hutool.core.util.StrUtil; -import com.starry.admin.modules.platform.entity.SysTenantEntity; -import com.starry.admin.modules.platform.service.ISysTenantService; -import com.starry.admin.modules.weichat.entity.CustomWxMpProperties; -import com.starry.common.context.CustomSecurityContextHolder; -import org.springframework.beans.factory.annotation.Autowired; - -public class WxMpPropertiesUtils { - - - private static ISysTenantService tenantService; - - public static CustomWxMpProperties getWeiChatProperties() { - CustomWxMpProperties properties = new CustomWxMpProperties(); - String tenantId = CustomSecurityContextHolder.getTenantId(); - if (StrUtil.isBlankIfStr(tenantId)) { - tenantId = "9999"; - } - if (tenantService == null) { - properties.setAppid("9999"); - properties.setAesKey("9999"); - properties.setToken("9999"); - properties.setSecret("9999"); - return properties; - } - SysTenantEntity entity = tenantService.getById(tenantId); - if (entity != null) { - properties.setAppid(entity.getAppId()); - properties.setAesKey(entity.getAesKey()); - properties.setToken(entity.getToken()); - properties.setSecret(entity.getSecret()); - } else { - properties.setAppid("9999"); - properties.setAesKey("9999"); - properties.setToken("9999"); - properties.setSecret("9999"); - } - return properties; - } - - @Autowired - public void setTenantService(ISysTenantService tenantService) { - WxMpPropertiesUtils.tenantService = tenantService; - } - -} diff --git a/play-admin/src/main/resources/application-test.yml b/play-admin/src/main/resources/application-test.yml index e958a70..31bf317 100644 --- a/play-admin/src/main/resources/application-test.yml +++ b/play-admin/src/main/resources/application-test.yml @@ -14,6 +14,8 @@ spring: username: root # 数据库对应的密码 password: KdaKRZ2trpdhNePa + # 批量插入 + rewriteBatchedStatements: true druid: enable: true db-type: mysql @@ -84,6 +86,15 @@ jwt: secret: yz-admin-secret #JWT加解密使用的密钥 expiration: 3600 #JWT的超期限时间秒(60*60*24) +# token配置 +token: + # 令牌自定义标识 + header: Authorization + # 令牌密钥 + secret: abcdefghijklmnopqrstuvwxyz + # 令牌有效期(默认30分钟) + expireTime: 43200 + # xl自定义配置 xl: login: @@ -92,3 +103,24 @@ xl: enable: false +wx: + # 消息模板ID + templateId: o9YG7vWS8It-mddU2Wnknf1jgzTqZtLeBQRLhF54SXQ + mp: + # 微信公众号的appid + appId: wx0683221d9c109406 + # 信公众号的app secret + secret: 2c0b67a538a1b5de352ec22ce6a69761 + # 微信公众号的toke + token: AkzAW8yqUhOWAFN550 + # 微信公众号的EncodingAESKey + aesKey: tsoM88UUQ5uEHJ29xgNiaHHaoswZapS5ijWpaN6hUZF + config-storage: + type: redisson + key-prefix: wx + redis: + host: 122.51.20.105 + port: 19087 + password: arcikXa7ZkEBGtLf + + diff --git a/play-common/src/main/java/com/starry/common/constant/Constants.java b/play-common/src/main/java/com/starry/common/constant/Constants.java index 3c02722..c8e48d7 100644 --- a/play-common/src/main/java/com/starry/common/constant/Constants.java +++ b/play-common/src/main/java/com/starry/common/constant/Constants.java @@ -51,8 +51,22 @@ public class Constants { */ public static final String LOGIN_FAIL = "Error"; + /** + * 令牌前缀 + */ + public static final String TOKEN_PREFIX = "Bearer "; + + public static final String CLERK_USER_LOGIN_TOKEN = "clerkusertoken"; + public static final String CUSTOM_USER_LOGIN_TOKEN = "customusertoken"; + /** * 令牌前缀 */ public static final String LOGIN_USER_KEY = "login_user_key"; + public static final String LOGIN_USER_KEY_MINI = "login_user_key_mini"; + public static final String LOGIN_USER_KEY_COSER = "login_user_key_coser"; + + + + } diff --git a/pom.xml b/pom.xml index dff507b..d110aa1 100644 --- a/pom.xml +++ b/pom.xml @@ -171,17 +171,18 @@ + + + com.github.binarywang + wx-java-mp-spring-boot-starter + ${weixin-java.version} + + com.github.binarywang weixin-java-common ${weixin-java.version} - - - com.github.binarywang - weixin-java-mp - ${weixin-java.version} - com.github.binarywang