From a663712947e5b7c6975e15f922e11e10e6f984e5 Mon Sep 17 00:00:00 2001 From: Stormeye Wu Date: Wed, 13 Mar 2019 11:01:05 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=BE=AE=E4=BF=A1=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E5=BC=80=E6=94=BE=E5=B9=B3=E5=8F=B0][=E6=96=B0=E5=A2=9E]:?= =?UTF-8?q?=E4=BB=8EformallProject=E8=BF=81=E7=A7=BBcode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mallinkService/pom.xml | 31 + .../com/iformall/common/CommonMapper.java | 16 + .../java/com/iformall/common/ErrorCode.java | 403 ++++++++ .../common/GlobalDefultExceptionHandler.java | 106 ++ .../java/com/iformall/common/IdWorker.java | 152 +++ .../main/java/com/iformall/common/Result.java | 32 + .../java/com/iformall/common/ResultData.java | 98 ++ .../iformall/domain/po/MallPermission.java | 242 +++++ .../java/com/iformall/domain/po/MallRole.java | 152 +++ .../com/iformall/domain/po/MallUserInfo.java | 326 ++++++ .../com/iformall/domain/po/WxAppinfo.java | 243 +++++ .../iformall/domain/po/WxAuthorizerInfo.java | 144 +++ .../domain/po/WxComponentVerifyTicket.java | 97 ++ .../com/iformall/domain/po/WxPayAccount.java | 211 ++++ .../com/iformall/domain/po/WxPayOrder.java | 315 ++++++ .../com/iformall/domain/po/WxTemplateMsg.java | 104 ++ .../domain/po/WxWeappAuditStatus.java | 101 ++ .../iformall/domain/po/WxWeappBasicSet.java | 109 ++ .../iformall/domain/po/WxWeappCodeStatus.java | 104 ++ .../com/iformall/domain/po/WxWeappExtSet.java | 105 ++ .../domain/po/WxWeappReleaseStatus.java | 99 ++ .../iformall/domain/vo/MallUserInfoVo.java | 46 + .../com/iformall/domain/vo/WxPayOrderVo.java | 39 + .../domain/vo/WxWeappAuditStatusVo.java | 14 + .../domain/vo/WxWeappCodeStatusVo.java | 14 + .../com/iformall/domain/vo/WxWeappInfo.java | 99 ++ .../domain/vo/WxWeappReleaseStatusVo.java | 14 + .../java/com/iformall/enums/EnumAppType.java | 40 + .../com/iformall/enums/EnumLoginType.java | 38 + .../iformall/enums/EnumMallUserStatus.java | 36 + .../com/iformall/enums/EnumTemplateType.java | 39 + .../com/iformall/enums/EnumUserWechat.java | 38 + .../iformall/enums/EnumWeappAuditStatus.java | 39 + .../enums/EnumWeappCodeCommitStatus.java | 38 + .../enums/EnumWeappReleaseStatus.java | 38 + .../enums/EnumWxAuthorizationInfoType.java | 38 + .../enums/EnumWxAuthorizationStatus.java | 38 + .../iformall/exception/MallinkException.java | 36 + .../iformall/mapper/MallPermissionMapper.java | 20 + .../iformall/mapper/MallUserInfoMapper.java | 38 + .../com/iformall/mapper/WxAppinfoMapper.java | 16 + .../mapper/WxAuthorizerInfoMapper.java | 21 + .../mapper/WxComponentVerifyTicketMapper.java | 16 + .../iformall/mapper/WxPayAccountMapper.java | 16 + .../com/iformall/mapper/WxPayOrderMapper.java | 13 + .../iformall/mapper/WxTemplateMsgMapper.java | 16 + .../mapper/WxWeappAuditStatusMapper.java | 24 + .../mapper/WxWeappBasicSetMapper.java | 16 + .../mapper/WxWeappCodeStatusMapper.java | 24 + .../iformall/mapper/WxWeappExtSetMapper.java | 16 + .../mapper/WxWeappReleaseStatusMapper.java | 24 + .../com/iformall/service/MailService.java | 131 +++ .../service/MallPermissionService.java | 62 ++ .../iformall/service/MallUserInfoService.java | 124 +++ .../iformall/service/WxAppinfoService.java | 71 ++ .../service/WxAuthorizerInfoService.java | 81 ++ .../WxComponentVerifyTicketService.java | 41 + .../service/WxTemplateMsgService.java | 55 + .../service/WxWeappAuditStatusService.java | 75 ++ .../service/WxWeappBasicSetService.java | 54 + .../service/WxWeappCodeStatusService.java | 75 ++ .../service/WxWeappExtSetService.java | 55 + .../service/WxWeappReleaseStatusService.java | 78 ++ .../impl/MallPermissionServiceImpl.java | 67 ++ .../service/impl/MallUserInfoServiceImpl.java | 138 +++ .../service/impl/WxAppinfoServiceImpl.java | 243 +++++ .../impl/WxAuthorizerInfoServiceImpl.java | 184 ++++ .../WxComponentVerifyTicketServiceImpl.java | 64 ++ .../impl/WxTemplateMsgServiceImpl.java | 67 ++ .../impl/WxWeappAuditStatusServiceImpl.java | 77 ++ .../impl/WxWeappBasicSetServiceImpl.java | 59 ++ .../impl/WxWeappCodeStatusServiceImpl.java | 79 ++ .../impl/WxWeappExtSetServiceImpl.java | 58 ++ .../impl/WxWeappReleaseStatusServiceImpl.java | 110 ++ .../java/com/iformall/utils/Constant.java | 8 + .../main/java/com/iformall/utils/IPUtil.java | 52 + .../java/com/iformall/utils/QRCodeUtils.java | 147 +++ .../resources/mapper/MallPermissionMapper.xml | 99 ++ .../resources/mapper/MallUserInfoMapper.xml | 264 +++++ .../main/resources/mapper/WxAppinfoMapper.xml | 107 ++ .../mapper/WxAuthorizerInfoMapper.xml | 234 +++++ .../mapper/WxComponentVerifyTicketMapper.xml | 52 + .../resources/mapper/WxPayAccountMapper.xml | 72 ++ .../resources/mapper/WxPayOrderMapper.xml | 178 ++++ .../resources/mapper/WxTemplateMsgMapper.xml | 68 ++ .../mapper/WxWeappAuditStatusMapper.xml | 135 +++ .../mapper/WxWeappBasicSetMapper.xml | 55 + .../mapper/WxWeappCodeStatusMapper.xml | 121 +++ .../resources/mapper/WxWeappExtSetMapper.xml | 54 + .../mapper/WxWeappReleaseStatusMapper.xml | 127 +++ mlWechatOpen/pom.xml | 61 ++ .../com/iformall/WechatOpenApplication.java | 41 + .../java/com/iformall/config/AwsProperty.java | 52 + .../com/iformall/config/KaptchaConfig.java | 32 + .../java/com/iformall/config/RedisConfig.java | 72 ++ .../com/iformall/config/RedisProperies.java | 124 +++ .../java/com/iformall/config/RestFilter.java | 58 ++ .../iformall/config/RestTemplateConfig.java | 24 + .../java/com/iformall/config/ShiroConfig.java | 303 ++++++ .../com/iformall/config/ShiroLoginFilter.java | 31 + .../java/com/iformall/config/WebConfig.java | 79 ++ .../iformall/config/WechatOpenProperties.java | 69 ++ .../iformall/controller/BaseController.java | 45 + .../iformall/controller/HomeController.java | 123 +++ .../controller/WechatAuthController.java | 102 ++ .../controller/WechatCalllbackController.java | 415 ++++++++ .../controller/WechatWeappCodeController.java | 544 ++++++++++ .../WechatWeappDraftTemplateController.java | 78 ++ .../WechatWeappMsgTemplateController.java | 135 +++ .../controller/WechatWeappSetController.java | 230 +++++ .../controller/WxWeappBasicSetController.java | 62 ++ .../controller/WxWeappExtSetController.java | 61 ++ .../controller/WxWeappInfoController.java | 952 ++++++++++++++++++ .../iformall/schedule/SchedulingConfig.java | 18 + .../schedule/UserUnionIdSchedule.java | 145 +++ .../wechat/WxOpenInRedisDBConfigStorage.java | 223 ++++ .../service/wechat/WxOpenService.java | 64 ++ .../shiro/MyRetryLimitCredentialsMatcher.java | 24 + .../java/com/iformall/shiro/MyShiroRealm.java | 90 ++ .../com/iformall/shiro/PasswordHelper.java | 32 + .../java/com/iformall/shiro/ShiroService.java | 126 +++ .../java/com/iformall/shiro/UserSession.java | 11 + .../com/iformall/shiro/UseriFormallToken.java | 39 + .../java/com/iformall/utils/ShiroUtils.java | 61 ++ .../src/main/resources/application-dev.yml | 93 ++ .../src/main/resources/application-prod.yml | 87 ++ .../src/main/resources/application.yml | 58 ++ .../src/main/resources/logback-spring.xml | 100 ++ pom.xml | 354 +++++++ 129 files changed, 13133 insertions(+) create mode 100644 mallinkService/pom.xml create mode 100644 mallinkService/src/main/java/com/iformall/common/CommonMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/common/ErrorCode.java create mode 100644 mallinkService/src/main/java/com/iformall/common/GlobalDefultExceptionHandler.java create mode 100644 mallinkService/src/main/java/com/iformall/common/IdWorker.java create mode 100644 mallinkService/src/main/java/com/iformall/common/Result.java create mode 100644 mallinkService/src/main/java/com/iformall/common/ResultData.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/MallPermission.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/MallRole.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/MallUserInfo.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxAppinfo.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxAuthorizerInfo.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxComponentVerifyTicket.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxTemplateMsg.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxWeappAuditStatus.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxWeappBasicSet.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxWeappCodeStatus.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxWeappExtSet.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/po/WxWeappReleaseStatus.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/vo/MallUserInfoVo.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/vo/WxPayOrderVo.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/vo/WxWeappAuditStatusVo.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/vo/WxWeappCodeStatusVo.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/vo/WxWeappInfo.java create mode 100644 mallinkService/src/main/java/com/iformall/domain/vo/WxWeappReleaseStatusVo.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumAppType.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumLoginType.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumMallUserStatus.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumTemplateType.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumUserWechat.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumWeappAuditStatus.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumWeappCodeCommitStatus.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumWeappReleaseStatus.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumWxAuthorizationInfoType.java create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumWxAuthorizationStatus.java create mode 100644 mallinkService/src/main/java/com/iformall/exception/MallinkException.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/MallPermissionMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/MallUserInfoMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxAppinfoMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxAuthorizerInfoMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxComponentVerifyTicketMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxPayAccountMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxPayOrderMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxTemplateMsgMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxWeappAuditStatusMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxWeappBasicSetMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxWeappCodeStatusMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxWeappExtSetMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/mapper/WxWeappReleaseStatusMapper.java create mode 100644 mallinkService/src/main/java/com/iformall/service/MailService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/MallPermissionService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxAppinfoService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxAuthorizerInfoService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxComponentVerifyTicketService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxTemplateMsgService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxWeappAuditStatusService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxWeappBasicSetService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxWeappCodeStatusService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxWeappExtSetService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/WxWeappReleaseStatusService.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/MallPermissionServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxAppinfoServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxAuthorizerInfoServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxComponentVerifyTicketServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxTemplateMsgServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxWeappAuditStatusServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxWeappBasicSetServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxWeappCodeStatusServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxWeappExtSetServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/service/impl/WxWeappReleaseStatusServiceImpl.java create mode 100644 mallinkService/src/main/java/com/iformall/utils/Constant.java create mode 100644 mallinkService/src/main/java/com/iformall/utils/IPUtil.java create mode 100644 mallinkService/src/main/java/com/iformall/utils/QRCodeUtils.java create mode 100644 mallinkService/src/main/resources/mapper/MallPermissionMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/MallUserInfoMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxAppinfoMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxAuthorizerInfoMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxComponentVerifyTicketMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxPayAccountMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxPayOrderMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxTemplateMsgMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxWeappAuditStatusMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxWeappBasicSetMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxWeappCodeStatusMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxWeappExtSetMapper.xml create mode 100644 mallinkService/src/main/resources/mapper/WxWeappReleaseStatusMapper.xml create mode 100644 mlWechatOpen/pom.xml create mode 100644 mlWechatOpen/src/main/java/com/iformall/WechatOpenApplication.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/config/AwsProperty.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/config/KaptchaConfig.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/config/RedisConfig.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/config/RedisProperies.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/config/RestFilter.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/config/RestTemplateConfig.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/config/ShiroConfig.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/config/ShiroLoginFilter.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/config/WebConfig.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/config/WechatOpenProperties.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/BaseController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/HomeController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/WechatAuthController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappCodeController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappDraftTemplateController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappMsgTemplateController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappSetController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/WxWeappBasicSetController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/WxWeappExtSetController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/controller/WxWeappInfoController.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/schedule/SchedulingConfig.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/schedule/UserUnionIdSchedule.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/service/wechat/WxOpenInRedisDBConfigStorage.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/service/wechat/WxOpenService.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/shiro/MyShiroRealm.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/shiro/PasswordHelper.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/shiro/ShiroService.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/shiro/UserSession.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/shiro/UseriFormallToken.java create mode 100644 mlWechatOpen/src/main/java/com/iformall/utils/ShiroUtils.java create mode 100644 mlWechatOpen/src/main/resources/application-dev.yml create mode 100644 mlWechatOpen/src/main/resources/application-prod.yml create mode 100644 mlWechatOpen/src/main/resources/application.yml create mode 100644 mlWechatOpen/src/main/resources/logback-spring.xml create mode 100644 pom.xml diff --git a/mallinkService/pom.xml b/mallinkService/pom.xml new file mode 100644 index 0000000..9dbdf87 --- /dev/null +++ b/mallinkService/pom.xml @@ -0,0 +1,31 @@ + + + + mallink + com.iformall + 1.0 + + 4.0.0 + + mallinkService + + + + + + org.flowable + flowable-spring-boot-starter-basic + 6.4.0 + + + + \ No newline at end of file diff --git a/mallinkService/src/main/java/com/iformall/common/CommonMapper.java b/mallinkService/src/main/java/com/iformall/common/CommonMapper.java new file mode 100644 index 0000000..cc76bf6 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/common/CommonMapper.java @@ -0,0 +1,16 @@ +package com.iformall.common; + +import tk.mybatis.mapper.common.BaseMapper; +import tk.mybatis.mapper.common.IdsMapper; +import tk.mybatis.mapper.common.Marker; +import tk.mybatis.mapper.common.special.InsertListMapper; + +import java.io.Serializable; + +/** + * @author chenkx + * @date 2017-12-27 + */ + +public interface CommonMapper extends BaseMapper, IdsMapper, InsertListMapper, Marker { +} diff --git a/mallinkService/src/main/java/com/iformall/common/ErrorCode.java b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java new file mode 100644 index 0000000..7dfba11 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/common/ErrorCode.java @@ -0,0 +1,403 @@ +package com.iformall.common; + +import java.text.MessageFormat; + +/** + * @author chenkx + * @date 2017-12-28. + */ +public enum ErrorCode{ + + /** + * 系统级别 + * 1000-1999 + */ + SYS_SERVER_ERROR(1000, "服务器请求异常"), + SYS_PARAMETER_ERROR(1001, "参数不合法"), + SYS_PARAMETER_NOT_NULL(1002, "参数不能为空"), + SYS_PARAMETER_TYPE_ERROR(1003, "参数类型异常"), + SYS_PARAMETER_CAST_ERROR(1004, "参数转换异常"), + SYS_PARAMETER_EMPTY_ERROR(1005, "参数转换异常"), + SYS_BEAN_EMPTY_PROPERTY_ERROR(1006, "实体转换异常"), + SYS_MEDIATYPE_NOT_SUPPORT(1007, "不支持的媒体类型"), + SYS_NULLPOINTER_ERROR(1008, "空指针异常"), + SYS_METHOD_NOT_SUPPORT(1009, "不支持的请求类型"), + SYS_CLASSCAST_ERROR(1010, "类型转换异常"), + SYS_NUMBER_FORMAT_ERROR(1011, "数字转化异常"), + SYS_EXTEND_JSON_ERROR(1012, "JSON格式异常"), + SYS_REPEAT_SUBMIT_EXCEPTION(1013, "请勿重复操作"), + + /** + * 数据库 + */ + DB_FAIL(1045, "数据库访问出错"), + + /** + * 网络 + */ + TOO_MANY_REQUEST(1050, "太多的请求访问"), + + LOGIN_DENIED(1051, "登录失败"), + NET_TOKEN_INVALID(1052, "TOKEN无效"), + NET_TOKEN_EMPTY(1053, "TOKEN不能为空"), + + + /** + * 业务级别 + */ + /** + * 用户2000-2099 + */ + USER_PASSWD_ERR(1987, "用户名或者密码错误"), + USER_IS_MULTI(1988, "有多个手机号,请联系富茂管理员"), + USER_IS_NOT_MEMBER(1989,"用户还未授权手机号成为会员"), + USER_PHONE_IS_NOT_FOUND(1990,"手机号不存在"), + USER_DEL_SELF(1991,"用户删除自己"), + USER_NOT_ADMIN(1992,"用户非超管"), + USER_NO_PERMISSION(1993,"用户无此权限"), + USER_USE_ROLE(1994,"用户使用此角色"), + USER_IS_EMPTY(2000, "用户不存在"), + PASSWORD_ERROR(2001, "密码错误"), + USER_IS_LOCKED(2003, "用户已经被禁用不能登录,请与管理员联系"), + NEW_USER_FAILD(2004, "创建新用户失败"), + BUSER_NOT_IN_APP(2005, "用户不是此app用户"), + KAPCHA_NOT_VALID(2006, "验证码已失效"), + KAPCHA_NOT_EQUAL(2007, "验证码不正确"), + USER_NAME_IS_FOUND(2008,"用户名已存在"), + USER_PHONE_IS_FOUND(2009,"手机号已存在"), + + + /** + * 商场/商户 + */ + MALL_INFO_NOT_FOUND(2010, "商场信息没找到"), + MERCHANT_INFO_NOT_FOUND(2011, "商户信息没找到"), + MERCHANT_INFO_NOT_EQUAL(2012, "商户信息不对应"), + MERCHANT_INFO_NOT_VALID(2013, "商户信息禁用"), + + + /** + * 券 + */ + COUPON_IS_EMPTY(2020, "此券不存在"), + COUPON_IS_NOT_FREE(2021, "此券不免费"), + COUPON_IS_TAKE_OFF(2022, "此券已作废"), + COUPON_IS_EXPIRED(2023, "此券已过期"), + COUPON_IS_SELL_OUT(2024, "此券已售罄"), + + COUPON_TYPE_IS_NOT_ACTIVE(2025, "此券不能用于主动领取"), + COUPON_TYPE_IS_NOT_PASSIVE(2026, "此券不能用于定向投放"), + COUPON_CHANNEL_IS_EXISTED(2027, "此券已投放过"), + COUPON_SEND_IS_EXISTED(2028, "此券已经添加到该渠道"), + COUPON_SEND_IS_INVALID(2029, "此发券渠道不存在"), + COUPON_SEND_IS_INVALID_TIME(2030, "发放时间不能晚于使用时间"), + COUPON_CHANNEL_IS_TAKE_OFF(2031, "此券已下架"), + COUPON_MERCHANT_NOT_FOUND(2032, "卡券关联商户未发现"), + COUPON_CHANNEL_IS_NOT_STARTED(2033, "此券活动未开始"), + COUPON_CHANNEL_IS_END(2033, "此券活动已结束"), + + PUSH_LIMIT_UP_TO_1DAYLIMIT(2040, "此用户一天内发券到达疲劳度限制"), + PUSH_LIMIT_UP_TO_COUPONLIMIT(2041, "此用户发此券到达疲劳度限制"), + PUSH_LIMIT_NOT_INRANG(2042, "不在疲劳度允许的时间段"), + /** + * 车流 2040 + */ + CAR_PARK_NOT_FOUND(2049, "车场未找到"), + CAR_VENDOR_NOT_SUPPORT(2050, "不支持的停车厂家"), + + ETCP_LOGIN_FAIL(2051, "ETCP共同登录失败"), + ETCP_BIND_FAIL(2052, "ETCP绑车牌失败"), + ETCP_UNBIND_FAIL(2053, "ETCP解绑车牌失败"), + ETCP_STOP_FEE_FAIL(2054, "ETCP停车费失败"), + ETCP_QUAN_TEMP_FAIL(2055, "ETCP优免券模板失败"), + ETCP_QUAN_SEND_FAIL(2056, "ETCP优免券发放失败"), + ETCP_CMD_FAIL(2057, "ETCP网络异常"), + + TJD_BIND_FAIL(2060,"TJD绑车牌失败"), + TJD_UNBIND_FAIL(2061,"TJD解绑车牌失败"), + TJD_STOP_FEE_FAIL(2062, "TJD停车费失败"), + TJD_DEDUCE_FEE_FAIL(2063, "TJD停车费抵扣失败"), + + /** + * 游戏 + */ + GAME_NOT_FOUND(2070, "游戏未找到"), + GAME_HAS_BEEN_LIMITED(2071, "游戏次数以达到上限"), + /** + * 订单 + */ + REMAIN_IS_EMPTY(3000, "库存不足"), + ORDER_IS_LIMITED(3001, "购买超限"), + ORDER_IS_FAIL(3002, "订单失败"), + ORDER_IS_NOT_FIND(3003, "订单不存在"), + ORDER_IS_NOT_PAY(3004, "订单已不能进行支付"), + ORDER_SAVE_ERR(3005,"订单保存失败"), + ORDER_UPDATE_ERR(3006,"订单更新失败"), + REMAIN_BACK_FAIL(3007, "库存恢复失败"), + ORDER_HAD_PAY(3008, "订单已支付"), + ORDER_HAD_CANCEL(3009, "订单已取消"), + ORDER_PRESS_IS_OVERTIME(3010, "砍价已过期"), + ORDER_PRESS_IS_COMPLETE(3011, "砍价已完成"), + + /** + * 卡券 + */ + COUPON_ORDER_SAVE_ERR(3999, "卡券保存失败"), + COUPON_ORDER_IS_NULL(4000, "卡券不存在"), + COUPON_ORDER_IS_USED(4001, "卡券已核销"), + COUPON_ORDER_IS_OVER_TIME(4002, "卡券已过期"), + COUPON_ORDER_IS_INVALID(4003, "卡券已经作废"), + COUPON_ORDER_BUSER_IS_NULL(4004, "卡券B端用户不存在"), + COUPON_ORDER_MERANT_IS_NULL(4005, "卡券商户不存在"), + COUPON_ORDER_IS_EARLIER_THAN_VALIDDATE(4006, "卡券使用期还未开始"), + COUPON_ORDER_IS_LATER_THAN_VALIDDATE(4007, "卡券使用期已结束"), + + /** + * 卡 + */ + CARD_IS_NOT_FOUND(9001, "优惠卡不存在"), + CARD_REMAIN_AMOUNT_IS_NOT_ENOUGH(9002, "优惠卡余额不足"), + CARD_IS_NOT_COST(9003, "优惠卡未消费,退款请用卡券退款,钱直接退回购买人手里"), + CARD_TRANSFERED(9004, "卡已被领取"), + CARD_TRANSFER_INVALID(9005, "卡转赠已失效"), + + /** + * 卡消费 + */ + CARD_SPEND_IS_PAID(9050, "卡消费已支付"), + + /** + * 砍价 + */ + COUPON_PRESS_HAD_FINISHED(9070, "砍价已完成"), + COUPON_PRESS_IS_OVERTIME(9071, "砍价已超时"), + COUPON_PRESS_IS_EXIST(9072, "此人已参与此次砍价"), + + + + + /** + * 微信 + */ + SESSION_KEY_DECODE_ERR(11001, "session_key/openId解密失败"), + NICK_NAME_DECODE_ERR(11002, "nickName,unionId解密失败"), + PHONE_DECODE_ERR(11003, "Phone解密失败"), + NICK_NAME_NOT_FOUND(11004, "nickName,unionId未授权"), + PHONE_NOT_FOUND(11005, "Phone未授权"), + PHONE_IS_ENCRYPTED(11006, "Phone已加密"), + TEMPLATE_SEND_FAILED(11007, "模板消息发送失败"), + WE_RUN_DATA_DECODE_ERR(11008, "运动信息解密失败"), + + + /** + * 支付 + */ + PAY_ORDER_REFUND(11994, "订单退款中"), + PAY_ORDER_PAYING(11995, "订单支付中"), + PAY_ORDER_NOT_PAY(11996, "订单未支付"), + PAY_ORDER_CLOSED(11997, "订单已关闭"), + PAY_ORDER_REVERSE(11998, "订单已撤销"), + PAY_ORDER_NOT_FOUND(12000, "支付订单不存在"), + PAY_ORDER_EXIST(12001, "支付订单已存在"), + PAY_ORDER_ERROR(12002, "支付订单异常"), + PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR(12003 , "支付验签失败"), + PAY_ORDER_IS_ZERO(12004, "支付订单金额为0"), + PAY_ORDER_IS_NOT_PAYMENT(12005, "不是支付订单"), + PREPAY_ID_IS_EMPTY(12006, "prepay_id是空值"), + PAY_ORDER_QUERY_ERROR(12007, "支付订单查询异常"), + + REFUND_ORDER_EXIST(12010, "退款订单已存在"), + REFUND_PAY_ORDER_IS_NOT_EXIST(12011, "退款支付订单不存在"), + REFUND_PAY_ORDER_IS_ZERO(12012, "退款支付订单金额为0"), + REFUND_ORDER_ERROR(12013, "退款订单异常"), + REFUND_ORDER_NOTIFY_CHECK_SIGN_ERROR(12014, "退款验签失败"), + REFUND_ORDER_BUSER_IS_NULL(12015, "B端用户不存在"), + REFUND_ORDER_BUSER_NOT_EQUAL(12016, "B端用户无操作权限"), + + APP_ID_NOT_FOUND(12020, "APPID没找到"), + MCH_INFO_NOT_FOUND(12021, "微信商户平台信息没找到"), + MCH_INFO_NOT_EQUAL(12022, "微信商户平台信息不对应"), + API_KEY_NOT_FOUND(12023, "支付密钥未配置"), + CERT_PATH_NOT_FOUND(12024, "双向证书未配置"), + + PROFIT_SHARING_REQUEST_FAILED(12030, "分账请求失败"), + PROFIT_SHARING_APPLY_FAILED(12031, "分账业务失败"), + PROFIT_SHARING_RETURN_INVALID(12032, "分账请求返回校验失败"), + PROFIT_SHARING_RECEIVER_INVALID(12033, "分账接受方查寻无效"), + PROFIT_SHARING_QUERY_REQUEST_FAILED(12034, "分账查询请求失败"), + PROFIT_SHARING_QUERY_APPLY_FAILED(12035, "分账查询业务失败"), + PROFIT_SHARING_QUERY_RETURN_INVALID(12036, "分账查询返回校验失败"), + PROFIT_SHARING_RECEIVER_ADD_FAILED(12037, "分账账户添加失败"), + PROFIT_SHARING_RECEIVER_DEL_FAILED(12038, "分账账户删除失败"), + PROFIT_SHARING_NUM_UP_LIMIT(12039, "分账次数超限"), + /** + * 核销 + */ + VERIFY_ERROR(12050, "核销异常"), + MSG_REPEAT_SEND(12061, "短信重新发送"), + + /** + * 解单 + */ + DALIY_REPORT_VOLUME_TODAY_NULL(12070, "今日解单不存在"), + DALIY_REPORT_VOLUME_WEEK_NULL(12071, "无解单数据"), + + /** + * 模板消息 + */ + TEMPLATE_NOT_FOUND(12090, "模板不存在"), + + /** + * + * 短信 + * + * */ + MSG_SERVER_NOT_FIND(12100,"您还未接入短信运营商,请联系平台管理员"), + MSG_TEMPLATE_REPEAT(12101,"您添加的短信模板已存在"), + MSG_SIGNATURE_CONTENT_ERROR(12102,"短信签名或内容错误"), + MSG_TEMPLATE_CREATE_ERROR(12103,"创建模板失败"), + MSG_VERIFY_CODE_NOT_FOUND(12104,"短信验证码不存在或失效"), + MSG_TEMPLATE_NOT_FOUND(12105,"短信模板不存在"), + MSG_REQUEST_PARAMS_ERROR(12106,"参数错误"), + MSG_SEND_ERROR(12107,"发送短信失败"), + MSG_METHOD_REQUEST_ERROR(12108,"接口请求错误"), + MSG_PHONE_NOT_FOUND(12109,"请输入手机号"), + MSG_SEND_WAY_CHOOSE_ERROR(12110,"请确定发送的方式"), + MSG_SUM_ZERO(12111,"短信数量为0"), + MSG_SUM_INSUFFICENT(12112,"短信数量不足"), + MSG_NO_VALID_PHONE(12113,"没有可以发送的手机号"), + MSG_SEND_INTERFACE_ERROR(12114,"短信运营商返回错误"), + /** + * 会员 + */ + MEM_IMPORT_ERR(13000, "模板导入失败,请检查数据,尝试重新导入"), + MEM_SCORE_NOT_ENOUGH(13001, "成长值不够扣减值"), + + /** + * 标签 + */ + TAGS_MATCHED_NULL(14000, "此标签没命中用户"), + + + /** + * 租赁合同 + * */ + RENT_CONTRACT_IS_NOT_FOUND(15000,"租赁合同不存在"), + RENT_CONTRACT_IS_TERMINATED(15001,"租赁合同已终止"), + RENT_CONTRACT_WITH_SHOP_IS_FOUND(15002,"店铺存在已关联的合同"), + /** + * 物业合同 + * */ + PROPERTY_CONTRACT_IS_NOT_FOUND(16000,"物业合同不存在"), + + /** + * 租赁账单 + * */ + BILL_RENT_IS_NOT_FOUND(17000,"租赁账单不存在"), + + /** + * 租赁押金账单 + * */ + + BILL_RENT_DEPOSIT_IS_NOT_FOUND(18000,"租赁押金账单不存在"), + + /** + * 物业账单 + * */ + + BILL_PROPERTY_IS_NOT_FOUND(19000,"物业账单不存在"), + + + /** + * 押金账单 + * */ + BILL_PROPERTY_DEPOSIT_IS_NOT_FOUND(20000,"物业押金账单不存在"), + BILL_OTHER_DEPOSIT_IS_NOT_FOUND(200001, "其他押金账单不存在"), + + /** + * 日常费用账单 + * */ + BILL_ROUTINE_IS_NOT_FOUND(21000,"账单不存在"), + BILL_UPDATE_FAILED(21001,"账单更新失败"), + BILL_OWE_ZERO(21002,"账单欠缴为0"), + BILL_PAY_ERROR(21003,"账单支付错误"), + + /** + * 商铺 + * */ + SHOP_IS_NOT_FOUND(22000,"商铺不存在"), + SHOP_IS_RENT(22001,"商铺已出租"), + + WIWIDE_INFO_NOT_FOUND(23001,"迈外迪信息未找到"), + WIWIDE_INFO_NOT_READY(23002,"迈外迪信息未就绪"), + + /** + * 审批流 + */ + FLOW_FAIL(24000, "审批流操作出错"), + FLOW_INST_NOT_EXIST(24001, "任务不存在"), + /** + * 微信第三方 + */ + WEAPP_APPID_NOT_AUTH(24100, "appid未授权"), + WEAPP_BASIC_SET_ERR(24101, "基础配置错误"), + WEAPP_BASIC_SET_DOMAIN_ERR(24102, "基础服务器域名配置错误"), + WEAPP_EXT_SET_ERR(24103, "扩展配置错误"), + WEAPP_CODE_COMMIT_ERR(24104, "code提交失败"), + WEAPP_AUDIT_ERR(24105, "提交审核失败"), + WEAPP_HAD_AUDITING(24106, "已有审核中"), + WEAPP_NOT_AUDITED(24107, "审核未通过"), + WEAPP_APP_RELEASEED(24108, "已发布"), + + WECHAT_LOGIN_KEY_OVERTIME(24130, "已过期"), + WECHAT_LOGIN_USER_SELECT(24131, "请选择要登录的用户"), + WECHAT_LOGIN_NOT_BIND(24132, "您的微信号未绑定,请登录后绑定"), + + /** + * 屏广告 + */ + SCREENAD_NOT_FOUND(25000, "屏广告未找到"), + + /** + * IOT设备 + */ + DEVICE_NOT_FOUND(26000, "设备未找到"), + DEVICE_ALREADY_EXIST(26001, "设备已经存在"), + DEVICE_QRCODE_GET_FAILED(26002, "微信二维码生成失败,请重试"), + /** + * 消息组件 + */ + MSG_MODEL_NOT_FOUND(27000, "找不到短信模板"), + MSG_CONFIG_NOT_FOUND(27001, "找不到短信配置"), + ; + + private int code; + private String message; + + ErrorCode(int code, String message) { + this.code = code; + this.message = message; + } + + public int getCode() { + return code; + } + + public String getMessage(Object... param) { + if (param.length == 0) { + return message; + } + return MessageFormat.format(message, param); + } + + public static ErrorCode getByCode(int code) { + ErrorCode[] values = ErrorCode.values(); + for (ErrorCode value : values) { + if (value.getCode() == code) { + return value; + } + + } + return null; + } +} diff --git a/mallinkService/src/main/java/com/iformall/common/GlobalDefultExceptionHandler.java b/mallinkService/src/main/java/com/iformall/common/GlobalDefultExceptionHandler.java new file mode 100644 index 0000000..69a88f6 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/common/GlobalDefultExceptionHandler.java @@ -0,0 +1,106 @@ +package com.iformall.common; + + +import com.iformall.exception.MallinkException; +import com.iformall.service.MailService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Enumeration; + +@ControllerAdvice +public class GlobalDefultExceptionHandler { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private boolean isFmException; + + @Autowired + private MailService mailService; + + @ExceptionHandler(Exception.class) + @ResponseBody + public ResultData defultExcepitonHandler(HttpServletRequest request, Exception e) { + log(e, request); + + if(isFmException) { + // 处理异常,发送邮件 + if(checkExceptionType(e)) { + // 某些异常不发邮件 + MallinkException me = (MallinkException)e; + return new ResultData(me.getErrorCode(),me.getMessage()); + } + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 + + StringBuilder sb = new StringBuilder(); + sb.append(df.format(new Date())); + sb.append("\n"); + sb.append(sw.toString()); + + String[] receivers = new String[] {"hupeng@iformall.com", "wuguoqiang@iformall.com", "gongbiao@iformall.com", "luozukai@iformall.com"}; + + //发送邮件 + mailService.sendSimpleMail(receivers, "请求地址:" + request.getRequestURL() + "异常", sb.toString()); + } + + if(checkExceptionType(e)) { + MallinkException me = (MallinkException)e; + return new ResultData(me.getErrorCode(),me.getMessage()); + }else { + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + + private void log(Exception ex, HttpServletRequest request) { + logger.error("************************异常开始*******************************"); + if(checkExceptionType(ex)) { + // 特殊异常不打印堆栈 + logger.error(ex.getMessage()); + logger.error("************************异常结束*******************************"); + return; + } + logger.error("请求地址:" + request.getRequestURL()); + logger.error("message:"+ ex.getMessage()); + Enumeration enumeration = request.getParameterNames(); + logger.error("请求参数"); + while (enumeration.hasMoreElements()) { + String name = enumeration.nextElement().toString(); + logger.error(name + "---" + request.getParameter(name)); + } + StackTraceElement[] error = ex.getStackTrace(); + for (StackTraceElement stackTraceElement : error) { + logger.error(stackTraceElement.toString()); + } + logger.error("************************异常结束*******************************"); + } + + private boolean checkExceptionType(Exception e) { + if(e instanceof MallinkException) { + MallinkException me = (MallinkException)e; + if(me.getErrorCode() == ErrorCode.NET_TOKEN_EMPTY.getCode() + || me.getErrorCode() == ErrorCode.NET_TOKEN_INVALID.getCode()) { + // token异常问题, 不发邮件 + return true; + } else if(me.getErrorCode() == ErrorCode.SYS_REPEAT_SUBMIT_EXCEPTION.getCode()) { + // 重复访问不打印异常消息 + return true; + } + } + return false; + } +} diff --git a/mallinkService/src/main/java/com/iformall/common/IdWorker.java b/mallinkService/src/main/java/com/iformall/common/IdWorker.java new file mode 100644 index 0000000..24197c9 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/common/IdWorker.java @@ -0,0 +1,152 @@ +package com.iformall.common; + +public class IdWorker { + // ==============================Fields=========================================== + /** 开始时间截 (2015-01-01) */ + private final long twepoch = 1489111610226L; + + /** 机器id所占的位数 */ + private final long workerIdBits = 5L; + + /** 数据标识id所占的位数 */ + private final long dataCenterIdBits = 5L; + + /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */ + private final long maxWorkerId = -1L ^ (-1L << workerIdBits); + + /** 支持的最大数据标识id,结果是31 */ + private final long maxDataCenterId = -1L ^ (-1L << dataCenterIdBits); + + /** 序列在id中占的位数 */ + private final long sequenceBits = 12L; + + /** 机器ID向左移12位 */ + private final long workerIdShift = sequenceBits; + + /** 数据标识id向左移17位(12+5) */ + private final long dataCenterIdShift = sequenceBits + workerIdBits; + + /** 时间截向左移22位(5+5+12) */ + private final long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits; + + /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */ + private final long sequenceMask = -1L ^ (-1L << sequenceBits); + + /** 工作机器ID(0~31) */ + private long workerId; + + /** 数据中心ID(0~31) */ + private long dataCenterId; + + /** 毫秒内序列(0~4095) */ + private long sequence = 0L; + + /** 上次生成ID的时间截 */ + private long lastTimestamp = -1L; + + ///////////////////////////////////////////////////////////////////////////////// + + private static class IdGenHolder { + private static final IdWorker instance = new IdWorker(); + } + + public static IdWorker get(){ + return IdGenHolder.instance; + } + + public IdWorker() { + this(0L, 0L); + } + + //==============================Constructors===================================== + /** + * 构造函数 + * @param workerId 工作ID (0~31) + * @param dataCenterId 数据中心ID (0~31) + */ + public IdWorker(long workerId, long dataCenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("workerId can't be greater than %d or less than 0", maxWorkerId)); + } + if (dataCenterId > maxDataCenterId || dataCenterId < 0) { + throw new IllegalArgumentException(String.format("dataCenterId can't be greater than %d or less than 0", maxDataCenterId)); + } + this.workerId = workerId; + this.dataCenterId = dataCenterId; + } + + // ==============================Methods========================================== + /** + * 获得下一个ID (该方法是线程安全的) + * @return SnowflakeId + */ + public synchronized long nextId() { + long timestamp = timeGen(); + + //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常 + if (timestamp < lastTimestamp) { + throw new RuntimeException( + String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } + + //如果是同一时间生成的,则进行毫秒内序列 + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & sequenceMask; + //毫秒内序列溢出 + if (sequence == 0) { + //阻塞到下一个毫秒,获得新的时间戳 + timestamp = tilNextMillis(lastTimestamp); + } + } + //时间戳改变,毫秒内序列重置 + else { + sequence = 0L; + } + + //上次生成ID的时间截 + lastTimestamp = timestamp; + + //移位并通过或运算拼到一起组成64位的ID + return ((timestamp - twepoch) << timestampLeftShift) // + | (dataCenterId << dataCenterIdShift) // + | (workerId << workerIdShift) // + | sequence; + } + + /** + * 阻塞到下一个毫秒,直到获得新的时间戳 + * @param lastTimestamp 上次生成ID的时间截 + * @return 当前时间戳 + */ + protected long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + /** + * 返回以毫秒为单位的当前时间 + * @return 当前时间(毫秒) + */ + protected long timeGen() { + return System.currentTimeMillis(); + } + + //==============================Test============================================= + /** 测试 */ + public static void main(String[] args) { + System.out.println(System.currentTimeMillis()); + final IdWorker idWorker = IdWorker.get(); + long startTime = System.nanoTime(); + for (int i = 0; i < 50000; i++) { + long id = idWorker.nextId(); + System.out.println(id); + System.out.println(String.valueOf(id)); + System.out.println(String.valueOf(id).length()); + } + System.out.println((System.nanoTime()-startTime)/1000000+"ms"); + } + + } \ No newline at end of file diff --git a/mallinkService/src/main/java/com/iformall/common/Result.java b/mallinkService/src/main/java/com/iformall/common/Result.java new file mode 100644 index 0000000..7543561 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/common/Result.java @@ -0,0 +1,32 @@ +package com.iformall.common; + + + +/** + * @author chenkx + * @date 2018-01-05. + */ +public class Result { + + public int code; + public String message; + public static final int SUCCESS = 200; + public static final int ERROR = 500; + public static final int UNLOGIN = 701; + + public Result() { + this.code = 200; + this.message = "success"; + } + + public Result(int code, String message) { + this.code = code; + this.message = message; + } + + public Result(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + } + +} diff --git a/mallinkService/src/main/java/com/iformall/common/ResultData.java b/mallinkService/src/main/java/com/iformall/common/ResultData.java new file mode 100644 index 0000000..9105243 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/common/ResultData.java @@ -0,0 +1,98 @@ +package com.iformall.common; + +import java.beans.BeanInfo; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author chenkx + * @date 2018-01-05. + */ +public class ResultData extends Result { + + public Object data; + + public ResultData() { + super(); + } + + public ResultData(Object data) { + this(); + this.data = data; + } + + + public static ResultData returnResultObject(int code) { + String value = ErrorCode.getByCode(code).getMessage(); + return new ResultData(code, value); + } + + + public ResultData(Enum[] ens) { + List> list = new ArrayList>(); + for (Enum en : ens) { + Map map = enumToMap(en); + list.add(map); + } + data = list; + } + + + private Map enumToMap(Enum en) { + Map map = new HashMap<>(); + try { + BeanInfo info = Introspector.getBeanInfo(en.getClass()); + PropertyDescriptor[] descriptors = info.getPropertyDescriptors(); + for (PropertyDescriptor property : descriptors) { + if (property.getPropertyType().getName().equals(Class.class.getName())) { + continue; + } + Object value = property.getReadMethod().invoke(en); + map.put(property.getName(), value); + } + } catch (Exception ex) { + throw new RuntimeException(ex); + } + return map; + } + + + public ResultData(int code, Exception e) { + super(code, e.toString()); + } + + + public ResultData(int code, String message) { + super(code, message); + } + + public ResultData(int code, String message, Object data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ResultData(ErrorCode errorCode, Object data) { + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + this.data = data; + } + + public ResultData(ErrorCode errorCode) { + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + } + + public HashMap toHashMap() { + HashMap map = new HashMap<>(3); + map.put("code", this.code); + map.put("message", this.message); + map.put("data", data); + return map; + } + +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/MallPermission.java b/mallinkService/src/main/java/com/iformall/domain/po/MallPermission.java new file mode 100644 index 0000000..493cb1d --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/MallPermission.java @@ -0,0 +1,242 @@ +package com.iformall.domain.po; + +import javax.persistence.*; +import javax.persistence.Transient; +import java.util.List; +import javax.persistence.Id; +import java.io.Serializable; + +@Table(name = "mall_permission") +public class MallPermission implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSortColumns() { + return sortColumns; + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + /*权限名称[LIKE]**/ + @io.swagger.annotations.ApiModelProperty(value="权限名称[LIKE]",name="name") + private String name; + @Transient + private String nameLike; + /*是否可用 Y/N**/ + @io.swagger.annotations.ApiModelProperty(value="是否可用 Y/N",name="available") + private String available; + /*父编号**/ + @io.swagger.annotations.ApiModelProperty(value="父编号",name="parentId") + private Long parentId; + /*父编号列表**/ + @io.swagger.annotations.ApiModelProperty(value="父编号列表",name="parentIds") + private String parentIds; + /*权限字符串[LIST]**/ + @io.swagger.annotations.ApiModelProperty(value="权限字符串[LIST]",name="permission") + private String permission; + @Transient + private List permissions; + /*资源类型0菜单 1,按钮**/ + @io.swagger.annotations.ApiModelProperty(value="资源类型0菜单 1,按钮",name="resourceType") + private String resourceType; + /*资源路径**/ + @io.swagger.annotations.ApiModelProperty(value="资源路径",name="url") + private String url; + /*排序[FROM][TO][GTE][GT][LTE][LT]**/ + @io.swagger.annotations.ApiModelProperty(value="排序[FROM][TO][GTE][GT][LTE][LT]",name="sort") + private Integer sort; + @Transient + private Integer sortFrom; + @Transient + private Integer sortTo; + @Transient + private Integer sortGte; + @Transient + private Integer sortGt; + @Transient + private Integer sortLte; + @Transient + private Integer sortLt; + public String getName() { + return name; + } + public void setName(String _name) { + name = _name; + } + public String getNameLike() { + return nameLike; + } + public void setNameLike( String _nameLike) { + nameLike = _nameLike; + } + public String getAvailable() { + return available; + } + public void setAvailable(String _available) { + available = _available; + } + public Long getParentId() { + return parentId; + } + public void setParentId(Long _parentId) { + parentId = _parentId; + } + public String getParentIds() { + return parentIds; + } + public void setParentIds(String _parentIds) { + parentIds = _parentIds; + } + public String getPermission() { + return permission; + } + public void setPermission(String _permission) { + permission = _permission; + } + public List getPermissions() { + return permissions; + } + public void setPermissions( List _permissions) { + permissions = _permissions; + } + public String getResourceType() { + return resourceType; + } + public void setResourceType(String _resourceType) { + resourceType = _resourceType; + } + public String getUrl() { + return url; + } + public void setUrl(String _url) { + url = _url; + } + public Integer getSort() { + return sort; + } + public void setSort(Integer _sort) { + sort = _sort; + } + public Integer getSortFrom() { + return sortFrom; + } + public void setSortFrom( Integer _sortFrom) { + sortFrom = _sortFrom; + } + public Integer getSortTo() { + return sortTo; + } + public void setSortTo( Integer _sortTo) { + sortTo = _sortTo; + } + public Integer getSortGte() { + return sortGte; + } + public void setSortGte( Integer _sortGte) { + sortGte = _sortGte; + } + public Integer getSortGt() { + return sortGt; + } + public void setSortGt( Integer _sortGt) { + sortGt = _sortGt; + } + public Integer getSortLte() { + return sortLte; + } + public void setSortLte( Integer _sortLte) { + sortLte = _sortLte; + } + public Integer getSortLt() { + return sortLt; + } + public void setSortLt( Integer _sortLt) { + sortLt = _sortLt; + } + + + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,Name_ASC("`name` ASC"),Name_DESC("`name` DESC") + ,Available_ASC("`available` ASC"),Available_DESC("`available` DESC") + ,ParentId_ASC("`parentId` ASC"),ParentId_DESC("`parentId` DESC") + ,ParentIds_ASC("`parentIds` ASC"),ParentIds_DESC("`parentIds` DESC") + ,Permission_ASC("`permission` ASC"),Permission_DESC("`permission` DESC") + ,ResourceType_ASC("`resourceType` ASC"),ResourceType_DESC("`resourceType` DESC") + ,Url_ASC("`url` ASC"),Url_DESC("`url` DESC") + ,Sort_ASC("`sort` ASC"),Sort_DESC("`sort` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(MallPermission.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/MallRole.java b/mallinkService/src/main/java/com/iformall/domain/po/MallRole.java new file mode 100644 index 0000000..fe8013e --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/MallRole.java @@ -0,0 +1,152 @@ +package com.iformall.domain.po; + +import javax.persistence.*; +import javax.persistence.Transient; +import java.util.List; +import javax.persistence.Id; +import java.io.Serializable; + +@Table(name = "mall_role") +public class MallRole implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSortColumns() { + return sortColumns; + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + + + /*租户ID**/ + @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") + private String tenantId; + /*角色名称**/ + @io.swagger.annotations.ApiModelProperty(value="角色名称",name="name") + private String name; + /*是否可用 0可用 1不可用**/ + @io.swagger.annotations.ApiModelProperty(value="是否可用 0可用 1不可用",name="available") + private String available; + /*角色描述**/ + @io.swagger.annotations.ApiModelProperty(value="角色描述",name="description") + private String description; + + @Transient + private String menus; + + public String getMenus() { + return menus; + } + + public void setMenus(String menus) { + this.menus = menus; + } + + public String getTenantId() { + return tenantId; + } + public void setTenantId(String _tenantId) { + tenantId = _tenantId; + } + public String getName() { + return name; + } + public void setName(String _name) { + name = _name; + } + public String getAvailable() { + return available; + } + public void setAvailable(String _available) { + available = _available; + } + public String getDescription() { + return description; + } + public void setDescription(String _description) { + description = _description; + } + + + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,TenantId_ASC("`tenantId` ASC"),TenantId_DESC("`tenantId` DESC") + ,Name_ASC("`name` ASC"),Name_DESC("`name` DESC") + ,Available_ASC("`available` ASC"),Available_DESC("`available` DESC") + ,Description_ASC("`description` ASC"),Description_DESC("`description` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(MallRole.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/MallUserInfo.java b/mallinkService/src/main/java/com/iformall/domain/po/MallUserInfo.java new file mode 100644 index 0000000..33ab0c9 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/MallUserInfo.java @@ -0,0 +1,326 @@ +package com.iformall.domain.po; + +import com.iformall.enums.EnumUserWechat; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Table(name = "mall_user_info") +@Data +public class MallUserInfo implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSortColumns() { + return sortColumns; + } + + public List getIds() { + return ids; + } + public void setIds(List ids) { + this.ids = ids; + } + + + + /**租户ID**/ + @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") + private String tenantId; + /**登录用户名**/ + @io.swagger.annotations.ApiModelProperty(value="登录用户名",name="username") + private String username; + /**用户名称**/ + @io.swagger.annotations.ApiModelProperty(value="用户名称",name="name") + private String name; + /**密码**/ + @io.swagger.annotations.ApiModelProperty(value="密码",name="password") + private String password; + /**创建时间**/ + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createTime") + private Date createTime; + /**最后登录时间**/ + @io.swagger.annotations.ApiModelProperty(value="最后登录时间",name="lastLoginTime") + private Date lastLoginTime; + /**1:有效,0:禁止登录**/ + @io.swagger.annotations.ApiModelProperty(value="1:有效,0:禁止登录",name="status") + private Integer status; + /**0 不是超管 1是超管**/ + @io.swagger.annotations.ApiModelProperty(value="0 不是超管 1是超管",name="isAdmin") + private Integer isAdmin; + @io.swagger.annotations.ApiModelProperty(value="昵称",name="nickName") + private String nickName; + + @io.swagger.annotations.ApiModelProperty(value="手机,系统内手机号唯一",name="phone") + private String phone; + + @io.swagger.annotations.ApiModelProperty(value="B端用户微信openid,领导看数据塔台用",name="bopenId") + private String bopenId; + + @io.swagger.annotations.ApiModelProperty(value="admin用户微信登录用,可绑定多个账户",name="webOpenId") + private String webOpenId; + + @io.swagger.annotations.ApiModelProperty(value="1 未绑定wechat,0 绑定微信",name="withWechat") + @Transient + private Integer withWechat; + + @Transient + private Long roleId; + + @Transient + private String roleName; + //该用户所有的角色 + @Transient + private List role; + //该用户包含的所有权限 + @Transient + private List permission; + //拥有的菜单权限 + @Transient + private String menus; + + @Transient + private String captcha; + + /**1合同审批 2账单审批**/ + @io.swagger.annotations.ApiModelProperty(value="1合同审批 2账单审批",name="flowPermission") + private String flowPermission; + + public String getFlowPermission() { + return flowPermission; + } + + public void setFlowPermission(String flowPermission) { + this.flowPermission = flowPermission; + } + + public String getMenus() { + return menus; + } + + public void setMenus(String menus) { + this.menus = menus; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getTenantId() { + return tenantId; + } + public void setTenantId(String _tenantId) { + tenantId = _tenantId; + } + public String getUsername() { + return username; + } + public void setUsername(String _username) { + username = _username; + } + public String getName() { + return name; + } + public void setName(String _name) { + name = _name; + } + public String getPassword() { + return password; + } + public void setPassword(String _password) { + password = _password; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date _createTime) { + createTime = _createTime; + } + public Date getLastLoginTime() { + return lastLoginTime; + } + public void setLastLoginTime(Date _lastLoginTime) { + lastLoginTime = _lastLoginTime; + } + public Integer getStatus() { + return status; + } + public void setStatus(Integer _status) { + status = _status; + } + public Integer getIsAdmin() { + return isAdmin; + } + public void setIsAdmin(Integer _isAdmin) { + isAdmin = _isAdmin; + } + public List getRole() { + return role; + } + + public void setRole(List role) { + this.role = role; + } + + public List getPermission() { + return permission; + } + + public void setPermission(List permission) { + this.permission = permission; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public String getCaptcha() { + return captcha; + } + + public void setCaptcha(String captcha) { + this.captcha = captcha; + } + + public Integer getWithWechat() { + if(StringUtils.isNotBlank(this.webOpenId)) { + this.withWechat = EnumUserWechat.HAD.getCode(); + } else { + this.withWechat = EnumUserWechat.NO.getCode(); + } + return this.withWechat; + } + + public void setWithWechat(Integer withWechat) { + this.withWechat = withWechat; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getBopenId() { + return bopenId; + } + + public void setBopenId(String bopenId) { + this.bopenId = bopenId; + } + + public String getWebOpenId() { + return webOpenId; + } + + public void setWebOpenId(String webOpenId) { + this.webOpenId = webOpenId; + } + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,TenantId_ASC("`tenant_id` ASC"),TenantId_DESC("`tenant_id` DESC") + ,Username_ASC("`username` ASC"),Username_DESC("`username` DESC") + ,Name_ASC("`name` ASC"),Name_DESC("`name` DESC") + ,Password_ASC("`password` ASC"),Password_DESC("`password` DESC") + ,CreateTime_ASC("`create_time` ASC"),CreateTime_DESC("`create_time` DESC") + ,LastLoginTime_ASC("`last_login_time` ASC"),LastLoginTime_DESC("`last_login_time` DESC") + ,Status_ASC("`status` ASC"),Status_DESC("`status` DESC") + ,IsAdmin_ASC("`is_admin` ASC"),IsAdmin_DESC("`is_admin` DESC") + ,NickName_ASC("`nick_name` ASC"),NickName_DESC("`nick_name` DESC") + ,Phone_ASC("`phone` ASC"),Phone_DESC("`phone` DESC") + ,BOpenId_ASC("`bopen_id` ASC"),BOpenId_DESC("`bopen_id` DESC") + ,WebOpenId_ASC("`web_open_id` ASC"),WebOpenId_DESC("`web_open_id` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(MallUserInfo.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + this.sortColumns=sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + List fList = new ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxAppinfo.java b/mallinkService/src/main/java/com/iformall/domain/po/WxAppinfo.java new file mode 100644 index 0000000..f0b0f21 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxAppinfo.java @@ -0,0 +1,243 @@ +package com.iformall.domain.po; + +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +@Table(name = "wx_appinfo") +public class WxAppinfo implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSortColumns() { + return sortColumns; + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + + + /*租户ID**/ + @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") + private String tenantId; + /*小程序ID**/ + @io.swagger.annotations.ApiModelProperty(value="小程序ID",name="appId") + private String appId; + /*公众号ID**/ + @io.swagger.annotations.ApiModelProperty(value="公众号ID",name="parentAppId") + private String parentAppId; + /*小程序名**/ + @io.swagger.annotations.ApiModelProperty(value="小程序名",name="name") + private String name; + /*小程序secret**/ + @io.swagger.annotations.ApiModelProperty(value="小程序secret",name="secret") + private String secret; + /*消息token**/ + @io.swagger.annotations.ApiModelProperty(value="消息token",name="token") + private String token; + /*消息aeskey**/ + @io.swagger.annotations.ApiModelProperty(value="消息aeskey",name="aesKey") + private String aesKey; + /*消息类型**/ + @io.swagger.annotations.ApiModelProperty(value="消息类型",name="msgDataFormat") + private String msgDataFormat; + /*微信访问token**/ + @io.swagger.annotations.ApiModelProperty(value="微信访问token",name="accessToken") + private String accessToken; + /*上次生成accesstoken时间**/ + @io.swagger.annotations.ApiModelProperty(value="上次生成accesstoken时间",name="lastTokenTime") + private Date lastTokenTime; + /*微信token有效时间单位(秒)**/ + @io.swagger.annotations.ApiModelProperty(value="微信token有效时间单位(秒)",name="expiresIn") + private Integer expiresIn; + /*支付ID,参看wx_pay_account**/ + @io.swagger.annotations.ApiModelProperty(value="支付ID,参看wx_pay_account",name="payId") + private Long payId; + @io.swagger.annotations.ApiModelProperty(value="1B端2C端",name="type") + private Integer type; + @io.swagger.annotations.ApiModelProperty(value="支付ID,参看wx_pay_account_bill",name="payBillId") + private Long payBillId; + + public Long getPayBillId() { + return payBillId; + } + + public void setPayBillId(Long payBillId) { + this.payBillId = payBillId; + } + + public String getTenantId() { + return tenantId; + } + public void setTenantId(String _tenantId) { + tenantId = _tenantId; + } + public String getAppId() { + return appId; + } + public void setAppId(String _appId) { + appId = _appId; + } + public String getParentAppId() { + return parentAppId; + } + + public void setParentAppId(String parentAppId) { + this.parentAppId = parentAppId; + } + public String getName() { + return name; + } + public void setName(String _name) { + name = _name; + } + public String getSecret() { + return secret; + } + public void setSecret(String _secret) { + secret = _secret; + } + public String getToken() { + return token; + } + public void setToken(String _token) { + token = _token; + } + public String getAesKey() { + return aesKey; + } + public void setAesKey(String _aesKey) { + aesKey = _aesKey; + } + public String getMsgDataFormat() { + return msgDataFormat; + } + public void setMsgDataFormat(String _msgDataFormat) { + msgDataFormat = _msgDataFormat; + } + public String getAccessToken() { + return accessToken; + } + public void setAccessToken(String _accessToken) { + accessToken = _accessToken; + } + public Date getLastTokenTime() { + return lastTokenTime; + } + public void setLastTokenTime(Date _lastTokenTime) { + lastTokenTime = _lastTokenTime; + } + public Integer getExpiresIn() { + return expiresIn; + } + public void setExpiresIn(Integer _expiresIn) { + expiresIn = _expiresIn; + } + public Long getPayId() { + return payId; + } + public void setPayId(Long _payId) { + payId = _payId; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,TenantId_ASC("`tenant_id` ASC"),TenantId_DESC("`tenant_id` DESC") + ,AppId_ASC("`app_id` ASC"),AppId_DESC("`app_id` DESC") + ,ParentAppId_ASC("`parent_app_id` ASC"),ParentAppId_DESC("`parent_app_id` DESC") + ,Name_ASC("`name` ASC"),Name_DESC("`name` DESC") + ,Secret_ASC("`secret` ASC"),Secret_DESC("`secret` DESC") + ,Token_ASC("`token` ASC"),Token_DESC("`token` DESC") + ,AesKey_ASC("`aesKey` ASC"),AesKey_DESC("`aesKey` DESC") + ,MsgDataFormat_ASC("`msg_data_format` ASC"),MsgDataFormat_DESC("`msg_data_format` DESC") + ,AccessToken_ASC("`access_token` ASC"),AccessToken_DESC("`access_token` DESC") + ,LastTokenTime_ASC("`last_token_time` ASC"),LastTokenTime_DESC("`last_token_time` DESC") + ,ExpiresIn_ASC("`expires_in` ASC"),ExpiresIn_DESC("`expires_in` DESC") + ,PayId_ASC("`pay_id` ASC"),PayId_DESC("`pay_id` DESC") + ,Type_ASC("`type` ASC"),Type_DESC("`type` DESC") + + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxAppinfo.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + this.sortColumns = sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxAuthorizerInfo.java b/mallinkService/src/main/java/com/iformall/domain/po/WxAuthorizerInfo.java new file mode 100644 index 0000000..dad1ab0 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxAuthorizerInfo.java @@ -0,0 +1,144 @@ +package com.iformall.domain.po; + +import lombok.Data; +import javax.persistence.*; +import java.util.*; +import javax.persistence.Transient; +import java.util.List; +import javax.persistence.Id; +import java.io.Serializable; + +@Table(name = "wx_authorizer_info") +@Data +public class WxAuthorizerInfo implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + @io.swagger.annotations.ApiModelProperty(value="授权方appid",name="authorizerAppid") + private String authorizerAppid; + @io.swagger.annotations.ApiModelProperty(value="授权方头像",name="headImg") + private String headImg; + @io.swagger.annotations.ApiModelProperty(value="授权方公众号所设置的微信号,可能为空",name="alias") + private String alias; + @io.swagger.annotations.ApiModelProperty(value="二维码图片的URL,开发者最好自行也进行保存",name="qrcodeUrl") + private String qrcodeUrl; + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createTime") + private Date createTime; + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateTime") + private Date updateTime; + @io.swagger.annotations.ApiModelProperty(value="授权状态,0为已授权,1为已取消授权",name="authorizationStatus") + private Integer authorizationStatus; + @io.swagger.annotations.ApiModelProperty(value="授权时间",name="authTime") + private Date authTime; + @io.swagger.annotations.ApiModelProperty(value="微信基础版本设置状态,0为已设置,1为设置失败",name="baseStatus") + private Integer baseStatus; + @io.swagger.annotations.ApiModelProperty(value="微信基础版本设置时间",name="baseTime") + private Date baseTime; + @io.swagger.annotations.ApiModelProperty(value="微信服务器域名版本设置状态,0为已设置,1为设置失败",name="domainStatus") + private Integer domainStatus; + @io.swagger.annotations.ApiModelProperty(value="微信服务器域名版本设置时间",name="domainTime") + private Date domainTime; + @io.swagger.annotations.ApiModelProperty(value="微信服务器业务域名版本设置状态,0为已设置,1为设置失败",name="webdomainStatus") + private Integer webdomainStatus; + @io.swagger.annotations.ApiModelProperty(value="微信服务器业务域名版本设置时间",name="webdomainTime") + private Date webdomainTime; + @io.swagger.annotations.ApiModelProperty(value="微信小程序模板设置状态,0为已设置,1为设置失败",name="templateStatus") + private Integer templateStatus; + @io.swagger.annotations.ApiModelProperty(value="微信小程序模板设置时间",name="templateTime") + private Date templateTime; + @io.swagger.annotations.ApiModelProperty(value="当前版本",name="currentVersion") + private String currentVersion; + @io.swagger.annotations.ApiModelProperty(value="当前版本描述",name="currentDesc") + private String currentDesc; + @io.swagger.annotations.ApiModelProperty(value="当前版本发布时间",name="releaseTime") + private Date releaseTime; + @io.swagger.annotations.ApiModelProperty(value="微信开放平台appId",name="openAppid") + private String openAppid; + @io.swagger.annotations.ApiModelProperty(value="绑定开发平台时间",name="bindOpenTime") + private Date bindOpenTime; + + + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,AuthorizerAppid_ASC("`authorizer_appid` ASC"),AuthorizerAppid_DESC("`authorizer_appid` DESC") + ,HeadImg_ASC("`head_img` ASC"),HeadImg_DESC("`head_img` DESC") + ,Alias_ASC("`alias` ASC"),Alias_DESC("`alias` DESC") + ,QrcodeUrl_ASC("`qrcode_url` ASC"),QrcodeUrl_DESC("`qrcode_url` DESC") + ,CreateTime_ASC("`create_time` ASC"),CreateTime_DESC("`create_time` DESC") + ,UpdateTime_ASC("`update_time` ASC"),UpdateTime_DESC("`update_time` DESC") + ,AuthorizationStatus_ASC("`authorization_status` ASC"),AuthorizationStatus_DESC("`authorization_status` DESC") + ,AuthTime_ASC("`auth_time` ASC"),AuthTime_DESC("`auth_time` DESC") + ,BaseStatus_ASC("`base_status` ASC"),BaseStatus_DESC("`base_status` DESC") + ,BaseTime_ASC("`base_time` ASC"),BaseTime_DESC("`base_time` DESC") + ,DomainStatus_ASC("`domain_status` ASC"),DomainStatus_DESC("`domain_status` DESC") + ,DomainTime_ASC("`domain_time` ASC"),DomainTime_DESC("`domain_time` DESC") + ,WebDomainStatus_ASC("`webdomain_status` ASC"),WebDomainStatus_DESC("`webdomain_status` DESC") + ,WebDomainTime_ASC("`webdomain_time` ASC"),WebDomainTime_DESC("`webdomain_time` DESC") + ,TemplateStatus_ASC("`template_status` ASC"),TemplateStatus_DESC("`template_status` DESC") + ,TemplateTime_ASC("`template_time` ASC"),TemplateTime_DESC("`template_time` DESC") + ,CurrentVersion_ASC("`current_version` ASC"),CurrentVersion_DESC("`current_version` DESC") + ,CurrentDesc_ASC("`current_desc` ASC"),CurrentDesc_DESC("`current_desc` DESC") + ,ReleaseTime_ASC("`release_time` ASC"),ReleaseTime_DESC("`release_time` DESC") + ,OpenAppId_ASC("`open_appid` ASC"),OpenAppId_DESC("`open_appid` DESC") + ,BindOpenTime_ASC("`bind_open_time` ASC"),BindOpen_DESC("`bind_open_time` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxAuthorizerInfo.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + this.sortColumns = sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxComponentVerifyTicket.java b/mallinkService/src/main/java/com/iformall/domain/po/WxComponentVerifyTicket.java new file mode 100644 index 0000000..f31a85f --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxComponentVerifyTicket.java @@ -0,0 +1,97 @@ +package com.iformall.domain.po; + +import lombok.Data; +import javax.persistence.*; +import java.util.*; +import javax.persistence.Transient; +import java.util.List; +import javax.persistence.Id; +import java.io.Serializable; + +@Table(name = "wx_component_verify_ticket") +@Data +public class WxComponentVerifyTicket implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + /**微信第三方componentAppid*/ + @io.swagger.annotations.ApiModelProperty(value="微信第三方componentAppid",name="componentAppid") + private String componentAppid; + /**微信第三方component_verify_ticket*/ + @io.swagger.annotations.ApiModelProperty(value="微信第三方component_verify_ticket",name="componentVerifyTicket") + private String componentVerifyTicket; + /**创建时间*/ + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createTime") + private Date createTime; + /**失效时间*/ + @io.swagger.annotations.ApiModelProperty(value="失效时间",name="deadline") + private Date deadline; + + + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,ComponentAppid_ASC("`component_appid` ASC"),ComponentAppid_DESC("`component_appid` DESC") + ,ComponentVerifyTicket_ASC("`component_verify_ticket` ASC"),ComponentVerifyTicket_DESC("`component_verify_ticket` DESC") + ,CreateTime_ASC("`create_time` ASC"),CreateTime_DESC("`create_time` DESC") + ,Deadline_ASC("`deadline` ASC"),Deadline_DESC("`deadline` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxComponentVerifyTicket.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + this.sortColumns = sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java b/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java new file mode 100644 index 0000000..7629bff --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxPayAccount.java @@ -0,0 +1,211 @@ +package com.iformall.domain.po; + +import javax.persistence.*; +import javax.persistence.Transient; +import java.util.List; +import javax.persistence.Id; +import java.io.Serializable; + +@Table(name = "wx_pay_account") +public class WxPayAccount implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSortColumns() { + return sortColumns; + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + + /*租户ID**/ + @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") + private String tenantId; + /**微信商户号/特约服务商号**/ + @io.swagger.annotations.ApiModelProperty(value="微信商户号/特约服务商号",name="mchId") + private String mchId; + /**微信服务商号*/ + @io.swagger.annotations.ApiModelProperty(value="微信服务商号",name="subMchId") + private String subMchId; + /**支付密钥**/ + @io.swagger.annotations.ApiModelProperty(value="支付密钥",name="apiKey") + private String apiKey; + /**微信回调,支持3种回调,(1.url/pay 2.url/refund3.url/separate)**/ + @io.swagger.annotations.ApiModelProperty(value="微信回调,支持3种回调,(1.url/pay 2.url/refund3.url/separate)",name="notifyUrl") + private String notifyUrl; + /**证书本地存放位置**/ + @io.swagger.annotations.ApiModelProperty(value="证书本地存放位置",name="certPath") + private String certPath; + /**商户模式**/ + @io.swagger.annotations.ApiModelProperty(value="商户模式-0:普通商户模式1:服务商模式",name="type") + private Integer type; + /**是否开启分账**/ + @io.swagger.annotations.ApiModelProperty(value="0:未开启分账1:开启分账",name="type") + private Integer share; + /**手续费**/ + @io.swagger.annotations.ApiModelProperty(value="手续费",name="rate") + private Integer rate; + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getMchId() { + return mchId; + } + public void setMchId(String _mchId) { + mchId = _mchId; + } + + public String getSubMchId() { + return subMchId; + } + + public void setSubMchId(String subMchId) { + this.subMchId = subMchId; + } + + public String getApiKey() { + return apiKey; + } + public void setApiKey(String _apiKey) { + apiKey = _apiKey; + } + public String getNotifyUrl() { + return notifyUrl; + } + public void setNotifyUrl(String _notifyUrl) { + notifyUrl = _notifyUrl; + } + public String getCertPath() { + return certPath; + } + public void setCertPath(String _certPath) { + certPath = _certPath; + } + public Integer getType() { + return type; + } + public void setType(Integer type) { + this.type = type; + } + public Integer getShare() { + return share; + } + public void setShare(Integer share) { + this.share = share; + } + + public Integer getRate() { + return rate; + } + + public void setRate(Integer rate) { + this.rate = rate; + } + + public String getPayNotifyUrl() { + return notifyUrl + "/pay"; + } + public String getRefundNotifyUrl() { + return notifyUrl + "/refund"; + } + public String getSeparateNotifyUrl() { + return notifyUrl + "/separate"; + } + public String getSubsidyNotifyUrl() { + return notifyUrl + "/subsidyPay"; + } + + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,TenantId_ASC("`tenant_id` ASC"),TenantId_DESC("`tenant_id` DESC") + ,MchId_ASC("`mch_id` ASC"),MchId_DESC("`mch_id` DESC") + ,SubMchId_ASC("`sub_mch_id` ASC"),SubMchId_DESC("`sub_mch_id` DESC") + ,ApiKey_ASC("`api_key` ASC"),ApiKey_DESC("`api_key` DESC") + ,NotifyUrl_ASC("`notify_url` ASC"),NotifyUrl_DESC("`notify_url` DESC") + ,CertPath_ASC("`cert_path` ASC"),CertPath_DESC("`cert_path` DESC") + ,Type_ASC("`type` ASC"),Type_DESC("`type` DESC") + ,Share_ASC("`share` ASC"),Share_DESC("`share` DESC") + ,Rate_ASC("`rate` ASC"),Rate_DESC("`rate` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxPayAccount.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + + this.sortColumns = sb.toString(); + + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java b/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java new file mode 100644 index 0000000..b7d07ab --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxPayOrder.java @@ -0,0 +1,315 @@ +package com.iformall.domain.po; + +import javax.persistence.*; +import java.util.*; +import javax.persistence.Transient; +import java.util.List; +import javax.persistence.Id; +import java.io.Serializable; + +@Table(name = "wx_pay_order") +public class WxPayOrder implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSortColumns() { + return sortColumns; + } + + public List getIds() { + return ids; + } + + public void setIds(List ids) { + this.ids = ids; + } + + + + /**租户ID**/ + @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") + private String tenantId; + /**创建时间**/ + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createTime") + private Date createTime; + /**更新时间**/ + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateTime") + private Date updateTime; + /**订单ID**/ + @io.swagger.annotations.ApiModelProperty(value="订单ID",name="orderId") + private Long orderId; + /**用户ID**/ + @io.swagger.annotations.ApiModelProperty(value="用户ID",name="cUserId") + private Long cUserId; + /**B端用户ID**/ + @io.swagger.annotations.ApiModelProperty(value="B端用户ID",name="bUserId") + private Long bUserId; + /**扫码授权编码**/ + @io.swagger.annotations.ApiModelProperty(value="扫码授权编码",name="authCode") + private String authCode; + /**ip地址**/ + @io.swagger.annotations.ApiModelProperty(value="ip地址",name="ip") + private String ip; + /**支付金额(分)**/ + @io.swagger.annotations.ApiModelProperty(value="支付金额(分)",name="payAmount") + private Integer payAmount; + /**支付发起时间**/ + @io.swagger.annotations.ApiModelProperty(value="支付发起时间",name="payTimeStart") + private Date payTimeStart; + /**支付结束时间**/ + @io.swagger.annotations.ApiModelProperty(value="支付结束时间",name="payTimeEnd") + private Date payTimeEnd; + /**微信预支付交易会话标识**/ + @io.swagger.annotations.ApiModelProperty(value="微信预支付交易会话标识",name="prepayId") + private String prepayId; + /**微信生成的订单号**/ + @io.swagger.annotations.ApiModelProperty(value="微信生成的订单号",name="transactionId") + private String transactionId; + /**支付渠道: 0-微信 1-支付宝 2-银联 **/ + @io.swagger.annotations.ApiModelProperty(value="支付渠道: 0-微信 1-支付宝 2-银联 ",name="payVendor") + private Integer payVendor; + /**支付订单号**/ + @io.swagger.annotations.ApiModelProperty(value="支付订单号",name="payOrderNo") + private String payOrderNo; + /**支付状态: 0-支付中;1-支付成功;2-支付失败**/ + @io.swagger.annotations.ApiModelProperty(value="支付状态: 0-支付中;1-支付成功;2-支付失败",name="payOrderStatus") + private Integer payOrderStatus; + /**分账状态: 0-未分账;1-分账**/ + @io.swagger.annotations.ApiModelProperty(value="分账状态: 0-未分账;1-分账",name="payOrderStatus") + private Integer share; + /**分账金额(总金额扣除手续费后的金额)**/ + @io.swagger.annotations.ApiModelProperty(value="分账金额",name="shareAmount") + private Integer shareAmount; + /**支付失败原因**/ + @io.swagger.annotations.ApiModelProperty(value="支付失败原因",name="failReason") + private String failReason; + @io.swagger.annotations.ApiModelProperty(value="支付后结果来源(0:callback, 1:query)",name="payEndFrom") + private Integer payEndFrom; + public String getTenantId() { + return tenantId; + } + public void setTenantId(String _tenantId) { + tenantId = _tenantId; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date _createTime) { + createTime = _createTime; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date _updateTime) { + updateTime = _updateTime; + } + public Long getOrderId() { + return orderId; + } + public void setOrderId(Long _orderId) { + orderId = _orderId; + } + + public Long getcUserId() { + return cUserId; + } + + public void setcUserId(Long cUserId) { + this.cUserId = cUserId; + } + + public Long getbUserId() { + return bUserId; + } + + public void setbUserId(Long bUserId) { + this.bUserId = bUserId; + } + + public String getAuthCode() { + return authCode; + } + + public void setAuthCode(String authCode) { + this.authCode = authCode; + } + + public String getIp() { + return ip; + } + public void setIp(String _ip) { + ip = _ip; + } + public Integer getPayAmount() { + return payAmount; + } + public void setPayAmount(Integer _payAmount) { + payAmount = _payAmount; + } + public Date getPayTimeStart() { + return payTimeStart; + } + public void setPayTimeStart(Date _payTimeStart) { + payTimeStart = _payTimeStart; + } + public Date getPayTimeEnd() { + return payTimeEnd; + } + public void setPayTimeEnd(Date _payTimeEnd) { + payTimeEnd = _payTimeEnd; + } + + public String getPrepayId() { + return prepayId; + } + + public void setPrepayId(String prepayId) { + this.prepayId = prepayId; + } + + public String getTransactionId() { + return transactionId; + } + public void setTransactionId(String _transactionId) { + transactionId = _transactionId; + } + public Integer getPayVendor() { + return payVendor; + } + public void setPayVendor(Integer _payVendor) { + payVendor = _payVendor; + } + public String getPayOrderNo() { + return payOrderNo; + } + public void setPayOrderNo(String _payOrderNo) { + payOrderNo = _payOrderNo; + } + public Integer getPayOrderStatus() { + return payOrderStatus; + } + public void setPayOrderStatus(Integer _payOrderStatus) { + payOrderStatus = _payOrderStatus; + } + + public Integer getShare() { + return share; + } + public void setShare(Integer share) { + this.share = share; + } + + public Integer getShareAmount() { + return shareAmount; + } + + public void setShareAmount(Integer shareAmount) { + this.shareAmount = shareAmount; + } + + public String getFailReason() { + return failReason; + } + public void setFailReason(String _failReason) { + failReason = _failReason; + } + + public Integer getPayEndFrom() { + return payEndFrom; + } + + public void setPayEndFrom(Integer payEndFrom) { + this.payEndFrom = payEndFrom; + } + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,TenantId_ASC("`tenant_id` ASC"),TenantId_DESC("`tenant_id` DESC") + ,CreateTime_ASC("`create_time` ASC"),CreateTime_DESC("`create_time` DESC") + ,UpdateTime_ASC("`update_time` ASC"),UpdateTime_DESC("`update_time` DESC") + ,OrderId_ASC("`order_id` ASC"),OrderId_DESC("`order_id` DESC") + ,CUserId_ASC("`c_user_id` ASC"),CUserId_DESC("`c_user_id` DESC") + ,BUserId_ASC("`b_user_id` ASC"),BUserId_DESC("`b_user_id` DESC") + ,AuthCode_ASC("`auth_code` ASC"),AuthCode_DESC("`auth_code` DESC") + ,Ip_ASC("`ip` ASC"),Ip_DESC("`ip` DESC") + ,PayAmount_ASC("`pay_amount` ASC"),PayAmount_DESC("`pay_amount` DESC") + ,PayTimeStart_ASC("`pay_time_start` ASC"),PayTimeStart_DESC("`pay_time_start` DESC") + ,PayTimeEnd_ASC("`pay_time_end` ASC"),PayTimeEnd_DESC("`pay_time_end` DESC") + ,PrepayId_ASC("`prepay_id` ASC"),PrepayId_DESC("`transaction_id` DESC") + ,TransactionId_ASC("`transaction_id` ASC"),TransactionId_DESC("`prepay_id` DESC") + ,PayVendor_ASC("`pay_vendor` ASC"),PayVendor_DESC("`pay_vendor` DESC") + ,PayOrderNo_ASC("`pay_order_no` ASC"),PayOrderNo_DESC("`pay_order_no` DESC") + ,PayOrderStatus_ASC("`pay_order_status` ASC"),PayOrderStatus_DESC("`pay_order_status` DESC") + ,Share_ASC("`share` ASC"),Share_DESC("`share` DESC") + ,ShareAmount_ASC("`share_amount` ASC"),ShareAmount_DESC("`share_amount` DESC") + ,FailReason_ASC("`fail_reason` ASC"),FailReason_DESC("`fail_reason` DESC") + ,PayEndFrom_ASC("`pay_end_from` ASC"),PayEndFrom_DESC("`pay_end_from` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxPayOrder.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + + this.sortColumns = sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxTemplateMsg.java b/mallinkService/src/main/java/com/iformall/domain/po/WxTemplateMsg.java new file mode 100644 index 0000000..db4fc6d --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxTemplateMsg.java @@ -0,0 +1,104 @@ +package com.iformall.domain.po; + +import lombok.Data; + +import javax.persistence.*; +import java.util.*; +import javax.persistence.Transient; +import java.util.List; +import javax.persistence.Id; +import java.io.Serializable; + +@Table(name = "wx_template_msg") +@Data +public class WxTemplateMsg implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + + /**租户ID**/ + @io.swagger.annotations.ApiModelProperty(value="租户ID",name="tenantId") + private String tenantId; + /**模板ID**/ + @io.swagger.annotations.ApiModelProperty(value="模板ID",name="templateId") + private String templateId; + /**模板类型1:核销成功消息, 2:核销失败消息**/ + @io.swagger.annotations.ApiModelProperty(value="模板类型1:核销成功消息,2:核销失败消息",name="type") + private Integer type; + /**创建时间**/ + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") + private Date createDate; + /**更新时间**/ + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") + private Date updateDate; + + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,TenantId_ASC("`tenant_id` ASC"),TenantId_DESC("`tenant_id` DESC") + ,TemplateId_ASC("`template_id` ASC"),TemplateId_DESC("`template_id` DESC") + ,Type_ASC("`type` ASC"),Type_DESC("`type` DESC") + ,CreateDate_ASC("`create_date` ASC"),CreateDate_DESC("`create_date` DESC") + ,UpdateDate_ASC("`update_date` ASC"),UpdateDate_DESC("`update_date` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxTemplateMsg.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + + this.sortColumns = sb.toString(); + + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxWeappAuditStatus.java b/mallinkService/src/main/java/com/iformall/domain/po/WxWeappAuditStatus.java new file mode 100644 index 0000000..d364004 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxWeappAuditStatus.java @@ -0,0 +1,101 @@ +package com.iformall.domain.po; + +import lombok.Data; + +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Table(name = "wx_weapp_audit_status") +@Data +public class WxWeappAuditStatus implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + @io.swagger.annotations.ApiModelProperty(value="小程序ID",name="appId") + private String appId; + @io.swagger.annotations.ApiModelProperty(value="小程序类型(1-B端 2-C端)",name="type") + private Integer type; + @io.swagger.annotations.ApiModelProperty(value="用户版本",name="userVersion") + private String userVersion; + @io.swagger.annotations.ApiModelProperty(value="用户版本描述",name="versionDesc") + private String versionDesc; + @io.swagger.annotations.ApiModelProperty(value="auditid",name="auditid") + private Long auditid; + @io.swagger.annotations.ApiModelProperty(value="审核状态(0为审核成功,1:审核失败,2:审核中,3:已撤回)",name="auditStatus") + private Integer auditStatus; + @io.swagger.annotations.ApiModelProperty(value="审核错误码",name="auditErrCode") + private String auditErrCode; + @io.swagger.annotations.ApiModelProperty(value="审核时间",name="auditTime") + private Date auditTime; + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,AppId_ASC("`app_id` ASC"),AppId_DESC("`app_id` DESC") + ,Type_ASC("`type` ASC"),Type_DESC("`type` DESC") + ,UserVersion_ASC("`user_version` ASC"),UserVersion_DESC("`user_version` DESC") + ,AuditTime_ASC("`audit_time` ASC"),AuditTime_DESC("`audit_time` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxWeappAuditStatus.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + this.sortColumns = sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + List fList = new ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxWeappBasicSet.java b/mallinkService/src/main/java/com/iformall/domain/po/WxWeappBasicSet.java new file mode 100644 index 0000000..6cb9888 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxWeappBasicSet.java @@ -0,0 +1,109 @@ +package com.iformall.domain.po; + +import lombok.Data; +import javax.persistence.*; +import java.util.*; +import javax.persistence.Transient; +import java.util.List; +import javax.persistence.Id; +import java.io.Serializable; + +@Table(name = "wx_weapp_basic_set") +@Data +public class WxWeappBasicSet implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + /**小程序类型(1-B端 2-C端)*/ + @io.swagger.annotations.ApiModelProperty(value="小程序类型(1-B端 2-C端)",name="type") + private Integer type; + /**部署类型(1:dev,2:test,3:prod)*/ + @io.swagger.annotations.ApiModelProperty(value="部署类型(1:dev,2:test,3:prod)",name="deploy") + private Integer deploy; + /**服务器域名*/ + @io.swagger.annotations.ApiModelProperty(value="服务器域名",name="domainUrl") + private String domainUrl; + /**小程序基础版本*/ + @io.swagger.annotations.ApiModelProperty(value="小程序基础版本",name="version") + private String version; + /**模板库信息*/ + @io.swagger.annotations.ApiModelProperty(value="模板库信息",name="templateInfo") + private String templateInfo; + /**创建时间*/ + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") + private Date createDate; + /**更新时间*/ + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") + private Date updateDate; + + + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,Type_ASC("`type` ASC"),Type_DESC("`type` DESC") + ,Deploy_ASC("`deploy` ASC"),Deploy_DESC("`deploy` DESC") + ,DomainUrl_ASC("`domain_url` ASC"),DomainUrl_DESC("`domain_url` DESC") + ,Version_ASC("`version` ASC"),Version_DESC("`version` DESC") + ,TemplateInfo_ASC("`template_info` ASC"),TemplateInfo_DESC("`template_info` DESC") + ,CreateDate_ASC("`create_date` ASC"),CreateDate_DESC("`create_date` DESC") + ,UpdateDate_ASC("`update_date` ASC"),UpdateDate_DESC("`update_date` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxWeappBasicSet.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + this.sortColumns = sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxWeappCodeStatus.java b/mallinkService/src/main/java/com/iformall/domain/po/WxWeappCodeStatus.java new file mode 100644 index 0000000..0ad54b1 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxWeappCodeStatus.java @@ -0,0 +1,104 @@ +package com.iformall.domain.po; + +import lombok.Data; + +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Table(name = "wx_weapp_code_status") +@Data +public class WxWeappCodeStatus implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + /**小程序ID*/ + @io.swagger.annotations.ApiModelProperty(value="小程序ID",name="appId") + private String appId; + /**小程序类型(1-B端 2-C端)*/ + @io.swagger.annotations.ApiModelProperty(value="小程序类型(1-B端 2-C端)",name="type") + private Integer type; + /**用户版本*/ + @io.swagger.annotations.ApiModelProperty(value="用户版本",name="userVersion") + private String userVersion; + @io.swagger.annotations.ApiModelProperty(value="用户版本描述",name="versionDesc") + private String versionDesc; + /**code提交状态*/ + @io.swagger.annotations.ApiModelProperty(value="code提交状态(0:成功, 1:失败)",name="codeStatus") + private Integer codeStatus; + @io.swagger.annotations.ApiModelProperty(value="code提交错误码",name="codeErrCode") + private String codeErrCode; + /**更新时间*/ + @io.swagger.annotations.ApiModelProperty(value="code提交时间",name="codeTime") + private Date codeTime; + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,AppId_ASC("`app_id` ASC"),AppId_DESC("`app_id` DESC") + ,Type_ASC("`type` ASC"),Type_DESC("`type` DESC") + ,UserVersion_ASC("`user_version` ASC"),UserVersion_DESC("`user_version` DESC") + ,CodeTime_ASC("`code_time` ASC"),CodeTime_DESC("`code_time` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxWeappCodeStatus.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + this.sortColumns = sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + List fList = new ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxWeappExtSet.java b/mallinkService/src/main/java/com/iformall/domain/po/WxWeappExtSet.java new file mode 100644 index 0000000..5372cb1 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxWeappExtSet.java @@ -0,0 +1,105 @@ +package com.iformall.domain.po; + +import lombok.Data; +import javax.persistence.*; +import java.util.*; +import javax.persistence.Transient; +import java.util.List; +import javax.persistence.Id; +import java.io.Serializable; + +@Table(name = "wx_weapp_ext_set") +@Data +public class WxWeappExtSet implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + /**小程序ID*/ + @io.swagger.annotations.ApiModelProperty(value="小程序ID",name="appId") + private String appId; + /**小程序类型(1-B端 2-C端)*/ + @io.swagger.annotations.ApiModelProperty(value="小程序类型(1-B端 2-C端)",name="type") + private Integer type; + /**小程序扩展信息*/ + @io.swagger.annotations.ApiModelProperty(value="小程序扩展信息",name="extJson") + private String extJson; + /**提交审核列表*/ + @io.swagger.annotations.ApiModelProperty(value="提交审核列表",name="releaseJson") + private String releaseJson; + /**创建时间*/ + @io.swagger.annotations.ApiModelProperty(value="创建时间",name="createDate") + private Date createDate; + /**更新时间*/ + @io.swagger.annotations.ApiModelProperty(value="更新时间",name="updateDate") + private Date updateDate; + + + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,AppId_ASC("`app_id` ASC"),AppId_DESC("`app_id` DESC") + ,Type_ASC("`type` ASC"),Type_DESC("`type` DESC") + ,ExtJson_ASC("`ext_json` ASC"),ExtJson_DESC("`ext_json` DESC") + ,ReleaseJson_ASC("`release_json` ASC"),ReleaseJson_DESC("`release_json` DESC") + ,CreateDate_ASC("`create_date` ASC"),CreateDate_DESC("`create_date` DESC") + ,UpdateDate_ASC("`update_date` ASC"),UpdateDate_DESC("`update_date` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxWeappExtSet.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + this.sortColumns = sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + java.util.List fList = new java.util.ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxWeappReleaseStatus.java b/mallinkService/src/main/java/com/iformall/domain/po/WxWeappReleaseStatus.java new file mode 100644 index 0000000..a3d5fe1 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxWeappReleaseStatus.java @@ -0,0 +1,99 @@ +package com.iformall.domain.po; + +import lombok.Data; + +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Table(name = "wx_weapp_release_status") +@Data +public class WxWeappReleaseStatus implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + protected Long id; + + @Transient + protected List ids; + @Transient + protected String sortColumns; + + @io.swagger.annotations.ApiModelProperty(value="小程序ID",name="appId") + private String appId; + @io.swagger.annotations.ApiModelProperty(value="小程序类型(1-B端 2-C端)",name="type") + private Integer type; + @io.swagger.annotations.ApiModelProperty(value="用户版本",name="userVersion") + private String userVersion; + @io.swagger.annotations.ApiModelProperty(value="用户版本描述",name="versionDesc") + private String versionDesc; + @io.swagger.annotations.ApiModelProperty(value="发布状态(0:发布成功, 1:发布失败, 2:发布中, 3:发布撤回)",name="releaseStatus") + private Integer releaseStatus; + @io.swagger.annotations.ApiModelProperty(value="发布错误码",name="releaseErrCode") + private String releaseErrCode; + @io.swagger.annotations.ApiModelProperty(value="发布时间",name="releaseTime") + private Date releaseTime; + + public static enum Field + { + Id_ASC("`id` ASC"),Id_DESC("`id` DESC") + ,AppId_ASC("`app_id` ASC"),AppId_DESC("`app_id` DESC") + ,Type_ASC("`type` ASC"),Type_DESC("`type` DESC") + ,UserVersion_ASC("`user_version` ASC"),UserVersion_DESC("`user_version` DESC") + ,ReleaseTime_ASC("`release_time` ASC"),ReleaseTime_DESC("`release_time` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxWeappReleaseStatus.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + this.sortColumns = sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + List fList = new ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/MallUserInfoVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/MallUserInfoVo.java new file mode 100644 index 0000000..07661de --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/MallUserInfoVo.java @@ -0,0 +1,46 @@ +package com.iformall.domain.vo; + +import com.iformall.domain.po.MallUserInfo; + +public class MallUserInfoVo extends MallUserInfo { + @io.swagger.annotations.ApiModelProperty(value="商场名",name="mallName") + private String mallName; + @io.swagger.annotations.ApiModelProperty(value="集团",name="mallGroup") + private String mallGroup; + @io.swagger.annotations.ApiModelProperty(value="商场图标",name="imgUrl") + private String imgUrl; + @io.swagger.annotations.ApiModelProperty(value="商场图标",name="imgUrlH") + private String imgUrlH; + + public String getMallName() { + return mallName; + } + + public void setMallName(String mallName) { + this.mallName = mallName; + } + + public String getMallGroup() { + return mallGroup; + } + + public void setMallGroup(String mallGroup) { + this.mallGroup = mallGroup; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String _imgUrl) { + this.imgUrl = _imgUrl; + } + + public String getImgUrlH() { + return imgUrlH; + } + + public void setImgUrlH(String imgUrlH) { + this.imgUrlH = imgUrlH; + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxPayOrderVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxPayOrderVo.java new file mode 100644 index 0000000..8ed58c5 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxPayOrderVo.java @@ -0,0 +1,39 @@ +package com.iformall.domain.vo; + +import com.iformall.domain.po.WxPayOrder; + +public class WxPayOrderVo extends WxPayOrder { + + @io.swagger.annotations.ApiModelProperty(value="用户绑定的openId",name="openId") + private String openId; + + @io.swagger.annotations.ApiModelProperty(value="用户支付appId",name="appId") + private String appId; + + @io.swagger.annotations.ApiModelProperty(value="支付ID,参看wx_pay_account",name="payId") + private Long payId; + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public Long getPayId() { + return payId; + } + + public void setPayId(Long payId) { + this.payId = payId; + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappAuditStatusVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappAuditStatusVo.java new file mode 100644 index 0000000..ed9cad7 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappAuditStatusVo.java @@ -0,0 +1,14 @@ +package com.iformall.domain.vo; + +import com.iformall.domain.po.WxWeappAuditStatus; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class WxWeappAuditStatusVo extends WxWeappAuditStatus { + + /**小程序名称*/ + @io.swagger.annotations.ApiModelProperty(value="小程序名称",name="name") + private String name; +} diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappCodeStatusVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappCodeStatusVo.java new file mode 100644 index 0000000..c91d1df --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappCodeStatusVo.java @@ -0,0 +1,14 @@ +package com.iformall.domain.vo; + +import com.iformall.domain.po.WxWeappCodeStatus; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class WxWeappCodeStatusVo extends WxWeappCodeStatus { + + /**小程序名称*/ + @io.swagger.annotations.ApiModelProperty(value="小程序名称",name="name") + private String name; +} diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappInfo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappInfo.java new file mode 100644 index 0000000..9838377 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappInfo.java @@ -0,0 +1,99 @@ +package com.iformall.domain.vo; + +import com.iformall.domain.po.WxAuthorizerInfo; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.ArrayList; +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = true) +public class WxWeappInfo extends WxAuthorizerInfo { + + /**小程序类型(1-B端 2-C端)*/ + @io.swagger.annotations.ApiModelProperty(value="小程序类型(1-B端 2-C端)",name="type") + private Integer type; + /**小程序名称*/ + @io.swagger.annotations.ApiModelProperty(value="小程序名称",name="name") + private String name; + + public static enum Field + { + Id_ASC("ai.`id` ASC"),Id_DESC("ai.`id` DESC") + ,AuthorizerAppid_ASC("ai.`authorizer_appid` ASC"),AuthorizerAppid_DESC("ai.`authorizer_appid` DESC") + + ,HeadImg_ASC("ai.`head_img` ASC"),HeadImg_DESC("ai.`head_img` DESC") + ,Alias_ASC("ai.`alias` ASC"),Alias_DESC("ai.`alias` DESC") + ,QrcodeUrl_ASC("ai.`qrcode_url` ASC"),QrcodeUrl_DESC("ai.`qrcode_url` DESC") + ,CreateTime_ASC("ai.`create_time` ASC"),CreateTime_DESC("ai.`create_time` DESC") + ,UpdateTime_ASC("ai.`update_time` ASC"),UpdateTime_DESC("ai.`update_time` DESC") + ,AuthorizationStatus_ASC("ai.`authorization_status` ASC"),AuthorizationStatus_DESC("ai.`authorization_status` DESC") + ,AuthTime_ASC("ai.`auth_time` ASC"),AuthTime_DESC("ai.`auth_time` DESC") + ,BaseStatus_ASC("ai.`base_status` ASC"),BaseStatus_DESC("ai.`base_status` DESC") + ,BaseTime_ASC("ai.`base_time` ASC"),BaseTime_DESC("ai.`base_time` DESC") + ,DomainStatus_ASC("ai.`domain_status` ASC"),DomainStatus_DESC("ai.`domain_status` DESC") + ,DomainTime_ASC("ai.`domain_time` ASC"),DomainTime_DESC("ai.`domain_time` DESC") + ,WebDomainStatus_ASC("ai.`webdomain_status` ASC"),WebDomainStatus_DESC("ai.`webdomain_status` DESC") + ,WebDomainTime_ASC("ai.`webdomain_time` ASC"),WebDomainTime_DESC("ai.`webdomain_time` DESC") + ,TemplateStatus_ASC("ai.`template_status` ASC"),TemplateStatus_DESC("ai.`template_status` DESC") + ,TemplateTime_ASC("ai.`template_time` ASC"),TemplateTime_DESC("ai.`template_time` DESC") + ,CurrentVersion_ASC("ai.`current_version` ASC"),CurrentVersion_DESC("ai.`current_version` DESC") + ,CurrentDesc_ASC("ai.`current_desc` ASC"),CurrentDesc_DESC("ai.`current_desc` DESC") + ,ReleaseTime_ASC("ai.`release_time` ASC"),ReleaseTime_DESC("ai.`release_time` DESC") + ,OpenAppid_ASC("ai.`open_appid` ASC"),OpenAppid_DESC("ai.`open_appid` DESC") + ,BindOpenTime_ASC("ai.`bind_open_time` ASC"),BindOpenTime_DESC("ai.`bind_open_time` DESC") + ,Name_ASC("a.`name` ASC"),Name_DESC("a.`name` DESC") + ,Type_ASC("a.`type` ASC"),Type_DESC("a.`type` DESC") + ; + private String value; + Field(String value){ + this.value = value; + } + public String getValue() { + return value; + } + public void setCol(String value) { + this.value = value; + } + @Override + public String toString() { + return this.getValue(); + } + } + + public void setSortColumns(WxWeappInfo.Field... fields) + { + if (fields == null || fields.length == 0) { + return; + } + for (int k = 0; k < fields.length; k++) { + if (fields[k] == null) { + return; + } + } + StringBuilder sb = new StringBuilder(fields[0].toString()); + for (int k = 1; k < fields.length; k++) { + sb.append(","); + sb.append(fields[k].toString()); + } + this.sortColumns = sb.toString(); + } + + public void setSortColumns(String sortColumns) + { + if (sortColumns == null || "".equals(sortColumns.trim())) { + return; + } + if (sortColumns.contains(",")) { + String[] cols = sortColumns.split(","); + List fList = new ArrayList(); + for (int k = 0; k < cols.length; k++) { + fList.add(Field.valueOf(cols[k])); + } + this.setSortColumns(fList.toArray(new Field[fList.size()])); + } else { + this.setSortColumns(Field.valueOf(sortColumns)); + } + } +} diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappReleaseStatusVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappReleaseStatusVo.java new file mode 100644 index 0000000..6601de5 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxWeappReleaseStatusVo.java @@ -0,0 +1,14 @@ +package com.iformall.domain.vo; + +import com.iformall.domain.po.WxWeappReleaseStatus; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class WxWeappReleaseStatusVo extends WxWeappReleaseStatus { + + /**小程序名称*/ + @io.swagger.annotations.ApiModelProperty(value="小程序名称",name="name") + private String name; +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumAppType.java b/mallinkService/src/main/java/com/iformall/enums/EnumAppType.java new file mode 100644 index 0000000..7a3deaf --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumAppType.java @@ -0,0 +1,40 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumAppType { + + // 1-B端, 2-C端, 3-服务号, 4-订阅号 + + B(1, "B端"), + C(2, "C端"), + MP_S(3,"公众号-服务号"), + MP_P(4, "公众号-订阅号"), + ; + + public static EnumAppType getEnum(Integer code) { + for (EnumAppType value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumAppType(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumLoginType.java b/mallinkService/src/main/java/com/iformall/enums/EnumLoginType.java new file mode 100644 index 0000000..d25d5f6 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumLoginType.java @@ -0,0 +1,38 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/11/16. + */ +public enum EnumLoginType { + + // 0-password, 1-nopassword + + PASSWORD(0, "PASSWORD"), + NOPASSWD(1, "NOPASSWORD") + ; + + public static EnumLoginType getEnum(Integer code) { + for (EnumLoginType value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumLoginType(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumMallUserStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumMallUserStatus.java new file mode 100644 index 0000000..5ec0092 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumMallUserStatus.java @@ -0,0 +1,36 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumMallUserStatus { + + VALID(1, "有效"), + NOT_VALID(0, "无效") + ; + + public static EnumMallUserStatus getEnum(Integer code) { + for (EnumMallUserStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumMallUserStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumTemplateType.java b/mallinkService/src/main/java/com/iformall/enums/EnumTemplateType.java new file mode 100644 index 0000000..e0a960f --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumTemplateType.java @@ -0,0 +1,39 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumTemplateType { + + // 1-核销成功消息, 2-核销失败消息 + + VERIFY_SUCCESS(1, "核销成功消息"), + VERIFY_FAIL(2, "核销失败消息"), + AUDIT_MESSAGE(3, "审核结果通知") + ; + + public static EnumTemplateType getEnum(Integer code) { + for (EnumTemplateType value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumTemplateType(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumUserWechat.java b/mallinkService/src/main/java/com/iformall/enums/EnumUserWechat.java new file mode 100644 index 0000000..f2f4c2d --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumUserWechat.java @@ -0,0 +1,38 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumUserWechat { + + // 微信第三方web登录 0-已绑定,1-未绑定 + + HAD(0, "已绑定"), + NO(1, "未绑定") + ; + + public static EnumUserWechat getEnum(Integer code) { + for (EnumUserWechat value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumUserWechat(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumWeappAuditStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumWeappAuditStatus.java new file mode 100644 index 0000000..e8014da --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumWeappAuditStatus.java @@ -0,0 +1,39 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumWeappAuditStatus { + + // 0为审核成功,1为审核失败,2为审核中,3已撤回 + SUCCESS(0, "审核成功"), + FAIL(1, "审核失败"), + AUDITING(2, "审核中"), + UNDO(3, "已撤回"), + ; + + public static EnumWeappAuditStatus getEnum(Integer code) { + for (EnumWeappAuditStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumWeappAuditStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumWeappCodeCommitStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumWeappCodeCommitStatus.java new file mode 100644 index 0000000..f0514af --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumWeappCodeCommitStatus.java @@ -0,0 +1,38 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumWeappCodeCommitStatus { + + // 0: 提交成功, 1: 提交失败, ; + + SUCCESS(0, "提交成功"), + FAIL(1, "提交失败") + ; + + public static EnumWeappCodeCommitStatus getEnum(Integer code) { + for (EnumWeappCodeCommitStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumWeappCodeCommitStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumWeappReleaseStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumWeappReleaseStatus.java new file mode 100644 index 0000000..d999cd0 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumWeappReleaseStatus.java @@ -0,0 +1,38 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumWeappReleaseStatus { + + // 0为发布成功,1为发布失败 + SUCCESS(0, "发布成功"), + FAIL(1, "发布失败"), + BACK(2, "发布回退"), + ; + + public static EnumWeappReleaseStatus getEnum(Integer code) { + for (EnumWeappReleaseStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumWeappReleaseStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumWxAuthorizationInfoType.java b/mallinkService/src/main/java/com/iformall/enums/EnumWxAuthorizationInfoType.java new file mode 100644 index 0000000..a622eb7 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumWxAuthorizationInfoType.java @@ -0,0 +1,38 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumWxAuthorizationInfoType { + + COMPONENT_VERIFY_TICKET(1, "component_verify_ticket"), + UNAUTHORIZED(2, "unauthorized"), + AUTHORIZED(3, "authorized"), + UPDATEAUTHORIZED(4, "updateauthorized") + ; + + public static EnumWxAuthorizationInfoType getEnum(Integer code) { + for (EnumWxAuthorizationInfoType value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumWxAuthorizationInfoType(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumWxAuthorizationStatus.java b/mallinkService/src/main/java/com/iformall/enums/EnumWxAuthorizationStatus.java new file mode 100644 index 0000000..a26c35c --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumWxAuthorizationStatus.java @@ -0,0 +1,38 @@ +package com.iformall.enums; + +/** + * Created by Stormeye on 2018/08/09. + */ +public enum EnumWxAuthorizationStatus { + + // 0-authorized, 1-unauthorized + + AUTHORIZED(0, "authorized"), + UNAUTHORIZED(1, "unauthorized") + ; + + public static EnumWxAuthorizationStatus getEnum(Integer code) { + for (EnumWxAuthorizationStatus value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumWxAuthorizationStatus(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/exception/MallinkException.java b/mallinkService/src/main/java/com/iformall/exception/MallinkException.java new file mode 100644 index 0000000..70dd6eb --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/exception/MallinkException.java @@ -0,0 +1,36 @@ +package com.iformall.exception; + +import com.iformall.common.ErrorCode; + +/** + * Created by Stormeye on 2018/8/10. + */ +public class MallinkException extends RuntimeException { + + private int errorCode; + private String message; + + public MallinkException(int errorC, String message) { + this.errorCode = errorC; + this.message = message; + } + + public MallinkException(ErrorCode errCode) { + this.errorCode = errCode.getCode(); + this.message = errCode.getMessage(); + } + + public MallinkException() { + super(); + } + + public int getErrorCode() { + return errorCode; + } + + @Override + public String getMessage() { + return message; + } + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/MallPermissionMapper.java b/mallinkService/src/main/java/com/iformall/mapper/MallPermissionMapper.java new file mode 100644 index 0000000..a84a507 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/MallPermissionMapper.java @@ -0,0 +1,20 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.MallPermission; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface MallPermissionMapper extends CommonMapper { + + List findList(MallPermission mallPermission); + + List findPermissionByRoleId(Long roleId); + List findPermissionByRoleIds(@Param("roleIds") List roleIds); + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/MallUserInfoMapper.java b/mallinkService/src/main/java/com/iformall/mapper/MallUserInfoMapper.java new file mode 100644 index 0000000..f40d727 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/MallUserInfoMapper.java @@ -0,0 +1,38 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.MallUserInfo; +import com.iformall.domain.vo.MallUserInfoVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface MallUserInfoMapper extends CommonMapper { + + MallUserInfo selectById(@Param("id") Long id); + + List findList(MallUserInfo mallUserInfo); + + MallUserInfo selectByUserName(@Param("username") String username); + + MallUserInfo selectByUserNameWebOpen(@Param("username") String username, @Param("webOpenId") String webOpenId); + + MallUserInfo selectByBOpenId(@Param("bopenId") String bopenId, @Param("tenantId") String tenantId); + + List selectByWebOpenId(@Param("webOpenId") String webOpenId); + + void removeWebOpenId(MallUserInfo mallUserInfo); + + MallUserInfo selectByPhone(@Param("phone") String phone, @Param("tenantId") String tenantId); + + Integer hasButtonPermission(@Param("userId") Long userId, @Param("permission") String permission); + + long cntByUserName(Map params); + + + List selectUsersByPhone(@Param("phone") String phone); + + List selectUsersByWebOpenId(@Param("webOpenId") String webOpenId); + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxAppinfoMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxAppinfoMapper.java new file mode 100644 index 0000000..75f538f --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxAppinfoMapper.java @@ -0,0 +1,16 @@ +package com.iformall.mapper; + +import java.util.*; +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxAppinfo; + +public interface WxAppinfoMapper extends CommonMapper { + + List findList(WxAppinfo wxAppinfo); + + + WxAppinfo findByAppId(String appId); + + + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxAuthorizerInfoMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxAuthorizerInfoMapper.java new file mode 100644 index 0000000..ddd6173 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxAuthorizerInfoMapper.java @@ -0,0 +1,21 @@ +package com.iformall.mapper; + +import java.util.*; +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxAuthorizerInfo; +import com.iformall.domain.vo.WxWeappInfo; + +public interface WxAuthorizerInfoMapper extends CommonMapper { + + List findList(WxAuthorizerInfo wxAuthorizerInfo); + + List findVoList(WxWeappInfo wxWeappInfo); + + void updateReleaseInfo(WxAuthorizerInfo wxAuthorizerInfo); + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxComponentVerifyTicketMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxComponentVerifyTicketMapper.java new file mode 100644 index 0000000..72d6514 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxComponentVerifyTicketMapper.java @@ -0,0 +1,16 @@ +package com.iformall.mapper; + +import java.util.*; +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxComponentVerifyTicket; + +public interface WxComponentVerifyTicketMapper extends CommonMapper { + + List findList(WxComponentVerifyTicket wxComponentVerifyTicket); + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxPayAccountMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxPayAccountMapper.java new file mode 100644 index 0000000..252940d --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxPayAccountMapper.java @@ -0,0 +1,16 @@ +package com.iformall.mapper; + +import java.util.*; +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxPayAccount; + +public interface WxPayAccountMapper extends CommonMapper { + + List findList(WxPayAccount wxPayAccount); + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxPayOrderMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxPayOrderMapper.java new file mode 100644 index 0000000..298dab3 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxPayOrderMapper.java @@ -0,0 +1,13 @@ +package com.iformall.mapper; + +import java.util.*; +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxPayOrder; +import com.iformall.domain.vo.WxPayOrderVo; + +public interface WxPayOrderMapper extends CommonMapper { + + List findList(WxPayOrder wxPayOrder); + + List findListOfPaidOrderByDate(Map dateMap); +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxTemplateMsgMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxTemplateMsgMapper.java new file mode 100644 index 0000000..e8667fa --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxTemplateMsgMapper.java @@ -0,0 +1,16 @@ +package com.iformall.mapper; + +import java.util.*; +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxTemplateMsg; + +public interface WxTemplateMsgMapper extends CommonMapper { + + List findList(WxTemplateMsg wxTemplateMsg); + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxWeappAuditStatusMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxWeappAuditStatusMapper.java new file mode 100644 index 0000000..2a92084 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxWeappAuditStatusMapper.java @@ -0,0 +1,24 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxWeappAuditStatus; +import com.iformall.domain.vo.WxWeappAuditStatusVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface WxWeappAuditStatusMapper extends CommonMapper { + + List findList(WxWeappAuditStatus weappAuditStatus); + + List findVoList(WxWeappAuditStatusVo weappAuditStatusVo); + + List findUserVersions(@Param(value = "type") Integer type, @Param(value = "auditStatus") Integer auditStatus); + + void updateStatus(WxWeappAuditStatus record); + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxWeappBasicSetMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxWeappBasicSetMapper.java new file mode 100644 index 0000000..2376a2d --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxWeappBasicSetMapper.java @@ -0,0 +1,16 @@ +package com.iformall.mapper; + +import java.util.*; +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxWeappBasicSet; + +public interface WxWeappBasicSetMapper extends CommonMapper { + + List findList(WxWeappBasicSet wxWeappBasicSet); + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxWeappCodeStatusMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxWeappCodeStatusMapper.java new file mode 100644 index 0000000..854a597 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxWeappCodeStatusMapper.java @@ -0,0 +1,24 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxWeappCodeStatus; +import com.iformall.domain.vo.WxWeappCodeStatusVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface WxWeappCodeStatusMapper extends CommonMapper { + + List findList(WxWeappCodeStatus weappCodeStatus); + + List findVoList(WxWeappCodeStatusVo weappCodeStatusVo); + + List findUserVersions(@Param(value = "type") Integer type); + + void updateStatus(WxWeappCodeStatus weappCodeStatus); + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxWeappExtSetMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxWeappExtSetMapper.java new file mode 100644 index 0000000..accb1f1 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxWeappExtSetMapper.java @@ -0,0 +1,16 @@ +package com.iformall.mapper; + +import java.util.*; +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxWeappExtSet; + +public interface WxWeappExtSetMapper extends CommonMapper { + + List findList(WxWeappExtSet wxWeappReleaseSet); + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/mapper/WxWeappReleaseStatusMapper.java b/mallinkService/src/main/java/com/iformall/mapper/WxWeappReleaseStatusMapper.java new file mode 100644 index 0000000..8f72957 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/mapper/WxWeappReleaseStatusMapper.java @@ -0,0 +1,24 @@ +package com.iformall.mapper; + +import com.iformall.common.CommonMapper; +import com.iformall.domain.po.WxWeappReleaseStatus; +import com.iformall.domain.vo.WxWeappReleaseStatusVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +public interface WxWeappReleaseStatusMapper extends CommonMapper { + + List findList(WxWeappReleaseStatus wxWeappReleaseStatus); + + List findVoList(WxWeappReleaseStatusVo weappReleaseStatusVo); + + List findUserVersions(@Param(value = "type") Integer type); + + void updateStatus(WxWeappReleaseStatus weappRelaseStatus); + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/MailService.java b/mallinkService/src/main/java/com/iformall/service/MailService.java new file mode 100644 index 0000000..01020a3 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/MailService.java @@ -0,0 +1,131 @@ +package com.iformall.service; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.FileSystemResource; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Service; + +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import java.io.File; + +@Service +public class MailService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private JavaMailSender sender; + + @Value("${spring.mail.username}") + private String from; + + /** + * 发送纯文本的简单邮件 + * @param to + * @param subject + * @param content + */ + public void sendSimpleMail(String[] to, String subject, String content){ + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom(from); + message.setTo(to); + message.setSubject(subject); + message.setText(content); + + try { + sender.send(message); + logger.info("简单邮件已经发送。"); + } catch (Exception e) { + logger.error("发送简单邮件时发生异常!", e); + } + } + + /** + * 发送html格式的邮件 + * @param to + * @param subject + * @param content + */ + public void sendHtmlMail(String to, String subject, String content){ + MimeMessage message = sender.createMimeMessage(); + + try { + //true表示需要创建一个multipart message + MimeMessageHelper helper = new MimeMessageHelper(message, true); + helper.setFrom(from); + helper.setTo(to); + helper.setSubject(subject); + helper.setText(content, true); + + sender.send(message); + logger.info("html邮件已经发送。"); + } catch (MessagingException e) { + logger.error("发送html邮件时发生异常!", e); + } + } + + /** + * 发送带附件的邮件 + * @param to + * @param subject + * @param content + * @param filePath + */ + public void sendAttachmentsMail(String to, String subject, String content, String filePath){ + MimeMessage message = sender.createMimeMessage(); + + try { + //true表示需要创建一个multipart message + MimeMessageHelper helper = new MimeMessageHelper(message, true); + helper.setFrom(from); + helper.setTo(to); + helper.setSubject(subject); + helper.setText(content, true); + + FileSystemResource file = new FileSystemResource(new File(filePath)); + String fileName = filePath.substring(filePath.lastIndexOf(File.separator)); + helper.addAttachment(fileName, file); + + sender.send(message); + logger.info("带附件的邮件已经发送。"); + } catch (MessagingException e) { + logger.error("发送带附件的邮件时发生异常!", e); + } + } + + /** + * 发送嵌入静态资源(一般是图片)的邮件 + * @param to + * @param subject + * @param content 邮件内容,需要包括一个静态资源的id,比如: + * @param rscPath 静态资源路径和文件名 + * @param rscId 静态资源id + */ + public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){ + MimeMessage message = sender.createMimeMessage(); + + try { + //true表示需要创建一个multipart message + MimeMessageHelper helper = new MimeMessageHelper(message, true); + helper.setFrom(from); + helper.setTo(to); + helper.setSubject(subject); + helper.setText(content, true); + + FileSystemResource res = new FileSystemResource(new File(rscPath)); + helper.addInline(rscId, res); + + sender.send(message); + logger.info("嵌入静态资源的邮件已经发送。"); + } catch (MessagingException e) { + logger.error("发送嵌入静态资源的邮件时发生异常!", e); + } + } + +} diff --git a/mallinkService/src/main/java/com/iformall/service/MallPermissionService.java b/mallinkService/src/main/java/com/iformall/service/MallPermissionService.java new file mode 100644 index 0000000..69505f0 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/MallPermissionService.java @@ -0,0 +1,62 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.MallPermission; + +import java.util.List; + +public interface MallPermissionService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param offset + * @param limit + * @return + */ + PageInfo listAsPage(MallPermission record, Integer pageIndex, Integer pageSize); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + MallPermission getById(Long id); + + /** + * 保存或更新实体 + * + * @param record + */ + void saveOrUpdate(MallPermission record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + /** + * 根据roleId查询菜单和按钮权限 + * @param roleId + * @return + */ + List findPermissionByRoleId(Long roleId); + + /** + * 根据ruleId权限组查找相应权限 + * @param roleIds + * @return + */ + List findPermissionByRoleIds(List roleIds); + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java b/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java new file mode 100644 index 0000000..4f77765 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/MallUserInfoService.java @@ -0,0 +1,124 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.common.ResultData; +import com.iformall.domain.po.MallUserInfo; +import com.iformall.domain.vo.MallUserInfoVo; + +import java.util.List; + +public interface MallUserInfoService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(MallUserInfo record, Integer pageIndex, Integer pageSize); + + /** + * 根据实体查询列表 + * @param record + * @return + */ + int cntUserList(MallUserInfo record); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + MallUserInfo getById(Long id); + + /** + * 保存或更新实体 + * + * @param record + */ + void saveOrUpdate(MallUserInfo record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + /** + * 查询用户名总数,用于校验用户名是否重复 + * @param username + */ + long cntByUserName(String username); + + /** + * 根据用户名查询用户对象 + * @param username + * @return + */ + MallUserInfo getByUsername(String username); + + /** + * 检查用户按钮是否有权限 + * @param userId + * @param permission + * @return 是否有权限(true: 有| false: 没有) + */ + boolean hasButtonPermission(Long userId, String permission); + + + boolean cntByUserName(String username, Long id); + + boolean cntByUserPhone(String phone, Long id); + + /** + * 根据phone获得实体 + * + * @param phone + * @return + */ + MallUserInfo getByPhone(String phone, String tenantId); + + /** + * 根据phone获得实体列表 + * + * @param phone + * @return + */ + List getUserByPhone(String phone); + + /** + * 根据B端OpenId获得实体 + * + * @param openId + * @return + */ + MallUserInfo getByBOpenId(String openId, String tenantId); + + void updateBOpenId(MallUserInfo user); + + /** + * 根据web端OpenId获得实体 + * + * @param webOpenId + * @return + */ + List getByWebOpenId(String webOpenId); + + /** + * 根据phone获得展示列表 + * + * @param webOpenId + * @return + */ + List getUsersByWebOpenId(String webOpenId); + + /** + * 根据条件用户列表 + * @return + */ + List findList(MallUserInfo record); +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxAppinfoService.java b/mallinkService/src/main/java/com/iformall/service/WxAppinfoService.java new file mode 100644 index 0000000..e65a3cb --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxAppinfoService.java @@ -0,0 +1,71 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxAppinfo; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public interface WxAppinfoService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxAppinfo record, Integer pageIndex, Integer pageSize); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + WxAppinfo getById(Long id); + + /** + * 根据appId获得实体 + * + * @param appId + * @return + */ + WxAppinfo getByAppId(String appId); + + /** + * 获取c端小程序信息 + * @return + */ + WxAppinfo getCAppInfo(String tenantId); + + /** + * 保存或更新实体 + * + * @param record + */ + void saveOrUpdate(WxAppinfo record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + + /** + * 更新accessToken + * @param appId + */ + void ctokenUpdate(String appId); + + /** + * 位置码/导购码生成 + */ + void exportQrcode(HttpServletRequest request, HttpServletResponse response, + String appId, int type, String pageUrl, String sceneParam, + int withText, String text1, String text2); + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxAuthorizerInfoService.java b/mallinkService/src/main/java/com/iformall/service/WxAuthorizerInfoService.java new file mode 100644 index 0000000..c093986 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxAuthorizerInfoService.java @@ -0,0 +1,81 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxAuthorizerInfo; +import com.iformall.domain.vo.WxWeappInfo; + +import java.util.List; + +public interface WxAuthorizerInfoService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxAuthorizerInfo record, Integer pageIndex, Integer pageSize); + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listVoAsPage(WxWeappInfo record, Integer pageIndex, Integer pageSize); + + /** + * 根据实体查询列表 + * @param record + * @return + */ + List getList(WxWeappInfo record); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + WxAuthorizerInfo getById(Long id); + + /** + * 根据appId获得实体 + * + * @param appId + * @return + */ + WxAuthorizerInfo getByAppId(String appId); + + /** + * 保存或更新实体 + * + * @param record + */ + void saveOrUpdate(WxAuthorizerInfo record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + + void updateReleaseVersion(WxAuthorizerInfo record); + + void updateBaseVersion(WxAuthorizerInfo record); + + void updateDomainUrl(WxAuthorizerInfo record); + + void updateWebDomainUrl(WxAuthorizerInfo record); + + void updateTemplate(WxAuthorizerInfo record); + + void updateOpenAppid(WxAuthorizerInfo record); + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxComponentVerifyTicketService.java b/mallinkService/src/main/java/com/iformall/service/WxComponentVerifyTicketService.java new file mode 100644 index 0000000..154ecbe --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxComponentVerifyTicketService.java @@ -0,0 +1,41 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxComponentVerifyTicket; + +public interface WxComponentVerifyTicketService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxComponentVerifyTicket record, Integer pageIndex, Integer pageSize); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + WxComponentVerifyTicket getById(Long id); + + /** + * 保存或更新实体 + * + * @param record + */ + void saveOrUpdate(WxComponentVerifyTicket record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxTemplateMsgService.java b/mallinkService/src/main/java/com/iformall/service/WxTemplateMsgService.java new file mode 100644 index 0000000..d302837 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxTemplateMsgService.java @@ -0,0 +1,55 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxTemplateMsg; + +public interface WxTemplateMsgService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxTemplateMsg record, Integer pageIndex, Integer pageSize); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + WxTemplateMsg getById(Long id); + + /** + * 根据Obj获得实体 + * + * @param record + * @return + */ + WxTemplateMsg getByObj(WxTemplateMsg record); + + /** + * 保存或更新实体 + * + * @param record + */ + void saveOrUpdate(WxTemplateMsg record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxWeappAuditStatusService.java b/mallinkService/src/main/java/com/iformall/service/WxWeappAuditStatusService.java new file mode 100644 index 0000000..f7abd62 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxWeappAuditStatusService.java @@ -0,0 +1,75 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxWeappAuditStatus; +import com.iformall.domain.vo.WxWeappAuditStatusVo; + +import java.util.List; +import java.util.Map; + +public interface WxWeappAuditStatusService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxWeappAuditStatusVo record, Integer pageIndex, Integer pageSize); + + /** + * 根据实体查询列表 + * + * @param record + * @return + */ + List getList(WxWeappAuditStatusVo record); + + /** + * 查询version列表 + * + * @return + */ + List getVersionList(Integer type, Integer auditStatus); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + WxWeappAuditStatus getById(Long id); + + /** + * 根据appId获得实体 + * + * @param appId + * @return + */ + WxWeappAuditStatus getByAppId(String appId); + + /** + * 保存实体 + * + * @param record + */ + void saveStatus(WxWeappAuditStatus record); + + /** + * 更新audit Status + * + * @param record + */ + void updateStatus(WxWeappAuditStatus record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxWeappBasicSetService.java b/mallinkService/src/main/java/com/iformall/service/WxWeappBasicSetService.java new file mode 100644 index 0000000..7ddbddc --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxWeappBasicSetService.java @@ -0,0 +1,54 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxWeappBasicSet; + +public interface WxWeappBasicSetService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxWeappBasicSet record, Integer pageIndex, Integer pageSize); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + WxWeappBasicSet getById(Long id); + + /** + * 根据type and deploy获取 + * @param weappBasicSet + * @return + */ + WxWeappBasicSet getByTypeAndDeploy(WxWeappBasicSet weappBasicSet); + + /** + * 保存或更新实体 + * + * @param record + */ + void saveOrUpdate(WxWeappBasicSet record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxWeappCodeStatusService.java b/mallinkService/src/main/java/com/iformall/service/WxWeappCodeStatusService.java new file mode 100644 index 0000000..e7e48d4 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxWeappCodeStatusService.java @@ -0,0 +1,75 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxWeappCodeStatus; +import com.iformall.domain.vo.WxWeappCodeStatusVo; + +import java.util.List; +import java.util.Map; + +public interface WxWeappCodeStatusService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxWeappCodeStatusVo record, Integer pageIndex, Integer pageSize); + + /** + * 根据实体查询列表 + * + * @param record + * @return + */ + List getList(WxWeappCodeStatusVo record); + + /** + * 查询version列表 + * + * @return + */ + List getVersionList(Integer type); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + WxWeappCodeStatus getById(Long id); + + /** + * 根据appId获得实体 + * + * @param appId + * @return + */ + WxWeappCodeStatus getByAppId(String appId); + + /** + * 保存实体 + * + * @param record + */ + void saveStatus(WxWeappCodeStatus record); + + /** + * 更新codeCommit Status + * + * @param record + */ + void updateStatus(WxWeappCodeStatus record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxWeappExtSetService.java b/mallinkService/src/main/java/com/iformall/service/WxWeappExtSetService.java new file mode 100644 index 0000000..8edd36d --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxWeappExtSetService.java @@ -0,0 +1,55 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxWeappExtSet; + +public interface WxWeappExtSetService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxWeappExtSet record, Integer pageIndex, Integer pageSize); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + WxWeappExtSet getById(Long id); + + /** + * 根据Obj获得实体 + * + * @param record + * @return + */ + WxWeappExtSet getByObj(WxWeappExtSet record); + + /** + * 保存或更新实体 + * + * @param record + */ + void saveOrUpdate(WxWeappExtSet record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/WxWeappReleaseStatusService.java b/mallinkService/src/main/java/com/iformall/service/WxWeappReleaseStatusService.java new file mode 100644 index 0000000..eaa0a30 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/WxWeappReleaseStatusService.java @@ -0,0 +1,78 @@ +package com.iformall.service; + +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxWeappCodeStatus; +import com.iformall.domain.po.WxWeappReleaseStatus; +import com.iformall.domain.vo.WxWeappAuditStatusVo; +import com.iformall.domain.vo.WxWeappCodeStatusVo; +import com.iformall.domain.vo.WxWeappReleaseStatusVo; + +import java.util.List; +import java.util.Map; + +public interface WxWeappReleaseStatusService { + + /** + * 根据实体查询分页列表 + * + * @param record + * @param pageIndex + * @param pageSize + * @return + */ + PageInfo listAsPage(WxWeappReleaseStatusVo record, Integer pageIndex, Integer pageSize); + + /** + * 根据实体查询列表 + * + * @param record + * @return + */ + List getList(WxWeappReleaseStatusVo record); + + /** + * 查询version列表 + * + * @return + */ + List getVersionList(Integer type); + + /** + * 根据Id获得实体 + * + * @param id + * @return + */ + WxWeappReleaseStatus getById(Long id); + + /** + * 根据appId获得实体 + * + * @param appId + * @return + */ + WxWeappReleaseStatus getByAppId(String appId); + + /** + * 保存实体 + * + * @param record + */ + void saveStatus(WxWeappReleaseStatus record); + + /** + * 更新release Status + * + * @param record + */ + void updateStatus(WxWeappReleaseStatus record); + + /** + * 根据Id删除实体 + * + * @param id + */ + void deleteById(Long id); + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/MallPermissionServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/MallPermissionServiceImpl.java new file mode 100644 index 0000000..e9a9318 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/MallPermissionServiceImpl.java @@ -0,0 +1,67 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.IdWorker; +import com.iformall.domain.po.MallPermission; +import com.iformall.mapper.MallPermissionMapper; +import com.iformall.service.MallPermissionService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class MallPermissionServiceImpl implements MallPermissionService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + MallPermissionMapper mallPermissionMapper; + + + @Override + public PageInfo listAsPage(MallPermission record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> mallPermissionMapper.findList(record)); + } + + @Override + public MallPermission getById(Long id) { + return mallPermissionMapper.selectByPrimaryKey(id); + } + + @Override + public void saveOrUpdate(MallPermission record) { + if (record.getId() == null) { + //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + mallPermissionMapper.insertSelective(record); + } else { + mallPermissionMapper.updateByPrimaryKeySelective(record); + } + } + + @Override + public void deleteById(Long id) { + mallPermissionMapper.deleteByPrimaryKey(id); + } + + @Override + public List findPermissionByRoleId(Long roleId) { + return mallPermissionMapper.findPermissionByRoleId(roleId); + } + + @Override + public List findPermissionByRoleIds(List roleIds) { + return mallPermissionMapper.findPermissionByRoleIds(roleIds); + } + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java new file mode 100644 index 0000000..d312fce --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/MallUserInfoServiceImpl.java @@ -0,0 +1,138 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; +import com.iformall.common.IdWorker; +import com.iformall.common.ResultData; +import com.iformall.domain.po.MallUserInfo; +import com.iformall.domain.vo.MallUserInfoVo; +import com.iformall.exception.MallinkException; +import com.iformall.mapper.MallUserInfoMapper; +import com.iformall.service.MallUserInfoService; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class MallUserInfoServiceImpl implements MallUserInfoService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + MallUserInfoMapper mallUserInfoMapper; + + + @Override + public PageInfo listAsPage(MallUserInfo record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> mallUserInfoMapper.findList(record)); + } + + @Override + public int cntUserList(MallUserInfo record) { + return mallUserInfoMapper.selectCount(record); + } + + @Override + public MallUserInfo getById(Long id) { + return mallUserInfoMapper.selectById(id); + } + + @Override + public MallUserInfo getByBOpenId(String openId, String tenantId) { + return mallUserInfoMapper.selectByBOpenId(openId, tenantId); + } + + @Override + public void updateBOpenId(MallUserInfo user) { + MallUserInfo updateUser = new MallUserInfo(); + updateUser.setId(user.getId()); + updateUser.setBopenId(user.getBopenId()); + mallUserInfoMapper.updateByPrimaryKeySelective(user); + } + + @Override + public MallUserInfo getByPhone(String phone, String tenantId) { + return mallUserInfoMapper.selectByPhone(phone, tenantId); + } + + @Override + public List getUserByPhone(String phone) { + return mallUserInfoMapper.selectUsersByPhone(phone); + } + + @Override + public List getByWebOpenId(String webOpenId) { + return mallUserInfoMapper.selectByWebOpenId(webOpenId); + } + + @Override + public List getUsersByWebOpenId(String webOpenId) { + return mallUserInfoMapper.selectUsersByWebOpenId(webOpenId); + } + + @Override + public void saveOrUpdate(MallUserInfo record) { + if (record.getId() == null) { + //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + if(StringUtils.isBlank(record.getFlowPermission())){ + record.setFlowPermission("[]"); + } + mallUserInfoMapper.insertSelective(record); + } else { + mallUserInfoMapper.updateByPrimaryKeySelective(record); + } + } + + @Override + public void deleteById(Long id) { + mallUserInfoMapper.deleteByPrimaryKey(id); + } + + @Override + public MallUserInfo getByUsername(String username) { + return mallUserInfoMapper.selectByUserName(username); + } + + @Override + public long cntByUserName(String username) { + MallUserInfo userInfo = new MallUserInfo(); + userInfo.setUsername(username); + return PageHelper.count(() -> mallUserInfoMapper.select(userInfo)); + } + + @Override + public boolean hasButtonPermission(Long userId, String permission) { + return mallUserInfoMapper.hasButtonPermission(userId, permission) == null ? false : true; + } + + @Override + public boolean cntByUserName(String username, Long id) { + Map params = new HashMap<>(); + params.put("username", username); + params.put("id", id); + return mallUserInfoMapper.cntByUserName(params) > 0 ? true : false; + } + + @Override + public boolean cntByUserPhone(String phone, Long id) { + Map params = new HashMap<>(); + params.put("phone", phone); + params.put("id", id); + return mallUserInfoMapper.cntByUserName(params) > 0 ? true : false; + } + + @Override + public List findList(MallUserInfo record){ + return mallUserInfoMapper.findList(record); + } + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxAppinfoServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxAppinfoServiceImpl.java new file mode 100644 index 0000000..4f542a1 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxAppinfoServiceImpl.java @@ -0,0 +1,243 @@ +package com.iformall.service.impl; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor; +import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.enums.EnumAppType; +import com.iformall.exception.MallinkException; +import com.iformall.mapper.WxAppinfoMapper; +import com.iformall.service.WxAppinfoService; +import com.iformall.utils.Constant; +import com.iformall.utils.QRCodeUtils; +import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.iformall.common.IdWorker; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; +import java.util.List; + +@Service +public class WxAppinfoServiceImpl implements WxAppinfoService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxAppinfoMapper wxAppinfoMapper; + + @Override + public WxAppinfo getCAppInfo(String tenantId) { + WxAppinfo appInfo = null; + WxAppinfo appinfoQ = new WxAppinfo(); + appinfoQ.setTenantId(tenantId); + appinfoQ.setType(EnumAppType.C.getCode()); + List appList = wxAppinfoMapper.select(appinfoQ); + if (appList.size() > 0) { + appInfo = appList.get(0); + } + return appInfo; + } + + @Override + public WxAppinfo getByAppId(String appId) { + return wxAppinfoMapper.findByAppId(appId); + } + + @Override + public PageInfo listAsPage(WxAppinfo record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxAppinfoMapper.findList(record)); + } + + @Override + public WxAppinfo getById(Long id) { + return wxAppinfoMapper.selectByPrimaryKey(id); + } + + @Override + public void saveOrUpdate(WxAppinfo record) { + if (record.getId() == null) { + //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + wxAppinfoMapper.insertSelective(record); + } else { + wxAppinfoMapper.updateByPrimaryKeySelective(record); + } + } + + @Override + public void deleteById(Long id) { + wxAppinfoMapper.deleteByPrimaryKey(id); + } + + + /** + * 租户c端小程序更新token + * @param tenantId + */ + @Override + public void ctokenUpdate(String tenantId) { + WxAppinfo appQ = new WxAppinfo(); + appQ.setTenantId(tenantId); + appQ.setType(EnumAppType.C.getCode()); + List appList = wxAppinfoMapper.findList(appQ); + if (appList.size() <= 0) { + return; + } + WxAppinfo appinfo = appList.get(0); + // get access_token + WxMaInMemoryConfig config = new WxMaInMemoryConfig(); + config.setAppid(appinfo.getAppId()); + config.setSecret(appinfo.getSecret()); + if (null != appinfo.getAccessToken()) { + config.setAccessToken(appinfo.getAccessToken()); + config.setExpiresTime(appinfo.getLastTokenTime().getTime()); + } + WxMaService wxMaService = new WxMaServiceImpl(); + wxMaService.setWxMaConfig(config); + + String access_token = ""; + try{ + access_token = wxMaService.getAccessToken(); + } catch (Exception e) { + logger.error(e.getMessage()); + } + Date date = new Date(); + // update db + appinfo.setAccessToken(access_token); + appinfo.setLastTokenTime(date); + wxAppinfoMapper.updateByPrimaryKeySelective(appinfo); + } + + private void downFile(String filePath, String filename, HttpServletResponse response, HttpServletRequest req) throws IOException { + try { + response.reset(); + response.setContentType("bin"); + String agent = req.getHeader("user-agent"); + if (agent.contains("Firefox")) { + response.setHeader("Content-disposition", + "attachment; filename=" + + new String(filename.getBytes("GB2312"),"ISO-8859-1")); + } else { + response.setHeader("Content-disposition", + "attachment; filename=" + + java.net.URLEncoder.encode(filename,"UTF-8")); + } + // 循环取出流中的数据 + byte[] b = new byte[1024]; + int len; + InputStream inStream = new FileInputStream(filePath); + while ((len = inStream.read(b)) > 0) + response.getOutputStream().write(b, 0, len); + inStream.close(); + } catch (Exception e) { + logger.error(e.getMessage()); + } + } + + @Override + public void exportQrcode(HttpServletRequest request, HttpServletResponse response, + String tenantId, int type, String pageUrl, String sceneParam, + int withText, String text1, String text2 ) { + // type 0 有限二维码, 1 无限制二维码 + // withText 0 不带字 1. 带下面的字,2 带下面的两行字 + WxAppinfo appQ = new WxAppinfo(); + appQ.setTenantId(tenantId); + appQ.setType(EnumAppType.C.getCode()); + List appList = wxAppinfoMapper.findList(appQ); + if (appList.size() <= 0) { + return; + } + WxAppinfo appinfo = appList.get(0); + boolean autoColor = false; + boolean isHyaline = true; + WxMaCodeLineColor color = new WxMaCodeLineColor("0", "0", "0"); + + WxMaInMemoryConfig config = new WxMaInMemoryConfig(); + config.setAppid(appinfo.getAppId()); + config.setSecret(appinfo.getSecret()); + WxMaService wxMaService = new WxMaServiceImpl(); + wxMaService.setWxMaConfig(config); + + String pathStr = ""; + if (StringUtils.isNotBlank(sceneParam)) { + pathStr = pageUrl + "?scene="+sceneParam; + } else { + pathStr = pageUrl; + } + + + String filepath = Constant.fileDirectory; + String fileName = sceneParam + ".png"; + String destPath1 = filepath + "1_" + fileName; + String destPath = filepath + fileName; + + File dest = new File(destPath); + File pDest = dest.getParentFile(); + if (!pDest.exists()) { + pDest.mkdirs(); + } + try { + Date imgDate = new Date(); + if(type == 0) { + final File codeFile = wxMaService.getQrcodeService().createQrcode(pathStr, QRCodeUtils.QR_WIDTH); + if (withText == 1) { + File dest1 = new File(destPath1); + org.apache.commons.io.FileUtils.copyFile(codeFile, dest1); + QRCodeUtils.graphicsGeneration(dest1, dest, text1); + org.apache.commons.io.FileUtils.forceDelete(dest1); + } else if (withText == 2) { + File dest1 = new File(destPath1); + org.apache.commons.io.FileUtils.copyFile(codeFile, dest1); + QRCodeUtils.graphicsGeneration2(dest1, dest, text1, text2); + org.apache.commons.io.FileUtils.forceDelete(dest1); + } else { + org.apache.commons.io.FileUtils.copyFile(codeFile, dest); + } + org.apache.commons.io.FileUtils.forceDelete(codeFile); + } else { + final File codeFile = wxMaService.getQrcodeService().createWxaCodeUnlimit(sceneParam, pageUrl, QRCodeUtils.QR_WIDTH, autoColor, color, isHyaline); + if (withText == 1) { + File dest1 = new File(destPath1); + org.apache.commons.io.FileUtils.copyFile(codeFile, dest1); + QRCodeUtils.graphicsGeneration(dest1, dest, text1); + org.apache.commons.io.FileUtils.forceDelete(dest1); + } else if (withText == 2) { + File dest1 = new File(destPath1); + org.apache.commons.io.FileUtils.copyFile(codeFile, dest1); + QRCodeUtils.graphicsGeneration2(dest1, dest, text1, text2); + org.apache.commons.io.FileUtils.forceDelete(dest1); + } else { + org.apache.commons.io.FileUtils.copyFile(codeFile, dest); + } + org.apache.commons.io.FileUtils.forceDelete(codeFile); + } + + } catch (WxErrorException e) { + logger.error(e.getMessage()); + } catch (Exception e) { + logger.error(e.getMessage()); + } + + try { + downFile(destPath, fileName, response, request); + org.apache.commons.io.FileUtils.forceDelete(dest); + } catch (Exception e) { + logger.error(e.getMessage()); + } + + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxAuthorizerInfoServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxAuthorizerInfoServiceImpl.java new file mode 100644 index 0000000..9ddce66 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxAuthorizerInfoServiceImpl.java @@ -0,0 +1,184 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxAuthorizerInfo; +import com.iformall.domain.po.WxWeappExtSet; +import com.iformall.domain.vo.WxWeappInfo; +import com.iformall.mapper.WxAppinfoMapper; +import com.iformall.mapper.WxAuthorizerInfoMapper; +import com.iformall.mapper.WxWeappExtSetMapper; +import com.iformall.service.WxAuthorizerInfoService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.iformall.common.IdWorker; + +import java.util.Date; +import java.util.List; + +@Service +public class WxAuthorizerInfoServiceImpl implements WxAuthorizerInfoService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxAuthorizerInfoMapper authorizerInfoMapper; + + @Autowired + WxWeappExtSetMapper weappExtSetMapper; + + @Autowired + WxAppinfoMapper appinfoMapper; + + + @Override + public PageInfo listAsPage(WxAuthorizerInfo record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> authorizerInfoMapper.findList(record)); + } + + @Override + public PageInfo listVoAsPage(WxWeappInfo record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> authorizerInfoMapper.findVoList(record)); + } + + @Override + public List getList(WxWeappInfo record) { + return authorizerInfoMapper.findVoList(record); + } + + @Override + public WxAuthorizerInfo getById(Long id) { + return authorizerInfoMapper.selectByPrimaryKey(id); + } + + @Override + public WxAuthorizerInfo getByAppId(String appId) { + WxAuthorizerInfo authQ = new WxAuthorizerInfo(); + authQ.setAuthorizerAppid(appId); + try { + WxAuthorizerInfo authorizerInfo = authorizerInfoMapper.selectOne(authQ); + return authorizerInfo; + } catch (Exception e) { + logger.error(e.getMessage()); + } + return null; + } + + @Override + public void saveOrUpdate(WxAuthorizerInfo record) { + // 1. 添加到wx_authorizer_info表中 + // 2. 同时在wx_weapp_ext_set中添加一条记录 + // 3. 同时在wx_weapp_code_status中添加一条记录 + Date curDate = new Date(); + logger.info(record.toString()); + WxAuthorizerInfo authorizerInfo = null; + try { + WxAuthorizerInfo aiQ = new WxAuthorizerInfo(); + aiQ.setAuthorizerAppid(record.getAuthorizerAppid()); + authorizerInfo = authorizerInfoMapper.selectOne(aiQ); + } catch (Exception e) { + logger.error(e.getMessage()); + } + if (authorizerInfo == null) { + WxAppinfo appinfo = appinfoMapper.findByAppId(record.getAuthorizerAppid()); + if(appinfo != null) { + record.setId(appinfo.getId()); + } else { + //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + } + record.setCreateTime(curDate); + record.setUpdateTime(curDate); + // 授权表 添加 + authorizerInfoMapper.insertSelective(record); + // 扩展配置表添加 + WxWeappExtSet weappExtSet = new WxWeappExtSet(); + weappExtSet.setId(record.getId()); + weappExtSet.setAppId(record.getAuthorizerAppid()); + if(appinfo != null) { + weappExtSet.setType(appinfo.getType()); + } + weappExtSet.setCreateDate(curDate); + weappExtSet.setUpdateDate(curDate); + weappExtSetMapper.insertSelective(weappExtSet); + } else { + record.setId(authorizerInfo.getId()); + record.setUpdateTime(curDate); + logger.info(record.toString()); + authorizerInfoMapper.updateByPrimaryKeySelective(record); + } + } + + @Override + public void deleteById(Long id) { + authorizerInfoMapper.deleteByPrimaryKey(id); + } + + @Override + public void updateReleaseVersion(WxAuthorizerInfo record) { + authorizerInfoMapper.updateReleaseInfo(record); + } + + @Override + public void updateBaseVersion(WxAuthorizerInfo record) { + Date curDate = new Date(); + WxAuthorizerInfo info = new WxAuthorizerInfo(); + info.setId(record.getId()); + info.setBaseStatus(record.getBaseStatus()); + info.setBaseTime(curDate); + info.setUpdateTime(curDate); + authorizerInfoMapper.updateByPrimaryKeySelective(record); + } + + @Override + public void updateDomainUrl(WxAuthorizerInfo record) { + Date curDate = new Date(); + WxAuthorizerInfo info = new WxAuthorizerInfo(); + info.setId(record.getId()); + info.setDomainStatus(record.getDomainStatus()); + info.setDomainTime(curDate); + info.setUpdateTime(curDate); + authorizerInfoMapper.updateByPrimaryKeySelective(record); + } + + @Override + public void updateWebDomainUrl(WxAuthorizerInfo record) { + Date curDate = new Date(); + WxAuthorizerInfo info = new WxAuthorizerInfo(); + info.setId(record.getId()); + info.setWebdomainStatus(record.getWebdomainStatus()); + info.setWebdomainTime(curDate); + info.setUpdateTime(curDate); + authorizerInfoMapper.updateByPrimaryKeySelective(record); + } + + @Override + public void updateTemplate(WxAuthorizerInfo record) { + Date curDate = new Date(); + WxAuthorizerInfo info = new WxAuthorizerInfo(); + info.setId(record.getId()); + info.setTemplateStatus(record.getTemplateStatus()); + info.setTemplateTime(curDate); + info.setUpdateTime(curDate); + authorizerInfoMapper.updateByPrimaryKeySelective(record); + } + + @Override + public void updateOpenAppid(WxAuthorizerInfo record) { + Date curDate = new Date(); + WxAuthorizerInfo info = new WxAuthorizerInfo(); + info.setId(record.getId()); + info.setOpenAppid(record.getOpenAppid()); + info.setBindOpenTime(curDate); + authorizerInfoMapper.updateByPrimaryKeySelective(record); + } + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxComponentVerifyTicketServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxComponentVerifyTicketServiceImpl.java new file mode 100644 index 0000000..b6f29c1 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxComponentVerifyTicketServiceImpl.java @@ -0,0 +1,64 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxComponentVerifyTicket; +import com.iformall.mapper.WxComponentVerifyTicketMapper; +import com.iformall.service.WxComponentVerifyTicketService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.iformall.common.IdWorker; + +@Service +public class WxComponentVerifyTicketServiceImpl implements WxComponentVerifyTicketService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxComponentVerifyTicketMapper wxComponentVerifyTicketMapper; + + + @Override + public PageInfo listAsPage(WxComponentVerifyTicket record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxComponentVerifyTicketMapper.findList(record)); + } + + @Override + public WxComponentVerifyTicket getById(Long id) { + return wxComponentVerifyTicketMapper.selectByPrimaryKey(id); + } + + @Override + public void saveOrUpdate(WxComponentVerifyTicket record) { + WxComponentVerifyTicket wxComponentVerifyTicket = null; + try { + WxComponentVerifyTicket ctQ = new WxComponentVerifyTicket(); + ctQ.setComponentAppid(record.getComponentAppid()); + wxComponentVerifyTicket = wxComponentVerifyTicketMapper.selectOne(ctQ); + } catch (Exception e) { + logger.error(e.getMessage()); + } + if (wxComponentVerifyTicket == null) { + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + wxComponentVerifyTicketMapper.insertSelective(record); + } else { + record.setId(wxComponentVerifyTicket.getId()); + wxComponentVerifyTicketMapper.updateByPrimaryKeySelective(record); + } + } + + @Override + public void deleteById(Long id) { + wxComponentVerifyTicketMapper.deleteByPrimaryKey(id); + } + + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxTemplateMsgServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxTemplateMsgServiceImpl.java new file mode 100644 index 0000000..0376b3b --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxTemplateMsgServiceImpl.java @@ -0,0 +1,67 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxTemplateMsg; +import com.iformall.mapper.WxTemplateMsgMapper; +import com.iformall.service.WxTemplateMsgService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.iformall.common.IdWorker; + +import java.util.Date; + +@Service +public class WxTemplateMsgServiceImpl implements WxTemplateMsgService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxTemplateMsgMapper wxTemplateMsgMapper; + + + @Override + public PageInfo listAsPage(WxTemplateMsg record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxTemplateMsgMapper.findList(record)); + } + + @Override + public WxTemplateMsg getById(Long id) { + return wxTemplateMsgMapper.selectByPrimaryKey(id); + } + + @Override + public WxTemplateMsg getByObj(WxTemplateMsg record) { + return wxTemplateMsgMapper.selectOne(record); + } + + @Override + public void saveOrUpdate(WxTemplateMsg record) { + Date curDate = new Date(); + if (record.getId() == null) { + //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + record.setCreateDate(curDate); + record.setUpdateDate(curDate); + wxTemplateMsgMapper.insertSelective(record); + } else { + record.setUpdateDate(curDate); + wxTemplateMsgMapper.updateByPrimaryKeySelective(record); + } + } + + @Override + public void deleteById(Long id) { + wxTemplateMsgMapper.deleteByPrimaryKey(id); + } + + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxWeappAuditStatusServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxWeappAuditStatusServiceImpl.java new file mode 100644 index 0000000..878fcb9 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxWeappAuditStatusServiceImpl.java @@ -0,0 +1,77 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.IdWorker; +import com.iformall.domain.po.WxWeappAuditStatus; +import com.iformall.domain.vo.WxWeappAuditStatusVo; +import com.iformall.mapper.WxWeappAuditStatusMapper; +import com.iformall.service.WxWeappAuditStatusService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +public class WxWeappAuditStatusServiceImpl implements WxWeappAuditStatusService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxWeappAuditStatusMapper weappAuditStatusMapper; + + + @Override + public PageInfo listAsPage(WxWeappAuditStatusVo record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> weappAuditStatusMapper.findVoList(record)); + } + + @Override + public List getList(WxWeappAuditStatusVo record) { + return weappAuditStatusMapper.findVoList(record); + } + + @Override + public List getVersionList(Integer type, Integer auditStatus) { + return weappAuditStatusMapper.findUserVersions(type, auditStatus); + } + + @Override + public WxWeappAuditStatus getById(Long id) { + return weappAuditStatusMapper.selectByPrimaryKey(id); + } + + @Override + public WxWeappAuditStatus getByAppId(String appId) { + WxWeappAuditStatus statusQ = new WxWeappAuditStatus(); + statusQ.setAppId(appId); + return weappAuditStatusMapper.selectOne(statusQ); + } + + @Override + public void saveStatus(WxWeappAuditStatus record) { + logger.info("AUDIT: " + record.toString()); + weappAuditStatusMapper.insertSelective(record); + } + + @Override + public void updateStatus(WxWeappAuditStatus record) { + logger.info("AUDIT: " + record.toString()); + weappAuditStatusMapper.updateByPrimaryKeySelective(record); + } + + @Override + public void deleteById(Long id) { + weappAuditStatusMapper.deleteByPrimaryKey(id); + } + + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxWeappBasicSetServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxWeappBasicSetServiceImpl.java new file mode 100644 index 0000000..87c23a0 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxWeappBasicSetServiceImpl.java @@ -0,0 +1,59 @@ +package com.iformall.service.impl; + +import java.util.*; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxWeappBasicSet; +import com.iformall.mapper.WxWeappBasicSetMapper; +import com.iformall.service.WxWeappBasicSetService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.iformall.common.IdWorker; + +@Service +public class WxWeappBasicSetServiceImpl implements WxWeappBasicSetService { + + @Autowired + WxWeappBasicSetMapper wxWeappBasicSetMapper; + + + @Override + public PageInfo listAsPage(WxWeappBasicSet record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxWeappBasicSetMapper.findList(record)); + } + + @Override + public WxWeappBasicSet getById(Long id) { + return wxWeappBasicSetMapper.selectByPrimaryKey(id); + } + + @Override + public WxWeappBasicSet getByTypeAndDeploy(WxWeappBasicSet weappBasicSet) { + return wxWeappBasicSetMapper.selectOne(weappBasicSet); + } + + @Override + public void saveOrUpdate(WxWeappBasicSet record) { + if (record.getId() == null) { + //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + wxWeappBasicSetMapper.insertSelective(record); + } else { + wxWeappBasicSetMapper.updateByPrimaryKeySelective(record); + } + } + + @Override + public void deleteById(Long id) { + wxWeappBasicSetMapper.deleteByPrimaryKey(id); + } + + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxWeappCodeStatusServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxWeappCodeStatusServiceImpl.java new file mode 100644 index 0000000..dd15f5b --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxWeappCodeStatusServiceImpl.java @@ -0,0 +1,79 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.common.IdWorker; +import com.iformall.domain.po.WxWeappCodeStatus; +import com.iformall.domain.vo.WxWeappCodeStatusVo; +import com.iformall.mapper.WxAuthorizerInfoMapper; +import com.iformall.mapper.WxWeappCodeStatusMapper; +import com.iformall.service.WxWeappCodeStatusService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Service +public class WxWeappCodeStatusServiceImpl implements WxWeappCodeStatusService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxWeappCodeStatusMapper weappCodeStatusMapper; + + + @Override + public PageInfo listAsPage(WxWeappCodeStatusVo record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> weappCodeStatusMapper.findVoList(record)); + } + + @Override + public List getList(WxWeappCodeStatusVo record) { + return weappCodeStatusMapper.findVoList(record); + } + + @Override + public List getVersionList(Integer type) { + return weappCodeStatusMapper.findUserVersions(type); + } + + @Override + public WxWeappCodeStatus getById(Long id) { + return weappCodeStatusMapper.selectByPrimaryKey(id); + } + + @Override + public WxWeappCodeStatus getByAppId(String appId) { + WxWeappCodeStatus weappCodeStatusQ = new WxWeappCodeStatus(); + weappCodeStatusQ.setAppId(appId); + return weappCodeStatusMapper.selectOne(weappCodeStatusQ); + } + + @Override + public void saveStatus(WxWeappCodeStatus record) { + logger.info("CODE-COMMIT: " + record.toString()); + weappCodeStatusMapper.insertSelective(record); + } + + @Override + public void updateStatus(WxWeappCodeStatus record) { + logger.info("CODE-COMMIT: " + record.toString()); + weappCodeStatusMapper.updateStatus(record); + } + + @Override + public void deleteById(Long id) { + weappCodeStatusMapper.deleteByPrimaryKey(id); + } + + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxWeappExtSetServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxWeappExtSetServiceImpl.java new file mode 100644 index 0000000..95262af --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxWeappExtSetServiceImpl.java @@ -0,0 +1,58 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxWeappExtSet; +import com.iformall.mapper.WxWeappExtSetMapper; +import com.iformall.service.WxWeappExtSetService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.iformall.common.IdWorker; + +@Service +public class WxWeappExtSetServiceImpl implements WxWeappExtSetService { + + @Autowired + WxWeappExtSetMapper wxWeappExtSetMapper; + + + @Override + public PageInfo listAsPage(WxWeappExtSet record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxWeappExtSetMapper.findList(record)); + } + + @Override + public WxWeappExtSet getById(Long id) { + return wxWeappExtSetMapper.selectByPrimaryKey(id); + } + + @Override + public WxWeappExtSet getByObj(WxWeappExtSet record) { + return wxWeappExtSetMapper.selectOne(record); + } + + @Override + public void saveOrUpdate(WxWeappExtSet record) { + if (record.getId() == null) { + //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); + final IdWorker idWorker = IdWorker.get(); + record.setId(idWorker.nextId()); + wxWeappExtSetMapper.insertSelective(record); + } else { + wxWeappExtSetMapper.updateByPrimaryKeySelective(record); + } + } + + @Override + public void deleteById(Long id) { + wxWeappExtSetMapper.deleteByPrimaryKey(id); + } + + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxWeappReleaseStatusServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxWeappReleaseStatusServiceImpl.java new file mode 100644 index 0000000..8dd3fe7 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxWeappReleaseStatusServiceImpl.java @@ -0,0 +1,110 @@ +package com.iformall.service.impl; + +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxAuthorizerInfo; +import com.iformall.domain.po.WxWeappReleaseStatus; +import com.iformall.domain.vo.WxWeappReleaseStatusVo; +import com.iformall.enums.EnumWeappReleaseStatus; +import com.iformall.mapper.WxAuthorizerInfoMapper; +import com.iformall.mapper.WxWeappReleaseStatusMapper; +import com.iformall.service.WxWeappReleaseStatusService; +import org.omg.CORBA.INTERNAL; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Service +public class WxWeappReleaseStatusServiceImpl implements WxWeappReleaseStatusService { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + WxWeappReleaseStatusMapper weappReleaseStatusMapper; + + @Autowired + WxAuthorizerInfoMapper authorizerInfoMapper; + + + @Override + public PageInfo listAsPage(WxWeappReleaseStatusVo record, Integer pageIndex, Integer pageSize) { + return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> weappReleaseStatusMapper.findVoList(record)); + } + + @Override + public List getList(WxWeappReleaseStatusVo record) { + return weappReleaseStatusMapper.findVoList(record); + } + + @Override + public List getVersionList(Integer type) { + return weappReleaseStatusMapper.findUserVersions(type); + } + + @Override + public WxWeappReleaseStatus getById(Long id) { + return weappReleaseStatusMapper.selectByPrimaryKey(id); + } + + @Override + public WxWeappReleaseStatus getByAppId(String appId) { + WxWeappReleaseStatus weappCodeStatusQ = new WxWeappReleaseStatus(); + weappCodeStatusQ.setAppId(appId); + return weappReleaseStatusMapper.selectOne(weappCodeStatusQ); + } + + @Override + public void saveStatus(WxWeappReleaseStatus record) { + logger.info("RELEASE: " + record.toString()); + weappReleaseStatusMapper.insertSelective(record); + } + + @Override + public void updateStatus(WxWeappReleaseStatus record) { + Date curDate = new Date(); + logger.info("RELEASE: " + record.toString()); + // 更新 小程序 状态 + if(record.getReleaseStatus().equals(EnumWeappReleaseStatus.SUCCESS.getCode())) { // 发布成功 + WxAuthorizerInfo updateInfo = new WxAuthorizerInfo(); + updateInfo.setAuthorizerAppid(record.getAppId()); + updateInfo.setCurrentVersion(record.getUserVersion()); + updateInfo.setCurrentDesc(record.getVersionDesc()); + updateInfo.setReleaseTime(curDate); + updateInfo.setUpdateTime(curDate); + authorizerInfoMapper.updateReleaseInfo(updateInfo); + } + // 发布回退,退回上次发布状态 + if(record.getReleaseStatus().equals(EnumWeappReleaseStatus.BACK.getCode())) { + try { + WxAuthorizerInfo appQ = new WxAuthorizerInfo(); + appQ.setAuthorizerAppid(record.getAppId()); + WxAuthorizerInfo authorizerInfo = authorizerInfoMapper.selectOne(appQ); + if(authorizerInfo != null) { + record.setUserVersion(authorizerInfo.getCurrentVersion()); + record.setVersionDesc(authorizerInfo.getCurrentDesc()); + record.setReleaseTime(authorizerInfo.getReleaseTime()); + } + } catch (Exception e) { + logger.error(e.getMessage()); + } + } + weappReleaseStatusMapper.updateStatus(record); + } + + @Override + public void deleteById(Long id) { + weappReleaseStatusMapper.deleteByPrimaryKey(id); + } + + + + + + + + +} diff --git a/mallinkService/src/main/java/com/iformall/utils/Constant.java b/mallinkService/src/main/java/com/iformall/utils/Constant.java new file mode 100644 index 0000000..bdbce4d --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/utils/Constant.java @@ -0,0 +1,8 @@ +package com.iformall.utils; + +public class Constant { + + public static final String fileDirectory = "./uploads/"; + public static final String importMemPrev = "importmem/"; + public static final String adminPage = "http://admin.malls.iformall.com"; +} diff --git a/mallinkService/src/main/java/com/iformall/utils/IPUtil.java b/mallinkService/src/main/java/com/iformall/utils/IPUtil.java new file mode 100644 index 0000000..467d4dd --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/utils/IPUtil.java @@ -0,0 +1,52 @@ +package com.iformall.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletRequest; +import java.net.InetAddress; +import java.net.UnknownHostException; + +public class IPUtil { + private final static Logger logger = LoggerFactory.getLogger(IPUtil.class); + private final static String UNKNOWN = "unknown"; + + + public static String getIpAddr(HttpServletRequest request) { + String ipAddress = request.getHeader("x-forwarded-for"); + if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("WL-Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("HTTP_CLIENT_IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) { + ipAddress = request.getRemoteAddr(); + if (ipAddress.equals("127.0.0.1") || ipAddress.equals("0:0:0:0:0:0:0:1")) { + //根据网卡获取本机配置的IP地址 + InetAddress inetAddress = null; + try { + inetAddress = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + logger.error(e.getMessage()); + } + ipAddress = inetAddress.getHostAddress(); + } + } + //对于通过多个代理的情况,第一个IP为客户端真实的IP地址,多个IP按照','分割 + if (null != ipAddress && ipAddress.length() > 15) { + //"***.***.***.***".length() = 15 + if (ipAddress.indexOf(",") > 0) { + ipAddress = ipAddress.substring(0, ipAddress.indexOf(",")); + } + } + + return ipAddress; + } +} diff --git a/mallinkService/src/main/java/com/iformall/utils/QRCodeUtils.java b/mallinkService/src/main/java/com/iformall/utils/QRCodeUtils.java new file mode 100644 index 0000000..f9ec744 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/utils/QRCodeUtils.java @@ -0,0 +1,147 @@ +package com.iformall.utils; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.font.FontRenderContext; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.io.File; + +/** + * Created by Stormeye on 2017/8/7. + */ +public class QRCodeUtils { + + public static String PAGE_URL = "pages/index/index"; + + public static final int QR_WIDTH = 430; + public static final int QR_HIGHT = 430; + public static final int QR_FONT_SIZE = 19; + public static final int QR_H_TIP = 90; + public static final int QR_H_TIP2 = 120; + + /** + * 二维码 + 文字1 + * + * @param oldimg + * @param newimg + * @param pressText + */ + public static void graphicsGeneration(File oldimg, File newimg, String pressText) { + int H_tip = QR_H_TIP; // 文字的高度 + int imageWidth = QR_WIDTH; // 图片的宽度 + int imageHeight = QR_HIGHT + QR_H_TIP; // 图片的高度 + + BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB); + // 设置图片的背景色 + Graphics2D main = image.createGraphics(); + main.setColor(Color.white); + main.fillRect(0, 0, imageWidth, imageHeight); + + Graphics mainPic = image.getGraphics(); + BufferedImage bimg = null; + try { + bimg = ImageIO.read(oldimg); + if (bimg != null) { + mainPic.drawImage(bimg, 0, 0, QR_WIDTH, QR_HIGHT, null); + mainPic.dispose(); + } + + Graphics2D tip = image.createGraphics(); + // 设置区域颜色 + tip.setColor(Color.white); + // 填充区域并确定区域大小位置 + tip.fillRect(0, QR_HIGHT, QR_WIDTH, H_tip); + + // 设置字体颜色,先设置颜色,再填充内容 + tip.setColor(Color.black); + // 设置字体 + Font tipFont = new Font("宋体", Font.PLAIN, QR_FONT_SIZE); + tip.setFont(tipFont); + FontRenderContext context = tip.getFontRenderContext(); + Rectangle2D bounds = tipFont.getStringBounds(pressText, context); + double x = (QR_WIDTH - bounds.getWidth()) / 2; + tip.drawString(pressText, (int) x, QR_HIGHT + 50); + + // 分割线 + tip.drawLine(0, QR_HIGHT, QR_WIDTH, QR_HIGHT); + + //FileOutputStream out = new FileOutputStream(newimg); + ImageIO.write(image, "png", newimg); + //JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); + //encoder.encode(image); + //out.close(); + + } catch (Exception e) { + e.printStackTrace(); + System.out.println(e); + } + + } + + /** + * 二维码 + 文字1 + 文字2 + * + * @param oldimg + * @param newimg + * @param pressText1 + * @param pressText2 + */ + public static void graphicsGeneration2(File oldimg, File newimg, String pressText1, String pressText2) { + int H_tip = QR_H_TIP2; // 文字的高度 + int imageWidth = QR_WIDTH; // 图片的宽度 + int imageHeight = QR_HIGHT + QR_H_TIP2; // 图片的高度 + + BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB); + // 设置图片的背景色 + Graphics2D main = image.createGraphics(); + main.setColor(Color.white); + main.fillRect(0, 0, imageWidth, imageHeight); + + Graphics mainPic = image.getGraphics(); + BufferedImage bimg = null; + try { + bimg = ImageIO.read(oldimg); + if (bimg != null) { + mainPic.drawImage(bimg, 0, 0, QR_WIDTH, QR_HIGHT, null); + mainPic.dispose(); + } + + Graphics2D tip = image.createGraphics(); + // 设置区域颜色 + tip.setColor(Color.white); + // 填充区域并确定区域大小位置 + tip.fillRect(0, QR_HIGHT, QR_WIDTH, H_tip); + // 设置字体颜色,先设置颜色,再填充内容 + tip.setColor(Color.black); + + // 设置字体 + Font tipFont = new Font("粗体", Font.BOLD, QR_FONT_SIZE); + tip.setFont(tipFont); + FontRenderContext context = tip.getFontRenderContext(); + Rectangle2D bounds1 = tipFont.getStringBounds(pressText1, context); + double x = (QR_WIDTH - bounds1.getWidth()) / 2; + tip.drawString(pressText1, (int) x, QR_HIGHT + 50); + + Rectangle2D bounds2 = tipFont.getStringBounds(pressText2, context); + x = (QR_WIDTH - bounds2.getWidth()) / 2; + tip.drawString(pressText2, (int) x, QR_HIGHT + 90); + //FileOutputStream out = new FileOutputStream(newimg); + ImageIO.write(image, "png", newimg); + //JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); + //encoder.encode(image); + //out.close(); + + } catch (Exception e) { + e.printStackTrace(); + System.out.println(e); + } + + } + + public static void main(String[] args) { + File souce = new File("./uploads/null.png"); + File dest = new File("./uploads/new.png"); + graphicsGeneration(souce, dest, "长融世贸广场停车专用"); + } +} diff --git a/mallinkService/src/main/resources/mapper/MallPermissionMapper.xml b/mallinkService/src/main/resources/mapper/MallPermissionMapper.xml new file mode 100644 index 0000000..7285671 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/MallPermissionMapper.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + `id`,`name`,`available`,`parent_id`,`parent_ids`,`permission`,`resource_type`,`url`,`sort` + + + + where 1 = 1 + + + and `id` = #{id} + + + + + and `name` like concat('%', #{name},'%') + + + and `name` like concat('%', #{nameLike},'%') + + + and `available` like concat('%', #{available},'%') + + + + + and `parent_id` = #{parentId} + + + + + and `parent_ids` like concat('%', #{parentIds},'%') + + + + + and `permission` like concat('%', #{permission},'%') + + + + and `permission` in + + #{item_permission} + + + + + and `resource_type` like concat('%', #{resourceType},'%') + + + + + and `url` like concat('%', #{url},'%') + + + + + and `sort` = #{sort} + + + and `sort` >= #{sortFrom} + and #{sortTo} >= `sort` + and `sort` >= #{sortGte} + and `sort` > #{sortGt} + and #{sortLte} >= `sort` + and #{sortLt} > `sort` + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + diff --git a/mallinkService/src/main/resources/mapper/MallUserInfoMapper.xml b/mallinkService/src/main/resources/mapper/MallUserInfoMapper.xml new file mode 100644 index 0000000..bf30fd4 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/MallUserInfoMapper.xml @@ -0,0 +1,264 @@ + + + + + + + + + + + + + + + + + + + + + + `id`,`tenant_id`,`username`,`name`,`password`,`create_time`,`last_login_time`,`status`,`is_admin`,`nick_name`,`phone`,`flow_permission`,`web_open_id` + + + + `id`,`tenant_id`,`username`,`name`,`password`,`create_time`,`last_login_time`,`status`,`is_admin`,`nick_name`,`phone`,`flow_permission`, + `bopen_id`,`web_open_id` + + + + where 1 = 1 + + and `id` = #{id} + + + + and `tenant_id` = #{tenantId} + + + + and `username` like concat('%', #{username},'%') + + + + and `nick_name` like concat('%', #{nickName},'%') + + + + and `name` like concat('%', #{name},'%') + + + + and `password` like concat('%', #{password},'%') + + + + and `create_time` = #{createTime} + + + + and `last_login_time` = #{lastLoginTime} + + + + and `status` = #{status} + + + + and `is_admin` = #{isAdmin} + + + and `phone` = #{phone} + + + and `bopen_id` = #{bopenId} + + + and `web_open_id` = #{webOpenId} + + + and JSON_CONTAINS(flow_permission->'$[*]', #{flowPermission}, '$') + + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + + + + + + + update mall_user_info + set `web_open_id` = null + where 1=1 + + and `tenant_id`=#{tenantId} + + + and username=#{username} + + + and `id` = #{id} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + u.`id`,u.`tenant_id`,u.`username`,u.`name`,u.`password`,u.`create_time`,u.`last_login_time`,u.`status`,u.`is_admin`,u.`nick_name`,u.`phone`,u.`flow_permission`, + m.`name` as mall_name, m.`group` as mall_group, m.`img_url`, m.`img_url_h` + + + + u.`id`,u.`tenant_id`,u.`username`,u.`name`,u.`password`,u.`create_time`,u.`last_login_time`,u.`status`,u.`is_admin`,u.`nick_name`,u.`phone`,u.`flow_permission`, + u.`bopen_id`,u.`web_open_id`, + m.`name` as mall_name, m.`group` as mall_group, m.`img_url`, m.`img_url_h` + + + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxAppinfoMapper.xml b/mallinkService/src/main/resources/mapper/WxAppinfoMapper.xml new file mode 100644 index 0000000..b852e23 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxAppinfoMapper.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + `id`,`tenant_id`,`app_id`,`parent_app_id`,`name`,`secret`,`token`,`aes_key`,`msg_data_format`,`access_token`,`last_token_time`,`expires_in`,`pay_id`,`type`,`pay_bill_id` + + + + where 1 = 1 + + + and `id` = #{id} + + + + and `tenant_id` = #{tenantId} + + + + and `app_id` = #{appId} + + + and `parent_app_id` like concat('%', #{parentAppId},'%') + + + + and `name` like concat('%', #{name},'%') + + + + and `secret` like concat('%', #{secret},'%') + + + + and `token` like concat('%', #{token},'%') + + + + and `aes_key` like concat('%', #{aesKey},'%') + + + + and `msg_data_format` like concat('%', #{msgDataFormat},'%') + + + + and `access_token` like concat('%', #{accessToken},'%') + + + + and `last_token_time` = #{lastTokenTime} + + + + and `expires_in` = #{expiresIn} + + + + and `pay_id` = #{payId} + + + and `type` = #{type} + + + and `pay_bill_id` = #{payBillId} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxAuthorizerInfoMapper.xml b/mallinkService/src/main/resources/mapper/WxAuthorizerInfoMapper.xml new file mode 100644 index 0000000..95ac137 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxAuthorizerInfoMapper.xml @@ -0,0 +1,234 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + `id`,`authorizer_appid`,`head_img`,`alias`,`qrcode_url`,`create_time`,`authorization_status`,`auth_time`, + `base_status`, `base_time`, `domain_status`, `domain_time`, `webdomain_status`, `webdomain_time`, `template_status`, `template_time`, + `current_version`,`current_desc`,`release_time`, + `open_appid`,`bind_open_time` + + + + where 1 = 1 + + and `id` = #{id} + + + and `authorizer_appid` = #{authorizerAppid} + + + and `head_img` like concat('%', #{headImg},'%') + + + and `alias` like concat('%', #{alias},'%') + + + and `qrcode_url` like concat('%', #{qrcodeUrl},'%') + + + and `create_time` = #{createTime} + + + and `update_time` = #{updateTime} + + + and `authorization_status` = #{authorizationStatus} + + + and `auth_time` = #{authTime} + + + and `base_status` = #{baseStatus} + + + and `base_time` = #{baseTime} + + + and `domain_status` = #{domainStatus} + + + and `domain_time` = #{domainTime} + + + and `webdomain_status` = #{webdomainStatus} + + + and `webdomain_time` = #{webdomainTime} + + + and `template_status` = #{templateStatus} + + + and `template_time` = #{templateTime} + + + and `current_version` = #{currentVersion} + + + and `current_desc` like concat('%', #{currentDesc},'%') + + + and `release_time` = #{releaseTime} + + + and `open_appid` = #{openAppid} + + + and `bind_open_time` = #{bindOpenTime} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + update wx_authorizer_info + set `current_version` = #{currentVersion}, `current_desc` = #{currentDesc}, `release_time` = #{releaseTime}, `update_time` = #{updateTime} + where `authorizer_appid` = #{authorizerAppid} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ai.`id`,ai.`authorizer_appid`,ai.`head_img`,ai.`alias`,ai.`qrcode_url`,ai.`create_time`,ai.`update_time`, + ai.`authorization_status`,ai.`auth_time`, + ai.`base_status`,ai.`base_time`, + ai.`domain_status`,ai.`domain_time`, + ai.`webdomain_status`,ai.`webdomain_time`, + ai.`template_status`,ai.`template_time`, + ai.`current_version`,ai.`current_desc`,ai.`release_time`, + ai.`open_appid`,ai.`bind_open_time`, + a.`type`,a.`name` + + + + where 1 = 1 + + and ai.`id` = #{id} + + + and a.`name` like concat('%', #{name},'%') + + + and a.`type` = #{type} + + + and ai.`authorizer_appid` = #{authorizerAppid} + + + and ai.`authorization_status` = #{authorizationStatus} + + + and ai.`auth_time` = #{authTime} + + + and ai.`base_status` = #{baseStatus} + + + and ai.`base_time` = #{baseTime} + + + and ai.`domain_status` = #{domainStatus} + + + and ai.`domain_time` = #{domainTime} + + + and ai.`webdomain_status` = #{webdomainStatus} + + + and ai.`webdomain_time` = #{webdomainTime} + + + and ai.`template_status` = #{templateStatus} + + + and ai.`template_time` = #{templateTime} + + + and ai.`current_version` = #{currentVersion} + + + and ai.`open_appid` = #{openAppid} + + + and ai.id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxComponentVerifyTicketMapper.xml b/mallinkService/src/main/resources/mapper/WxComponentVerifyTicketMapper.xml new file mode 100644 index 0000000..0d01442 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxComponentVerifyTicketMapper.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + `id`,`component_appid`,`component_verify_ticket`,`create_time`,`deadline` + + + + where 1 = 1 + + and `id` = #{id} + + + and `component_appid` like concat('%', #{componentAppid},'%') + + + and `component_verify_ticket` like concat('%', #{componentVerifyTicket},'%') + + + and `create_time` = #{createTime} + + + and `deadline` = #{deadline} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxPayAccountMapper.xml b/mallinkService/src/main/resources/mapper/WxPayAccountMapper.xml new file mode 100644 index 0000000..301d78a --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxPayAccountMapper.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + `id`,`mch_id`,`parent_mch_id`,`api_key`,`notify_url`,`cert_path`,`type`,`share`,`rate` + + + + where 1 = 1 + + + and `id` = #{id} + + + + and `mch_id` like concat('%', #{mchId},'%') + + + + and `parent_mch_id` like concat('%', #{parentMchId},'%') + + + + and `api_key` like concat('%', #{apiKey},'%') + + + + and `notify_url` like concat('%', #{notifyUrl},'%') + + + + and `cert_path` like concat('%', #{certPath},'%') + + + and `type` = #{type} + + + and `share` = #{share} + + + and `rate` = #{rate} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxPayOrderMapper.xml b/mallinkService/src/main/resources/mapper/WxPayOrderMapper.xml new file mode 100644 index 0000000..fc92664 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxPayOrderMapper.xml @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + `id`,`tenant_id`,`create_time`,`update_time`,`order_id`,`c_user_id`,`b_user_id`, + `auth_code`,`ip`,`pay_amount`,`pay_time_start`,`pay_time_end`, + `prepay_id`,`transaction_id`,`pay_vendor`,`pay_order_no`, + `pay_order_status`,`share`,`share_amount`,`fail_reason` + + + + where 1 = 1 + + + and `id` = #{id} + + + + and `tenant_id` = #{tenantId} + + + + and `create_time` = #{createTime} + + + + and `update_time` = #{updateTime} + + + + and `order_id` = #{orderId} + + + + and `c_user_id` = #{cUserId} + + + + and `b_user_id` = #{bUserId} + + + + and `auth_code` = #{authCode} + + + + and `ip` like concat('%', #{ip},'%') + + + + and `pay_amount` = #{payAmount} + + + + and `pay_time_start` = #{payTimeStart} + + + + and `pay_time_end` = #{payTimeEnd} + + + + and `prepay_id` like concat('%', #{prepayId},'%') + + + + and `transaction_id` like concat('%', #{transactionId},'%') + + + + and `pay_vendor` = #{payVendor} + + + + and `pay_order_no` like concat('%', #{payOrderNo},'%') + + + + and `pay_order_status` = #{payOrderStatus} + + + and `share` = #{share} + + + and `share_amount` = #{shareAmount} + + + and `fail_reason` like concat('%', #{failReason},'%') + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + p.`id`,p.`tenant_id`,p.`create_time`,p.`update_time`,p.`order_id`,p.`c_user_id`,p.`b_user_id`, + p.`auth_code`,p.`ip`,p.`pay_amount`,p.`pay_time_start`,p.`pay_time_end`, + p.`prepay_id`,p.`transaction_id`,p.`pay_vendor`,p.`pay_order_no`, + p.`pay_order_status`,p.`share`,p.`share_amount`,p.`fail_reason`, + u.`open_id`, + a.`app_id`, a.`pay_id` + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxTemplateMsgMapper.xml b/mallinkService/src/main/resources/mapper/WxTemplateMsgMapper.xml new file mode 100644 index 0000000..35266ad --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxTemplateMsgMapper.xml @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + `id`,`tenant_id`,`template_id`,`type`,`create_date`,`update_date` + + + + where 1 = 1 + + + and `id` = #{id} + + + + + and `tenant_id` = #{tenantId} + + + + + and `template_id` like concat('%', #{templateId},'%') + + + + + and `type` = #{type} + + + + + and `create_date` = #{createDate} + + + + + and `update_date` = #{updateDate} + + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxWeappAuditStatusMapper.xml b/mallinkService/src/main/resources/mapper/WxWeappAuditStatusMapper.xml new file mode 100644 index 0000000..5c7ad98 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxWeappAuditStatusMapper.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + `id`,`app_id`,`type`,`user_version`,`version_desc`, `audit_status`,`audit_err_code`,`audit_time` + + + + where 1 = 1 + + and `id` = #{id} + + + and `app_id` = #{appId} + + + and `type` = #{type} + + + and `user_version` = #{userVersion} + + + and `auditid` = #{auditid} + + + and `audit_status` = #{auditStatus} + + + and `audit_time` = #{auditTime} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + update wx_weapp_audit_status + set `user_version` = #{userVersion}, `version_desc` = #{versionDesc}, + `audit_status` = #{auditStatus}, `audit_err_code` = #{auditErrCode}, `audit_time` = #{auditTime} + where `app_id` = #{appId} and `type` = #{type} + + + + + + + + + + + + + + + + + + c.`id`,c.`app_id`,c.`type`,c.`user_version`,`version_desc`, + c.`audit_status`,c.`audit_err_code`,c.`audit_time`, + a.`name` + + + + where 1 = 1 + + and c.`id` = #{id} + + + and c.`app_id` = #{appId} + + + and c.`type` = #{type} + + + and c.`user_version` = #{userVersion} + + + and c.`audit_status` = #{auditStatus} + + + and c.`audit_time` = #{auditTime} + + + and a.`name` like concat('%', #{name},'%') + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxWeappBasicSetMapper.xml b/mallinkService/src/main/resources/mapper/WxWeappBasicSetMapper.xml new file mode 100644 index 0000000..50b757a --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxWeappBasicSetMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + `id`,`type`,`domain_url`,`version`,`template_info`,`create_date`,`update_date` + + + + where 1 = 1 + + and `id` = #{id} + + + and `type` = #{type} + + + and `deploy` = #{deploy} + + + and `create_date` = #{createDate} + + + and `update_date` = #{updateDate} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxWeappCodeStatusMapper.xml b/mallinkService/src/main/resources/mapper/WxWeappCodeStatusMapper.xml new file mode 100644 index 0000000..6612bad --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxWeappCodeStatusMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + `id`,`app_id`,`type`,`user_version`,`version_desc`,`code_status`,`code_err_code`,`code_time` + + + + where 1 = 1 + + and `id` = #{id} + + + and `app_id` = #{appId} + + + and `type` = #{type} + + + and `user_version` = #{userVersion} + + + and `code_status` = #{codeStatus} + + + and `code_time` = #{codeTime} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + update wx_weapp_code_status + set `user_version` = #{userVersion}, `version_desc`= #{versionDesc}, + `code_status` = #{codeStatus}, `code_err_code` = #{codeErrCode}, `code_time` = #{codeTime} + where `app_id` = #{appId} and `type` = #{type} + + + + + + + + + + + + + + + + + + c.`id`,c.`app_id`,c.`type`,c.`user_version`,c.`version_desc`,c.`code_status`,c.`code_err_code`,c.`code_time`, a.`name` + + + + where 1 = 1 + + and c.`id` = #{id} + + + and c.`app_id` = #{appId} + + + and c.`type` = #{type} + + + and c.`user_version` = #{userVersion} + + + and c.`code_status` = #{codeStatus} + + + and a.`name` like concat('%', #{name},'%') + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + diff --git a/mallinkService/src/main/resources/mapper/WxWeappExtSetMapper.xml b/mallinkService/src/main/resources/mapper/WxWeappExtSetMapper.xml new file mode 100644 index 0000000..71de37b --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxWeappExtSetMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + `id`,`app_id`,`type`,`ext_json`,`release_json`,`create_date`,`update_date` + + + + where 1 = 1 + + and `id` = #{id} + + + and `app_id` = #{appId} + + + and `type` = #{type} + + + and `create_date` = #{createDate} + + + and `update_date` = #{updateDate} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + + + + + diff --git a/mallinkService/src/main/resources/mapper/WxWeappReleaseStatusMapper.xml b/mallinkService/src/main/resources/mapper/WxWeappReleaseStatusMapper.xml new file mode 100644 index 0000000..f615331 --- /dev/null +++ b/mallinkService/src/main/resources/mapper/WxWeappReleaseStatusMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + `id`,`app_id`,`type`,`user_version`,`version_desc`,`release_status`,`release_err_code`,`release_time` + + + + where 1 = 1 + + and `id` = #{id} + + + and `app_id` = #{appId} + + + and `type` = #{type} + + + and `user_version` = #{userVersion} + + + and `release_status` = #{releaseStatus} + + + and `release_time` = #{releaseTime} + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + + update wx_weapp_release_status + set `user_version` = #{userVersion}, `version_desc` = #{versionDesc}, + `release_status` = #{releaseStatus}, `release_err_code` = #{releaseErrCode}, `release_time` = #{releaseTime} + where `app_id` = #{appId} and `type` = #{type} + + + + + + + + + + + + + + + + + + c.`id`,c.`app_id`,c.`type`,c.`user_version`,c.`version_desc`, + c.`release_status`,c.`release_err_code`,c.`release_time`, + a.`name` + + + + where 1 = 1 + + and c.`id` = #{id} + + + and c.`app_id` = #{appId} + + + and c.`type` = #{type} + + + and c.`user_version` = #{userVersion} + + + and c.`release_status` = #{releaseStatus} + + + and c.`release_time` = #{releaseTime} + + + and a.`name` like concat('%', #{name},'%') + + + and id in + + #{idItem} + + + order by ${sortColumns} + + + + + diff --git a/mlWechatOpen/pom.xml b/mlWechatOpen/pom.xml new file mode 100644 index 0000000..fab658d --- /dev/null +++ b/mlWechatOpen/pom.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + + mallink + com.iformall + 1.0 + + + malWechatOpen + + + 3.3.0.A + 3.3.0.A + + + + + com.iformall + mallinkService + 1.0 + + + com.github.binarywang + weixin-java-open + ${weixin-java-open.version} + + + com.github.binarywang + weixin-java-mp + ${weixin-java-mp.version} + + + com.google.zxing + core + 3.3.3 + + + + com.github.axet + kaptcha + 0.0.9 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + \ No newline at end of file diff --git a/mlWechatOpen/src/main/java/com/iformall/WechatOpenApplication.java b/mlWechatOpen/src/main/java/com/iformall/WechatOpenApplication.java new file mode 100644 index 0000000..18a87a7 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/WechatOpenApplication.java @@ -0,0 +1,41 @@ +package com.iformall; + +import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties; +import io.swagger.models.auth.In; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import springfox.documentation.swagger2.annotations.EnableSwagger2; +import tk.mybatis.spring.annotation.MapperScan; + +/** + * @author stormeye + * @date 2019-01-14 + */ +@SpringBootApplication +@MapperScan(basePackages = {"com.iformall.mapper"}) +@EnableSwagger2 +@EnableEncryptableProperties +public class WechatOpenApplication { + + @Value("${fm.exception}") + private boolean fmException; + + @Bean + public boolean isFmException() { + return fmException; + } + + @Value("${fm.delay}") + private Integer fmDelay; + + @Bean + public Integer getFmDelay() { return fmDelay; } + + + + public static void main(String[] args) { + SpringApplication.run(WechatOpenApplication.class, args); + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/config/AwsProperty.java b/mlWechatOpen/src/main/java/com/iformall/config/AwsProperty.java new file mode 100644 index 0000000..0329f1d --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/AwsProperty.java @@ -0,0 +1,52 @@ +package com.iformall.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author Stormeye + */ +@Component +@ConfigurationProperties(prefix = "aws") +public class AwsProperty { + // AWS ACCESS KEY + private String access; + + private String secret; + + private String clientRegion; + + private String bucketName; + + public String getAccess() { + return access; + } + + public void setAccess(String access) { + this.access = access; + } + + public String getSecret() { + return secret; + } + + public void setSecret(String secret) { + this.secret = secret; + } + + public String getClientRegion() { + return clientRegion; + } + + public void setClientRegion(String clientRegion) { + this.clientRegion = clientRegion; + } + + public String getBucketName() { + return bucketName; + } + + public void setBucketName(String bucketName) { + this.bucketName = bucketName; + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/config/KaptchaConfig.java b/mlWechatOpen/src/main/java/com/iformall/config/KaptchaConfig.java new file mode 100644 index 0000000..8d20c08 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/KaptchaConfig.java @@ -0,0 +1,32 @@ +package com.iformall.config; + +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Properties; + + +/** + * 生成验证码配置 + * + * @author stormeye.wu + * @email wugq@mippoint.com + * @date 2017-04-20 19:22 + */ +@Configuration +public class KaptchaConfig { + + @Bean + public DefaultKaptcha producer() { + Properties properties = new Properties(); + properties.put("kaptcha.border", "no"); + properties.put("kaptcha.textproducer.font.color", "black"); + properties.put("kaptcha.textproducer.char.space", "5"); + Config config = new Config(properties); + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + defaultKaptcha.setConfig(config); + return defaultKaptcha; + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/config/RedisConfig.java b/mlWechatOpen/src/main/java/com/iformall/config/RedisConfig.java new file mode 100644 index 0000000..bc9721f --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/RedisConfig.java @@ -0,0 +1,72 @@ +package com.iformall.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; + +import java.time.Duration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Created by Stormeye on 2018/10/1. + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport { + + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + //缓存管理器 + @Bean + public CacheManager cacheManager(RedisConnectionFactory connectionFactory) { + /* + //user信息缓存配置 + RedisCacheConfiguration userCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(10)).disableCachingNullValues().prefixKeysWith("user"); + Map redisCacheConfigurationMap = new HashMap<>(); + redisCacheConfigurationMap.put("user", userCacheConfiguration); + //初始化一个RedisCacheWriter + RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory); + // 设置CacheManager的值序列化方式为JdkSerializationRedisSerializer,但其实RedisCacheConfiguration默认就是使用StringRedisSerializer序列化key,JdkSerializationRedisSerializer序列化value,所以以下注释代码为默认实现 + // ClassLoader loader = this.getClass().getClassLoader(); + // JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer(loader); + // RedisSerializationContext.SerializationPair pair = RedisSerializationContext.SerializationPair.fromSerializer(jdkSerializer); + // RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair); + RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig(); + //设置默认超过期时间是30秒 + defaultCacheConfig.entryTtl(Duration.ofSeconds(30)); + //初始化RedisCacheManager + RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, defaultCacheConfig, redisCacheConfigurationMap); + return cacheManager; + */ + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); // 生成一个默认配置,通过config对象即可对缓存进行自定义配置 + config = config.entryTtl(Duration.ofMinutes(1)) // 设置缓存的默认过期时间,也是使用Duration设置 + .disableCachingNullValues(); // 不缓存空值 + + // 设置一个初始化的缓存空间set集合 + Set cacheNames = new HashSet<>(); + cacheNames.add("my-redis-cache1"); + cacheNames.add("my-redis-cache2"); + + // 对每个缓存空间应用不同的配置 + Map configMap = new HashMap<>(); + configMap.put("my-redis-cache1", config); + configMap.put("my-redis-cache2", config.entryTtl(Duration.ofSeconds(120))); + + RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory) // 使用自定义的缓存配置初始化一个cacheManager + .initialCacheNames(cacheNames) // 注意这两句的调用顺序,一定要先调用该方法设置初始化的缓存名,再初始化相关的配置 + .withInitialCacheConfigurations(configMap) + .build(); + return cacheManager; + } + +} diff --git a/mlWechatOpen/src/main/java/com/iformall/config/RedisProperies.java b/mlWechatOpen/src/main/java/com/iformall/config/RedisProperies.java new file mode 100644 index 0000000..21602ae --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/RedisProperies.java @@ -0,0 +1,124 @@ +package com.iformall.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import redis.clients.jedis.JedisPoolConfig; +import redis.clients.jedis.Protocol; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.SSLParameters; +import javax.net.ssl.SSLSocketFactory; + +/** + * Stormeye + */ +@ConfigurationProperties(prefix = "wechat.redis") +public class RedisProperies extends JedisPoolConfig { + private String host = Protocol.DEFAULT_HOST; + private int port = Protocol.DEFAULT_PORT; + private String password; + private int database = 1; + private int connectionTimeout = Protocol.DEFAULT_TIMEOUT; + private int soTimeout = Protocol.DEFAULT_TIMEOUT; + private String clientName; + private boolean ssl; + private SSLSocketFactory sslSocketFactory; + private SSLParameters sslParameters; + private HostnameVerifier hostnameVerifier; + + public boolean isSsl() { + return ssl; + } + + public void setSsl(boolean ssl) { + this.ssl = ssl; + } + + public SSLSocketFactory getSslSocketFactory() { + return sslSocketFactory; + } + + public void setSslSocketFactory(SSLSocketFactory sslSocketFactory) { + this.sslSocketFactory = sslSocketFactory; + } + + public SSLParameters getSslParameters() { + return sslParameters; + } + + public void setSslParameters(SSLParameters sslParameters) { + this.sslParameters = sslParameters; + } + + public HostnameVerifier getHostnameVerifier() { + return hostnameVerifier; + } + + public void setHostnameVerifier(HostnameVerifier hostnameVerifier) { + this.hostnameVerifier = hostnameVerifier; + } + + public String getHost() { + return host; + } + + public void setHost(String host) { + if (host == null || "".equals(host)) { + host = Protocol.DEFAULT_HOST; + } + this.host = host; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + if ("".equals(password)) { + password = null; + } + this.password = password; + } + + public int getDatabase() { + return database; + } + + public void setDatabase(int database) { + this.database = database; + } + + public String getClientName() { + return clientName; + } + + public void setClientName(String clientName) { + if ("".equals(clientName)) { + clientName = null; + } + this.clientName = clientName; + } + + public int getConnectionTimeout() { + return connectionTimeout; + } + + public void setConnectionTimeout(int connectionTimeout) { + this.connectionTimeout = connectionTimeout; + } + + public int getSoTimeout() { + return soTimeout; + } + + public void setSoTimeout(int soTimeout) { + this.soTimeout = soTimeout; + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/config/RestFilter.java b/mlWechatOpen/src/main/java/com/iformall/config/RestFilter.java new file mode 100644 index 0000000..4f92984 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/RestFilter.java @@ -0,0 +1,58 @@ +package com.iformall.config; + +import java.io.IOException; +import java.util.Optional; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 前后端分离RESTful接口过滤器 + * + * @author xuguoqin + * + */ +public class RestFilter implements Filter { + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + HttpServletRequest req = null; + if (request instanceof HttpServletRequest) { + req = (HttpServletRequest) request; + } + HttpServletResponse res = null; + if (response instanceof HttpServletResponse) { + res = (HttpServletResponse) response; + } + if (req != null && res != null) { + //设置允许传递的参数 + res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization"); + //设置允许带上cookie + res.setHeader("Access-Control-Allow-Credentials", "true"); + String origin = Optional.ofNullable(req.getHeader("Origin")).orElse(req.getHeader("Referer")); + //设置允许的请求来源 + res.setHeader("Access-Control-Allow-Origin", origin); + //设置允许的请求方法 + res.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS"); + } + chain.doFilter(request, response); + } + + @Override + public void destroy() { + + } + +} \ No newline at end of file diff --git a/mlWechatOpen/src/main/java/com/iformall/config/RestTemplateConfig.java b/mlWechatOpen/src/main/java/com/iformall/config/RestTemplateConfig.java new file mode 100644 index 0000000..560a77c --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/RestTemplateConfig.java @@ -0,0 +1,24 @@ +package com.iformall.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory factory) { + return new RestTemplate(factory); + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setReadTimeout(5000);//ms + factory.setConnectTimeout(10000);//ms + return factory; + } +} \ No newline at end of file diff --git a/mlWechatOpen/src/main/java/com/iformall/config/ShiroConfig.java b/mlWechatOpen/src/main/java/com/iformall/config/ShiroConfig.java new file mode 100644 index 0000000..e41df9a --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/ShiroConfig.java @@ -0,0 +1,303 @@ +package com.iformall.config; + +import com.iformall.service.MallPermissionService; +import com.iformall.shiro.MyRetryLimitCredentialsMatcher; +import com.iformall.shiro.MyShiroRealm; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.spring.LifecycleBeanPostProcessor; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.servlet.SimpleCookie; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.crazycake.shiro.RedisCacheManager; +import org.crazycake.shiro.RedisManager; +import org.crazycake.shiro.RedisSessionDAO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.servlet.Filter; +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; +import java.util.LinkedHashMap; +import java.util.Map; + + +/** + * Created by yangqj on 2017/4/23. + */ +@Configuration +public class ShiroConfig { + @Autowired(required = false) + private MallPermissionService resourcesService; + + @Value("${spring.redis.host}") + private String host; + + @Value("${spring.redis.port}") + private int port; + + @Value("${spring.redis.timeout}") + private int timeout; + + @Value("${spring.redis.expire}") + private int expire; + + @Value("${spring.redis.password}") + private String password; + + @Bean + public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() { + return new LifecycleBeanPostProcessor(); + } + + /** + * ShiroDialect,为了在thymeleaf里使用shiro的标签的bean + * @return + */ +// @Bean +// public ShiroDialect shiroDialect() { +// return new ShiroDialect(); +// } + + /** + * ShiroFilterFactoryBean 处理拦截资源文件问题。 + * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,因为在 + * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager + *

+ * Filter Chain定义说明 + * 1、一个URL可以配置多个Filter,使用逗号分隔 + * 2、当设置多个过滤器时,全部验证通过,才视为通过 + * 3、部分过滤器可指定参数,如perms,roles + */ + @Bean + public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { + System.out.println("ShiroConfiguration.shirFilter()"); + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + // 必须设置 SecurityManager + shiroFilterFactoryBean.setSecurityManager(securityManager); + Map filters = new LinkedHashMap(); + filters.put("token", new ShiroLoginFilter()); + filters.put("corsFilter", new RestFilter()); + //filters.put("authc", new MyFormAuthenticationFilter()); + shiroFilterFactoryBean.setFilters(filters); + // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面 + shiroFilterFactoryBean.setLoginUrl("/#/"); + // 登录成功后要跳转的链接 + + shiroFilterFactoryBean.setSuccessUrl("/usersPage"); + //未授权界面; + shiroFilterFactoryBean.setUnauthorizedUrl("/403"); + //拦截器. + Map filterChainDefinitionMap = new LinkedHashMap(); + + //配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了 + + //filterChainDefinitionMap.put("/ue/**", "anon"); + //filterChainDefinitionMap.put("/config.json", "anon"); + + // 静态文件 + filterChainDefinitionMap.put("/css/**", "anon"); + filterChainDefinitionMap.put("/js/**", "anon"); + filterChainDefinitionMap.put("/img/**", "anon"); + filterChainDefinitionMap.put("/font-awesome/**", "anon"); + //:这是一个坑呢,一不小心代码就不好使了; + // + //自定义加载权限资源关系 +// Map map = new HashMap<>(); +// List resourcesList = resourcesService.list(map); +// for(SysPermission resources:resourcesList){ +// +// if (StringUtil.isNotEmpty(resources.getUrl())) { +// String permission = "perms[" + resources.getUrl()+ "]"; +// filterChainDefinitionMap.put(resources.getUrl(),permission); +// } +// } + + // 登录 + filterChainDefinitionMap.put("/captcha.jpg", "anon"); + filterChainDefinitionMap.put("/doLogin/**", "anon"); + filterChainDefinitionMap.put("/version", "anon"); + + /// swagger-ui.html + filterChainDefinitionMap.put("/swagger-ui.html", "anon"); + filterChainDefinitionMap.put("/v2/**", "anon"); + filterChainDefinitionMap.put("/swagger-resources/**", "anon"); + filterChainDefinitionMap.put("/webjars/**", "anon"); + + // 第三方平台 + filterChainDefinitionMap.put("/wxOpen/**", "anon"); + + +// filterChainDefinitionMap.put("/role/**", "corsFilter,token"); + filterChainDefinitionMap.put("/**", "corsFilter,token,authc"); +// filterChainDefinitionMap.put("/**", "anon"); + + + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + return shiroFilterFactoryBean; + } + + + public static boolean isAjax(ServletRequest request) { + String header = ((HttpServletRequest) request).getHeader("X-Requested-With"); + if ("XMLHttpRequest".equalsIgnoreCase(header)) { + System.out.println("当前请求为Ajax请求"); + return Boolean.TRUE; + } + System.out.println("当前请求非Ajax请求"); + return Boolean.FALSE; + } + + @Bean + public SecurityManager securityManager(@Qualifier("myRetryLimitCredentialsMatcher") MyRetryLimitCredentialsMatcher matcher) { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + //设置realm. + securityManager.setRealm(myShiroRealm(matcher)); + // 自定义缓存实现 使用redis + //securityManager.setCacheManager(cacheManager()); + // 自定义session管理 使用redis + securityManager.setSessionManager(sessionManager()); + return securityManager; + } + + @Bean + public MyShiroRealm myShiroRealm(MyRetryLimitCredentialsMatcher matcher) { + MyShiroRealm myShiroRealm = new MyShiroRealm(); + myShiroRealm.setCredentialsMatcher(matcher); + return myShiroRealm; + } + + + /** + * 密码匹配凭证管理器 凭证匹配器 + * (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了 + * 所以我们需要修改下doGetAuthenticationInfo中的代码; + * ) + * + * @return + */ + @Bean(name = "myRetryLimitCredentialsMatcher") + public MyRetryLimitCredentialsMatcher hashedCredentialsMatcher() { + MyRetryLimitCredentialsMatcher hashedCredentialsMatcher = new MyRetryLimitCredentialsMatcher(); + + hashedCredentialsMatcher.setHashAlgorithmName("md5");//散列算法:这里使用MD5算法; + hashedCredentialsMatcher.setHashIterations(2);//散列的次数,比如散列两次,相当于 md5(md5("")); + + return hashedCredentialsMatcher; + } + + + /** + * 开启shiro aop注解支持. + * 使用代理方式;所以需要开启代码支持; + * + * @param securityManager + * @return + */ + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); + return authorizationAttributeSourceAdvisor; + } + + /** + * 配置shiro redisManager + * 使用的是shiro-redis开源插件 + * + * @return + */ + public RedisManager redisManager() { + RedisManager redisManager = new RedisManager(); + redisManager.setHost(host); + redisManager.setPort(port); + //redisManager.setExpire(expire);// 配置缓存过期时间 + redisManager.setTimeout(timeout); + redisManager.setPassword(password); + return redisManager; + } + + /** + * cacheManager 缓存 redis实现 + * 使用的是shiro-redis开源插件 + * + * @return + */ + public RedisCacheManager cacheManager() { + RedisCacheManager redisCacheManager = new RedisCacheManager(); + redisCacheManager.setRedisManager(redisManager()); + return redisCacheManager; + } + + + /** + * RedisSessionDAO shiro sessionDao层的实现 通过redis + * 使用的是shiro-redis开源插件 + */ + @Bean + public RedisSessionDAO redisSessionDAO() { + RedisSessionDAO redisSessionDAO = new RedisSessionDAO(); + redisSessionDAO.setRedisManager(redisManager()); + return redisSessionDAO; + } + + /** + * shiro session的管理 + */ + @Bean + public DefaultWebSessionManager sessionManager() { + DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); + //设置session过期时间为1小时(单位:毫秒),默认为30分钟 + sessionManager.setGlobalSessionTimeout(60 * 60 * 1000); + sessionManager.setSessionValidationSchedulerEnabled(true); + sessionManager.setSessionIdUrlRewritingEnabled(false); + + sessionManager.setSessionDAO(redisSessionDAO()); + sessionManager.setSessionIdCookie(simpleCookie()); + return sessionManager; + } + + @Bean + public SimpleCookie simpleCookie() { + SimpleCookie simpleCookie = new SimpleCookie("SSID"); + simpleCookie.setDomain(""); + return simpleCookie; + } + +// @Bean +// public SimpleCookie rememberMeCookie(){ +// //System.out.println("ShiroConfiguration.rememberMeCookie()"); +// //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe +// SimpleCookie simpleCookie = new SimpleCookie("rememberMe"); +// // +// simpleCookie.setMaxAge(60*30); +// return simpleCookie; +// } + +// @Bean +// public CookieRememberMeManager rememberMeManager(){ +// //System.out.println("ShiroConfiguration.rememberMeManager()"); +// CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager(); +// cookieRememberMeManager.setCookie(rememberMeCookie()); +// //rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位) +// cookieRememberMeManager.setCipherKey(Base64.decodeBytes("2AvVhdsgUs0FSA3SDFAdag==")); +// return cookieRememberMeManager; +// } + +// @Bean(name = "securityManager") +// public DefaultWebSecurityManager defaultWebSecurityManager(MyShiroRealm realm){ +// DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); +// //设置realm +// securityManager.setRealm(realm); +// //用户授权/认证信息Cache, 采用EhCache缓存 +// securityManager.setCacheManager(cacheManager()); +// //注入记住我管理器 +// securityManager.setRememberMeManager(rememberMeManager()); +// return securityManager; +// } + +} diff --git a/mlWechatOpen/src/main/java/com/iformall/config/ShiroLoginFilter.java b/mlWechatOpen/src/main/java/com/iformall/config/ShiroLoginFilter.java new file mode 100644 index 0000000..30d8fe4 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/ShiroLoginFilter.java @@ -0,0 +1,31 @@ +package com.iformall.config; + +import com.alibaba.fastjson.JSON; +import com.iformall.common.ResultData; +import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +public class ShiroLoginFilter extends FormAuthenticationFilter { + + @Override + protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json"); + ResultData resultData = new ResultData(ResultData.UNLOGIN,"用户未登录"); + response.getWriter().write(JSON.toJSONString(resultData)); + return false; + } + + /** + * 判断ajax请求 + * @param request + * @return + */ + boolean isAjax(HttpServletRequest request){ + return (request.getHeader("X-Requested-With") != null && "XMLHttpRequest".equals( request.getHeader("X-Requested-With").toString()) ) ; + } + +} \ No newline at end of file diff --git a/mlWechatOpen/src/main/java/com/iformall/config/WebConfig.java b/mlWechatOpen/src/main/java/com/iformall/config/WebConfig.java new file mode 100644 index 0000000..48708f3 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/WebConfig.java @@ -0,0 +1,79 @@ +package com.iformall.config; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationConfig; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.text.SimpleDateFormat; +import java.util.List; + +@Configuration +@EnableWebMvc +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("swagger-ui.html") + .addResourceLocations("classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**") + .addResourceLocations("classpath:/META-INF/resources/webjars/"); + //registry.addResourceHandler("/app/**").addResourceLocations("classpath:/app/"); + + } + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowCredentials(true) + .allowedMethods("GET", "POST", "DELETE", "PUT") + .maxAge(3600); + } + + @Override + public void configureMessageConverters(List> converters) { + MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); + //ObjectMapper 是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构,反之亦然 + ObjectMapper objectMapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule(); + + //不显示为null的字段 + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + + DeserializationConfig dc = objectMapper.getDeserializationConfig(); + // 设置反序列化日期格式、忽略不存在get、set的属性 + objectMapper.setConfig( + dc.with(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")) + .without(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + ); + + //序列化将Long转String类型 + simpleModule.addSerializer(Long.class, ToStringSerializer.instance); + simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); + SimpleModule bigIntegerModule = new SimpleModule(); + //序列化将BigInteger转String类型 + bigIntegerModule.addSerializer(BigInteger.class, ToStringSerializer.instance); + SimpleModule bigDecimalModule = new SimpleModule(); + //序列化将BigDecimal转String类型 + bigDecimalModule.addSerializer(BigDecimal.class, ToStringSerializer.instance); + objectMapper.registerModule(simpleModule); + objectMapper.registerModule(bigDecimalModule); + objectMapper.registerModule(bigIntegerModule); + jackson2HttpMessageConverter.setObjectMapper(objectMapper); + converters.add(jackson2HttpMessageConverter); + } + + +} diff --git a/mlWechatOpen/src/main/java/com/iformall/config/WechatOpenProperties.java b/mlWechatOpen/src/main/java/com/iformall/config/WechatOpenProperties.java new file mode 100644 index 0000000..e19dfc4 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/config/WechatOpenProperties.java @@ -0,0 +1,69 @@ +package com.iformall.config; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Stormeye + */ +@ConfigurationProperties(prefix = "wechat.open") +public class WechatOpenProperties { + /** + * 设置微信三方平台的appid + */ + private String componentAppId; + + /** + * 设置微信三方平台的app secret + */ + private String componentSecret; + + /** + * 设置微信三方平台的token + */ + private String componentToken; + + /** + * 设置微信三方平台的EncodingAESKey + */ + private String componentAesKey; + + public String getComponentAppId() { + return componentAppId; + } + + public void setComponentAppId(String componentAppId) { + this.componentAppId = componentAppId; + } + + public String getComponentSecret() { + return componentSecret; + } + + public void setComponentSecret(String componentSecret) { + this.componentSecret = componentSecret; + } + + public String getComponentToken() { + return componentToken; + } + + public void setComponentToken(String componentToken) { + this.componentToken = componentToken; + } + + public String getComponentAesKey() { + return componentAesKey; + } + + public void setComponentAesKey(String componentAesKey) { + this.componentAesKey = componentAesKey; + } + + @Override + public String toString() { + return ToStringBuilder.reflectionToString(this, + ToStringStyle.MULTI_LINE_STYLE); + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/BaseController.java b/mlWechatOpen/src/main/java/com/iformall/controller/BaseController.java new file mode 100644 index 0000000..c77080f --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/BaseController.java @@ -0,0 +1,45 @@ +package com.iformall.controller; + +import com.iformall.utils.IPUtil; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.beans.PropertyEditorSupport; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; + +@RestController +public class BaseController { + @InitBinder + public void InitBinder(WebDataBinder dataBinder) { + dataBinder.registerCustomEditor(Date.class, new PropertyEditorSupport() { + public void setAsText(String value) { + try { + setValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(value)); + } catch(ParseException e) { + try { + setValue(new SimpleDateFormat("yyyy-MM-dd ").parse(value)); + } catch (ParseException e1) { + setValue(null); + } + } + } + + public String getAsText() { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) getValue()); + } + + }); + } + + public String getIpAddr() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + String ipaddress = IPUtil.getIpAddr(request); + return ipaddress; + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/HomeController.java b/mlWechatOpen/src/main/java/com/iformall/controller/HomeController.java new file mode 100644 index 0000000..a2b93a4 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/HomeController.java @@ -0,0 +1,123 @@ +package com.iformall.controller; + +import com.google.code.kaptcha.Constants; +import com.google.code.kaptcha.Producer; +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.domain.po.MallUserInfo; +import com.iformall.exception.MallinkException; +import com.iformall.shiro.UserSession; +import com.iformall.utils.ShiroUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.imageio.ImageIO; +import javax.servlet.ServletException; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.IOException; + + +@RestController +@Api(description = "登录相关接口") +public class HomeController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Value("${version}") + private String version; + + @Autowired + private Producer producer; + + + @GetMapping("/captcha.jpg") + public void captcha(HttpServletResponse response)throws ServletException, IOException { + logger.debug("[" + getIpAddr() + "] HomeController::captcha"); + response.setHeader("Cache-Control", "no-store, no-cache"); + response.setContentType("image/jpeg"); + + //生成文字验证码 + String text = producer.createText(); + //生成图片验证码 + BufferedImage image = producer.createImage(text); + //保存到shiro session + ShiroUtils.setSessionAttribute(Constants.KAPTCHA_SESSION_KEY, text); + + ServletOutputStream out = response.getOutputStream(); + ImageIO.write(image, "jpg", out); + IOUtils.closeQuietly(out); + } + + @ApiOperation("登录") + @PostMapping("/doLogin") + public ResultData login(@RequestBody MallUserInfo user, HttpServletResponse response) { + logger.debug("[" + getIpAddr() + "] HomeController::login"); + + try { + String kaptcha = ShiroUtils.getKaptcha(Constants.KAPTCHA_SESSION_KEY); + if(!user.getCaptcha().equalsIgnoreCase(kaptcha)){ + return new ResultData(ErrorCode.KAPCHA_NOT_EQUAL); + } + } catch (MallinkException e) { + logger.error("验证码" + e.getMessage()); + return new ResultData(ErrorCode.KAPCHA_NOT_VALID.getCode(), e.getMessage()); + } + + + ResultData data = new ResultData(); + if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword())) { +// throw new SystemException(ErrorCode.LOGIN_USER_OR_PWD_ERROR); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + try { + Subject subject = SecurityUtils.getSubject(); + UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword()); + subject.login(token); + MallUserInfo info = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo); + info.setPassword("保密"); + info.setBopenId("保密"); + if(StringUtils.isNotBlank(info.getWebOpenId())) { + info.setWebOpenId("保密"); + } + + Cookie unameCookie = new Cookie("uname", info.getUsername()); + unameCookie.setMaxAge(60); + response.addCookie(unameCookie); + + data.data = info; + } catch (Exception e) { + return new ResultData(ErrorCode.USER_PASSWD_ERR); + } + return data; + } + + @ApiOperation("登出") + @GetMapping("/logout") + public ResultData logout() { + logger.debug("[" + getIpAddr() + "] HomeController::logout"); + ResultData data = new ResultData(); + SecurityUtils.getSubject().logout(); + return data; + } + + @ApiOperation("获取后端版本号") + @GetMapping("/version") + public ResultData version() { + return new ResultData(version); + } +} \ No newline at end of file diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WechatAuthController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WechatAuthController.java new file mode 100644 index 0000000..a0a3023 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WechatAuthController.java @@ -0,0 +1,102 @@ +package com.iformall.controller; + +import com.iformall.domain.po.WxAuthorizerInfo; +import com.iformall.enums.EnumWxAuthorizationStatus; +import com.iformall.service.WxAuthorizerInfoService; +import com.iformall.service.wechat.WxOpenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult; +import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Date; + +/** + * Stormeye Wu + */ +@Controller +@RequestMapping("/wt_auth") +@Api(description = "微信第三方开放平台授权相关接口") +public class WechatAuthController { + private final Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired + private WxOpenService openService; + + @Autowired + private WxAuthorizerInfoService authorizerInfoService; + + @ApiOperation(value = "获取授权跳转页", notes = "") + @GetMapping("/goto_auth_url_show") + @ResponseBody + public String gotoPreAuthUrlShow() { + return "" + + "" + + "go" + + "" + + ""; + } + + @ApiOperation(value = "授权跳转页", notes = "") + @GetMapping("/goto_auth_url") + public void gotoPreAuthUrl(HttpServletRequest request, HttpServletResponse response) { + String host = request.getHeader("host"); + String url = "https://" + host + "/O/wt_auth/jump"; + try { + url = openService.getWxOpenComponentService().getPreAuthUrl(url); + response.sendRedirect(url); + } catch (WxErrorException | IOException e) { + logger.error("gotoPreAuthUrl", e); + throw new RuntimeException(e); + } + } + + @ApiOperation(value = "授权", notes = "") + @GetMapping("/jump") + @ResponseBody + public void jump(@RequestParam("auth_code") String authorizationCode) { + try { + WxOpenQueryAuthResult queryAuthResult = openService.getWxOpenComponentService().getQueryAuth(authorizationCode); + logger.info("getQueryAuth", queryAuthResult); + WxOpenAuthorizerInfoResult openAuthorizerInfoResult = openService.getWxOpenComponentService().getAuthorizerInfo( + queryAuthResult.getAuthorizationInfo().getAuthorizerAppid()); + // save auth info + authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo(){ + { + setAuthorizerAppid(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerAppid()); + setAlias(openAuthorizerInfoResult.getAuthorizerInfo().getAlias()); + setHeadImg(openAuthorizerInfoResult.getAuthorizerInfo().getHeadImg()); + setQrcodeUrl(openAuthorizerInfoResult.getAuthorizerInfo().getQrcodeUrl()); + setAuthorizationStatus(EnumWxAuthorizationStatus.AUTHORIZED.getCode()); + setAuthTime(new Date()); + } + }); + } catch (WxErrorException e) { + logger.error("gotoPreAuthUrl", e); + throw new RuntimeException(e); + } + } + + @ApiOperation(value = "手机跳转链接url", notes = "") + @GetMapping("/getMobilePreAuthUrl") + @ResponseBody + public String getMobilePreAuthUrl(HttpServletRequest request, HttpServletResponse response) { + String host = request.getHeader("host"); + String url = "https://" + host + "/O/wt_auth/jump"; + try { + url = openService.getWxOpenComponentService().getMobilePreAuthUrl(url); + return url; + } catch (WxErrorException e) { + logger.error("getMobilePreAuthUrl", e); + throw new RuntimeException(e); + } + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java new file mode 100644 index 0000000..5f542e6 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WechatCalllbackController.java @@ -0,0 +1,415 @@ +package com.iformall.controller; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.po.*; +import com.iformall.enums.*; +import com.iformall.service.*; +import com.iformall.service.wechat.WxOpenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; +import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; +import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage; +import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult; +import me.chanjar.weixin.open.bean.result.WxOpenPlatformResult; +import me.chanjar.weixin.open.bean.result.WxOpenQueryAuthResult; +import me.chanjar.weixin.open.bean.result.WxOpenResult; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +@Controller +@RequestMapping("/wxOpen") +@Api(description = "微信第三方开放平台回调相关接口") +public class WechatCalllbackController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + protected WxOpenService openService; + + @Autowired + private WxComponentVerifyTicketService componentVerifyTicketService; + + @Autowired + private WxAuthorizerInfoService authorizerInfoService; + + @Autowired + private WxWeappAuditStatusService weappAuditStatusService; + + @Autowired + private WxAppinfoService appinfoService; + + @Autowired + private MailService mailService; + + @RequestMapping(value = "/notify", method = RequestMethod.POST) + @ApiOperation("接收ticket回调") + public Object receiveTicket(HttpServletRequest request) throws IOException { + logger.info("[" +getIpAddr() + "]接收微信回调 /wxOpen/notify"); + InputStream inStream = request.getInputStream(); + ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = inStream.read(buffer)) != -1) { + outSteam.write(buffer, 0, len); + } + String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8")); + logger.info(resultxml); + + outSteam.close(); + inStream.close(); + + String timestamp = request.getParameter("timestamp"); + String nonce = request.getParameter("nonce"); + String signature = request.getParameter("signature"); + String encType = request.getParameter("encrypt_type"); + String msgSignature= request.getParameter("msg_signature"); + + /* + // 测试数据 + String timestamp = "1545708083"; + String nonce = "1052028699"; + String signature = "b5fa8296b46c726cbed35f744944f20f682776a6"; + String encType = "aes"; + String msgSignature= "54bec4c513f447cb312fd091bea48326f87aedde"; + + String resultxml = "\n" + + " \n" + + " \n" + + ""; + */ + logger.info("\n接收微信回调:[signature=[{}], encType=[{}], msgSignature=[{}]," + + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", + signature, encType, msgSignature, timestamp, nonce, resultxml); + + if (!StringUtils.equalsIgnoreCase("aes", encType) + || !openService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) { + throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); + } + + // aes加密的消息 + WxOpenXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedXml(resultxml, + openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature); + this.logger.info("接收微信回调,消息解密后内容为:{} ", inMessage.toString()); + if(inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.COMPONENT_VERIFY_TICKET.getMessage())) { + // 保存component_verify_ticket + componentVerifyTicketService.saveOrUpdate(new WxComponentVerifyTicket(){ + { + setComponentVerifyTicket(inMessage.getComponentVerifyTicket()); + setCreateTime(new Date(Long.valueOf(inMessage.getCreateTime() * 1000))); + setComponentAppid(inMessage.getAppId()); + setDeadline(new Date(Long.valueOf(System.currentTimeMillis() + (60*60*1000)))); + } + }); + } else if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.AUTHORIZED.getMessage()) || + inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.UPDATEAUTHORIZED.getMessage()) + ) { + try { + WxOpenQueryAuthResult queryAuthResult = openService.getWxOpenComponentService().getQueryAuth(inMessage.getAuthorizationCode()); + logger.info("getQueryAuth", queryAuthResult); + + WxOpenAuthorizerInfoResult openAuthorizerInfoResult = openService.getWxOpenComponentService().getAuthorizerInfo( + queryAuthResult.getAuthorizationInfo().getAuthorizerAppid()); + logger.info(openAuthorizerInfoResult.toString()); + // save auth info + authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo(){ + { + setAuthorizerAppid(openAuthorizerInfoResult.getAuthorizationInfo().getAuthorizerAppid()); + setAlias(openAuthorizerInfoResult.getAuthorizerInfo().getAlias()); + setHeadImg(openAuthorizerInfoResult.getAuthorizerInfo().getHeadImg()); + setQrcodeUrl(openAuthorizerInfoResult.getAuthorizerInfo().getQrcodeUrl()); + setAuthorizationStatus(EnumWxAuthorizationStatus.AUTHORIZED.getCode()); + setAuthTime(new Date()); + } + }); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + } + } else if (inMessage.getInfoType().equals(EnumWxAuthorizationInfoType.UNAUTHORIZED.getMessage())) { + authorizerInfoService.saveOrUpdate(new WxAuthorizerInfo(){ + { + setAuthorizerAppid(inMessage.getAuthorizerAppid()); + setAuthorizationStatus(EnumWxAuthorizationStatus.UNAUTHORIZED.getCode()); + setAuthTime(new Date()); + } + }); + } + try { + String out = openService.getWxOpenComponentService().route(inMessage); + this.logger.info("组装回复信息:{}", out); + } catch (WxErrorException e) { + this.logger.error("notify", e); + } + + return "success"; + } + + @RequestMapping(value = "/{appId}/callback") + @ApiOperation("消息回调") + public Object callback(@PathVariable("appId") String appId, HttpServletRequest request) throws IOException { + logger.info("[" +getIpAddr() + "]接收微信APP回调 /{appId}/callback"); + InputStream inStream = request.getInputStream(); + ByteArrayOutputStream outSteam = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len = 0; + while ((len = inStream.read(buffer)) != -1) { + outSteam.write(buffer, 0, len); + } + String resultxml = new String(outSteam.toByteArray(), Charset.forName("UTF-8")); + logger.info(resultxml); + + outSteam.close(); + inStream.close(); + + String timestamp = request.getParameter("timestamp"); + String nonce = request.getParameter("nonce"); + String signature = request.getParameter("signature"); + String encType = request.getParameter("encrypt_type"); + String openid = request.getParameter("openid"); + String msgSignature= request.getParameter("msg_signature"); + + logger.info("接收微信APP回调:[appId=[{}], openid=[{}], signature=[{}], encType=[{}], msgSignature=[{}]," + + " timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ", + appId, openid, signature, encType, msgSignature, timestamp, nonce, resultxml); + if (!StringUtils.equalsIgnoreCase("aes", encType) + || !openService.getWxOpenComponentService().checkSignature(timestamp, nonce, signature)) { + throw new IllegalArgumentException("非法请求,可能属于伪造的请求!"); + } + + String out = ""; + // aes加密的消息 + WxMpXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedMpXml(resultxml, + openService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature); + logger.info("接收微信APP回调,消息解密后内容为:\n{}", inMessage.toString()); + // 全网发布测试用例 + if (StringUtils.equalsAnyIgnoreCase(appId, "wx570bc396a51b8ff8", "wxd101a85aa106f53e")) { + try { + if (StringUtils.equals(inMessage.getMsgType(), "text")) { + if (StringUtils.equals(inMessage.getContent(), "TESTCOMPONENT_MSG_TYPE_TEXT")) { + out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml( + WxMpXmlOutMessage.TEXT().content("TESTCOMPONENT_MSG_TYPE_TEXT_callback") + .fromUser(inMessage.getToUser()) + .toUser(inMessage.getFromUser()) + .build(), + openService.getWxOpenConfigStorage() + ); + } else if (StringUtils.startsWith(inMessage.getContent(), "QUERY_AUTH_CODE:")) { + String msg = inMessage.getContent().replace("QUERY_AUTH_CODE:", "") + "_from_api"; + WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(msg).toUser(inMessage.getFromUser()).build(); + openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage); + } + } else if (StringUtils.equals(inMessage.getMsgType(), "event")) { + WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(inMessage.getEvent() + "from_callback").toUser(inMessage.getFromUser()).build(); + openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage); + } + } catch (WxErrorException e) { + logger.error("callback", e); + } + } else { + /**判断消息类型,调用对应的方法*/ + switch (inMessage.getMsgType()){ + case "event": { + switch (inMessage.getEvent()) { + case "weapp_audit_success": { // 审核成功 + updateAuditStatus(appId, true, ""); + break; + } + case "weapp_audit_fail": { // 审核失败 + updateAuditStatus(appId, false, inMessage.getReason()); + break; + } + default: + break; + } + return "success"; + } + case "text": + WxMpXmlOutMessage outMessage = openService.getWxOpenMessageRouter().route(inMessage, appId); + if (outMessage != null) { + out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(outMessage, openService.getWxOpenConfigStorage()); + logger.info(out); + } + /* + else { + + WxMpXmlOutMessage outMsg = new WxMpXmlOutTextMessage(); + outMsg.setCreateTime(System.currentTimeMillis()); + outMsg.setToUserName(inMessage.getFromUser()); + outMsg.setFromUserName(inMessage.getToUser()); + outMsg.setMsgType("text"); + ((WxMpXmlOutTextMessage) outMsg).setContent(inMessage.getContent()); + out = WxOpenXmlMessage.wxMpOutXmlMessageToEncryptedXml(outMsg, wxOpenService.getWxOpenConfigStorage()); + } + */ + else { + out = "success"; + } + break; + default: + return "success"; + } + } + + + return out; + } + + private void updateAuditStatus(String appId, boolean success, String reason) { + + + WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); + if(auditStatus != null) { + if(success) { + auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode()); + auditStatus.setAuditErrCode(""); + } else { + auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); + auditStatus.setAuditErrCode(reason); + } + auditStatus.setAuditTime(new Date()); + weappAuditStatusService.updateStatus(auditStatus); + } + + // 发邮件 + WxAppinfo appinfo = appinfoService.getByAppId(appId); + if(appinfo != null) { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 + + StringBuilder titleSB = new StringBuilder(); + if(appinfo.getType().equals(EnumAppType.C.getCode())) { + titleSB.append("C端小程序"); + } else if(appinfo.getType().equals(EnumAppType.B.getCode())) { + titleSB.append("B端小程序"); + } else if(appinfo.getType().equals(EnumAppType.MP_S.getCode())) { + titleSB.append("公众号-服务号"); + } else if(appinfo.getType().equals(EnumAppType.MP_P.getCode())) { + titleSB.append("公众号-订阅号"); + } + titleSB.append(appinfo.getName()); + if(success) { + titleSB.append("审核通过"); + } else { + titleSB.append("审核未通过"); + } + + StringBuilder sb = new StringBuilder(); + sb.append(df.format(new Date())).append("\n"); + if(success) { + sb.append("审核通过\n"); + } else { + sb.append("审核未通过\n").append("原因").append(reason); + } + + String[] receivers = new String[] {"wangmei@iformall.com", "wuguoqiang@iformall.com", "huanghui@iformall.com", "sunmingming@iformall.com"}; + + //发送邮件 + mailService.sendSimpleMail(receivers, titleSB.toString(), sb.toString()); + } + } + + @GetMapping(value = "/createOpenPlatform") + @ApiOperation("创建微信开放平台") + public ResultData createOpenPlatform(@RequestParam(value="appId") String appId) { + Gson gson = new GsonBuilder().create(); + try { + String responseStr = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).createOpenPlatform(appId); + logger.info(responseStr); + WxOpenPlatformResult openPlatformResult = gson.fromJson(responseStr, WxOpenPlatformResult.class); + if(openPlatformResult.isSuccess()) { + WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); + if(authorizerInfo != null) { + authorizerInfo.setId(authorizerInfo.getId()); + authorizerInfo.setOpenAppid(openPlatformResult.getOpenAppid()); + authorizerInfoService.updateOpenAppid(authorizerInfo); + } + } + return new ResultData(responseStr); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @GetMapping(value = "/bindOpenPlatform") + @ApiOperation("绑定微信开放平台") + public ResultData bindOpenPlatform(@RequestParam(value = "appId") String appId, @RequestParam(value = "openAppId") String openAppId) { + Gson gson = new GsonBuilder().create(); + try { + String responseStr = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).bindOpenPlatform(appId, openAppId); + logger.info(responseStr); + WxOpenResult openResult = gson.fromJson(responseStr, WxOpenResult.class); + if(openResult.isSuccess()) { + return new ResultData(); + } + return new ResultData(Result.ERROR, responseStr); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @GetMapping(value = "/unbindOpenPlatform") + @ApiOperation("解绑微信开放平台") + public ResultData unbindOpenPlatform(@RequestParam(value = "appId") String appId, @RequestParam(value = "openAppId") String openAppId) { + Gson gson = new GsonBuilder().create(); + try { + String responseStr = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).unbindOpenPlatform(appId, openAppId); + logger.info(responseStr); + WxOpenResult openResult = gson.fromJson(responseStr, WxOpenResult.class); + if(openResult.isSuccess()) { + return new ResultData(); + } + return new ResultData(Result.ERROR, responseStr); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @GetMapping(value = "/getOpenPlatform") + @ApiOperation("获取微信开放平台appId") + public ResultData getOpenPlatform(@RequestParam(value = "appId") String appId) { + Gson gson = new GsonBuilder().create(); + try { + String responseStr = openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getBindOpenPlatform(appId); + logger.info(responseStr); + WxOpenPlatformResult openPlatformResult = gson.fromJson(responseStr, WxOpenPlatformResult.class); + if(openPlatformResult.isSuccess()) { + return new ResultData(openPlatformResult.getOpenAppid()); + } + return new ResultData(Result.ERROR, responseStr); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @GetMapping(value = "/clearQuota") + @ApiOperation("代公众号清零quota,每个公众号每个月有10次清零机会,包括在微信公众平台上的清零以及调用API进行清零") + public ResultData clearQuota(@RequestParam(value = "appId") String appId) { + try { + openService.getWxOpenComponentService().getWxMpServiceByAppid(appId).clearQuota(appId); + return new ResultData(); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappCodeController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappCodeController.java new file mode 100644 index 0000000..b151c4f --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappCodeController.java @@ -0,0 +1,544 @@ +package com.iformall.controller; + +import com.alibaba.fastjson.JSON; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.iformall.common.ErrorCode; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxWeappCodeStatusVo; +import com.iformall.enums.*; +import com.iformall.service.*; +import com.iformall.service.wechat.WxOpenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.open.api.WxOpenMaService; +import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo; +import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage; +import me.chanjar.weixin.open.bean.result.*; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URLEncoder; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * Stormeye Wu + */ +@RestController +@RequestMapping("/weappCode") +@Api(description = "微信第三方开发平台-小程序-代码管理") +public class WechatWeappCodeController { + private final Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired + private WxOpenService openService; + + @Autowired + private WxWeappCodeStatusService weappCodeStatusService; + + @Autowired + private WxWeappAuditStatusService weappAuditStatusService; + + @Autowired + private WxWeappReleaseStatusService weappReleaseStatusService; + + @Autowired + private WxAppinfoService appinfoService; + + @Autowired + private WxAuthorizerInfoService authorizerInfoService; + + @Autowired + private WxWeappExtSetService weappExtSetService; + + + @ApiOperation(value = "为授权的小程序帐号上传小程序代码", notes = "extInfo参考https://mp.weixin.qq.com/debug/wxadoc/dev/framework/config.html") + @PostMapping("/codeCommit") + public ResultData codeCommit(Long templateId, String userVersion, String userDesc, String extInfoStr) { + Gson gson = new GsonBuilder().create(); + WxMaOpenCommitExtInfo extInfo = gson.fromJson(extInfoStr, new TypeToken() {}.getType()); + String appId = extInfo.getExtAppid(); + + // 检查appId是否已授权 + WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); + if(authorizerInfo == null) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + + WxWeappCodeStatus codeStatus = weappCodeStatusService.getByAppId(appId); + + WxAppinfo appinfo = appinfoService.getByAppId(appId); + + int iAppType = 0; + String appTypeStr = userVersion.substring(0, 1); + if(appTypeStr.equalsIgnoreCase("C")) + iAppType = EnumAppType.C.getCode(); + else if(appTypeStr.equalsIgnoreCase("B")) + iAppType = EnumAppType.B.getCode(); + + try { + // code提交 + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + logger.info(extInfo.toString()); + WxOpenResult openRet = openMaService.codeCommit(templateId, userVersion, userDesc, extInfo); + logger.info(openRet.toString()); + boolean codeCommitStatus = false; + if (openRet.isSuccess()) { + codeCommitStatus = true; + } + if (codeStatus == null) { + codeStatus = new WxWeappCodeStatus(); + codeStatus.setAppId(appId); + if (appinfo != null) { + codeStatus.setType(appinfo.getType()); + } + codeStatus.setUserVersion(userVersion); + codeStatus.setVersionDesc(userDesc); + if(codeCommitStatus) { + codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode()); + } else { + codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode()); + codeStatus.setCodeErrCode(gson.toJson(openRet)); + } + codeStatus.setCodeTime(new Date()); + weappCodeStatusService.saveStatus(codeStatus); + } else { + codeStatus.setUserVersion(userVersion); + codeStatus.setVersionDesc(userDesc); + if(codeCommitStatus) { + codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode()); + } else { + codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode()); + codeStatus.setCodeErrCode(gson.toJson(openRet)); + } + codeStatus.setCodeTime(new Date()); + weappCodeStatusService.updateStatus(codeStatus); + } + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + if (codeStatus == null) { + codeStatus = new WxWeappCodeStatus(); + codeStatus.setAppId(appId); + if (appinfo != null) { + codeStatus.setType(appinfo.getType()); + } + codeStatus.setUserVersion(userVersion); + codeStatus.setVersionDesc(userDesc); + codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode()); + codeStatus.setCodeErrCode(e.getMessage()); + codeStatus.setCodeTime(new Date()); + weappCodeStatusService.saveStatus(codeStatus); + } else { + codeStatus.setUserVersion(userVersion); + codeStatus.setVersionDesc(userDesc); + codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode()); + codeStatus.setCodeErrCode(e.getMessage()); + codeStatus.setCodeTime(new Date()); + weappCodeStatusService.updateStatus(codeStatus); + } + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @ApiOperation("获取体验小程序的体验二维码") + @GetMapping("/getQrcode") + public void getQrcode(@RequestParam(value = "appId") String appId, @RequestParam(value = "pagePath") String pagePath, + @RequestParam(value = "params", required = false) Map params, + HttpServletResponse response, HttpServletRequest req) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + File file = openMaService.getTestQrcode(pagePath, params); + ServletOutputStream out = response.getOutputStream(); + + response.reset(); + response.setContentType("image/jpeg"); + String agent = req.getHeader("user-agent"); + String filename = "QRCode.jpg"; + if (agent.contains("Firefox")) { + response.setHeader("Content-disposition", + "attachment; filename=" + new String(filename.getBytes("GB2312"),"ISO-8859-1")); + } else { + response.setHeader("Content-disposition", + "attachment; filename=" + URLEncoder.encode(filename,"UTF-8")); + } + // 循环取出流中的数据 + byte[] b = new byte[1024]; + int len; + InputStream inStream = new FileInputStream(file); + while ((len = inStream.read(b)) > 0) + response.getOutputStream().write(b, 0, len); + inStream.close(); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + } catch (IOException e) { + logger.error(e.getMessage()); + } + } + + @ApiOperation("获取授权小程序帐号已设置的类目") + @GetMapping("/getCategory") + public ResultData getCategory(String appId) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenMaCategoryListResult openRet = openMaService.getCategoryList(); + logger.info(openRet.toString()); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @ApiOperation("获取小程序的第三方提交代码的页面配置") + @GetMapping("/getPage") + public ResultData getPage(String appId) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenMaPageListResult openRet = openMaService.getPageList(); + logger.info(openRet.toString()); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @ApiOperation("将第三方提交的代码包提交审核") + @GetMapping("/submitAudit") + @ApiImplicitParams({ + @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true), + @ApiImplicitParam(name = "version", value = "version", dataType = "String", paramType = "query")}) + public ResultData submitAudit(String appId, String version) { + Gson gson = new GsonBuilder().create(); + WxWeappExtSet extSetQ = new WxWeappExtSet(); + extSetQ.setAppId(appId); + WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ); + if(StringUtils.isBlank(extSet.getReleaseJson())) { + logger.error("Release JSON is null"); + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + + WxWeappCodeStatusVo codeQ = new WxWeappCodeStatusVo(); + codeQ.setAppId(appId); + if(StringUtils.isNotBlank(version)) { + codeQ.setUserVersion(version); + } + List codeStatusList = weappCodeStatusService.getList(codeQ); + if(codeStatusList.size() == 1) { + WxWeappCodeStatusVo codeStatus = codeStatusList.get(0); + WxOpenMaSubmitAuditMessage subMessage = gson.fromJson(extSet.getReleaseJson(), new TypeToken() {}.getType()); + if(codeStatus != null && codeStatus.getCodeStatus().equals(EnumWeappCodeCommitStatus.SUCCESS.getCode())) { + WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); + boolean submitStatus = false; + String codeErrCode = ""; + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenMaSubmitAuditResult openRet = openMaService.submitAudit(subMessage); + logger.info(openRet.toString()); + if(openRet.isSuccess()) { + submitStatus = true; + codeErrCode = gson.toJson(openRet); + } else { + submitStatus = false; + codeErrCode = gson.toJson(openRet); + } + } catch (WxErrorException e) { + logger.error(e.getMessage()); + submitStatus = false; + codeErrCode = e.getMessage(); + } + + if (auditStatus == null) { + auditStatus = new WxWeappAuditStatus(); + auditStatus.setId(codeStatus.getId()); + auditStatus.setAppId(codeStatus.getAppId()); + auditStatus.setType(codeStatus.getType()); + auditStatus.setUserVersion(codeStatus.getUserVersion()); + auditStatus.setVersionDesc(codeStatus.getVersionDesc()); + if(submitStatus) { + auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + } else { + auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); + } + auditStatus.setAuditErrCode(codeErrCode); + auditStatus.setAuditTime(new Date()); + weappAuditStatusService.saveStatus(auditStatus); + } else { + if(!submitStatus) { + if(!auditStatus.getUserVersion().equals(codeStatus.getUserVersion()) + && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) { + // 提交审核失败不替换当前审核中的数据 + return new ResultData(ErrorCode.WEAPP_HAD_AUDITING); + } + codeStatus.setCodeStatus(EnumWeappAuditStatus.FAIL.getCode()); + codeStatus.setCodeErrCode(codeErrCode); + } else { + codeStatus.setCodeStatus(EnumWeappAuditStatus.AUDITING.getCode()); + } + auditStatus.setUserVersion(codeStatus.getUserVersion()); + auditStatus.setVersionDesc(codeStatus.getVersionDesc()); + auditStatus.setAuditTime(new Date()); + weappAuditStatusService.updateStatus(auditStatus); + } + if(submitStatus) { + return new ResultData(codeErrCode); + } else { + return new ResultData(ErrorCode.WEAPP_AUDIT_ERR); + } + } else { + logger.error(ErrorCode.WEAPP_CODE_COMMIT_ERR.getMessage()); + return new ResultData(ErrorCode.WEAPP_CODE_COMMIT_ERR); + } + } + return new ResultData(ErrorCode.WEAPP_CODE_COMMIT_ERR); + } + + @ApiOperation("查询某个指定版本的审核状态") + @PostMapping("/getAuditstatus") + public ResultData getAuditstatus(String appId, String auditidStr) { + Gson gson = new GsonBuilder().create(); + Long auditId = Long.valueOf(auditidStr); + WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); + if(auditStatus != null && auditStatus.getAuditid().equals(auditId)) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenMaQueryAuditResult openRet = openMaService.getAuditStatus(auditId); + logger.info(openRet.toString()); + if (openRet.isSuccess()) { + auditStatus.setAuditid(openRet.getAuditId()); + // 审核状态,其中0为审核成功,1为审核失败,2为审核中,3已撤回 + switch (openRet.getStatus().intValue()) { + case 0: + auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode()); + break; + case 1: + auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); + break; + case 2: + auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + break; + case 3: + auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode()); + break; + default: + auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + break; + } + auditStatus.setAuditErrCode(gson.toJson(openRet)); + auditStatus.setAuditTime(new Date()); + weappAuditStatusService.updateStatus(auditStatus); + } + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + return new ResultData(Result.ERROR, "auditid不对应"); + } + + @ApiOperation("查询最新一次提交的审核状态") + @GetMapping("/getLatestAuditstatus") + public ResultData get_latest_auditstatus(String appId) { + Gson gson = new GsonBuilder().create(); + WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); + if(auditStatus != null + && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenMaQueryAuditResult openRet = openMaService.getLatestAuditStatus(); + logger.info(openRet.toString()); + if (openRet.isSuccess()) { + auditStatus.setAuditid(openRet.getAuditId()); + // 审核状态,其中0为审核成功,1为审核失败,2为审核中,3已撤回 + switch (openRet.getStatus().intValue()) { + case 0: + auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode()); + break; + case 1: + auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); + break; + case 2: + auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + break; + case 3: + auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode()); + break; + default: + auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + break; + } + auditStatus.setAuditErrCode(gson.toJson(openRet)); + auditStatus.setAuditTime(new Date()); + weappAuditStatusService.updateStatus(auditStatus); + } + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } else { + return new ResultData(Result.ERROR, "审核状态不是审核中"); + } + } + + @ApiOperation("发布已通过审核的小程序") + @GetMapping("/releaseAudited") + public ResultData releaesAudited(String appId) { + if(StringUtils.isBlank(appId)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + Gson gson = new GsonBuilder().create(); + WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); + if(auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.SUCCESS.getCode())) { + boolean isUpdate = false; + WxWeappReleaseStatus releaseStatus = weappReleaseStatusService.getByAppId(appId); + if(releaseStatus != null) { + // 版本已发布成功,跳过 + if(releaseStatus.getUserVersion().equals(auditStatus.getUserVersion()) + && releaseStatus.getReleaseStatus().equals(EnumWeappReleaseStatus.SUCCESS.getCode())) { + return new ResultData(ErrorCode.WEAPP_APP_RELEASEED); + } + releaseStatus.setUserVersion(auditStatus.getUserVersion()); + releaseStatus.setVersionDesc(auditStatus.getVersionDesc()); + isUpdate = true; + } else { + releaseStatus = new WxWeappReleaseStatus(); + releaseStatus.setAppId(auditStatus.getAppId()); + releaseStatus.setType(auditStatus.getType()); + releaseStatus.setUserVersion(auditStatus.getUserVersion()); + releaseStatus.setVersionDesc(auditStatus.getVersionDesc()); + } + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenResult openRet = openMaService.releaesAudited(); + logger.info(openRet.toString()); + if(openRet.getErrcode().equals('0')) { + releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode()); + } else { + releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode()); + } + releaseStatus.setReleaseErrCode(gson.toJson(openRet)); + releaseStatus.setReleaseTime(new Date()); + if(isUpdate) { + weappReleaseStatusService.updateStatus(releaseStatus); + } else { + weappReleaseStatusService.saveStatus(releaseStatus); + } + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode()); + releaseStatus.setReleaseErrCode(e.getMessage()); + releaseStatus.setReleaseTime(new Date()); + if(isUpdate) { + weappReleaseStatusService.updateStatus(releaseStatus); + } else { + weappReleaseStatusService.saveStatus(releaseStatus); + } + return new ResultData(Result.ERROR, e.getMessage()); + } + } else { + return new ResultData(ErrorCode.WEAPP_NOT_AUDITED); + } + } + + @ApiOperation("小程序版本回退") + @GetMapping("/revertCodeRelease") + public ResultData revertCodeRelease(String appId) { + Gson gson = new GsonBuilder().create(); + WxWeappReleaseStatus releaseStatus = weappReleaseStatusService.getByAppId(appId); + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenResult openRet = openMaService.revertCodeReleaes(); + logger.info(openRet.toString()); + if(openRet.isSuccess()) { + if(releaseStatus != null) { + releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.BACK.getCode()); + releaseStatus.setReleaseErrCode(gson.toJson(openRet)); + releaseStatus.setReleaseTime(new Date()); + weappReleaseStatusService.updateStatus(releaseStatus); + } + return new ResultData(); + } + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @ApiOperation("查询当前设置的最低基础库版本及各版本用户占比") + @GetMapping("/getSupportVersion") + public ResultData getSupportVersion(String appId) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + String openRet = openMaService.getSupportVersion(); + logger.info(openRet.toString()); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @ApiOperation("设置最低基础库版本") + @GetMapping("/setSupportVersion") + public ResultData setSupportVersion(String appId, String version) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + String openRet = openMaService.setSupportVersion(version); + logger.info(openRet); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @ApiOperation(value = "小程序审核撤回", notes = "单个帐号每天审核撤回次数最多不超过1次,一个月不超过10次。") + @GetMapping("/undoCodeAudit") + public ResultData undoCodeAudit(String appId) { + Gson gson = new GsonBuilder().create(); + WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); + if(auditStatus != null) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenResult openResult = openMaService.undoCodeAudit(); + if(openResult.isSuccess()) { + auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode()); + auditStatus.setAuditErrCode(gson.toJson(openResult)); + auditStatus.setAuditTime(new Date()); + weappAuditStatusService.updateStatus(auditStatus); + return new ResultData("审核撤回成功"); + } + return new ResultData(Result.ERROR, "审核撤回失败"); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + return new ResultData(Result.ERROR, "没有审核记录,不能撤回"); + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappDraftTemplateController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappDraftTemplateController.java new file mode 100644 index 0000000..2c2a97e --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappDraftTemplateController.java @@ -0,0 +1,78 @@ +package com.iformall.controller; + +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.service.wechat.WxOpenService; +import io.swagger.annotations.Api; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * Stormeye Wu + */ +@RestController +@RequestMapping("/weappDraftTemplate") +@Api(description = "微信第三方开发平台-小程序-代码模版库管理") +public class WechatWeappDraftTemplateController { + private final Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired + private WxOpenService openService; + + + @GetMapping("/tempDraftList") + public ResultData getTempDraftList() { + try { + List list = openService.getWxOpenComponentService().getTemplateDraftList(); + return new ResultData(list); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + + } + + @GetMapping("/tempList") + public ResultData getTempList() { + try { + List list = openService.getWxOpenComponentService().getTemplateList(); + return new ResultData(list); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @PostMapping("/addToTemplate") + public ResultData addToTemplate(@RequestBody WxOpenMaCodeTemplate template) { + if(template == null || template.getDraftId() == null) { + return new ResultData(Result.ERROR, "draftId is null"); + } + try { + openService.getWxOpenComponentService().addToTemplate(template.getDraftId()); + return new ResultData(); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @PostMapping("/deleteTemplate") + public ResultData deleteTemplate(@RequestBody WxOpenMaCodeTemplate template) { + if(template == null || template.getTemplateId() == null) { + return new ResultData(Result.ERROR, "templateId is null"); + } + try { + openService.getWxOpenComponentService().deleteTemplate(template.getTemplateId()); + return new ResultData(); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappMsgTemplateController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappMsgTemplateController.java new file mode 100644 index 0000000..36fbfe4 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappMsgTemplateController.java @@ -0,0 +1,135 @@ +package com.iformall.controller; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryGetResult; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateLibraryListResult; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateListResult; +import com.iformall.common.ErrorCode; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxAuthorizerInfo; +import com.iformall.enums.EnumWxAuthorizationStatus; +import com.iformall.service.WxAuthorizerInfoService; +import com.iformall.service.wechat.WxOpenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import me.chanjar.weixin.common.error.WxErrorException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; + +/** + * Stormeye Wu + */ +@RestController +@RequestMapping("/weappMsgTemplate") +@Api(description = "微信第三方开发平台-小程序-消息模板设置") +public class WechatWeappMsgTemplateController { + private final Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired + private WxOpenService openService; + + @Autowired + private WxAuthorizerInfoService authorizerInfoService; + + @ApiOperation("获取小程序模板库标题列表") + @GetMapping("getTmpLibList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true), + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData getTmpLibList(String appId, Integer pageNum, Integer pageSize) { + try { + WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxMaTemplateLibraryListResult ret = maService.getTemplateService().findTemplateLibraryList(pageNum, pageSize); + return new ResultData(ret); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @ApiOperation("获取模板库某个模板标题下关键词库") + @GetMapping("getTemplateLibraryKeywordList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true), + @ApiImplicitParam(name = "id", value = "页数", dataType = "String", paramType = "query", required = true)}) + public ResultData findTemplateLibraryKeywordList(String appId, String id) { + try { + WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxMaTemplateLibraryGetResult ret = maService.getTemplateService().findTemplateLibraryKeywordList(id); + return new ResultData(ret); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + + } + + @ApiOperation("组合模板并添加至帐号下的个人模板库") + @PostMapping("addTemplate") + public ResultData addTemplate(String appId, String id, List keywordIdList) { + WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); + if(authorizerInfo == null) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + try { + WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxMaTemplateAddResult ret = maService.getTemplateService().addTemplate(id, keywordIdList); + authorizerInfo.setTemplateStatus(0); + authorizerInfo.setTemplateTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + authorizerInfoService.updateTemplate(authorizerInfo); + return new ResultData(ret); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + authorizerInfo.setTemplateStatus(1); + authorizerInfo.setTemplateTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + authorizerInfoService.updateTemplate(authorizerInfo); + return new ResultData(Result.ERROR, e.getMessage()); + } + + } + + @ApiOperation("获取帐号下已存在的模板列表") + @GetMapping("getTemplateList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "appId", value = "appId", dataType = "String", paramType = "query", required = true), + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData findTemplateList(String appId, Integer pageNum, Integer pageSize) { + try { + WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxMaTemplateListResult ret = maService.getTemplateService().findTemplateList(pageNum, pageSize); + return new ResultData(ret); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + + } + + @ApiOperation("删除帐号下的某个模板") + @PostMapping("delTemplate") + public ResultData delTemplate(@RequestParam(value = "appId") String appId, @RequestParam(value = "templateId") String templateId) { + try { + WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + maService.getTemplateService().delTemplate(templateId); + return new ResultData(); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappSetController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappSetController.java new file mode 100644 index 0000000..7b9506a --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WechatWeappSetController.java @@ -0,0 +1,230 @@ +package com.iformall.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.iformall.common.ErrorCode; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxAuthorizerInfo; +import com.iformall.enums.EnumWxAuthorizationStatus; +import com.iformall.service.WxAuthorizerInfoService; +import com.iformall.service.wechat.WxOpenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.open.api.WxOpenMaService; +import me.chanjar.weixin.open.bean.result.*; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * Stormeye Wu + */ +@RestController +@RequestMapping("/weappSet") +@Api(description = "微信第三方开发平台-小程序设置") +public class WechatWeappSetController { + private final Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired + private WxOpenService openService; + + @Autowired + private WxAuthorizerInfoService authorizerInfoService; + + @ApiOperation("获取小程序的信息") + @GetMapping("/getInfo") + public ResultData getAccountBasicInfo(String appId) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + String openRet = openMaService.getAccountBasicInfo(); + logger.info(openRet.toString()); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + } + return new ResultData(Result.ERROR); + } + + @ApiOperation("获取小程序服务器域名") + @GetMapping("/getDomain") + public ResultData getDomain(String appId) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenResult openRet = openMaService.getDomain(); + logger.info(openRet.toString()); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + + } + + @ApiOperation("获取小程序服务器域名") + @GetMapping("/getWebDomain") + public ResultData getWebDomain(String appId) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + String openRet = openMaService.getWebViewDomain(); + logger.info(openRet); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + + @ApiOperation(value = "设置小程序服务器域名", notes = "{\n" + + " \"action\":\"add/set/delete/get\",\n" + + " \"requestdomain\":[\"https://www.qq.com\",\"https://www.qq.com\"],\n" + + " \"wsrequestdomain\":[\"wss://www.qq.com\",\"wss://www.qq.com\"],\n" + + " \"uploaddomain\":[\"https://www.qq.com\",\"https://www.qq.com\"],\n" + + " \"downloaddomain\":[\"https://www.qq.com\",\"https://www.qq.com\"],\n" + + " }") + @PostMapping("/modifyDomain") + public ResultData modifyDomain(String appId, String action, + List requestDomain, List wsrequestdomain, + List uploaddomain, List downloaddomain) { + WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); + if(authorizerInfo == null) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenMaDomainResult openRet = openMaService.modifyDomain(action, + requestDomain, wsrequestdomain, + uploaddomain, downloaddomain); + logger.info(openRet.toString()); + if(openRet.isSuccess()) { + logger.info("设置服务器域名成功"); + authorizerInfo.setDomainStatus(0); + authorizerInfo.setDomainTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + + } else { + logger.info("设置服务器域名成功"); + authorizerInfo.setDomainStatus(1); + authorizerInfo.setDomainTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + } + authorizerInfoService.updateDomainUrl(authorizerInfo); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + } + return new ResultData(Result.ERROR); + } + + @ApiOperation(value = "设置小程序业务域名", notes = "{\n" + + " \"action\":\"add/set/delete/get\",\n" + + " \"webviewdomain\":[\"https://www.qq.com\",\"https://m.qq.com\"]\n" + + " }") + @PostMapping("/modifyWebViewDomain") + public ResultData modifyWebViewDomain(String appId, String action, + List urlList) { + WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); + if(authorizerInfo == null) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + String openRet = openMaService.setWebViewDomain(action, urlList); + logger.info(openRet); + JSONObject webRetObj = JSON.parseObject(openRet); + if(webRetObj.getInteger("errcode").equals(0)) { + logger.info("设置服务器业务域名成功"); + authorizerInfo.setWebdomainStatus(0); + authorizerInfo.setWebdomainTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + } else { + logger.info("设置服务器业务域名失败"); + authorizerInfo.setWebdomainStatus(1); + authorizerInfo.setWebdomainTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + } + authorizerInfoService.updateWebDomainUrl(authorizerInfo); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + } + return new ResultData(Result.ERROR); + } + + @ApiOperation(value = "绑定微信用户为小程序体验者", notes = "{\"appId\":\"string\", \"wechatId\":\"string\"}") + @PostMapping("/bindTester") + public ResultData bindTester(@RequestBody Map params) { + String appId = params.get("appId"); + String wechatId = params.get("wechatId"); + if(StringUtils.isBlank(appId)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "appId不能为空"); + } + WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); + if(authorizerInfo == null) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + if(StringUtils.isBlank(wechatId)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "wechatId不能为空"); + } + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenResult openRet = openMaService.bindTester(wechatId); + logger.info(openRet.toString()); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(e.getMessage()); + } + } + + @ApiOperation(value = "解除绑定小程序的体验者", notes = "") + @PostMapping("/unbindTester") + public ResultData unbindTester(@RequestBody Map params) { + String appId = params.get("appId"); + String wechatId = params.get("wechatId"); + if(StringUtils.isBlank(appId)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "appId不能为空"); + } + if(StringUtils.isBlank(wechatId)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "wechatId不能为空"); + } + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenResult openRet = openMaService.unbindTester(wechatId); + logger.info(openRet.toString()); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(e.getMessage()); + } + } + + @ApiOperation(value = "获取体验者列表", notes = "") + @GetMapping("/getTesterList") + public ResultData getTesterList(@RequestParam(value = "appId") String appId) { + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + WxOpenResult openRet = openMaService.getTesterList(); + logger.info(openRet.toString()); + return new ResultData(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + } + return new ResultData(Result.ERROR); + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WxWeappBasicSetController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WxWeappBasicSetController.java new file mode 100644 index 0000000..c124e11 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WxWeappBasicSetController.java @@ -0,0 +1,62 @@ +package com.iformall.controller; + +import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxWeappBasicSet; +import com.iformall.service.WxWeappBasicSetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +/** + * Stormeye Wu + */ +@Controller +@RequestMapping("/weappBasicSet") +@Api(description = "小程序基础设置接口") +public class WxWeappBasicSetController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private Integer getFmDelay; + + @Autowired + private WxWeappBasicSetService weappBasicSetService; + + @ApiOperation("分页列表接口") + @GetMapping("list") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData list(@ModelAttribute WxWeappBasicSet weappBasicSet, Integer pageNum, Integer pageSize) { + logger.debug("[" + getIpAddr() + "] WxWeappBasicSetController::list"); + if (null == weappBasicSet) weappBasicSet = new WxWeappBasicSet(); + weappBasicSet.setDeploy(getFmDelay); + final PageInfo page = weappBasicSetService.listAsPage(weappBasicSet, pageNum, pageSize); + return new ResultData(page); + } + + @PostMapping("add") + public ResultData add(WxWeappBasicSet weappBasicSet) { + logger.debug("[" + getIpAddr() + "] WxWeappBasicSetController::add"); + if (null == weappBasicSet) return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + weappBasicSetService.saveOrUpdate(weappBasicSet); + return new ResultData(); + } + + @PostMapping("update") + public ResultData update(WxWeappBasicSet weappBasicSet) { + logger.debug("[" + getIpAddr() + "] WxWeappBasicSetController::update"); + if (null == weappBasicSet) return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + weappBasicSetService.saveOrUpdate(weappBasicSet); + return new ResultData(); + } + +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WxWeappExtSetController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WxWeappExtSetController.java new file mode 100644 index 0000000..a58f182 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WxWeappExtSetController.java @@ -0,0 +1,61 @@ +package com.iformall.controller; + +import com.github.pagehelper.PageInfo; +import com.iformall.common.ErrorCode; +import com.iformall.common.ResultData; +import com.iformall.domain.po.WxWeappExtSet; +import com.iformall.service.WxWeappExtSetService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * Stormeye Wu + */ +@Controller +@RequestMapping("/weappExtSet") +@Api(description = "小程序扩展设置接口") +public class WxWeappExtSetController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private WxWeappExtSetService weappExtSetService; + + @ApiOperation("分页列表接口") + @GetMapping("list") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData list(@ModelAttribute WxWeappExtSet weappExtSet, Integer pageNum, Integer pageSize) { + logger.debug("[" + getIpAddr() + "] WxWeappExtSetController::list"); + if (null == weappExtSet) weappExtSet = new WxWeappExtSet(); + final PageInfo page = weappExtSetService.listAsPage(weappExtSet, pageNum, pageSize); + return new ResultData(page); + } + + @PostMapping("add") + public ResultData add(WxWeappExtSet weappExtSet) { + logger.debug("[" + getIpAddr() + "] WxWeappExtSetController::add"); + if (null == weappExtSet) return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + weappExtSetService.saveOrUpdate(weappExtSet); + return new ResultData(); + } + + @PostMapping("update") + public ResultData update(WxWeappExtSet weappExtSet) { + logger.debug("[" + getIpAddr() + "] WxWeappBasicSetController::update"); + if (null == weappExtSet) return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + weappExtSetService.saveOrUpdate(weappExtSet); + return new ResultData(); + } + +} diff --git a/mlWechatOpen/src/main/java/com/iformall/controller/WxWeappInfoController.java b/mlWechatOpen/src/main/java/com/iformall/controller/WxWeappInfoController.java new file mode 100644 index 0000000..117ad7c --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/controller/WxWeappInfoController.java @@ -0,0 +1,952 @@ +package com.iformall.controller; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.template.WxMaTemplateAddResult; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.github.pagehelper.PageInfo; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.iformall.common.ErrorCode; +import com.iformall.common.Result; +import com.iformall.common.ResultData; +import com.iformall.domain.po.*; +import com.iformall.domain.vo.WxWeappAuditStatusVo; +import com.iformall.domain.vo.WxWeappCodeStatusVo; +import com.iformall.domain.vo.WxWeappInfo; +import com.iformall.domain.vo.WxWeappReleaseStatusVo; +import com.iformall.enums.*; +import com.iformall.service.*; +import com.iformall.service.wechat.WxOpenService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.models.auth.In; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.open.api.WxOpenMaService; +import me.chanjar.weixin.open.bean.ma.WxMaOpenCommitExtInfo; +import me.chanjar.weixin.open.bean.message.WxOpenMaSubmitAuditMessage; +import me.chanjar.weixin.open.bean.result.WxOpenMaDomainResult; +import me.chanjar.weixin.open.bean.result.WxOpenMaQueryAuditResult; +import me.chanjar.weixin.open.bean.result.WxOpenMaSubmitAuditResult; +import me.chanjar.weixin.open.bean.result.WxOpenResult; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +/** + * Stormeye Wu + */ +@Controller +@RequestMapping("/weapp") +@Api(description = "小程序") +public class WxWeappInfoController extends BaseController { + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private Integer getFmDelay; + + @Autowired + private WxAuthorizerInfoService authorizerInfoService; + + @Autowired + private WxWeappBasicSetService weappBasicSetService; + + @Autowired + private WxWeappExtSetService weappExtSetService; + + @Autowired + private WxWeappCodeStatusService weappCodeStatusService; + + @Autowired + private WxWeappAuditStatusService weappAuditStatusService; + + @Autowired + private WxWeappReleaseStatusService weappReleaseStatusService; + + @Autowired + private WxOpenService openService; + + @Autowired + private WxAppinfoService appinfoService; + + @Autowired + private WxTemplateMsgService templateMsgService; + + + @ApiOperation(value = "小程序分页列表接口", notes = "查询支持小程序类型,名称,appid,version") + @GetMapping("list") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData list(@ModelAttribute WxWeappInfo weappInfo, Integer pageNum, Integer pageSize) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::list"); + if (null == weappInfo) { + weappInfo = new WxWeappInfo(); + } else { + if(StringUtils.isBlank(weappInfo.getName())) { + weappInfo.setName(null); + } + } + weappInfo.setSortColumns(WxWeappInfo.Field.Name_ASC,WxWeappInfo.Field.Type_ASC); + final PageInfo page = authorizerInfoService.listVoAsPage(weappInfo, pageNum, pageSize); + return new ResultData(page); + } + + @ApiOperation("小程序列表接口") + @GetMapping("allist") + public ResultData getList(@ModelAttribute WxWeappInfo weappInfo) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::list"); + if (null == weappInfo) { + weappInfo = new WxWeappInfo(); + } else { + if(StringUtils.isBlank(weappInfo.getName())) { + weappInfo.setName(null); + } + } + weappInfo.setSortColumns(WxAuthorizerInfo.Field.CurrentVersion_DESC); + final List list = authorizerInfoService.getList(weappInfo); + return new ResultData(list); + } + + @ApiOperation(value = "APPs基础设置(服务器域名、业务域名、基础版本、微信模板)", notes = "{\"apps\":\"appid,appid\",\"type\":\"String\"}") + @PostMapping("batchBasicSet") + public ResultData batchSet(@RequestBody Map params) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchBasicSet"); + String appsStr = params.get("apps"); + String typeStr = params.get("type"); + + if(StringUtils.isBlank(typeStr)) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "type参数不能为空"); + } + + Integer type = 0; + try { + type = Integer.parseInt(typeStr); + } catch (Exception e) { + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); + } + // 检查基础配置参数 + WxWeappBasicSet weappBasicSetQ = new WxWeappBasicSet(); + weappBasicSetQ.setType(type); + weappBasicSetQ.setDeploy(getFmDelay); + WxWeappBasicSet weappBasicSet = weappBasicSetService.getByTypeAndDeploy(weappBasicSetQ); + if(weappBasicSet == null) { + logger.error("未找到相关的基础设置参数"); + return new ResultData(ErrorCode.WEAPP_BASIC_SET_ERR); + } + + JSONObject domainObj = JSON.parseObject(weappBasicSet.getDomainUrl()); + if(domainObj == null) { + logger.error("未找到相关的基础设置参数"); + return new ResultData(ErrorCode.WEAPP_BASIC_SET_DOMAIN_ERR); + } + JSONObject templeObj = JSON.parseObject(weappBasicSet.getTemplateInfo()); + + if(StringUtils.isBlank(appsStr)) { + WxWeappInfo weappInfoQ = new WxWeappInfo(); + weappInfoQ.setType(type); + List list = authorizerInfoService.getList(weappInfoQ); + for(WxWeappInfo info: list) { + appsStr += info.getAuthorizerAppid() + ","; + } + appsStr = appsStr.substring(0, appsStr.length() - 1); + } + + // 逐一设置app配置 + String [] apps = appsStr.split(","); + for(String appId: apps) { + // 检查appId是否已授权 + WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); + if(authorizerInfo == null) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + ResultData openRet = setBasicForAppId(appId, weappBasicSet, domainObj, templeObj); + if (openRet != null) return openRet; + } + return new ResultData(); + } + + private ResultData setBasicForAppId(String appId, WxWeappBasicSet weappBasicSet, JSONObject domainObj, JSONObject templeObj) { + WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); + if(authorizerInfo == null) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + // 设置基础版本 + String versionRet = openMaService.setSupportVersion(weappBasicSet.getVersion()); + logger.info(versionRet); + JSONObject verObj = JSON.parseObject(versionRet); + if(verObj.getInteger("errcode").equals(0)) { + authorizerInfo.setBaseStatus(0); + } else { + authorizerInfo.setBaseStatus(1); + } + authorizerInfo.setBaseTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + authorizerInfoService.updateBaseVersion(authorizerInfo); + + // 服务器域名 + String action = "set"; + JSONObject urlObj = domainObj.getJSONObject("url"); + List requestDomain = getUrlList(urlObj.getJSONArray("requestdomain")); + List wsrequestDomain = getUrlList(urlObj.getJSONArray("wsrequestdomain")); + List uploadDomain = getUrlList(urlObj.getJSONArray("requestdomain")); + List downloadDomain = getUrlList(urlObj.getJSONArray("requestdomain")); + WxOpenMaDomainResult openRet = openMaService.modifyDomain(action, + requestDomain, wsrequestDomain, + uploadDomain, downloadDomain); + logger.info(openRet.toString()); + if(openRet.isSuccess()) { + logger.info("设置服务器域名成功"); + authorizerInfo.setDomainStatus(0); + authorizerInfo.setDomainTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + + } else { + logger.info("设置服务器域名成功"); + authorizerInfo.setDomainStatus(1); + authorizerInfo.setDomainTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + } + authorizerInfoService.updateDomainUrl(authorizerInfo); + // 业务域名 + JSONObject webObj = domainObj.getJSONObject("web"); + List urlList = getUrlList(webObj.getJSONArray("webviewdomain")); + String openRet1 = openMaService.setWebViewDomain(action, urlList); + logger.info(openRet1); + JSONObject webRetObj = JSON.parseObject(openRet1); + if(webRetObj.getInteger("errcode").equals(0)) { + logger.info("设置服务器业务域名成功"); + authorizerInfo.setWebdomainStatus(0); + authorizerInfo.setWebdomainTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + } else { + logger.info("设置服务器业务域名失败"); + authorizerInfo.setWebdomainStatus(1); + authorizerInfo.setWebdomainTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + } + authorizerInfoService.updateWebDomainUrl(authorizerInfo); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + return new ResultData(Result.ERROR, e.getMessage()); + } + + // 设置微信模板 + if(weappBasicSet.getType().equals(EnumAppType.C.getCode())) { + WxAppinfo appinfo = appinfoService.getByAppId(appId); + try { + WxMaService maService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appId); + // 核销成功消息 + JSONObject verify_success = templeObj.getJSONObject("verify_success"); + JSONArray keyidlist = verify_success.getJSONArray("keyword_id_list"); + List keyArr = getIdList(keyidlist); + WxMaTemplateAddResult ret = maService.getTemplateService().addTemplate(verify_success.getString("id"), keyArr); + logger.info(ret.toString()); + if(appinfo != null) { + // wx_template_msg + WxTemplateMsg templateMsgQ = new WxTemplateMsg(); + templateMsgQ.setTenantId(appinfo.getTenantId()); + templateMsgQ.setType(EnumTemplateType.VERIFY_SUCCESS.getCode()); + WxTemplateMsg templateMsg = templateMsgService.getByObj(templateMsgQ); + if(templateMsg != null) { + templateMsg.setTemplateId(ret.getTemplateId()); + templateMsgService.saveOrUpdate(templateMsg); + } else { + templateMsgQ.setTemplateId(ret.getTemplateId()); + templateMsgService.saveOrUpdate(templateMsgQ); + } + } + // 核销失败消息 + JSONObject verify_fail = templeObj.getJSONObject("verify_fail"); + keyidlist = verify_fail.getJSONArray("keyword_id_list"); + List keyArr1 = getIdList(keyidlist); + ret = maService.getTemplateService().addTemplate(verify_fail.getString("id"), keyArr1); + logger.info(ret.toString()); + if(appinfo != null) { + // wx_template_msg + WxTemplateMsg templateMsgQ = new WxTemplateMsg(); + templateMsgQ.setTenantId(appinfo.getTenantId()); + templateMsgQ.setType(EnumTemplateType.VERIFY_FAIL.getCode()); + WxTemplateMsg templateMsg = templateMsgService.getByObj(templateMsgQ); + if(templateMsg != null) { + templateMsg.setTemplateId(ret.getTemplateId()); + templateMsgService.saveOrUpdate(templateMsg); + } else { + templateMsgQ.setTemplateId(ret.getTemplateId()); + templateMsgService.saveOrUpdate(templateMsgQ); + } + } + + // 更新状态 + authorizerInfo.setTemplateStatus(0); + authorizerInfo.setTemplateTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + authorizerInfoService.updateTemplate(authorizerInfo); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + // 更新状态 + authorizerInfo.setTemplateStatus(1); + authorizerInfo.setTemplateTime(new Date()); + authorizerInfo.setUpdateTime(new Date()); + authorizerInfoService.updateTemplate(authorizerInfo); + return new ResultData(Result.ERROR, e.getMessage()); + } + } + // 设置成功返回null + return null; + } + + private List getIdList(JSONArray keyidlist) { + List keyArr = new ArrayList(); + for (int i = 0; i < keyidlist.size(); i++) { + keyArr.add(keyidlist.getIntValue(i)); + } + return keyArr; + } + + private List getUrlList(JSONArray urlList) { + List keyArr = new ArrayList(); + for (int i = 0; i < urlList.size(); i++) { + keyArr.add(urlList.getString(i)); + } + return keyArr; + } + + @ApiOperation(value = "批量授权的小程序code提交", notes = "{\"apps\":\"appid,appid\",\"templateId\":\"String\",\"type\":\"String\",\"userVersion\":\"String\",\"userDesc\":\"String\"}") + @PostMapping("batchCodeCommit") + public ResultData batchCodeCommit(@RequestBody Map params) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchExtSet"); + String appsStr = params.get("apps"); + String templateIdStr = params.get("templateId"); + String typeStr = params.get("type"); + String userVersion = params.get("userVersion"); + String userDesc = params.get("userDesc"); + + Integer type = null; + Long templateId = null; + try { + templateId = Long.parseLong(templateIdStr); + } catch (Exception e) { + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); + } + + try { + type = Integer.parseInt(typeStr); + } catch (Exception e) { + logger.error("type为null"); + } + if(StringUtils.isBlank(appsStr)) { + if(type == null) { + logger.error("type为null"); + return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); + } + WxWeappInfo authQ = new WxWeappInfo(); + authQ.setType(type); + List appList = authorizerInfoService.getList(authQ); + appsStr = ""; + StringBuilder sb = new StringBuilder(); + boolean bfirst = true; + for(WxWeappInfo app: appList) { + if(bfirst) { + sb.append(app.getAuthorizerAppid()); + bfirst = false; + } else { + sb.append(app.getAuthorizerAppid()).append(","); + } + } + } + String [] apps = appsStr.split(","); + // 逐一检查app的设置 + for(String appId: apps) { + WxWeappExtSet extSetQ = new WxWeappExtSet(); + extSetQ.setAppId(appId); + WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ); + if(extSet == null) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + if(StringUtils.isBlank(extSet.getExtJson())) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + if(StringUtils.isBlank(extSet.getReleaseJson())) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + } + // 逐一设置app配置 + for(String appId: apps) { + // 检查appId是否已授权 + WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); + if(authorizerInfo == null) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + codeCommit(appId, userVersion, userDesc, templateId); + } + return new ResultData(); + } + + private void codeCommit(String appId, String userVersion, String userDesc, Long templateId) { + WxAppinfo appinfo = appinfoService.getByAppId(appId); + + int iAppType = 0; + String appTypeStr = userVersion.substring(0, 1); + if(appTypeStr.equalsIgnoreCase("C")) + iAppType = EnumAppType.C.getCode(); + else if(appTypeStr.equalsIgnoreCase("B")) + iAppType = EnumAppType.B.getCode(); + + if(!appinfo.getType().equals(iAppType)) { + // 如果版本号与小程序的类型不一致,不提交版本 + return; + } + + // get ext json + WxWeappExtSet extSetQ = new WxWeappExtSet(); + extSetQ.setAppId(appId); + WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ); + WxWeappCodeStatus codeStatus = weappCodeStatusService.getByAppId(appId); + if(extSet != null) { + boolean codeCommitStatus = false; + if(codeStatus != null && codeStatus.getCodeStatus().equals(0) && codeStatus.getUserVersion().equals(userVersion)) { + codeCommitStatus = true; + } + if(!codeCommitStatus) { + codeCommitStatus = doCodeCommit(userVersion, userDesc, templateId, appinfo, extSet, codeStatus); + } + } + } + + @ApiOperation(value = "小程序批量提交审核", notes = "{\"type\":\"String\",\"userVersion\":\"String\",\"apps\":\"appid,appid\"}") + @PostMapping("batchCodeAudit") + public ResultData batchCodeAudit(@RequestBody Map params) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchExtSet"); + String appsStr = params.get("apps"); + String typeStr = params.get("type"); + String userVersion = params.get("userVersion"); + Integer type = null; + try { + type = Integer.parseInt(typeStr); + } catch (Exception e) { + logger.error("小程序类型"); + } + if(StringUtils.isBlank(appsStr)) { + if(type == null) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + WxWeappInfo authQ = new WxWeappInfo(); + authQ.setType(type); + List appList = authorizerInfoService.getList(authQ); + appsStr = ""; + StringBuilder sb = new StringBuilder(); + boolean bfirst = true; + for(WxWeappInfo app: appList) { + if(bfirst) { + sb.append(app.getAuthorizerAppid()); + bfirst = false; + } else { + sb.append(app.getAuthorizerAppid()).append(","); + } + } + } + String [] apps = appsStr.split(","); + // 逐一检查app的设置 + for(String appId: apps) { + WxWeappExtSet extSetQ = new WxWeappExtSet(); + extSetQ.setAppId(appId); + WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ); + if(extSet == null) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + if(StringUtils.isBlank(extSet.getExtJson())) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + if(StringUtils.isBlank(extSet.getReleaseJson())) { + return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL); + } + } + // 逐一设置app配置 + for(String appId: apps) { + // 检查appId是否已授权 + WxAuthorizerInfo authorizerInfo = authorizerInfoService.getByAppId(appId); + if(authorizerInfo == null) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + if(!authorizerInfo.getAuthorizationStatus().equals(EnumWxAuthorizationStatus.AUTHORIZED.getCode())) { + return new ResultData(ErrorCode.WEAPP_APPID_NOT_AUTH); + } + codeAudit(appId, userVersion); + } + return new ResultData(); + } + + private void codeAudit(String appId, String userVersion) { + // get ext json + WxWeappExtSet extSetQ = new WxWeappExtSet(); + extSetQ.setAppId(appId); + WxWeappExtSet extSet = weappExtSetService.getByObj(extSetQ); + WxWeappCodeStatus codeStatus = weappCodeStatusService.getByAppId(appId); + if(extSet != null) { + boolean codeCommitStatus = false; + if(codeStatus != null + && codeStatus.getCodeStatus().equals(EnumWeappCodeCommitStatus.SUCCESS.getCode()) + && codeStatus.getUserVersion().equals(userVersion)) { + codeCommitStatus = true; + } + if(codeCommitStatus) { + WxWeappAuditStatus auditStatus = weappAuditStatusService.getByAppId(appId); + if(auditStatus != null && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) { + logger.error("审核中不能再提交审核"); + return; + } + doCodeAudit(codeStatus, auditStatus, extSet); + } else { + logger.error("CODE提交失败"); + } + } + } + + private boolean doCodeCommit(String userVersion, String userDesc, Long templateId, WxAppinfo appinfo, WxWeappExtSet extSet, WxWeappCodeStatus codeStatus) { + Gson gson = new GsonBuilder().create(); + // code提交 + boolean codeCommitStatus = false; + String codeErrCode = ""; + try { + WxMaOpenCommitExtInfo extInfo = gson.fromJson(extSet.getExtJson(), new TypeToken() {}.getType()); + logger.info("OLD: " + extInfo.toString()); + // 自动修改提交的版本 + if(extInfo.getExtMap().containsKey("appVersion")) { + extInfo.getExtMap().put("appVersion", userVersion); + } + logger.info("NEW: " + extInfo.toString()); + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(appinfo.getAppId()); + WxOpenResult openRet = openMaService.codeCommit(templateId, userVersion, userDesc, extInfo); + logger.info(openRet.toString()); + if (openRet.isSuccess()) { + codeCommitStatus = true; + } + codeErrCode = gson.toJson(openRet); + } catch (WxErrorException e) { + codeCommitStatus = false; + codeErrCode = e.getMessage(); + logger.error(codeErrCode); + } + + if (codeStatus == null) { + codeStatus = new WxWeappCodeStatus(); + codeStatus.setId(appinfo.getId()); + codeStatus.setAppId(appinfo.getAppId()); + if (appinfo != null) { + codeStatus.setType(appinfo.getType()); + } + codeStatus.setUserVersion(userVersion); + codeStatus.setVersionDesc(userDesc); + if(codeCommitStatus) { + codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode()); + } else { + codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode()); + } + codeStatus.setCodeErrCode(codeErrCode); + codeStatus.setCodeTime(new Date()); + weappCodeStatusService.saveStatus(codeStatus); + } else { + codeStatus.setUserVersion(userVersion); + codeStatus.setVersionDesc(userDesc); + if(codeCommitStatus) { + codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.SUCCESS.getCode()); + } else { + codeStatus.setCodeStatus(EnumWeappCodeCommitStatus.FAIL.getCode()); + } + codeStatus.setCodeErrCode(codeErrCode); + codeStatus.setCodeTime(new Date()); + weappCodeStatusService.updateStatus(codeStatus); + } + return codeCommitStatus; + } + + private void doCodeAudit(WxWeappCodeStatus codeStatus, WxWeappAuditStatus auditStatus, WxWeappExtSet extSet) { + Gson gson = new GsonBuilder().create(); + boolean submitStatus = false; + Long auditid = null; + String codeErrCode = ""; + try { + WxOpenMaSubmitAuditMessage subMessage = gson.fromJson(extSet.getReleaseJson(), new TypeToken() {}.getType()); + logger.info(subMessage.toString()); + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(codeStatus.getAppId()); + WxOpenMaSubmitAuditResult openRet = openMaService.submitAudit(subMessage); + logger.info(openRet.toString()); + if(openRet.isSuccess()) { + submitStatus = true; + auditid = openRet.getAuditId(); + } else { + submitStatus = false; + } + codeErrCode = gson.toJson(openRet); + } catch (WxErrorException e) { + logger.error(e.getMessage()); + submitStatus = false; + codeErrCode = e.getMessage(); + } + + if (auditStatus == null) { + auditStatus = new WxWeappAuditStatus(); + auditStatus.setId(codeStatus.getId()); + auditStatus.setAppId(codeStatus.getAppId()); + auditStatus.setType(codeStatus.getType()); + auditStatus.setUserVersion(codeStatus.getUserVersion()); + auditStatus.setVersionDesc(codeStatus.getVersionDesc()); + if(submitStatus) { + auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + auditStatus.setAuditid(auditid); + } else { + auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); + } + auditStatus.setAuditErrCode(codeErrCode); + auditStatus.setAuditTime(new Date()); + weappAuditStatusService.saveStatus(auditStatus); + } else { + if(!submitStatus) { + if(!auditStatus.getUserVersion().equals(codeStatus.getUserVersion()) + && auditStatus.getAuditStatus().equals(EnumWeappAuditStatus.AUDITING.getCode())) { + // 当前审核中的数据不能替换 + return; + } + auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); + } else { + auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + auditStatus.setAuditid(auditid); + } + auditStatus.setUserVersion(codeStatus.getUserVersion()); + auditStatus.setVersionDesc(codeStatus.getVersionDesc()); + auditStatus.setAuditErrCode(codeErrCode); + auditStatus.setAuditTime(new Date()); + weappAuditStatusService.updateStatus(auditStatus); + } + } + + + @ApiOperation(value = "批量审核查询", notes = "{\"type\":\"string\",\"version\":\"string\"}") + @PostMapping("batchAuditQuery") + public ResultData batchAuditQuery(@RequestBody Map params) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchAuditQuery"); + Gson gson = new GsonBuilder().create(); + String typeStr = params.get("type"); + String version = params.get("version"); + Integer type = null; + try { + type = Integer.parseInt(typeStr); + } catch (Exception e) { + logger.error(e.getMessage()); + } + WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo(); + if(StringUtils.isNotBlank(typeStr)) { + queryVo.setType(type); + } + if(StringUtils.isNotBlank(version)) { + queryVo.setUserVersion(version); + } + queryVo.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + List apps = weappAuditStatusService.getList(queryVo); + apps.stream().forEach( auditStatus -> { + // 审核中,可以发起审核查询 + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(auditStatus.getAppId()); + WxOpenMaQueryAuditResult openResult = openMaService.getLatestAuditStatus(); + logger.info(openResult.toString()); + if (openResult.isSuccess()) { + // 审核状态,其中0为审核成功,1为审核失败,2为审核中,3已撤回 + switch (openResult.getStatus().intValue()) { + case 0: + auditStatus.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode()); + break; + case 1: + auditStatus.setAuditStatus(EnumWeappAuditStatus.FAIL.getCode()); + break; + case 2: + auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + break; + case 3: + auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode()); + break; + default: + auditStatus.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + break; + } + auditStatus.setAuditErrCode(gson.toJson(openResult)); + auditStatus.setAuditid(openResult.getAuditId()); + auditStatus.setAuditTime(new Date()); + weappAuditStatusService.updateStatus(auditStatus); + } + } catch (WxErrorException e) { + logger.error(e.getMessage()); + } + }); + return new ResultData(); + } + + @ApiOperation(value = "批量审核撤回", notes = "{\"type\":\"string\",\"version\":\"string\"}") + @PostMapping("batchAuditCancel") + public ResultData batchAuditCancel(@RequestBody Map params) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchAuditCancel"); + Gson gson = new GsonBuilder().create(); + String typeStr = params.get("type"); + String version = params.get("version"); + Integer type = null; + try { + type = Integer.parseInt(typeStr); + } catch (Exception e) { + logger.error(e.getMessage()); + } + WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo(); + if(StringUtils.isNotBlank(typeStr)) { + queryVo.setType(type); + } + if(StringUtils.isNotBlank(version)) { + queryVo.setUserVersion(version); + } + queryVo.setAuditStatus(EnumWeappAuditStatus.AUDITING.getCode()); + List apps = weappAuditStatusService.getList(queryVo); + apps.stream().forEach( auditStatus -> { + // 审核通过,已发布不可撤回 + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(auditStatus.getAppId()); + WxOpenResult openResult = openMaService.undoCodeAudit(); + logger.info(openResult.toString()); + if(openResult.isSuccess()) { + auditStatus.setAuditStatus(EnumWeappAuditStatus.UNDO.getCode()); + auditStatus.setAuditErrCode(gson.toJson(openResult)); + auditStatus.setAuditTime(new Date()); + weappAuditStatusService.updateStatus(auditStatus); + } + } catch (WxErrorException e) { + logger.error(e.getMessage()); + } + }); + return new ResultData(); + } + + @ApiOperation(value = "批量发布", notes = "{\"type\":\"string\", \"version\":\"string\"}") + @PostMapping("batchRelease") + public ResultData batchRelease(@RequestBody Map params) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::batchRelease"); + Gson gson = new GsonBuilder().create(); + String typeStr = params.get("type"); + String version = params.get("version"); + Integer type = null; + try { + type = Integer.parseInt(typeStr); + } catch (Exception e) { + logger.error(e.getMessage()); + } + WxWeappAuditStatusVo queryVo = new WxWeappAuditStatusVo(); + if(StringUtils.isNotBlank(typeStr)) { + queryVo.setType(type); + } + if(StringUtils.isNotBlank(version)) { + queryVo.setUserVersion(version); + } + queryVo.setAuditStatus(EnumWeappAuditStatus.SUCCESS.getCode()); + List apps = weappAuditStatusService.getList(queryVo); + apps.stream().forEach( auditStatus -> { + boolean isUpdate = false; + WxWeappReleaseStatus releaseStatus = weappReleaseStatusService.getByAppId(auditStatus.getAppId()); + if(releaseStatus != null) { + // 当前版本已发布成功,跳过 + if(releaseStatus.getUserVersion().equals(version) + && releaseStatus.getReleaseStatus().equals(EnumWeappReleaseStatus.SUCCESS.getCode())) { + return; + } + releaseStatus.setUserVersion(auditStatus.getUserVersion()); + releaseStatus.setVersionDesc(auditStatus.getVersionDesc()); + } else { + releaseStatus = new WxWeappReleaseStatus(); + releaseStatus.setId(auditStatus.getId()); + releaseStatus.setAppId(auditStatus.getAppId()); + releaseStatus.setType(auditStatus.getType()); + releaseStatus.setUserVersion(auditStatus.getUserVersion()); + releaseStatus.setVersionDesc(auditStatus.getVersionDesc()); + isUpdate = true; + } + + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(auditStatus.getAppId()); + WxOpenResult openRet = openMaService.releaesAudited(); + logger.info(openRet.toString()); + boolean releaseSuccess = false; + if(openRet.isSuccess()) { + releaseSuccess = true; + } + if(releaseSuccess) { + releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.SUCCESS.getCode()); + } else { + releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode()); + + } + releaseStatus.setReleaseErrCode(gson.toJson(openRet)); + releaseStatus.setReleaseTime(new Date()); + if(isUpdate) { + weappReleaseStatusService.updateStatus(releaseStatus); + } else { + weappReleaseStatusService.saveStatus(releaseStatus); + } + } catch (WxErrorException e) { + logger.error(e.getMessage()); + releaseStatus.setReleaseStatus(EnumWeappReleaseStatus.FAIL.getCode()); + releaseStatus.setReleaseErrCode(e.getMessage()); + releaseStatus.setReleaseTime(new Date()); + if(isUpdate) { + weappReleaseStatusService.updateStatus(releaseStatus); + } else { + weappReleaseStatusService.saveStatus(releaseStatus); + } + } + }); + return new ResultData(); + } + + @ApiOperation(value = "小程序code提交状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version") + @GetMapping("codeStatusList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData codeStatusList(@ModelAttribute WxWeappCodeStatusVo weappCodeStatusVo, Integer pageNum, Integer pageSize) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::codeStatusList"); + if (null == weappCodeStatusVo) { + weappCodeStatusVo = new WxWeappCodeStatusVo(); + } else { + if(StringUtils.isBlank(weappCodeStatusVo.getAppId())) { + weappCodeStatusVo.setAppId(null); + } + if(StringUtils.isBlank(weappCodeStatusVo.getName())) { + weappCodeStatusVo.setName(null); + } + } + weappCodeStatusVo.setSortColumns(WxWeappCodeStatus.Field.UserVersion_DESC); + final PageInfo page = weappCodeStatusService.listAsPage(weappCodeStatusVo, pageNum, pageSize); + return new ResultData(page); + } + + @ApiOperation(value = "小程序审核状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version") + @GetMapping("auditStatusList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData auditStatusList(@ModelAttribute WxWeappAuditStatusVo weappAuditStatusVo, Integer pageNum, Integer pageSize) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::auditStatusList"); + if (null == weappAuditStatusVo) { + weappAuditStatusVo = new WxWeappAuditStatusVo(); + } else { + if(StringUtils.isBlank(weappAuditStatusVo.getAppId())) { + weappAuditStatusVo.setAppId(null); + } + if(StringUtils.isBlank(weappAuditStatusVo.getName())) { + weappAuditStatusVo.setName(null); + } + } + weappAuditStatusVo.setSortColumns(WxWeappAuditStatus.Field.UserVersion_DESC); + final PageInfo page = weappAuditStatusService.listAsPage(weappAuditStatusVo, pageNum, pageSize); + return new ResultData(page); + } + + @ApiOperation(value = "小程序发布状态分页列表接口", notes = "查询支持小程序类型,名称,appid,version") + @GetMapping("releaseStatusList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "pageNum", value = "页数", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "pageSize", value = "每页条数", dataType = "int", paramType = "query", required = true)}) + public ResultData releaseStatusList(@ModelAttribute WxWeappReleaseStatusVo weappReleaseStatusVo, Integer pageNum, Integer pageSize) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::releaseStatusList"); + if (null == weappReleaseStatusVo) { + weappReleaseStatusVo = new WxWeappReleaseStatusVo(); + } else { + if(StringUtils.isBlank(weappReleaseStatusVo.getAppId())) { + weappReleaseStatusVo.setAppId(null); + } + if(StringUtils.isBlank(weappReleaseStatusVo.getName())) { + weappReleaseStatusVo.setName(null); + } + } + weappReleaseStatusVo.setSortColumns(WxWeappReleaseStatus.Field.UserVersion_DESC); + final PageInfo page = weappReleaseStatusService.listAsPage(weappReleaseStatusVo, pageNum, pageSize); + return new ResultData(page); + } + + @ApiOperation("小程序code提交版本列表") + @GetMapping("codeVersionList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "小程序类型", dataType = "int", paramType = "query", required = true)}) + public ResultData getCodeVersionList(Integer type) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::getCodeVersionList"); + final List list = weappCodeStatusService.getVersionList(type); + return new ResultData(list); + } + + @ApiOperation("小程序审核版本列表") + @GetMapping("auditVersionList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "小程序类型", dataType = "int", paramType = "query", required = true), + @ApiImplicitParam(name = "status", value = "审核状态", dataType = "int", paramType = "query")}) + public ResultData getAuditVersionList(Integer type, Integer status) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::getAuditVersionList"); + final List list = weappAuditStatusService.getVersionList(type, status); + return new ResultData(list); + } + + @ApiOperation("小程序发布版本列表") + @GetMapping("releaseVersionList") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "小程序类型", dataType = "int", paramType = "query", required = true)}) + public ResultData getReleaseVersionList(Integer type) { + logger.debug("[" + getIpAddr() + "] WxWeappInfoController::getReleaseVersionList"); + final List list = weappReleaseStatusService.getVersionList(type); + return new ResultData(list); + } + + /* + * 0. 回调搭建好 + * 1. wx_appinfo配置好 + * + * 10. 授权 + * 11. 设置服务器域名及业务域名 - B/C 配置表 + * C 服务器域名 c.malls.iformall.com + * 业务域名 c.malls.iformall.com,game.malls.iformall.com + * B 服务器域名 b.malls.iformall.com + * 业务域名 mobile.malls.iformall.com,admin.malls.iformall.com + * C 服务器域名 ciformall.youlane.cn + * 业务域名 ciformall.youlane.cn,game.youlane.cn + * B 服务器域名 biformall.youlane.cn + * 业务域名 mobile.youlane.cn,mall.youlane.cn + * C 服务器域名 ctest.malls.iformall.com + * 业务域名 ctest.malls.iformall.com,gametest.malls.iformall.com + * B 服务器域名 btest.malls.iformall.com + * 业务域名 mobiletest.malls.iformall.com,admintest.malls.iformall.com + * 12. 设置微信基础版本 - 配置 + * 2.0.9 + * 13. 设置微信模板 - 配置 + * 核销成功模板 AT0423 14,15,16,7,10,3,9 + * 核销失败模板 AT1824 1,3,4,5 + * 14. 草稿提交 + * 15. 模板 + * 16. 上传小程序代码 - 配置 ext.json + * 17. 体验二维码 + * 18. 提交审核 - json --- 获取审核ID + * 19. 获取审核结果 - 基于审核ID查询 -- event 回调 + * 20. 审核撤回 + * 21. 发布已通过审核的小程序 + * 22. oauth2refreshAccessToken + */ + +} diff --git a/mlWechatOpen/src/main/java/com/iformall/schedule/SchedulingConfig.java b/mlWechatOpen/src/main/java/com/iformall/schedule/SchedulingConfig.java new file mode 100644 index 0000000..c347b05 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/schedule/SchedulingConfig.java @@ -0,0 +1,18 @@ +package com.iformall.schedule; + +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +@Configuration +@EnableScheduling +public class SchedulingConfig implements SchedulingConfigurer { + + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + + + } + +} \ No newline at end of file diff --git a/mlWechatOpen/src/main/java/com/iformall/schedule/UserUnionIdSchedule.java b/mlWechatOpen/src/main/java/com/iformall/schedule/UserUnionIdSchedule.java new file mode 100644 index 0000000..09c9848 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/schedule/UserUnionIdSchedule.java @@ -0,0 +1,145 @@ +package com.iformall.schedule; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaTemplateData; +import cn.binarywang.wx.miniapp.bean.WxMaUniformMessage; +import com.google.common.collect.Lists; +import com.iformall.common.ErrorCode; +import com.iformall.domain.po.WxAppinfo; +import com.iformall.domain.po.WxPayAccount; +import com.iformall.domain.vo.WxPayOrderVo; +import com.iformall.exception.MallinkException; +import com.iformall.mapper.WxPayAccountMapper; +import com.iformall.mapper.WxPayOrderMapper; +import com.iformall.service.WxAppinfoService; +import com.iformall.service.wechat.WxOpenService; +import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.open.api.WxOpenMaService; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +public class UserUnionIdSchedule { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + + private final int TIME_OUT_VALUE = 4 * 60 * 1000; //4分钟 + + @Autowired + WxPayOrderMapper payOrderMapper; + + @Autowired + private WxOpenService openService; + + @Autowired + private WxPayAccountMapper payAccountMapper; + + @Autowired + WxAppinfoService wxAppinfoService; + + @Scheduled(cron = "0 */4 * * * *?") // 每4分钟检查一次 + //@Scheduled(cron = "*/10 * * * * ?") // 测试10秒中一次 + public void payOrderGetUnionIdSchedule() { + Map dateMap = new HashMap(); + Date curDate = new Date(); + Date expireDate = new Date(curDate.getTime() - TIME_OUT_VALUE ); + + // 券相关订单 + dateMap.put("startDate", expireDate); + List paidList = payOrderMapper.findListOfPaidOrderByDate(dateMap); + paidList.parallelStream().forEach( payOrderVo -> { + getUnionId(payOrderVo); + //sendUniformMessage(payOrderVo); + }); + } + + /** + * 根据payOrder信息获取UnionId + * @param payOrderVo + */ + public void getUnionId(WxPayOrderVo payOrderVo) { + if(StringUtils.isBlank(payOrderVo.getOpenId())) { + return; + } + try { + WxOpenMaService openMaService = openService.getWxOpenComponentService().getWxMaServiceByAppid(payOrderVo.getAppId()); + if(StringUtils.isNotBlank(payOrderVo.getTransactionId())) { + String openRet = openMaService.getApiGetPaidUnionid(payOrderVo.getOpenId(), payOrderVo.getTransactionId()); + logger.info(openRet); + } else { + WxPayAccount payAccount = payAccountMapper.selectByPrimaryKey(payOrderVo.getPayId()); + if(payAccount != null) { + String openRet = openMaService.getApiGetPaidUnionid(payOrderVo.getOpenId(), payAccount.getMchId(), payOrderVo.getPayOrderNo()); + logger.info(openRet); + } + } + }catch (Exception e) { + logger.error(e.getMessage()); + } + + } + + /** + * 根据payOrder发送模板消息 + * @param payOrderVo + */ + /* + public void sendUniformMessage(WxPayOrderVo payOrderVo) { + if(StringUtils.isBlank(payOrderVo.getOpenId())) { + return; + } + + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + + // + // 卡券核销通知 p6pwzZN9GVJq11j2zh72EEhIn5fAIa6oQBBOjqVt8-U + // {{first.DATA}} + // 卡券类型:{{keyword1.DATA}} + // 卡券号码:{{keyword2.DATA}} + // 核销时间:{{keyword3.DATA}} + // {{remark.DATA}} + // + // + String template_id = "p6pwzZN9GVJq11j2zh72EEhIn5fAIa6oQBBOjqVt8-U"; + WxMaUniformMessage.MiniProgram miniprogram = new WxMaUniformMessage.MiniProgram(); + miniprogram.setAppid(payOrderVo.getAppId()); + miniprogram.setPagePath("pages/index/index"); + miniprogram.setUsePath(true); + + WxMaUniformMessage templateMessage = WxMaUniformMessage.builder() + .isMpTemplateMsg(true) + .toUser(payOrderVo.getOpenId()) + .appid("wxed2f44705544b892") + .templateId(template_id) + .url("http://iformall.com") + .page("pages/index/index") + .formId(payOrderVo.getPrepayId()) // 微信支付的formId是prepayId + .miniProgram(miniprogram) + .data(Lists.newArrayList( + new WxMaTemplateData("first", payOrderVo.getAppId(), "#173177"), + new WxMaTemplateData("keyword1", payOrderVo.getOpenId(), "#173177"), + new WxMaTemplateData("keyword2", payOrderVo.getTransactionId(), "#173177"), + new WxMaTemplateData("keyword3", dateFormat.format(new Date()), "#173177") + )) + .emphasisKeyword("keyword1.DATA") + .build(); + WxAppinfo appInfo = wxAppinfoService.getByAppId(payOrderVo.getAppId()); + WxMaService wxMaService = MaUtil.getWeappService(appInfo); + + try { + wxMaService.getMsgService().sendUniformMsg(templateMessage); + } catch (WxErrorException e) { + logger.error("支付通知测试: " + e.getMessage()); + throw new MallinkException(ErrorCode.TEMPLATE_SEND_FAILED); + } + }*/ +} \ No newline at end of file diff --git a/mlWechatOpen/src/main/java/com/iformall/service/wechat/WxOpenInRedisDBConfigStorage.java b/mlWechatOpen/src/main/java/com/iformall/service/wechat/WxOpenInRedisDBConfigStorage.java new file mode 100644 index 0000000..2a06393 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/service/wechat/WxOpenInRedisDBConfigStorage.java @@ -0,0 +1,223 @@ +package com.iformall.service.wechat; + +import com.iformall.mapper.WxComponentVerifyTicketMapper; +import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; +import redis.clients.util.Pool; + +public class WxOpenInRedisDBConfigStorage extends WxOpenInMemoryConfigStorage { + private final static String COMPONENT_VERIFY_TICKET_KEY = "wechat_component_verify_ticket:"; + private final static String COMPONENT_ACCESS_TOKEN_KEY = "wechat_component_access_token:"; + + private final static String AUTHORIZER_REFRESH_TOKEN_KEY = "wechat_authorizer_refresh_token:"; + private final static String AUTHORIZER_ACCESS_TOKEN_KEY = "wechat_authorizer_access_token:"; + private final static String JSAPI_TICKET_KEY = "wechat_jsapi_ticket:"; + private final static String CARD_API_TICKET_KEY = "wechat_card_api_ticket:"; + + protected final Pool jedisPool; + /** + * redis 存储的 key 的前缀,可为空 + */ + private String keyPrefix; + private String componentVerifyTicketKey; + private String componentAccessTokenKey; + private String authorizerRefreshTokenKey; + private String authorizerAccessTokenKey; + private String jsapiTicketKey; + private String cardApiTicket; + + @Autowired + WxComponentVerifyTicketMapper wxComponentVerifyTicketMapper; + + public WxOpenInRedisDBConfigStorage(Pool jedisPool) { + this.jedisPool = jedisPool; + } + + public WxOpenInRedisDBConfigStorage(Pool jedisPool, String keyPrefix) { + this.jedisPool = jedisPool; + this.keyPrefix = keyPrefix; + } + + public WxOpenInRedisDBConfigStorage(JedisPool jedisPool) { + this.jedisPool = jedisPool; + } + + @Override + public void setComponentAppId(String componentAppId) { + super.setComponentAppId(componentAppId); + String prefix = StringUtils.isBlank(keyPrefix) ? "" : + (StringUtils.endsWith(keyPrefix, ":") ? keyPrefix : (keyPrefix + ":")); + componentVerifyTicketKey = prefix + COMPONENT_VERIFY_TICKET_KEY.concat(componentAppId); + componentAccessTokenKey = prefix + COMPONENT_ACCESS_TOKEN_KEY.concat(componentAppId); + authorizerRefreshTokenKey = prefix + AUTHORIZER_REFRESH_TOKEN_KEY.concat(componentAppId); + authorizerAccessTokenKey = prefix + AUTHORIZER_ACCESS_TOKEN_KEY.concat(componentAppId); + this.jsapiTicketKey = JSAPI_TICKET_KEY.concat(componentAppId); + this.cardApiTicket = CARD_API_TICKET_KEY.concat(componentAppId); + } + + @Override + public String getComponentVerifyTicket() { + try (Jedis jedis = this.jedisPool.getResource()) { + return jedis.get(this.componentVerifyTicketKey); + } + } + + @Override + public void setComponentVerifyTicket(String componentVerifyTicket) { + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.set(this.componentVerifyTicketKey, componentVerifyTicket); + } + // TODO update to DB + } + + @Override + public String getComponentAccessToken() { + try (Jedis jedis = this.jedisPool.getResource()) { + return jedis.get(this.componentAccessTokenKey); + } + } + + @Override + public boolean isComponentAccessTokenExpired() { + try (Jedis jedis = this.jedisPool.getResource()) { + return jedis.ttl(this.componentAccessTokenKey) < 2; + } + } + + @Override + public void expireComponentAccessToken(){ + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.expire(this.componentAccessTokenKey, 0); + } + } + + @Override + public void updateComponentAccessTokent(String componentAccessToken, int expiresInSeconds) { + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.setex(this.componentAccessTokenKey, expiresInSeconds - 200, componentAccessToken); + } + // TODO update to DB + } + + private String getKey(String prefix, String appId) { + return prefix.endsWith(":") ? prefix.concat(appId) : prefix.concat(":").concat(appId); + } + + @Override + public String getAuthorizerRefreshToken(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + return jedis.get(this.getKey(this.authorizerRefreshTokenKey, appId)); + } + } + + @Override + public void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.set(this.getKey(this.authorizerRefreshTokenKey, appId), authorizerRefreshToken); + } + // TODO update to DB + } + + @Override + public String getAuthorizerAccessToken(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + return jedis.get(this.getKey(this.authorizerAccessTokenKey, appId)); + } + } + + @Override + public boolean isAuthorizerAccessTokenExpired(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + return jedis.ttl(this.getKey(this.authorizerAccessTokenKey, appId)) < 2; + } + } + + @Override + public void expireAuthorizerAccessToken(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.expire(this.getKey(this.authorizerAccessTokenKey, appId), 0); + } + // TODO update to DB + } + + @Override + public void updateAuthorizerAccessToken(String appId, String authorizerAccessToken, int expiresInSeconds) { + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.setex(this.getKey(this.authorizerAccessTokenKey, appId), expiresInSeconds - 200, authorizerAccessToken); + } + // TODO update to DB + } + + /* + @Override + public void changeAuthorizationStatus(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.expire(this.getKey(this.authorizerAccessTokenKey, appId), 0); + } + // TODO update to DB + } + */ + + @Override + public String getJsapiTicket(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + return jedis.get(this.getKey(this.jsapiTicketKey, appId)); + } + } + + @Override + public boolean isJsapiTicketExpired(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + return jedis.ttl(this.getKey(this.jsapiTicketKey, appId)) < 2; + } + } + + @Override + public void expireJsapiTicket(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.expire(this.getKey(this.jsapiTicketKey, appId), 0); + } + } + + @Override + public void updateJsapiTicket(String appId, String jsapiTicket, int expiresInSeconds) { + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.setex(this.getKey(this.jsapiTicketKey, appId), expiresInSeconds - 200, jsapiTicket); + } + + // TODO update to DB + } + + @Override + public String getCardApiTicket(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + return jedis.get(this.getKey(this.cardApiTicket, appId)); + } + } + + @Override + public boolean isCardApiTicketExpired(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + return jedis.ttl(this.getKey(this.cardApiTicket, appId)) < 2; + } + } + + @Override + public void expireCardApiTicket(String appId) { + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.expire(this.getKey(this.cardApiTicket, appId), 0); + } + } + + @Override + public void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds) { + try (Jedis jedis = this.jedisPool.getResource()) { + jedis.setex(this.getKey(this.cardApiTicket, appId), expiresInSeconds - 200, cardApiTicket); + } + + // TODO update to DB + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/service/wechat/WxOpenService.java b/mlWechatOpen/src/main/java/com/iformall/service/wechat/WxOpenService.java new file mode 100644 index 0000000..aba8d45 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/service/wechat/WxOpenService.java @@ -0,0 +1,64 @@ +package com.iformall.service.wechat; + +import com.iformall.config.RedisProperies; +import com.iformall.config.WechatOpenProperties; +import me.chanjar.weixin.open.api.impl.WxOpenMessageRouter; +import me.chanjar.weixin.open.api.impl.WxOpenServiceImpl; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.stereotype.Service; +import redis.clients.jedis.JedisPool; + +import javax.annotation.PostConstruct; + +/** + * Stormeye WU + */ +@Service +@EnableConfigurationProperties({WechatOpenProperties.class, RedisProperies.class}) +public class WxOpenService extends WxOpenServiceImpl { + private Logger logger = LoggerFactory.getLogger(getClass()); + @Autowired + private WechatOpenProperties wechatProperties; + @Autowired + private RedisProperies redisProperies; + private static JedisPool pool; + private WxOpenMessageRouter wxOpenMessageRouter; + + @PostConstruct + public void init() { + WxOpenInRedisDBConfigStorage configStorage = new WxOpenInRedisDBConfigStorage(getJedisPool()); + configStorage.setComponentAppId(wechatProperties.getComponentAppId()); + configStorage.setComponentAppSecret(wechatProperties.getComponentSecret()); + configStorage.setComponentToken(wechatProperties.getComponentToken()); + configStorage.setComponentAesKey(wechatProperties.getComponentAesKey()); + setWxOpenConfigStorage(configStorage); + wxOpenMessageRouter = new WxOpenMessageRouter(this); + wxOpenMessageRouter.rule().handler((wxMpXmlMessage, map, wxMpService, wxSessionManager) -> { + logger.info("\n接收到 {} 公众号请求消息,内容:{}", wxMpService.getWxMpConfigStorage().getAppId(), wxMpXmlMessage); + return null; + }).next(); + } + + public WxOpenMessageRouter getWxOpenMessageRouter() { + return wxOpenMessageRouter; + } + + private JedisPool getJedisPool() { + if (pool == null) { + synchronized (WxOpenService.class) { + if (pool == null) { + pool = new JedisPool(redisProperies, redisProperies.getHost(), + redisProperies.getPort(), redisProperies.getConnectionTimeout(), + redisProperies.getSoTimeout(), redisProperies.getPassword(), + redisProperies.getDatabase(), redisProperies.getClientName(), + redisProperies.isSsl(), redisProperies.getSslSocketFactory(), + redisProperies.getSslParameters(), redisProperies.getHostnameVerifier()); + } + } + } + return pool; + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java b/mlWechatOpen/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java new file mode 100644 index 0000000..14630d6 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/shiro/MyRetryLimitCredentialsMatcher.java @@ -0,0 +1,24 @@ +package com.iformall.shiro; + +import com.iformall.enums.EnumLoginType; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.credential.HashedCredentialsMatcher; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MyRetryLimitCredentialsMatcher extends HashedCredentialsMatcher { + @Override + public boolean doCredentialsMatch(AuthenticationToken authcToken, AuthenticationInfo info) { + if(authcToken instanceof UseriFormallToken) { + UseriFormallToken tk = (UseriFormallToken) authcToken; + if(tk.getType().equals(EnumLoginType.NOPASSWD)){ + return true; + } + boolean matches = super.doCredentialsMatch(authcToken, info); + return matches; + } + boolean matches =super.doCredentialsMatch(authcToken, info); + return matches; + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/shiro/MyShiroRealm.java b/mlWechatOpen/src/main/java/com/iformall/shiro/MyShiroRealm.java new file mode 100644 index 0000000..9d6e01b --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/shiro/MyShiroRealm.java @@ -0,0 +1,90 @@ +package com.iformall.shiro; + +import com.iformall.domain.po.MallUserInfo; +import com.iformall.enums.EnumMallUserStatus; +import com.iformall.service.MallPermissionService; +import com.iformall.service.MallUserInfoService; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.*; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.util.ByteSource; + +import javax.annotation.Resource; + +/** + * Created by yangqj on 2017/4/21. + */ +public class MyShiroRealm extends AuthorizingRealm { + + @Resource + private MallUserInfoService userService; + + @Resource + private MallPermissionService resourcesService; + + //授权 + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + MallUserInfo user= (MallUserInfo) SecurityUtils.getSubject().getPrincipal();//User{id=1, username='admin', password='3ef7164d1f6167cb9f2658c07d3c2f0a', enable=1} +// Map map = new HashMap(); +// map.put("userid",user.getId()); +// List resourcesList = resourcesService.list(map); +// 权限信息对象info,用来存放查出的用户的所有的角色(role)及权限(permission) + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); +// for(SysPermission resources: resourcesList){ +// info.addStringPermission(resources.getUrl()); +// } + return info; + } + + //认证 + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { + //获取用户的输入的账号. + String username = (String)token.getPrincipal(); + MallUserInfo user = userService.getByUsername(username); + if(user == null) { + throw new UnknownAccountException("用户名不存在"); + } +// if (0==user.getEnable()) { +// throw new LockedAccountException(); // 帐号锁定 +// } + //用户被禁用 + if(user.getStatus()==null || + !EnumMallUserStatus.VALID.getCode().equals(user.getStatus())) { + throw new DisabledAccountException("用户被禁用"); + } + if(!user.getTenantId().equals("1")) { + // 只支持租户为1的用户 + throw new UnknownAccountException("用户名不支持"); + } + SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( + user, //用户 + user.getPassword(), //密码 + ByteSource.Util.bytes(username), + getName() //realm name + ); + // 当验证都通过后,把用户信息放在session里 + Session session = SecurityUtils.getSubject().getSession(); + session.setAttribute(UserSession.userInfo, user); + session.setAttribute(UserSession.userId, user.getId()); + session.setAttribute(UserSession.tenantId, user.getTenantId()); + return authenticationInfo; + } + + + /** + * 指定principalCollection 清除 + */ + /* public void clearCachedAuthorizationInfo(PrincipalCollection principalCollection) { + + SimplePrincipalCollection principals = new SimplePrincipalCollection( + principalCollection, getName()); + super.clearCachedAuthorizationInfo(principals); + } +*/ +} diff --git a/mlWechatOpen/src/main/java/com/iformall/shiro/PasswordHelper.java b/mlWechatOpen/src/main/java/com/iformall/shiro/PasswordHelper.java new file mode 100644 index 0000000..a88a9f5 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/shiro/PasswordHelper.java @@ -0,0 +1,32 @@ +package com.iformall.shiro; + + +import com.iformall.domain.po.MallUserInfo; +import org.apache.shiro.crypto.hash.SimpleHash; +import org.apache.shiro.util.ByteSource; + + +public class PasswordHelper { + //private RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator(); + private String algorithmName = "md5"; + private int hashIterations = 2; + + public void encryptPassword(MallUserInfo user) { + //String salt=randomNumberGenerator.nextBytes().toHex(); + String newPassword = new SimpleHash(algorithmName, user.getPassword(), ByteSource.Util.bytes(user.getUsername()), hashIterations).toHex(); + //String newPassword = new SimpleHash(algorithmName, user.getPassword()).toHex(); + user.setPassword(newPassword); + + } + + public static void main(String[] args) { + MallUserInfo user = new MallUserInfo(); + user.setUsername("fmadmin"); + user.setPassword("admin123"); + PasswordHelper passwordHelper = new PasswordHelper(); + passwordHelper.encryptPassword(user); + System.out.println(user); + System.out.println(user.getPassword()); + } + +} diff --git a/mlWechatOpen/src/main/java/com/iformall/shiro/ShiroService.java b/mlWechatOpen/src/main/java/com/iformall/shiro/ShiroService.java new file mode 100644 index 0000000..a9621c7 --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/shiro/ShiroService.java @@ -0,0 +1,126 @@ +package com.iformall.shiro; + +import com.iformall.service.MallPermissionService; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.filter.mgt.DefaultFilterChainManager; +import org.apache.shiro.web.filter.mgt.PathMatchingFilterChainResolver; +import org.apache.shiro.web.servlet.AbstractShiroFilter; +import org.crazycake.shiro.RedisSessionDAO; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Created by yangqj on 2017/4/30. + */ +//@Service +public class ShiroService { + @Autowired + private ShiroFilterFactoryBean shiroFilterFactoryBean; + @Autowired + private MallPermissionService resourcesService; + @Autowired + private RedisSessionDAO redisSessionDAO; + /** + * 初始化权限 + */ + public Map loadFilterChainDefinitions() { + // 权限控制map.从数据库获取 + Map filterChainDefinitionMap = new LinkedHashMap(); + filterChainDefinitionMap.put("/logout", "logout"); + filterChainDefinitionMap.put("/css/**","anon"); + filterChainDefinitionMap.put("/js/**","anon"); + filterChainDefinitionMap.put("/img/**","anon"); + filterChainDefinitionMap.put("/user/**","anon"); + filterChainDefinitionMap.put("/font-awesome/**","anon"); +// Map map = new HashMap<>(); +// List resourcesList = resourcesService.list(map); +// for(SysPermission resources:resourcesList){ +// +// if (StringUtil.isNotEmpty(resources.getUrl())) { +// String permission = "perms[" + resources.getUrl()+ "]"; +// filterChainDefinitionMap.put(resources.getUrl(),permission); +// } +// } + filterChainDefinitionMap.put("/**", "authc"); + return filterChainDefinitionMap; + } + + /** + * 重新加载权限 + */ + public void updatePermission() { + + synchronized (shiroFilterFactoryBean) { + + AbstractShiroFilter shiroFilter = null; + try { + shiroFilter = (AbstractShiroFilter) shiroFilterFactoryBean + .getObject(); + } catch (Exception e) { + throw new RuntimeException( + "get ShiroFilter from shiroFilterFactoryBean error!"); + } + + PathMatchingFilterChainResolver filterChainResolver = (PathMatchingFilterChainResolver) shiroFilter + .getFilterChainResolver(); + DefaultFilterChainManager manager = (DefaultFilterChainManager) filterChainResolver + .getFilterChainManager(); + + // 清空老的权限控制 + manager.getFilterChains().clear(); + + shiroFilterFactoryBean.getFilterChainDefinitionMap().clear(); + shiroFilterFactoryBean + .setFilterChainDefinitionMap(loadFilterChainDefinitions()); + // 重新构建生成 + Map chains = shiroFilterFactoryBean + .getFilterChainDefinitionMap(); + for (Map.Entry entry : chains.entrySet()) { + String url = entry.getKey(); + String chainDefinition = entry.getValue().trim() + .replace(" ", ""); + manager.createChain(url, chainDefinition); + } + + System.out.println("更新权限成功!!"); + } + } + + /** + * 根据userId 清除当前session存在的用户的权限缓存 + * @param userIds 已经修改了权限的userId + */ + /* public void clearUserAuthByUserId(List userIds){ + if(null == userIds || userIds.size() == 0) return ; + //获取所有session + Collection sessions = redisSessionDAO.getActiveSessions(); + //定义返回 + List list = new ArrayList(); + for (Session session:sessions){ + //获取session登录信息。 + Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); + if(null != obj && obj instanceof SimplePrincipalCollection){ + //强转 + SimplePrincipalCollection spc = (SimplePrincipalCollection)obj; + //判断用户,匹配用户ID。 + obj = spc.getPrimaryPrincipal(); + if(null != obj && obj instanceof User){ + User user = (User) obj; + System.out.println("user:"+user); + //比较用户ID,符合即加入集合 + if(null != user && userIds.contains(user.getId())){ + list.add(spc); + } + } + } + } + RealmSecurityManager securityManager = + (RealmSecurityManager) SecurityUtils.getSecurityManager(); + MyShiroRealm realm = (MyShiroRealm)securityManager.getRealms().iterator().next(); + for (SimplePrincipalCollection simplePrincipalCollection : list) { + realm.clearCachedAuthorizationInfo(simplePrincipalCollection); + } + }*/ +} diff --git a/mlWechatOpen/src/main/java/com/iformall/shiro/UserSession.java b/mlWechatOpen/src/main/java/com/iformall/shiro/UserSession.java new file mode 100644 index 0000000..02a7aca --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/shiro/UserSession.java @@ -0,0 +1,11 @@ +package com.iformall.shiro; + +public class UserSession { + + public static String userInfo="userSession"; + + public static String userId ="userSessionId"; + + public static String tenantId ="TENANT_ID"; + +} diff --git a/mlWechatOpen/src/main/java/com/iformall/shiro/UseriFormallToken.java b/mlWechatOpen/src/main/java/com/iformall/shiro/UseriFormallToken.java new file mode 100644 index 0000000..04f525a --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/shiro/UseriFormallToken.java @@ -0,0 +1,39 @@ +package com.iformall.shiro; + +import com.iformall.enums.EnumLoginType; +import org.apache.shiro.authc.UsernamePasswordToken; + +public class UseriFormallToken extends UsernamePasswordToken { + private static final long serialVersionUID = -2564928913725078138L; + + private EnumLoginType type; + + public UseriFormallToken() { + super(); + } + + public UseriFormallToken(String username, String password, EnumLoginType type, boolean rememberMe, String host) { + super(username, password, rememberMe, host); + this.type = type; + } + + /** 免密登录 */ + public UseriFormallToken(String username) { + super(username, "", false, null); + this.type = EnumLoginType.NOPASSWD; + } + /** 账号密码登录 */ + public UseriFormallToken(String username, String pwd) { + super(username, pwd, false, null); + this.type = EnumLoginType.PASSWORD; + } + + public EnumLoginType getType() { + return type; + } + + + public void setType(EnumLoginType type) { + this.type = type; + } +} diff --git a/mlWechatOpen/src/main/java/com/iformall/utils/ShiroUtils.java b/mlWechatOpen/src/main/java/com/iformall/utils/ShiroUtils.java new file mode 100644 index 0000000..02b66fc --- /dev/null +++ b/mlWechatOpen/src/main/java/com/iformall/utils/ShiroUtils.java @@ -0,0 +1,61 @@ +package com.iformall.utils; + +import com.iformall.common.ErrorCode; +import com.iformall.domain.po.MallUserInfo; +import com.iformall.exception.MallinkException; +import com.iformall.shiro.UserSession; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; + +/** + * Shiro工具类 + * + * @author stormeye.wu + * @email wugq@mippoint.com + * @date 2016年11月12日 上午9:49:19 + */ +public class ShiroUtils { + + public static Session getSession() { + return SecurityUtils.getSubject().getSession(); + } + + public static Subject getSubject() { + return SecurityUtils.getSubject(); + } + + public static MallUserInfo getUserInfo() { + return (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo); + } + + public static Long getUserId() { + return getUserInfo().getId(); + } + + public static void setSessionAttribute(Object key, Object value) { + getSession().setAttribute(key, value); + } + + public static Object getSessionAttribute(Object key) { + return getSession().getAttribute(key); + } + + public static boolean isLogin() { + return SecurityUtils.getSubject().getPrincipal() != null; + } + + public static void logout() { + SecurityUtils.getSubject().logout(); + } + + public static String getKaptcha(String key) { + Object kaptcha = getSessionAttribute(key); + if (kaptcha == null) { + throw new MallinkException(ErrorCode.KAPCHA_NOT_VALID); + } + getSession().removeAttribute(key); + return kaptcha.toString(); + } + +} diff --git a/mlWechatOpen/src/main/resources/application-dev.yml b/mlWechatOpen/src/main/resources/application-dev.yml new file mode 100644 index 0000000..6f7a61e --- /dev/null +++ b/mlWechatOpen/src/main/resources/application-dev.yml @@ -0,0 +1,93 @@ +spring: + profiles: + include: rabbitMQ + # JDBC + datasource: + url: jdbc:mysql://202.165.179.86:3306/mallinkDev?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useUnicode=true&useSSL=false + username: ENC(dZ8fmrtuBMQYaRytKQgTqg==) + password: ENC(WGu0+1DPIHrqorDhrbq1+7wr7xNG53mN) + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + filters: stat + maxActive: 20 + initialSize: 1 + maxWait: 60000 + minIdle: 1 + timeBetweenEvictionRunsMillis: 28000 + minEvictableIdleTimeMillis: 28000 + validationQuery: select 'x' + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + poolPreparedStatements: true + maxOpenPreparedStatements: 20 + connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000" + #jackson: + #date-format: yyyy-MM-dd HH:mm:ss + + # REDIS + redis: + host: 202.165.179.86 + port: 6379 + password: ENC(aYJ3Wr2UWtkORRQjjrWWpz2ZeTISsHOA) + timeout: 3600 + expire: 1800 #30分钟 + database: 10 + defaultExpiration: 2592000 # 默认生命周期30天 + jedis: + pool: + max-active: 50 + max-idle: 50 + max-wait: -1 + min-idle: 10 + # EMAIL + mail: + host: smtp.exmail.qq.com + username: ENC(R0bER9E9OB9/YQcpNXMyYDwofNVb8/pFl4nrApS8mi0=) + password: ENC(50YqJd0iK/2r2YnmEd5RKaki3ktU73UDapBJrVYfqmc=) # 授权密码 + properties: + mail: + smtp: + auth: true + starttls: + enable: true +aws: + clientRegion: cn-northwest-1 + bucketName: iformall-net + access: ENC(3gx5ghDFBqGrEhO3Wf8aYmXsnwHO7Cj3HNKJGOeUj0o=) + secret: ENC(HVKIJwCJKVXLlUpGlQPwNqJOlnpxn4xYuy91SH0seTSm2uAttIQHvA49fXWWax90v5wloIk0QuU=) + +wechat: + open: + componentAppId: "wx897e4673286c915d" + componentSecret: "cdfdfda65c45689beb6766c4c427eed2" + componentToken: "formall2018" + componentAesKey: "htKq8EjBMPNndfZQK9JiFojFaqFwFpw42VfeWFtx7HN" + redis: + host: 202.165.179.86 + port: 6379 + password: ENC(aYJ3Wr2UWtkORRQjjrWWpz2ZeTISsHOA) + timeout: 3600 + expire: 1800 #30分钟 + database: 2 + defaultExpiration: 2592000 # 默认生命周期30天 + jedis: + pool: + max-active: 100 + max-idle: 500 + max-wait: -1 + min-idle: 10 + +jasypt: + encryptor: + password: oRqdnDbK5pj3eMmB + +fm: + exception: false + delay: 1 + +logging: + level: + tk.mybatis: debug + com.iformall.mapper: debug + path: ./logs/o diff --git a/mlWechatOpen/src/main/resources/application-prod.yml b/mlWechatOpen/src/main/resources/application-prod.yml new file mode 100644 index 0000000..56366f5 --- /dev/null +++ b/mlWechatOpen/src/main/resources/application-prod.yml @@ -0,0 +1,87 @@ +spring: + profiles: + include: rocketMQ + # JDBC + datasource: + url: jdbc:mysql://formalldb.cfqyqflkdlit.rds.cn-northwest-1.amazonaws.com.cn:3306/mallink?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false + username: ENC(NUzgQOdJnCbVLKT6BaX0aw==) + password: ENC(mvuoDRiu0jqYaKNRwwTuXZ6U7aoIaqsjdiPqTLgi/nY=) + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + filters: stat + maxActive: 20 + initialSize: 1 + maxWait: 60000 + minIdle: 1 + timeBetweenEvictionRunsMillis: 28000 + minEvictableIdleTimeMillis: 28000 + validationQuery: select 'x' + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + poolPreparedStatements: true + maxOpenPreparedStatements: 20 + connectionProperties: "druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000" + # REDIS + redis: + host: 127.0.0.1 + port: 6379 + password: ENC(8gYU47Fu93NUJPhwPCiPbAT+6VFA1YDx1egK4Z0Nl6w=) + timeout: 3600 + expire: 1800 #30分钟 + database: 1 + defaultExpiration: 2592000 # 默认生命周期30天 + jedis: + pool: + max-active: 8 + max-idle: 8 + max-wait: -1 + min-idle: 0 + # EMAIL + mail: + host: smtp.exmail.qq.com + username: ENC(I2YKxnRVPY7J1r/bwzwHOhQCjj3nVqCWEbVTJvBq7y0=) + password: ENC(APQMO9XQRzMKd0eap+oSSOYH9MQe/r5K0YFF9A9mizU=) # 授权密码 + properties: + mail: + smtp: + auth: true + starttls: + enable: true + +aws: + clientRegion: cn-northwest-1 + bucketName: iformall-net + access: ENC(a6SN1sZ1enNL49ypiOXkg/pPPAnZD8H4buQFTTKN08s=) + secret: ENC(5P5ff4bTMJUbXVR4ZsM03UHzOKZ4+Zg5Iutcdkyp/Quny/oXg+A4KpfwEyGarlLu3vQMJahGP5M=) + +wechat: + open: + componentAppId: ENC(b3JG0MUZgQfz5Zj+DC2ZM1zDeLOiGTmmeokfe2O8kaM=) + componentSecret: ENC(QVyc4BPGdnSjXGs2ivgpDBE1v8wPWHLLRMYI7Vv8uYwC0SiZHQz0QpyyQV/b48Pb) + componentToken: ENC(rkxj0733WxFFDLgA9x01m2s5Fi2L+0PC) + componentAesKey: ENC(EIbJUBpbYOrLb4YQ/HXLQmxlxgAqIp2ZmpnGICC8pu5xiTz3Cqfkbwd2S8raCcK/IvYcX2GmedI=) + redis: + host: 127.0.0.1 + port: 6379 + password: ENC(8gYU47Fu93NUJPhwPCiPbAT+6VFA1YDx1egK4Z0Nl6w=) + timeout: 3600 + expire: 1800 #30分钟 + database: 2 + defaultExpiration: 2592000 # 默认生命周期30天 + jedis: + pool: + max-active: 100 + max-idle: 100 + max-wait: -1 + min-idle: 10 + +fm: + exception: true + delay: 3 + +logging: + level: + tk.mybatis: debug + com.iformall: debug + path: ./logs/o \ No newline at end of file diff --git a/mlWechatOpen/src/main/resources/application.yml b/mlWechatOpen/src/main/resources/application.yml new file mode 100644 index 0000000..515f361 --- /dev/null +++ b/mlWechatOpen/src/main/resources/application.yml @@ -0,0 +1,58 @@ +server: + port: 6060 + servlet: + context-path: / + +spring: + application: + name: mallink + profiles: + active: dev + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + default-property-inclusion: non_null + servlet: + multipart: + max-file-size: 2MB + max-request-size: 2MB + cache: + type: REDIS + cache-names: redis_cache #缓存的名字(可以不指定) + redis: + time-to-live: 60000ms #很重要,缓存的有效时间,以便缓存的过期(单位为毫秒) + + + +# @{link} https://github.com/abel533 +#Mybatis +mybatis: + type-aliases-package: com.iformall.domain.po + mapper-locations: classpath:mapper/*Mapper.xml + configuration: + map-underscore-to-camel-case: true + cache-enabled: true + lazy-loading-enabled: true + use-generated-keys: true + default-fetch-size: 100 + default-statement-timeout: 10 + +#PageHelper +pagehelper: + helperDialect: mysql + reasonable: false + supportMethodsArguments: true + params: count=countSql + offset-as-page-num: true + page-size-zero: true + row-bounds-with-count: true + +mapper: + mappers: + - com.iformall.common.CommonMapper + +pay: + real: true + + +version: @project.version@ \ No newline at end of file diff --git a/mlWechatOpen/src/main/resources/logback-spring.xml b/mlWechatOpen/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..0499e2c --- /dev/null +++ b/mlWechatOpen/src/main/resources/logback-spring.xml @@ -0,0 +1,100 @@ + + + + + + + + [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] --%mdc{client}%msg%n + + + + + ${logPath}/trace.log + + ${logPath}/daily/trace.%d{yyyy-MM-dd}.log + 180 + + + [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n + + + + + ${logPath}/info.log + + ${logPath}/daily/info.%d{yyyy-MM-dd}.log + 180 + + + [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n + + + INFO + ACCEPT + DENY + + + + + ${logPath}/debug.log + + ${logPath}/daily/debug.%d{yyyy-MM-dd}.log + 180 + + + [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n + + + DEBUG + ACCEPT + DENY + + + + + + ${logPath}/warn.log + + ${logPath}/daily/warn.%d{yyyy-MM-dd}.log + 180 + + + [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n + + + WARN + ACCEPT + DENY + + + + + + + ${logPath}/error.log + + ${logPath}/daily/error.%d{yyyy-MM-dd}.log + 180 + + + [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n + + + ERROR + ACCEPT + DENY + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..5196022 --- /dev/null +++ b/pom.xml @@ -0,0 +1,354 @@ + + + + + 4.0.0 + com.iformall + mallink + pom + 1.0 + + + mallinkService + mlWechatOpen + + + + org.springframework.boot + spring-boot-starter-parent + 2.0.7.RELEASE + + + + + 3.3.0.A + 3.3.0.A + 3.3.0.A + 3.3.0.A + 2.3.0 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-undertow + + + org.springframework.boot + spring-boot-starter-aop + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.boot + spring-boot-starter-cache + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.springframework.boot + spring-boot-starter-websocket + + + org.springframework.boot + spring-boot-starter-web-services + + + + org.springframework.boot + spring-boot-starter-mail + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 1.3.2 + + + com.github.pagehelper + pagehelper-spring-boot-starter + 1.2.7 + + + tk.mybatis + mapper-spring-boot-starter + 2.0.4 + + + + org.springframework + spring-context-support + + + + mysql + mysql-connector-java + 8.0.11 + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.rocketmq.spring.boot + rocketmq-spring-boot-starter + 1.0.0.RELEASE + + + org.apache.rocketmq + rocketmq-client + 4.4.0 + + + + org.apache.commons + commons-lang3 + 3.8 + + + com.google.guava + guava + 26.0-jre + + + + com.alibaba + fastjson + 1.2.54 + + + com.alibaba + druid + 1.1.12 + + + org.mybatis.generator + mybatis-generator-core + 1.3.7 + + + + org.quartz-scheduler + quartz + ${quartz.version} + + + com.mchange + c3p0 + + + com.zaxxer + HikariCP-java6 + + + + + + + io.springfox + springfox-swagger2 + 2.8.0 + + + io.springfox + springfox-swagger-ui + 2.8.0 + + + io.springfox + springfox-spring-web + 2.8.0 + + + com.fasterxml.jackson.core + jackson-core + 2.9.7 + + + com.fasterxml.jackson.core + jackson-databind + 2.9.7 + + + javax.xml.bind + jaxb-api + 2.3.0 + + + javax.persistence + persistence-api + 1.0.2 + + + org.projectlombok + lombok + 1.18.2 + provided + + + + + + + + + + + + + + + org.apache.shiro + shiro-spring + 1.4.0 + + + + org.crazycake + shiro-redis + 3.1.0 + + + + org.jdom + jdom2 + 2.0.6 + + + + org.bouncycastle + bcprov-jdk15on + 1.60 + + + + org.bouncycastle + bcpkix-jdk15on + 1.60 + + + + + + + + + + commons-io + commons-io + 2.6 + + + + + cn.afterturn + easypoi-spring-boot-starter + 4.0.0 + + + + + com.squareup.okhttp3 + okhttp + 3.11.0 + + + + org.dom4j + dom4j + 2.1.1 + + + + com.google.code.gson + gson + 2.8.5 + + + + + com.thoughtworks.xstream + xstream + 1.4.10 + + + + com.github.binarywang + weixin-java-common + ${weixin-java-common.version} + + + + com.github.binarywang + weixin-java-miniapp + ${weixin-java-miniapp.version} + + + + com.github.binarywang + weixin-java-mp + ${weixin-java-mp.version} + + + + com.github.binarywang + weixin-java-pay + ${weixin-java-pay.version} + + + + com.github.ulisesbocchio + jasypt-spring-boot + 2.1.0 + + + + com.amazonaws + aws-java-sdk-s3 + 1.11.423 + + + + + + \ No newline at end of file