From f98db5fe4b236b4c259e9dc611e4b6c3e1d249ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BA=86=E7=A5=A5?= Date: Fri, 6 Jun 2025 16:54:15 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=E6=B5=8B=E8=AF=95=E4=BC=9A=E5=91=98?= =?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3=E5=B9=B6=E4=BC=98=E5=8C=96=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +- ruoyi-admin/pom.xml | 1 + .../web/controller/AuthController.java | 7 +- .../web/controller/CaptchaController.java | 16 +- .../org/dromara/web/domain/vo/LoginVo.java | 5 + .../dromara/web/service/SysLoginService.java | 16 + .../web/service/impl/SmsAuthStrategy.java | 57 +- .../src/main/resources/application-dev.yml | 8 +- .../src/main/resources/application.yml | 15 +- ruoyi-common/ruoyi-common-core/pom.xml | 5 + .../common/core/constant/Constants.java | 2 +- .../dromara/common/core/domain/BaseBO.java | 5 +- .../common/core/domain/model/LoginUser.java | 6 + .../core/domain/model/RegisterBody.java | 2 + ruoyi-common/ruoyi-common-mongo/pom.xml | 8 +- .../common/web/core/BaseController.java | 12 +- .../common/web/core/BaseConverter.java | 11 +- .../org/dromara/common/web/core/Page.java | 89 ++ ruoyi-modules/ruoyi-auth/pom.xml | 20 + .../controller/MemberBuyerController.java | 365 ----- .../com/wzj/soopin/auth/domain/bo/Token.java | 67 - .../wzj/soopin/auth/domain/dto/AuthToken.java | 57 + .../com/wzj/soopin/auth/enums/UserEnums.java | 27 - .../wzj/soopin/auth/security/UserContext.java | 97 -- .../soopin/auth/service/IMemberService.java | 295 ---- .../auth/service/IVerificationService.java | 44 - .../service/IVerificationSourceService.java | 36 - .../auth/service/impl/MemberServiceImpl.java | 1394 ----------------- .../service/impl/VerificationServiceImpl.java | 228 --- .../impl/VerificationSourceServiceImpl.java | 56 - .../auth/util/Base64DecodeMultipartFile.java | 127 -- .../com/wzj/soopin/auth/util/SmsUtil.java | 59 - .../wzj/soopin/auth/vo/MemberSearchVO.java | 34 - .../soopin/auth/vo/SerializableStream.java | 24 - .../member/controller/FeedbackController.java | 68 +- .../controller/MemberAccountController.java | 56 +- .../controller/MemberAddressController.java | 22 +- .../controller/MemberCartController.java | 11 +- .../member/controller/MemberController.java | 28 +- .../member/convert/FeedbackConvert.java | 2 +- .../member/convert/MemberAccountConvert.java | 8 +- .../member/convert/MemberAddressConvert.java | 2 +- .../member/convert/MemberCartConvert.java | 11 +- .../soopin/member/convert/MemberConvert.java | 4 +- .../convert/MemberLogininforConvert.java | 3 +- .../member/convert/MemberWechatConvert.java | 3 +- .../soopin/member/domain/bo/FeedbackBO.java | 5 + .../member/domain/bo/MemberAccountBO.java | 41 + .../member/domain/bo/MemberAccountQuery.java | 23 - .../member/domain/bo/MemberAddressBO.java | 5 +- .../wzj/soopin/member/domain/bo/MemberBO.java | 2 +- .../wzj/soopin/member/domain/po/Address.java | 14 +- .../wzj/soopin/member/domain/po/Feedback.java | 10 +- .../wzj/soopin/member/domain/po/Member.java | 18 +- .../member/domain/po/MemberAccount.java | 8 +- .../member/domain/po/MemberAddress.java | 3 +- .../soopin/member/domain/po/MemberCart.java | 3 +- .../soopin/member/domain/po/MemberWechat.java | 3 +- .../soopin/member/domain/vo/MemberInfoVO.java | 71 + .../member/service/IMemberCrudService.java | 11 - .../soopin/member/service/IMemberService.java | 55 + .../member/service/ITencentIMServicce.java | 10 + .../member/service/MemberRegisterService.java | 116 ++ .../impl/MemberAccountServiceImpl.java | 6 +- .../impl/MemberAddressServiceImpl.java | 7 +- .../service/impl/MemberCrudServiceImpl.java | 66 - .../service/impl/MemberServiceImpl.java | 219 +++ .../service/impl/TencentIMServiceImpl.java | 92 ++ .../member/util/GenerateTestUserSig.java | 143 ++ .../wzj/soopin/member}/util/TLSSigAPIv2.java | 2 +- script/sql/rzj.sql | 6 + 71 files changed, 1226 insertions(+), 3132 deletions(-) create mode 100644 ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/Page.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/controller/MemberBuyerController.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/domain/bo/Token.java create mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/domain/dto/AuthToken.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/enums/UserEnums.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/security/UserContext.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IMemberService.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IVerificationService.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IVerificationSourceService.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/MemberServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/VerificationServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/VerificationSourceServiceImpl.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/Base64DecodeMultipartFile.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/SmsUtil.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/vo/MemberSearchVO.java delete mode 100644 ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/vo/SerializableStream.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAccountBO.java delete mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAccountQuery.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberInfoVO.java delete mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberCrudService.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberService.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberRegisterService.java delete mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberCrudServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/util/GenerateTestUserSig.java rename ruoyi-modules/{ruoyi-auth/src/main/java/com/wzj/soopin/auth => ruoyi-member/src/main/java/com/wzj/soopin/member}/util/TLSSigAPIv2.java (99%) create mode 100644 script/sql/rzj.sql diff --git a/pom.xml b/pom.xml index 35c9b548e..d958cfee3 100644 --- a/pom.xml +++ b/pom.xml @@ -411,7 +411,11 @@ 2.5.4 - + + org.dromara + ruoyi-auth + ${revision} + org.dromara diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index d97374e7b..0c58f9ef0 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -107,6 +107,7 @@ ruoyi-workflow + de.codecentric spring-boot-admin-starter-client diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index 8ad7465ae..c1f6f09b0 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -80,7 +80,7 @@ public class AuthController { * @param body 登录信息 * @return 结果 */ - @ApiEncrypt +// @ApiEncrypt @PostMapping("/login") public R login(@RequestBody String body) { LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); @@ -97,7 +97,10 @@ public class AuthController { return R.fail(MessageUtils.message("auth.grant.type.blocked")); } // 校验租户 - loginService.checkTenant(loginBody.getTenantId()); + if(!"app".equals(client.getClientKey())){ + loginService.checkTenant(loginBody.getTenantId()); + } + // 登录 LoginVo loginVo = IAuthStrategy.login(body, client, grantType); diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java index 0848170af..03a628ad9 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/CaptchaController.java @@ -56,22 +56,22 @@ public class CaptchaController { * * @param phonenumber 用户手机号 */ - @RateLimiter(key = "#phonenumber", time = 60, count = 1) +// @RateLimiter(key = "#phonenumber", time = 60, count = 1) @GetMapping("/resource/sms/code") public R smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber; String code = RandomUtil.randomNumbers(4); RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); // 验证码模板id 自行处理 (查数据库或写死均可) - String templateId = ""; + String templateId = "2375314"; LinkedHashMap map = new LinkedHashMap<>(1); map.put("code", code); - SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); - SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); - if (!smsResponse.isSuccess()) { - log.error("验证码短信发送异常 => {}", smsResponse); - return R.fail(smsResponse.getData().toString()); - } + SmsBlend smsBlend = SmsFactory.getSmsBlend("config2"); +// SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, templateId, map); +// if (!smsResponse.isSuccess()) { +// log.error("验证码短信发送异常 => {}", smsResponse); +// return R.fail(smsResponse.getData().toString()); +// } return R.ok(); } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java index 834afe5a1..1966ab911 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java @@ -51,4 +51,9 @@ public class LoginVo { */ private String openid; + /** + * 用户 sig + */ + private String userSig; + } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java index 41a802b44..07d13655e 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -7,6 +7,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Opt; import cn.hutool.core.util.ObjectUtil; import com.baomidou.lock.annotation.Lock4j; +import com.wzj.soopin.member.domain.po.Member; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.zhyd.oauth.model.AuthUser; @@ -18,6 +19,7 @@ import org.dromara.common.core.domain.dto.PostDTO; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.model.LoginUser; import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.UserType; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.*; @@ -171,6 +173,20 @@ public class SysLoginService { return loginUser; } + /** + * 构建登录用户 + */ + public LoginUser buildLoginUser(Member member) { + LoginUser loginUser = new LoginUser(); + Long userId = member.getId(); + loginUser.setUserId(userId); + loginUser.setUsername(member.getUserName()); + loginUser.setNickname(member.getNickname()); + loginUser.setUserType(UserType.APP_USER.getUserType()); + loginUser.setUserSig(member.getUserSig()); + return loginUser; + } + /** * 记录登录信息 * diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java index 2ffda353e..a230665d4 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java @@ -4,14 +4,19 @@ import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.member.domain.po.Member; +import com.wzj.soopin.member.mapper.MemberMapper; +import com.wzj.soopin.member.service.MemberRegisterService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.domain.model.RegisterBody; import org.dromara.common.core.domain.model.SmsLoginBody; import org.dromara.common.core.enums.LoginType; +import org.dromara.common.core.enums.UserType; import org.dromara.common.core.exception.user.CaptchaExpireException; import org.dromara.common.core.exception.user.UserException; import org.dromara.common.core.utils.MessageUtils; @@ -42,6 +47,8 @@ public class SmsAuthStrategy implements IAuthStrategy { private final SysLoginService loginService; private final SysUserMapper userMapper; + private final MemberMapper memberMapper; + private final MemberRegisterService memberRegisterService; @Override public LoginVo login(String body, SysClientVo client) { @@ -51,10 +58,34 @@ public class SmsAuthStrategy implements IAuthStrategy { String phonenumber = loginBody.getPhonenumber(); String smsCode = loginBody.getSmsCode(); LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { - SysUserVo user = loadUserByPhonenumber(phonenumber); - loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - return loginService.buildLoginUser(user); + + + if("app".equals(client.getClientKey())){ + //会员登录 + Member member = loadMemberByPhonenumber(phonenumber); + + //手机号登录,如果没有则创建一个 + if (member == null) { + RegisterBody registerBody = new RegisterBody(); + registerBody.setPhoneNumber(phonenumber); + registerBody.setCode(smsCode); + registerBody.setUserType(UserType.APP_USER.getUserType()); + registerBody.setClientId(client.getClientId()); + registerBody.setUuid(phonenumber); + member = memberRegisterService.register(registerBody); + return loginService.buildLoginUser(member); + } else { + loginService.checkLogin(LoginType.SMS, tenantId, member.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(member); + } + }else{ + //管理员登录 + SysUserVo user = loadUserByPhonenumber(phonenumber); + loginService.checkLogin(LoginType.SMS, tenantId, user.getUserName(), () -> !validateSmsCode(tenantId, phonenumber, smsCode)); + // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 + return loginService.buildLoginUser(user); + } }); loginUser.setClientKey(client.getClientKey()); loginUser.setDeviceType(client.getDeviceType()); @@ -72,9 +103,16 @@ public class SmsAuthStrategy implements IAuthStrategy { loginVo.setAccessToken(StpUtil.getTokenValue()); loginVo.setExpireIn(StpUtil.getTokenTimeout()); loginVo.setClientId(client.getClientId()); + loginVo.setUserSig(loginUser.getUserSig()); return loginVo; } + + + private void checkMemberLogin(){ + + } + /** * 校验短信验证码 */ @@ -98,5 +136,16 @@ public class SmsAuthStrategy implements IAuthStrategy { } return user; } + private Member loadMemberByPhonenumber(String phonenumber) { + Member user = memberMapper.selectOne(new LambdaQueryWrapper().eq(Member::getPhoneEncrypted, phonenumber)); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", phonenumber); + return null; + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", phonenumber); + throw new UserException("user.blocked", phonenumber); + } + return user; + } } diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 83bff12cd..9d0be9a11 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -182,10 +182,10 @@ sms: config2: # 厂商标识,标定此配置是哪个厂商,详细请看厂商标识介绍部分 supplier: tencent - access-key-id: 您的accessKey - access-key-secret: 您的accessKeySecret - signature: 您的短信签名 - sdk-app-id: 您的sdkAppId + access-key-id: AKIDvhEVWHm0xe5JGxOZXGitnRovlKcfRzIN + access-key-secret: qPhiTxA7oENFrCH5dvxiCQN4UdWAYgYA + signature: 无终街科技 + sdk-app-id: 1400966042 --- # 三方授权 diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 7e584b3dd..5cce743d9 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -116,14 +116,7 @@ security: - /*/api-docs - /*/api-docs/** - /warm-flow-ui/token-name - - /admin/vlog/upload/detail/** - - /admin/vlog/upload/** -# - /admin/vlog/upload/pull -# - /admin/vlog/upload/pull/batch -# - /admin/vlog/upload/list -# - /admin/vlog/upload/** -# - /admin/vlog/pull/** -# - /admin/vlog/pull + # 多租户配置 tenant: @@ -140,6 +133,12 @@ tenant: - sys_user_role - sys_client - sys_oss_config + - ums_member + - ums_member_address + - ums_feedback + - ums_member_account + - ums_member_logininfor + - ums_member_cart # MyBatisPlus配置 # https://baomidou.com/config/ diff --git a/ruoyi-common/ruoyi-common-core/pom.xml b/ruoyi-common/ruoyi-common-core/pom.xml index ad37e90db..5a9dd1b31 100644 --- a/ruoyi-common/ruoyi-common-core/pom.xml +++ b/ruoyi-common/ruoyi-common-core/pom.xml @@ -88,6 +88,11 @@ mapstruct-plus-spring-boot-starter + + com.baomidou + mybatis-plus-spring-boot3-starter + + org.lionsoul diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java index 273c7344a..6354f893c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/Constants.java @@ -65,7 +65,7 @@ public interface Constants { /** * 验证码有效期(分钟) */ - Integer CAPTCHA_EXPIRATION = 2; + Integer CAPTCHA_EXPIRATION = 5; /** * 顶级父级id diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/BaseBO.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/BaseBO.java index f2382f77c..2cf6a3907 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/BaseBO.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/BaseBO.java @@ -2,6 +2,9 @@ package org.dromara.common.core.domain; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.dromara.common.core.domain.model.BaseAudit; + import java.sql.Wrapper; public class BaseBO { @@ -11,7 +14,7 @@ public class BaseBO { * * @return */ - public T toWrapper() { + public LambdaQueryWrapper toWrapper() { return null; } } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java index 75e2d6587..eb16bc6e9 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginUser.java @@ -133,6 +133,12 @@ public class LoginUser implements Serializable { private String deviceType; + /** + * 腾讯IM用户Sig + */ + private String userSig; + + /** * 获取登录id */ diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java index 6ea8a764a..19c85d3ab 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/RegisterBody.java @@ -30,4 +30,6 @@ public class RegisterBody extends LoginBody { private String userType; + private String phoneNumber; + } diff --git a/ruoyi-common/ruoyi-common-mongo/pom.xml b/ruoyi-common/ruoyi-common-mongo/pom.xml index 53cf6907c..33305593c 100644 --- a/ruoyi-common/ruoyi-common-mongo/pom.xml +++ b/ruoyi-common/ruoyi-common-mongo/pom.xml @@ -24,10 +24,10 @@ ruoyi-common-log - - org.springframework.boot - spring-boot-starter-data-mongodb - + + + + diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseController.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseController.java index fd01dda5a..8f204e75a 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseController.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseController.java @@ -1,14 +1,24 @@ package org.dromara.common.web.core; +import com.baomidou.mybatisplus.extension.service.IService; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; import org.dromara.common.core.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; /** * web层通用数据处理 * * @author Lion Li */ -public class BaseController { +public class BaseController { + +// @Autowired +// public S service; +// +// @Autowired +// public C convert; + /** * 响应返回结果 diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseConverter.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseConverter.java index 4649c91cc..df51eec9e 100644 --- a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseConverter.java +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/BaseConverter.java @@ -2,30 +2,33 @@ package org.dromara.common.web.core; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.mapstruct.MapperConfig; import java.util.List; +@MapperConfig public interface BaseConverter { /** * dto转vo * @param t * @return */ - V convertToVO(T t); + public V toVO(T t); /** * dto列表转vo * @param tList * @return */ - List convertToVO(List tList); + public List toVO(List tList); /** * dto分页转vo * @param tPage * @return */ - TableDataInfo convertToVO(IPage tPage); + public Page toVO(Page tPage); @@ -35,7 +38,7 @@ public interface BaseConverter { * @param d * @return */ - T convertToPo(B d); + public T toPo(B d); diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/Page.java b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/Page.java new file mode 100644 index 000000000..9b10f2ae7 --- /dev/null +++ b/ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/core/Page.java @@ -0,0 +1,89 @@ +package org.dromara.common.web.core; + +import cn.hutool.http.HttpStatus; +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author Lion Li + */ +@Data +@NoArgsConstructor +public class Page implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 总记录数 + */ + private long total; + + /** + * 列表数据 + */ + private List rows; + + /** + * 消息状态码 + */ + private int code; + + /** + * 消息内容 + */ + private String msg; + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public Page(List list, long total) { + this.rows = list; + this.total = total; + this.code = HttpStatus.HTTP_OK; + this.msg = "查询成功"; + } + + /** + * 根据分页对象构建表格分页数据对象 + */ + public static Page build(IPage page) { + Page rspData = new Page<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + rspData.setRows(page.getRecords()); + rspData.setTotal(page.getTotal()); + return rspData; + } + + /** + * 根据数据列表构建表格分页数据对象 + */ + public static Page build(List list) { + Page rspData = new Page<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(list.size()); + return rspData; + } + + /** + * 构建表格分页数据对象 + */ + public static Page build() { + Page rspData = new Page<>(); + rspData.setCode(HttpStatus.HTTP_OK); + rspData.setMsg("查询成功"); + return rspData; + } + +} diff --git a/ruoyi-modules/ruoyi-auth/pom.xml b/ruoyi-modules/ruoyi-auth/pom.xml index 998dc4534..2ddd81f56 100644 --- a/ruoyi-modules/ruoyi-auth/pom.xml +++ b/ruoyi-modules/ruoyi-auth/pom.xml @@ -99,10 +99,20 @@ org.dromara ruoyi-common-sse + + + org.dromara + ruoyi-common-social + + org.dromara ruoyi-member + + org.dromara + ruoyi-system + com.tencentcloudapi @@ -116,6 +126,16 @@ tls-sig-api-v2 2.0 + + org.springframework.security + spring-security-crypto + + + + com.squareup.okhttp3 + okhttp + 4.12.0 + diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/controller/MemberBuyerController.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/controller/MemberBuyerController.java deleted file mode 100644 index 72d47f1dd..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/controller/MemberBuyerController.java +++ /dev/null @@ -1,365 +0,0 @@ -package com.wzj.soopin.auth.controller; - - - -import cn.hutool.json.JSONException; -import cn.hutool.json.JSONObject; -import com.squareup.okhttp.OkHttpClient; -import com.squareup.okhttp.Request; -import com.squareup.okhttp.Response; -import com.wzj.soopin.auth.domain.dto.entity.enums.VerificationEnums; -import com.wzj.soopin.auth.util.TLSSigAPIv2; -import com.wzj.soopin.member.domain.bo.MemberEditDTO; -import org.dromara.common.core.constant.ResultCode; -import com.wzj.soopin.auth.enums.UserEnums; -import com.wzj.soopin.auth.service.IMemberService; -import com.wzj.soopin.auth.service.IVerificationService; -import com.wzj.soopin.auth.util.SmsUtil; -import com.wzj.soopin.member.domain.po.Member; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import io.swagger.annotations.ApiOperation; -import jakarta.validation.constraints.NotNull; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.domain.R; -import org.dromara.common.core.exception.ServiceException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.TimeUnit; - - -/** - - * 买家端,会员接口 - - * - - * @author Chopper - - * @since 2020/11/16 10:07 下午 - - */ - - -@RestController - -@Api(tags = "买家端,会员接口") - -@Slf4j -@RequestMapping("/buyer/passport/member") - -public class MemberBuyerController { - - - - @Autowired - - private IMemberService memberService; - - @Autowired - - private SmsUtil smsUtil; - - - @Autowired - - private IVerificationService verificationService; - -// @Autowired - -// private GenerateTestUserSig generateTestUserSig; - - - - // 腾讯云 SDKAppID 和密钥 - - private static final long SDKAPPID = 1600080789; // 替换为您的 SDKAppID - - private static final String SECRETKEY = "311b5309d714a20f7f5b54360ee21b1e24ec208ebcd25ce8f47d24753bccc091"; // 替换为您的密钥 - - - - @ApiOperation(value = "登录接口") - - @ApiImplicitParams({ - - @ApiImplicitParam(name = "username", value = "用户名", required = true, paramType = "query"), - - @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query") - - }) - - @PostMapping("/userLogin") - - public R userLogin(@NotNull(message = "用户名不能为空") @RequestParam String username, - - @NotNull(message = "密码不能为空") @RequestParam String password, - - @RequestHeader String uuid) { - - verificationService.check(uuid, VerificationEnums.LOGIN); - - //return R.ok(this.memberService.usernameLogin(username, password)); - return R.ok(this.memberService.usernameLoginNew(username, password)); - - } - - - - @ApiOperation(value = "注销接口") - - @PostMapping("/logout") - - public R logout() { - - this.memberService.logout(UserEnums.MEMBER); - - return R.ok(); - - } - - @ApiOperation(value = "注销账号") - @PutMapping("/cancellation") - public R cancellation() { - memberService.cancellation(); - return R.ok(); - } - - - - @ApiOperation(value = "短信登录接口") - @ApiImplicitParams({ - @ApiImplicitParam(name = "mobile", value = "手机号", required = true, paramType = "query"), - @ApiImplicitParam(name = "code", value = "验证码", required = true, paramType = "query") - }) - @PostMapping("/smsLogin") - public R smsLogin(@NotNull(message = "手机号为空") @RequestParam String mobile, - @NotNull(message = "验证码为空") @RequestParam String code, - @RequestHeader String uuid) throws JSONException { - log.info("短信验证码校验成功: mobile={}, code={}", mobile, code); - return R.ok(memberService.mobilePhoneLoginNew(mobile)); - } - - - @SneakyThrows - @ApiOperation(value = "注册用户") - @ApiImplicitParams({ - @ApiImplicitParam(name = "username", value = "用户名", required = true, paramType = "query"), - @ApiImplicitParam(name = "password", value = "密码", required = true, paramType = "query"), - @ApiImplicitParam(name = "mobilePhone", value = "手机号", required = true, paramType = "query"), - @ApiImplicitParam(name = "code", value = "验证码", required = true, paramType = "query") - }) - @PostMapping("/register") - public R register(@NotNull(message = "用户名不能为空") @RequestParam String username, - @NotNull(message = "密码不能为空") @RequestParam String password, - @NotNull(message = "手机号为空") @RequestParam String mobilePhone, - @RequestHeader String uuid, - @NotNull(message = "验证码不能为空") @RequestParam String code) { - // 检查用户名是否已存在 - if (memberService.usernameExists(username)) { - throw new ServiceException(ResultCode.ERROR); - } - - // 验证短信验证码 - if (!smsUtil.verifyCode(mobilePhone, VerificationEnums.REGISTER, uuid, code)) { - throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR); - } - - try { - // 生成 UserSig - TLSSigAPIv2 tlsSigAPIv2 = new TLSSigAPIv2(SDKAPPID, SECRETKEY); - long expire = TimeUnit.DAYS.toSeconds(365 * 50); // 设置为 50 年 - String userSig = tlsSigAPIv2.genUserSig(mobilePhone, expire); - String random = String.valueOf(System.currentTimeMillis()); - - // 构建腾讯云IM请求 - JSONObject requestBody = new JSONObject(); - requestBody.put("UserID", mobilePhone); - requestBody.put("Nick", username); - requestBody.put("FaceUrl", "http://www.qq.com"); - requestBody.put("Tag_Profile_IM_AllowType", "AllowType_Type_NeedConfirm"); - - String urlString = String.format("https://console.tim.qq.com/v4/im_open_login_svc/account_import?sdkappid=%s&identifier=%s&usersig=%s&random=%s&contenttype=json", - SDKAPPID, mobilePhone, userSig, random); - - OkHttpClient client = new OkHttpClient(); - Request request = new Request.Builder() - .url(urlString) -// .post(RequestBody.create(MediaType.get("application/json; charset=utf-8"), requestBody.toString())) - .build(); - - Response response = client.newCall(request).execute(); - if (!response.isSuccessful()) { - log.error("腾讯云IM账号导入失败: {}", response.body().string()); - throw new ServiceException(ResultCode.ERROR); - } - - // 注册用户 - return R.ok(memberService.registerNew(username, password, mobilePhone, userSig)); - } catch (Exception e) { - log.error("注册失败", e); - throw new ServiceException(ResultCode.ERROR); - } - } - - /*@PostMapping("/registerTest") - public R registerTest(){ - // 处理成功响应 - return R.ok(memberService.registerNew("leon", "12345678", "13899990000","qqqqqqqqqqqqqqqqqqqqqqq")); - }*/ - - - @ApiOperation(value = "获取当前登录用户接口") - @GetMapping - public R getUserInfo() { - return R.ok(memberService.getUserInfo()); - - } - - - - @ApiOperation(value = "通过短信重置密码") - - @ApiImplicitParams({ - - @ApiImplicitParam(name = "mobile", value = "手机号", required = true, paramType = "query"), - - @ApiImplicitParam(name = "password", value = "是否保存登录", required = true, paramType = "query") - - }) - - @PostMapping("/resetByMobile") - - public R resetByMobile(@NotNull(message = "手机号为空") @RequestParam String mobile, - - @NotNull(message = "验证码为空") @RequestParam String code, - - @RequestHeader String uuid) { - - //校验短信验证码是否正确 - - if (smsUtil.verifyCode(mobile, VerificationEnums.FIND_USER, uuid, code)) { - - //校验是否通过手机号可获取会员,存在则将会员信息存入缓存,有效时间3分钟 - - memberService.findByMobile(uuid, mobile); - - return R.ok(); - - } else { - - throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR); - - } - - } - - - - @ApiOperation(value = "修改密码") - - @ApiImplicitParams({ - - @ApiImplicitParam(name = "mobile", value = "手机号", required = true, paramType = "query"), - - @ApiImplicitParam(name = "password", value = "是否保存登录", required = true, paramType = "query") - - }) - - @PostMapping("/resetPassword") - - public R resetByMobile(@NotNull(message = "密码为空") @RequestParam String password, @RequestHeader String uuid) { - - - - return R.ok(memberService.resetByMobile(uuid, password)); - - } - - - - @ApiOperation(value = "修改用户自己资料") - - @PutMapping("/editOwn") - - public R editOwn(MemberEditDTO memberEditDTO) { - - - - return R.ok(memberService.editOwn(memberEditDTO)); - - } - - - - @ApiOperation(value = "修改密码") - - @ApiImplicitParams({ - - @ApiImplicitParam(name = "password", value = "旧密码", required = true, paramType = "query"), - - @ApiImplicitParam(name = "newPassword", value = "新密码", required = true, paramType = "query") - - }) - - @PutMapping("/modifyPass") - - public R modifyPass(@NotNull(message = "旧密码不能为空") @RequestParam String password, - - @NotNull(message = "新密码不能为空") @RequestParam String newPassword) { - - return R.ok(memberService.modifyPass(password, newPassword)); - - } - - - - - - @ApiOperation(value = "刷新token") - - @GetMapping("/refresh/{refreshToken}") - - public R refreshToken(@NotNull(message = "刷新token不能为空") @PathVariable String refreshToken) { - - return R.ok(this.memberService.refreshToken(refreshToken)); - - } - - - - @ApiOperation(value = "获取当前登录用户的IM信息") - @GetMapping("/im-info") - public R> getImInfo() { - // 获取当前登录用户 - Member member = memberService.getUserInfo(); - if (member == null) { - throw new ServiceException(ResultCode.USER_NOT_LOGIN); - } - - // 生成 UserSig - TLSSigAPIv2 tlsSigAPIv2 = new TLSSigAPIv2(SDKAPPID, SECRETKEY); - long expire = TimeUnit.DAYS.toSeconds(365 * 50); // 设置为 50 年 - String userSig = tlsSigAPIv2.genUserSig(member.getPhoneEncrypted(), expire); - - // 构建返回数据 - Map imInfo = new HashMap<>(); - imInfo.put("sdkAppId", SDKAPPID); - imInfo.put("userID", member.getPhoneEncrypted()); - imInfo.put("userSig", userSig); - imInfo.put("nickName", member.getNickname()); - imInfo.put("faceUrl", member.getAvatar() != null ? member.getAvatar() : "http://www.qq.com"); - - return R.ok(imInfo); - } - - - -} - - diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/domain/bo/Token.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/domain/bo/Token.java deleted file mode 100644 index c63c6d310..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/domain/bo/Token.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.wzj.soopin.auth.domain.bo; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * Token 实体类 - * - * @author Chopper - * @version v1.0 2020-11-13 10:02 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class Token { - /** - * 用户名 - */ - private String username; - - /** - * 访问token - */ - private String accessToken; - - /** - * 刷新token - */ - private String refreshToken; - - /** - * 认证用户信息 - */ - private Object authUser; - - /** - * 短视频系统账号信息 - */ - private String tikUser; - - /** - * 构造函数 - * - * @param accessToken 访问token - * @param refreshToken 刷新token - */ - public Token(String accessToken, String refreshToken) { - this.accessToken = accessToken; - this.refreshToken = refreshToken; - } - - /** - * 构造函数 - * - * @param username 用户名 - * @param accessToken 访问token - * @param refreshToken 刷新token - * @param authUser 认证用户信息 - */ - public Token(String username, String accessToken, String refreshToken, Object authUser) { - this.username = username; - this.accessToken = accessToken; - this.refreshToken = refreshToken; - this.authUser = authUser; - } -} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/domain/dto/AuthToken.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/domain/dto/AuthToken.java new file mode 100644 index 000000000..e2b1c7a26 --- /dev/null +++ b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/domain/dto/AuthToken.java @@ -0,0 +1,57 @@ +package com.wzj.soopin.auth.domain.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 联合登陆授权token + * + * @author Chopper + * @version v4.0 + * @since 2020/12/4 23:48 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AuthToken implements Serializable { + + private static final long serialVersionUID = -2701476618576443366L; + + /** + * 第三方token + */ + private String accessToken; + /** + * 第三方刷新token + */ + private String refreshToken; + /** + * 有效时间 + */ + private int expireIn; + /** + * 会员id + */ + private String uid; + /** + * 联合登录id + */ + private String unionId; + /** + * 联合登录openid + */ + private String openId; + /** + * 请求码 + */ + private String accessCode; + /** + * 范围 + */ + private String scope; +} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/enums/UserEnums.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/enums/UserEnums.java deleted file mode 100644 index 53f919f1c..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/enums/UserEnums.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.wzj.soopin.auth.enums; - -/** - * token角色类型 - * - * @author Chopper - * @version v1.0 - * @since 2020/8/18 15:23 - */ -public enum UserEnums { - /** - * 角色 - */ - MEMBER("会员"), - STORE("商家"), - MANAGER("管理员"), - SYSTEM("系统"); - private final String role; - - UserEnums(String role) { - this.role = role; - } - - public String getRole() { - return role; - } -} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/security/UserContext.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/security/UserContext.java deleted file mode 100644 index 14efceb6b..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/security/UserContext.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.wzj.soopin.auth.security; - -import cn.hutool.jwt.Claims; -import com.google.gson.Gson; -import com.wzj.soopin.auth.enums.SecurityEnum; -import jakarta.servlet.http.HttpServletRequest; -import org.dromara.common.core.constant.ResultCode; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.redis.redis.RedisCache; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - - -/** - * 用户上下文 - * - * @author Chopper - * @version v4.0 - * @since 2020/11/14 20:27 - */ -public class UserContext { - - /** - * 根据request获取用户信息 - * - * @return 授权用户 - */ -// public static AuthUser getCurrentUser() { -// if (RequestContextHolder.getRequestAttributes() != null) { -// HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); -// String accessToken = request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); -// return getAuthUser(accessToken); -// } -// return null; -// } - - /** - * 根据request获取用户信息 - * - * @return 授权用户 - */ - public static String getUuid() { - if (RequestContextHolder.getRequestAttributes() != null) { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - return request.getHeader(SecurityEnum.UUID.getValue()); - } - return null; - } - - -// /** -// * 根据jwt获取token重的用户信息 -// * -// * @param cache 缓存 -// * @param accessToken token -// * @return 授权用户 -// */ -// public static AuthUser getAuthUser(RedisCache cache, String accessToken) { -// try { -// if (cache.keys("*" + accessToken).isEmpty()) { -// throw new ServiceException(ResultCode.USER_AUTHORITY_ERROR); -// } -// return getAuthUser(accessToken); -// } catch (Exception e) { -// return null; -// } -// } - - public static String getCurrentUserToken() { - if (RequestContextHolder.getRequestAttributes() != null) { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - return request.getHeader(SecurityEnum.HEADER_TOKEN.getValue()); - } - return null; - } - -// /** -// * 根据jwt获取token重的用户信息 -// * -// * @param accessToken token -// * @return 授权用户 -// */ -// public static AuthUser getAuthUser(String accessToken) { -// try { -// //获取token的信息 -// Claims claims -// = Jwts.parser() -// .setSigningKey(SecretKeyUtil.generalKeyByDecoders()) -// .parseClaimsJws(accessToken).getBody(); -// //获取存储在claims中的用户信息 -// String json = claims.get(SecurityEnum.USER_CONTEXT.getValue()).toString(); -// return new Gson().fromJson(json, AuthUser.class); -// } catch (Exception e) { -// return null; -// } -// } -} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IMemberService.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IMemberService.java deleted file mode 100644 index f7d441d75..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IMemberService.java +++ /dev/null @@ -1,295 +0,0 @@ -package com.wzj.soopin.auth.service; - - - -import cn.hutool.json.JSONException; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.service.IService; -import com.wzj.soopin.auth.domain.bo.Token; -import com.wzj.soopin.auth.enums.UserEnums; -import com.wzj.soopin.auth.vo.MemberSearchVO; -import com.wzj.soopin.member.domain.bo.MemberAddDTO; -import com.wzj.soopin.member.domain.bo.MemberEditDTO; -import com.wzj.soopin.member.domain.po.Member; -import com.wzj.soopin.member.domain.vo.MemberVO; -import org.dromara.common.core.domain.R; - -import java.util.List; -import java.util.Map; - -/** - * 会员业务层 - * - * @author Bulbasaur - * @since 2020-02-25 14:10:16 - */ -public interface IMemberService extends IService { - - boolean usernameExists(String username); // 确保这个方法在接口中定义 - - /** - * 获取当前登录的用户信息 - * - * @return 会员信息 - */ - Member getUserInfo(); - - /** - * 是否可以通过手机获取用户 - * - * @param uuid UUID - * @param mobile 手机号 - * @return 操作状态 - */ - boolean findByMobile(String uuid, String mobile); - - /** - * 通过用户名获取用户 - * - * @param username 用户名 - * @return 会员信息 - */ - Member findByUsername(String username); - - /** - * 登录:用户名、密码登录 - * - * @param username 用户名 - * @param password 密码 - * @return token - */ - Token usernameLogin(String username, String password); - - /** - * 商家登录:用户名、密码登录 - * - * @param username 用户名 - * @param password 密码 - * @return token - */ - Token usernameStoreLogin(String username, String password); - - /** - * 注册:手机号、验证码登录 - * - * @param mobilePhone 手机号 - * @return token - */ - Token mobilePhoneLogin(String mobilePhone); - - /** - * 修改会员信息 - * - * @param memberEditDTO 会员修改信息 - * @return 修改后的会员 - */ - Member editOwn(MemberEditDTO memberEditDTO); - - /** - * 修改用户密码 - * - * @param oldPassword 旧密码 - * @param newPassword 新密码 - * @return 操作结果 - */ - Member modifyPass(String oldPassword, String newPassword); - - /** - * 注册会员 - * - * @param userName 会员 - * @param password 密码 - * @param mobilePhone mobilePhone - * @return 处理结果 - */ - Token register(String userName, String password, String mobilePhone, String userSig); - - /** - * 修改当前会员的手机号 - * - * @param mobile 手机号 - * @return 操作结果 - */ - boolean changeMobile(String mobile); - - /** - * 通过手机号修改密码 - * - * @param mobile 手机号 - * @param password 密码 - * @return - */ - boolean resetByMobile(String mobile, String password); - - /** - * 后台-添加会员 - * - * @param memberAddDTO 会员 - * @return 会员 - */ - Member addMember(MemberAddDTO memberAddDTO); - -// /** -// * 后台-修改会员 -// * -// * @param managerMemberEditDTO 后台修改会员参数 -// * @return 会员 -// */ -// Member updateMember(ManagerMemberEditDTO managerMemberEditDTO); - - /** - * 获取会员分页 - * - * @param memberSearchVO 会员搜索VO - * @param page 分页 - * @return 会员分页 - */ - IPage getMemberPage(MemberSearchVO memberSearchVO, IPage page); - - /** - * 一键注册会员 - * - * @return - */ - Token autoRegister(); - -// /** -// * 一键注册会员 -// * -// * @param authUser 联合登录用户 -// * @return Token -// */ -// Token autoRegister(ConnectAuthUser authUser); - - /** - * 刷新token - * - * @param refreshToken - * @return Token - */ - Token refreshToken(String refreshToken); - - /** - * 刷新token - * - * @param refreshToken - * @return Token - */ - Token refreshStoreToken(String refreshToken); - - /** - * 会员积分变动 - * - * @param point 变动积分 - * @param type 是否增加积分 INCREASE 增加 REDUCE 扣减 - * @param memberId 会员id - * @param content 变动日志 - * @return 操作结果 - */ - Boolean updateMemberPoint(Long point, String type, String memberId, String content); - - /** - * 更新会员状态 - * - * @param memberIds 会员ID列表 - * @param disabled 是否禁用 - * @param banDays 封禁天数,如果为null则永久封禁 - * @return 操作结果代码 - */ - R updateMemberStatus(List memberIds, Boolean disabled, Integer banDays); - - /** - * 根据条件查询会员总数 - * - * @param memberSearchVO - * @return 会员总数 - */ - long getMemberNum(MemberSearchVO memberSearchVO); - - /** - * 获取指定会员数据 - * - * @param columns 指定获取的列 - * @param memberIds 会员ids - * @return 指定会员数据 - */ - List> listFieldsByMemberIds(String columns, List memberIds); - - /** - * 登出 - * - * @param userEnums token角色类型 - */ - void logout(UserEnums userEnums); - - - /** - * 注销账号 - * - * @return 操作结果 - */ - void cancellation(); - - /** - * 获取所有会员的手机号 - * - * @return 所有会员的手机号 - */ - List getAllMemberMobile(); - - /** - * 更新会员登录时间为最新时间 - * - * @param memberId 会员id - * @return 是否更新成功 - */ - boolean updateMemberLoginTime(String memberId); - - /** - * 获取用户VO - * - * @param id 会员id - * @return 用户VO - */ - MemberVO getMember(String id); - - /** - * 注册会员 - * - * @param userName 会员 - * @param password 密码 - * @param mobilePhone mobilePhone - * @return 处理结果 - */ - Token registerNew(String userName, String password, String mobilePhone, String userSig); - - /** - * 登录获取短视频系统账户信息 - * - * @param username - * @param password - * @return - */ - Token usernameLoginNew(String username, String password); - - /** - * 短信登录获取短视频系统账户信息 - * - * @param mobilePhone - * @return - */ - Token mobilePhoneLoginNew(String mobilePhone) throws JSONException; - - /** - * 设置会员为代理人 - * @param memberId 会员ID - * @param region 代理区域编码 - */ - void setMemberAsAgent(String memberId, String region); - - Member updateMemberS(Member member); - - void endsetMemberAsAgent(String memberId, String region); - - void updateRevenueSharingPercentage(String id, String percentage); -} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IVerificationService.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IVerificationService.java deleted file mode 100644 index f32840197..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IVerificationService.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.wzj.soopin.auth.service; - - -import com.wzj.soopin.auth.domain.dto.entity.enums.VerificationEnums; - -import java.io.IOException; -import java.util.Map; - -/** - * 验证码模块 - * - * @author Bulbasaur - * @since 2021/7/9 1:42 上午 - */ -public interface IVerificationService { - /** - * 获取校验对象 - * - * @param verificationEnums 校验枚举 - * @param uuid uuid - * @return 校验对象 - * @throws IOException 校验错误 - */ - Map createVerification(VerificationEnums verificationEnums, String uuid); - - /** - * 预校验 - * - * @param xPos 位移距离 - * @param uuid 用户唯一表示 - * @param verificationEnums 校验枚举 - * @return - */ - boolean preCheck(Integer xPos, String uuid, VerificationEnums verificationEnums); - - /** - * 验证码校验 - * - * @param uuid 用户唯一表示 - * @param verificationEnums 校验枚举 - * @return 操作结果 - */ - boolean check(String uuid, VerificationEnums verificationEnums); -} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IVerificationSourceService.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IVerificationSourceService.java deleted file mode 100644 index ff4c5a1c1..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/IVerificationSourceService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.wzj.soopin.auth.service; - - -import com.baomidou.mybatisplus.extension.service.IService; -import com.wzj.soopin.auth.domain.dto.VerificationDTO; -import com.wzj.soopin.auth.domain.dto.VerificationSource; -import org.dromara.common.core.constant.CachePrefix; - -/** - * 验证码资源维护 业务层 - * - * @author Chopper - * @since 2020/11/17 3:44 下午 - */ -public interface IVerificationSourceService extends IService { - - /** - * 缓存 - */ - String VERIFICATION_CACHE = CachePrefix.VERIFICATION.getPrefix(); - - - /** - * 初始化缓存 - * - * @return - */ - VerificationDTO initCache(); - - /** - * 获取验证缓存 - * - * @return 验证码 - */ - VerificationDTO getVerificationCache(); -} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/MemberServiceImpl.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/MemberServiceImpl.java deleted file mode 100644 index 1c0296758..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/MemberServiceImpl.java +++ /dev/null @@ -1,1394 +0,0 @@ -package com.wzj.soopin.auth.service.impl; - -import cn.hutool.core.convert.Convert; -import cn.hutool.core.text.CharSequenceUtil; -import cn.hutool.json.JSONException; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.wzj.soopin.auth.domain.bo.Token; -import com.wzj.soopin.auth.enums.UserEnums; -import com.wzj.soopin.auth.service.IMemberService; -import com.wzj.soopin.auth.vo.MemberSearchVO; -import com.wzj.soopin.member.domain.bo.MemberAddDTO; -import com.wzj.soopin.member.domain.bo.MemberEditDTO; -import com.wzj.soopin.member.domain.po.Member; -import com.wzj.soopin.member.domain.vo.MemberVO; -import com.wzj.soopin.member.mapper.MemberMapper; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.dromara.common.core.domain.R; -import org.dromara.common.redis.redis.RedisCache; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; - - - -/** - * 会员接口业务层实现 - * - * @author Chopper - * @since 2021-03-29 14:10:16 - */ -@Slf4j -@Service -public class MemberServiceImpl extends ServiceImpl implements IMemberService { - @Autowired - private MemberMapper memberMapper; - - @Override - public boolean usernameExists(String username) { - return false; - } - - @Override - public Member getUserInfo() { - return null; - } - - @Override - public boolean findByMobile(String uuid, String mobile) { - return false; - } - - @Override - public Member findByUsername(String username) { - return null; - } - - @Override - public Token usernameLogin(String username, String password) { - return null; - } - - @Override - public Token usernameStoreLogin(String username, String password) { - return null; - } - - @Override - public Token mobilePhoneLogin(String mobilePhone) { - return null; - } - - @Override - public Member editOwn(MemberEditDTO memberEditDTO) { - return null; - } - - @Override - public Member modifyPass(String oldPassword, String newPassword) { - return null; - } - - @Override - public Token register(String userName, String password, String mobilePhone, String userSig) { - return null; - } - - @Override - public boolean changeMobile(String mobile) { - return false; - } - - @Override - public boolean resetByMobile(String mobile, String password) { - return false; - } - - @Override - public Member addMember(MemberAddDTO memberAddDTO) { - return null; - } - - @Override - public IPage getMemberPage(MemberSearchVO memberSearchVO, IPage page) { - return null; - } - - @Override - public Token autoRegister() { - return null; - } - - @Override - public Token refreshToken(String refreshToken) { - return null; - } - - @Override - public Token refreshStoreToken(String refreshToken) { - return null; - } - - @Override - public Boolean updateMemberPoint(Long point, String type, String memberId, String content) { - return null; - } - - @Override - public R updateMemberStatus(List memberIds, Boolean disabled, Integer banDays) { - return null; - } - - @Override - public long getMemberNum(MemberSearchVO memberSearchVO) { - return 0; - } - - @Override - public List> listFieldsByMemberIds(String columns, List memberIds) { - return null; - } - - @Override - public void logout(UserEnums userEnums) { - - } - - @Override - public void cancellation() { - - } - - @Override - public List getAllMemberMobile() { - return null; - } - - @Override - public boolean updateMemberLoginTime(String memberId) { - return false; - } - - @Override - public MemberVO getMember(String id) { - return null; - } - - @Override - public Token registerNew(String userName, String password, String mobilePhone, String userSig) { - return null; - } - - @Override - public Token usernameLoginNew(String username, String password) { - return null; - } - - @Override - public Token mobilePhoneLoginNew(String mobilePhone) throws JSONException { - return null; - } - - @Override - public void setMemberAsAgent(String memberId, String region) { - - } - - @Override - public Member updateMemberS(Member member) { - return null; - } - - @Override - public void endsetMemberAsAgent(String memberId, String region) { - - } - - @Override - public void updateRevenueSharingPercentage(String id, String percentage) { - - } - -// /** -// * 会员token -// */ -// @Autowired -// private MemberTokenGenerate memberTokenGenerate; -// /** -// * 商家token -// */ -// @Autowired -// private StoreTokenGenerate storeTokenGenerate; -// /** -// * 联合登录 -// */ -// @Autowired -// private ConnectService connectService; -// /** -// * 店铺 -// */ -// @Autowired -// private StoreService storeService; -// /** -// * RocketMQ 配置 -// */ -// @Autowired -// private RocketmqCustomProperties rocketmqCustomProperties; -// /** -// * RocketMQ -// */ -// @Autowired -// private RocketMQTemplate rocketMQTemplate; -// /** -// * 缓存 -// */ -// @Autowired -// private RedisCache cache; -// -// @Autowired -// private RevenueSharingMapper revenueSharingMapper; -// -// @Override -// public Member findByUsername(String userName) { -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// queryWrapper.eq("username", userName); -// return this.baseMapper.selectOne(queryWrapper); -// } -// -// @Override -// public boolean usernameExists(String username) { -// return memberMapper.countByUsername(username) > 0; // 确保实现 -// } -// -// @Override -// public Member getUserInfo() { -// AuthUser tokenUser = UserContext.getCurrentUser(); -// if (tokenUser != null) { -// return this.findByUsername(tokenUser.getUsername()); -// } -// throw new ServiceException(ResultCode.USER_NOT_LOGIN); -// } -// -// @Override -// public boolean findByMobile(String uuid, String mobile) { -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// queryWrapper.eq("mobile", mobile); -// Member member = this.baseMapper.selectOne(queryWrapper); -// if (member == null) { -// throw new ServiceException(ResultCode.USER_NOT_PHONE); -// } -// cache.put(CachePrefix.FIND_MOBILE + uuid, mobile, 300L); -// -// return true; -// } -// -// @Override -// public Token usernameLogin(String username, String password) { -// Member member = this.findMember(username); -// // 判断用户是否存在 -// if (member == null || !member.getDisabled()) { -// throw new ServiceException(ResultCode.USER_NOT_EXIST); -// } -//// // 判断密码是否输入正确 -//// if (!new BCryptPasswordEncoder().matches(password, member.getPassword())) { -//// throw new ServiceException(ResultCode.USER_PASSWORD_ERROR); -//// } -// loginBindUser(member); -// return memberTokenGenerate.createToken(member, false); -// } -// -// @Override -// public Token usernameStoreLogin(String username, String password) { -// -// Member member = this.findMember(username); -// -//// // 对输入的密码进行 MD5 哈希处理 -//// String hashedPassword = md5Hash(password); -// // 判断用户是否存在 -// if (member == null) { -// throw new ServiceException(ResultCode.USER_NOT_EXIST); -// } -// // 判断密码是否输入正确 -//// if (!new BCryptPasswordEncoder().matches(password, member.getPassword())) { -//// throw new ServiceException(ResultCode.USER_PASSWORD_ERROR); -//// } -// // 对店铺状态的判定处理 -// if (Boolean.TRUE.equals(member.getHaveStore())) { -// Store store = storeService.getById(member.getStoreId()); -// if (!store.getStoreDisable().equals(StoreStatusEnum.OPEN.name())) { -// throw new ServiceException(ResultCode.STORE_CLOSE_ERROR); -// } -// } else { -// throw new ServiceException(ResultCode.USER_NOT_EXIST); -// } -// -// return storeTokenGenerate.createToken(member, false); -// } -// -// private String md5Hash(String input) { -// try { -// // 获取 MD5 摘要算法的 MessageDigest 对象 -// MessageDigest md = MessageDigest.getInstance("MD5"); -// // 使用指定的字节数组更新摘要 -// md.update(input.getBytes()); -// // 获取密文 -// byte[] digest = md.digest(); -// StringBuilder sb = new StringBuilder(); -// for (byte b : digest) { -// sb.append(String.format("%02x", b & 0xff)); -// } -// return sb.toString(); -// } catch (NoSuchAlgorithmException e) { -// throw new RuntimeException(e); -// } -// } -// -// /** -// * 传递手机号或者用户名 -// * -// * @param userName 手机号或者用户名 -// * @return 会员信息 -// */ -// private Member findMember(String userName) { -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// queryWrapper.eq("username", userName).or().eq("mobile", userName); -// return this.getOne(queryWrapper); -// } -// -// @Override -// public Token autoRegister(ConnectAuthUser authUser) { -// if (CharSequenceUtil.isEmpty(authUser.getNickname())) { -// authUser.setNickname("临时昵称"); -// } -// if (CharSequenceUtil.isEmpty(authUser.getAvatar())) { -// authUser.setAvatar("https://i.loli.net/2020/11/19/LyN6JF7zZRskdIe.png"); -// } -// try { -// String username = UuidUtils.getUUID(); -// Member member = new Member(username, UuidUtils.getUUID(), authUser.getAvatar(), authUser.getNickname(), -// authUser.getGender() != null ? Convert.toInt(authUser.getGender().getCode()) : 0); -// -// // 生成 UserSig -// String userSig = generateUserSig(username); -// member.setUserSig(userSig); -// -// // 创建 IM 账号 -// boolean imAccountCreated = createTencentIMAccount(username, userSig); -// if (!imAccountCreated) { -// log.error("创建IM账号失败,用户名: {}", username); -// throw new ServiceException(ResultCode.ERROR, "创建IM账号失败"); -// } -// -// registerHandler(member); -// // 绑定登录方式 -// loginBindUser(member); -// return memberTokenGenerate.createToken(member, false); -// } catch (ServiceException e) { -// log.error("自动注册服务泡出异常:", e); -// throw e; -// } catch (Exception e) { -// log.error("自动注册异常:", e); -// throw new ServiceException(ResultCode.USER_AUTO_REGISTER_ERROR); -// } -// } -// -// @Override -// public Token autoRegister() { -// ConnectAuthUser connectAuthUser = this.checkConnectUser(); -// return this.autoRegister(connectAuthUser); -// } -// -// @Override -// public Token refreshToken(String refreshToken) { -// return memberTokenGenerate.refreshToken(refreshToken); -// } -// -// @Override -// public Token refreshStoreToken(String refreshToken) { -// return storeTokenGenerate.refreshToken(refreshToken); -// } -// -// @Override -// public Token mobilePhoneLogin(String mobilePhone) { -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// queryWrapper.eq("mobile", mobilePhone); -// Member member = this.baseMapper.selectOne(queryWrapper); -// // 如果手机号不存在则自动注册用户 -// if (member == null) { -// member = new Member(mobilePhone, UuidUtils.getUUID(), mobilePhone); -// -// // 直接设置默认密码 -// BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); -// member.setPassword(passwordEncoder.encode("123456")); -// -// registerHandler(member); -// log.info("手机号登录自动注册用户: {}, 默认密码: 123456", mobilePhone); -// } -// loginBindUser(member); -// return memberTokenGenerate.createToken(member, false); -// } -// -// /** -// * 注册方法抽象 -// * -// * @param member -// */ -// private void registerHandler(Member member) { -// member.setId(SnowFlake.getIdStr()); -// -// // 确保所有注册会员都使用默认密码123456 -// BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); -// String encodedPassword = passwordEncoder.encode("123456"); -// member.setPassword(encodedPassword); -// -// // 保存会员 -// this.save(member); -// String destination = rocketmqCustomProperties.getMemberTopic() + ":" + MemberTagsEnum.MEMBER_REGISTER.name(); -// rocketMQTemplate.asyncSend(destination, member, RocketmqSendCallbackBuilder.commonCallback()); -// } -// -// @Override -// public Member editOwn(MemberEditDTO memberEditDTO) { -// // 查询会员信息 -// Member member = this.findByUsername(Objects.requireNonNull(UserContext.getCurrentUser()).getUsername()); -// // 传递修改会员信息 -// BeanUtil.copyProperties(memberEditDTO, member); -// // 修改会员 -// this.updateById(member); -// return member; -// } -// -// @Override -// public Member modifyPass(String oldPassword, String newPassword) { -// AuthUser tokenUser = UserContext.getCurrentUser(); -// if (tokenUser == null) { -// throw new ServiceException(ResultCode.USER_NOT_LOGIN); -// } -// Member member = this.getById(tokenUser.getId()); -// // 判断旧密码输入是否正确 -// if (!new BCryptPasswordEncoder().matches(oldPassword, member.getPassword())) { -// throw new ServiceException(ResultCode.USER_OLD_PASSWORD_ERROR); -// } -// // 修改会员密码 -// LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); -// lambdaUpdateWrapper.eq(Member::getId, member.getId()); -// lambdaUpdateWrapper.set(Member::getPassword, new BCryptPasswordEncoder().encode(newPassword)); -// this.update(lambdaUpdateWrapper); -// return member; -// } -// -// @Override -// public Token register(String userName, String password, String mobilePhone, String userSig) { -// // 检测会员信息 -// checkMember(userName, mobilePhone); -// // 创建BCryptPasswordEncoder实例 -// BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); -// -//// 使用passwordEncoder对密码进行加密 -// String encodedPassword = passwordEncoder.encode("123456"); -// // 设置会员信息 -// Member member = new Member(userName, -// encodedPassword, -// mobilePhone); -// member.setUserSig(userSig); // 设置 UserSig -// // 注册成功后用户自动登录 -// registerHandler(member); -// Token token = memberTokenGenerate.createToken(member, false); -// return token; -// } -// -// @Override -// public boolean changeMobile(String mobile) { -// AuthUser tokenUser = Objects.requireNonNull(UserContext.getCurrentUser()); -// Member member = this.findByUsername(tokenUser.getUsername()); -// -// // 判断是否用户登录并且会员ID为当前登录会员ID -// if (!Objects.equals(tokenUser.getId(), member.getId())) { -// throw new ServiceException(ResultCode.USER_NOT_LOGIN); -// } -// // 修改会员手机号 -// LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); -// lambdaUpdateWrapper.eq(Member::getId, member.getId()); -// lambdaUpdateWrapper.set(Member::getMobile, mobile); -// return this.update(lambdaUpdateWrapper); -// } -// -// @Override -// public boolean resetByMobile(String uuid, String password) { -// String phone = cache.get(CachePrefix.FIND_MOBILE + uuid).toString(); -// // 根据手机号获取会员判定是否存在此会员 -// if (phone != null) { -// // 修改密码 -// LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); -// lambdaUpdateWrapper.eq(Member::getMobile, phone); -// lambdaUpdateWrapper.set(Member::getPassword, new BCryptPasswordEncoder().encode(password)); -// cache.remove(CachePrefix.FIND_MOBILE + uuid); -// return this.update(lambdaUpdateWrapper); -// } else { -// throw new ServiceException(ResultCode.USER_PHONE_NOT_EXIST); -// } -// -// } -// -// @Override -// public Member addMember(MemberAddDTO memberAddDTO) { -// -// // 检测会员信息 -// checkMember(memberAddDTO.getUsername(), memberAddDTO.getMobile()); -// -// // 添加会员 -// Member member = new Member(memberAddDTO.getUsername(), -// StringUtils.isEmpty(memberAddDTO.getPassword()) ? -// new BCryptPasswordEncoder().encode("123456") : // 如果密码为空,使用默认密码123456 -// new BCryptPasswordEncoder().encode(memberAddDTO.getPassword()), -// memberAddDTO.getMobile()); -// registerHandler(member); -// return member; -// } -// -// @Override -// public Member updateMember(ManagerMemberEditDTO managerMemberEditDTO) { -// // 判断是否用户登录并且会员ID为当前登录会员ID -// AuthUser tokenUser = UserContext.getCurrentUser(); -// if (tokenUser == null) { -// throw new ServiceException(ResultCode.USER_NOT_LOGIN); -// } -// // 过滤会员昵称敏感词 -// if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(managerMemberEditDTO.getNickName())) { -// managerMemberEditDTO.setNickName(SensitiveWordsFilter.filter(managerMemberEditDTO.getNickName())); -// } -// // 如果密码不为空则加密密码 -// if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(managerMemberEditDTO.getPassword())) { -// managerMemberEditDTO.setPassword(new BCryptPasswordEncoder().encode(managerMemberEditDTO.getPassword())); -// } -// // 查询会员信息 -// Member member = this.findByUsername(managerMemberEditDTO.getUsername()); -// // 传递修改会员信息 -// BeanUtil.copyProperties(managerMemberEditDTO, member); -// this.updateById(member); -// return member; -// } -// -// @Override -// public IPage getMemberPage(MemberSearchVO memberSearchVO, PageVO page) { -// QueryWrapper queryWrapper = Wrappers.query(); -// // 用户名查询 -// queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getUsername()), "m.username", -// memberSearchVO.getUsername()); -// // 用户名查询 -// queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getNickName()), "m.nick_name", -// memberSearchVO.getNickName()); -// // 按照电话号码查询 -// queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getMobile()), "m.mobile", -// memberSearchVO.getMobile()); -// -// // 根据exper和agent条件查询revenue_sharing -// if (memberSearchVO.getExper() != null && memberSearchVO.getExper() == 1) { -// queryWrapper.eq("rs.id", 3); -// } -// if (memberSearchVO.getAgent() != null && memberSearchVO.getAgent() == 1) { -// queryWrapper.eq("rs.id", 2); -// } -// -// // 时间倒叙排序 -// queryWrapper.orderByDesc("m.create_time"); -// queryWrapper.orderByDesc("ea.created_at"); -// -// IPage memberPage = this.baseMapper.pageByMemberVO(PageUtil.initPage(page), queryWrapper); -// -// // 查询分账比例 -// for (MemberVO memberVO : memberPage.getRecords()) { -// if (memberVO.getAgent() != null && memberVO.getAgent() == 1) { -// // 代理 -// RevenueSharing sharing = revenueSharingMapper.selectByRole("代理"); -// if (sharing != null) memberVO.setPercentage(sharing.getPercentage()); -// } else if (memberVO.getExpert() != null && memberVO.getExpert() == 1) { -// // 达人 -// RevenueSharing sharing = revenueSharingMapper.selectByRole("达人"); -// if (sharing != null) memberVO.setPercentage(sharing.getPercentage()); -// } -// } -// return memberPage; -// } -// @Override -// @PointLogPoint -// @Transactional(rollbackFor = Exception.class) -// public Boolean updateMemberPoint(Long point, String type, String memberId, String content) { -// // 获取当前会员信息 -// Member member = this.getById(memberId); -// if (member != null) { -// // 积分变动后的会员积分 -// long currentPoint; -// // 会员总获得积分 -// long totalPoint = member.getTotalPoint(); -// // 如果增加积分 -// if (type.equals(PointTypeEnum.INCREASE.name())) { -// currentPoint = member.getPoint() + point; -// // 如果是增加积分 需要增加总获得积分 -// totalPoint = totalPoint + point; -// } -// // 否则扣除积分 -// else { -// currentPoint = member.getPoint() - point < 0 ? 0 : member.getPoint() - point; -// } -// member.setPoint(currentPoint); -// member.setTotalPoint(totalPoint); -// boolean result = this.updateById(member); -// if (result) { -// // 发送会员消息 -// MemberPointMessage memberPointMessage = new MemberPointMessage(); -// memberPointMessage.setPoint(point); -// memberPointMessage.setType(type); -// memberPointMessage.setMemberId(memberId); -// String destination = rocketmqCustomProperties.getMemberTopic() + ":" -// + MemberTagsEnum.MEMBER_POINT_CHANGE.name(); -// rocketMQTemplate.asyncSend(destination, memberPointMessage, -// RocketmqSendCallbackBuilder.commonCallback()); -// return true; -// } -// return false; -// -// } -// throw new ServiceException(ResultCode.USER_NOT_EXIST); -// } -// -// /** -// * 更新会员状态 -// * 支持设置封禁时长 -// * -// * @param memberIds 会员ID列表 -// * @param disabled 是否禁用 -// * @param banDays 封禁天数,null表示永久封禁 -// * @return 操作结果代码 -// */ -// @Override -// public ResultCode updateMemberStatus(List memberIds, Boolean disabled, Integer banDays) { -// if (memberIds == null || memberIds.isEmpty()) { -// return ResultCode.USER_NOT_EXIST; -// } -// -// try { -// UpdateWrapper updateWrapper = new UpdateWrapper<>(); -// updateWrapper.in("id", memberIds); -// -// if (Boolean.TRUE.equals(disabled)) { -// // 计算解封时间 -// Date banEndTime = null; -// if (banDays != null && banDays > 0) { -// // 使用 Calendar 设置解封日期 -// Calendar calendar = Calendar.getInstance(); -// calendar.add(Calendar.DAY_OF_MONTH, banDays); -// banEndTime = calendar.getTime(); -// } -// // 设置封禁状态和解封时间 -// updateWrapper.set("delete_flag", true); -// updateWrapper.set("ban_end_time", banEndTime); -// -// // 记录操作日志 -// log.info("封禁会员: memberIds={}, banDays={}, banEndTime={}", -// memberIds, banDays, banEndTime); -// } else { -// // 解除封禁 -// updateWrapper.set("delete_flag", false); -// updateWrapper.set("ban_end_time", null); -// -// // 记录操作日志 -// log.info("解封会员: memberIds={}", memberIds); -// } -// -// boolean result = this.update(updateWrapper); -// -// // 如果更新失败,检查记录是否存在 -// if (!result) { -// long count = this.count(new QueryWrapper().in("id", memberIds)); -// if (count == 0) { -// log.warn("更新会员状态失败: 未找到指定会员, memberIds={}", memberIds); -// return ResultCode.USER_NOT_EXIST; -// } else { -// log.warn("更新会员状态失败: 更新操作失败, memberIds={}", memberIds); -// return ResultCode.ERROR; -// } -// } -// -// return ResultCode.SUCCESS; -// } catch (Exception e) { -// log.error("更新会员状态异常", e); -// return ResultCode.ERROR; -// } -// } -// -// /** -// * 定时任务:检查并解除到期的封禁账号 -// * 每天凌晨执行 -// */ -// @Scheduled(cron = "0 0 0 * * ?") -// public void checkAndUnbanMembers() { -// log.info("开始执行会员自动解封任务"); -// Date now = new Date(); -// -// // 查找到期需要解封的会员数量 -// QueryWrapper countWrapper = new QueryWrapper<>(); -// countWrapper.eq("disabled", true) -// .isNotNull("ban_end_time") -// .le("ban_end_time", now); -// long count = this.count(countWrapper); -// -// if (count > 0) { -// // 解除封禁 -// UpdateWrapper updateWrapper = new UpdateWrapper<>(); -// updateWrapper.set("disabled", false) -// .set("ban_end_time", null) -// .eq("disabled", true) -// .isNotNull("ban_end_time") -// .le("ban_end_time", now); -// -// boolean result = this.update(updateWrapper); -// log.info("会员自动解封任务完成,解封会员数量:{},处理结果:{}", count, result); -// } else { -// log.info("会员自动解封任务完成,无需要解封的会员"); -// } -// } -// -// /** -// * 根据手机号获取会员 -// * -// * @param mobilePhone 手机号 -// * @return 会员 -// */ -// private Long findMember(String mobilePhone, String userName) { -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// queryWrapper.eq("mobile", mobilePhone).or().eq("username", userName); -// return this.baseMapper.selectCount(queryWrapper); -// } -// -// /** -// * 获取cookie中的联合登录对象 -// * -// * @param uuid uuid -// * @param type 状态 -// * @return cookie中的联合登录对象 -// */ -// private ConnectAuthUser getConnectAuthUser(String uuid, String type) { -// Object context = cache.get(ConnectService.cacheKey(type, uuid)); -// if (context != null) { -// return (ConnectAuthUser) context; -// } -// return null; -// } -// -// /** -// * 成功登录,则检测cookie中的信息,进行会员绑定 -// * -// * @param member 会员 -// */ -// private Token loginBindUser(Member member) { -// // 检查该账号是否已有token -// // 先获取所有token对象 -// Object[] keyObjects = cache.keys("{ACCESS_TOKEN}_*").toArray(); -// log.info("Looking for token objects"); -// log.info("Found keys: {}", String.join(", ", Arrays.stream(keyObjects).map(Object::toString).collect(Collectors.toList()))); -// -// String accessToken = null; -// for (Object keyObj : keyObjects) { -// String key = keyObj.toString(); -// String tokenObject = cache.getString(key); -// if (tokenObject != null) { -// try { -// Token token = new Gson().fromJson(tokenObject, Token.class); -// if (token != null && member.getUsername().equals(token.getUsername())) { -// accessToken = token.getAccessToken(); -// log.info("Found access token: {}", accessToken); -// break; -// } -// } catch (Exception e) { -// log.error("Error parsing token object: {}", tokenObject, e); -// } -// } -// } -// -// if (accessToken != null) { -// try { -// // 直接清理token相关的缓存 -// cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix() + member.getUsername()); -// cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER) + accessToken); -// cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix() + accessToken); -// -// // 清理refresh token -// String refreshToken = cache.getString(CachePrefix.REFRESH_TOKEN.getPrefix(UserEnums.MEMBER) + accessToken); -// if (refreshToken != null) { -// cache.remove(CachePrefix.REFRESH_TOKEN.getPrefix(UserEnums.MEMBER) + refreshToken); -// } -// -// log.info("用户[{}]登录系统,清理旧token缓存成功", member.getUsername()); -// } catch (Exception e) { -// log.error("清理用户[{}]token缓存时出错", member.getUsername(), e); -// } -// } -// -// // 获取cookie存储的信息 -// String uuid = CookieUtil.getCookie(ConnectService.CONNECT_COOKIE, ThreadContextHolder.getHttpRequest()); -// String connectType = CookieUtil.getCookie(ConnectService.CONNECT_TYPE, ThreadContextHolder.getHttpRequest()); -// // 如果联合登陆存储了信息 -// if (CharSequenceUtil.isNotEmpty(uuid) && CharSequenceUtil.isNotEmpty(connectType)) { -// try { -// // 获取信息 -// ConnectAuthUser connectAuthUser = getConnectAuthUser(uuid, connectType); -// if (connectAuthUser == null) { -// return null; -// } -// Connect connect = connectService.queryConnect( -// ConnectQueryDTO.builder().unionId(connectAuthUser.getUuid()).unionType(connectType).build()); -// if (connect == null) { -// connect = new Connect(member.getId(), connectAuthUser.getUuid(), connectType); -// connectService.save(connect); -// } -// } catch (ServiceException e) { -// throw e; -// } catch (Exception e) { -// log.error("绑定第三方联合登陆失败:", e); -// } finally { -// // 联合登陆成功与否,都清除掉cookie中的信息 -// CookieUtil.delCookie(ConnectService.CONNECT_COOKIE, ThreadContextHolder.getHttpResponse()); -// CookieUtil.delCookie(ConnectService.CONNECT_TYPE, ThreadContextHolder.getHttpResponse()); -// } -// } -// return null; -// } -// -// /** -// * 检测是否可以绑定第三方联合登陆 返回null原因 包含原因1:redis中已经没有联合登陆信息 2:已绑定其他账号 -// * -// * @return 返回对象则代表可以进行绑定第三方会员,返回null则表示联合登陆无法继续 -// */ -// private ConnectAuthUser checkConnectUser() { -// // 获取cookie存储的信息 -// String uuid = CookieUtil.getCookie(ConnectService.CONNECT_COOKIE, ThreadContextHolder.getHttpRequest()); -// String connectType = CookieUtil.getCookie(ConnectService.CONNECT_TYPE, ThreadContextHolder.getHttpRequest()); -// -// // 如果联合登陆存储了信息 -// if (CharSequenceUtil.isNotEmpty(uuid) && CharSequenceUtil.isNotEmpty(connectType)) { -// // 枚举 联合登陆类型获取 -// ConnectAuthEnum authInterface = ConnectAuthEnum.valueOf(connectType); -// -// ConnectAuthUser connectAuthUser = getConnectAuthUser(uuid, connectType); -// if (connectAuthUser == null) { -// throw new ServiceException(ResultCode.USER_OVERDUE_CONNECT_ERROR); -// } -// // 检测是否已经绑定过用户 -// Connect connect = connectService.queryConnect( -// ConnectQueryDTO.builder().unionType(connectType).unionId(connectAuthUser.getUuid()).build()); -// // 没有关联则返回true,表示可以继续绑定 -// if (connect == null) { -// connectAuthUser.setConnectEnum(authInterface); -// return connectAuthUser; -// } else { -// throw new ServiceException(ResultCode.USER_CONNECT_BANDING_ERROR); -// } -// } else { -// throw new ServiceException(ResultCode.USER_CONNECT_NOT_EXIST_ERROR); -// } -// } -// -// @Override -// public long getMemberNum(MemberSearchVO memberSearchVO) { -// QueryWrapper queryWrapper = Wrappers.query(); -// // 用户名查询 -// queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getUsername()), "username", -// memberSearchVO.getUsername()); -// // 按照电话号码查询 -// queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getMobile()), "mobile", -// memberSearchVO.getMobile()); -// // 按照状态查询 -// queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled", -// memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0); -// queryWrapper.orderByDesc("create_time"); -// return this.count(queryWrapper); -// } -// -// /** -// * 获取指定会员数据 -// * -// * @param columns 指定获取的列 -// * @param memberIds 会员ids -// * @return 指定会员数据 -// */ -// @Override -// public List> listFieldsByMemberIds(String columns, List memberIds) { -// return this.listMaps(new QueryWrapper().select(columns).in(memberIds != null && !memberIds.isEmpty(), -// "id", memberIds)); -// } -// -// /** -// * 登出 -// */ -// @Override -// public void logout(UserEnums userEnums) { -// String currentUserToken = UserContext.getCurrentUserToken(); -// if (CharSequenceUtil.isNotEmpty(currentUserToken)) { -// AuthUser authUser = UserContext.getCurrentUser(); -// if (authUser != null) { -// try { -// // 清除用户名对应的token缓存,确保单一登录设备失效 -// cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix() + authUser.getUsername()); -// -// // 清除token关联的其他缓存 -// cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums) + currentUserToken); -// cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix() + currentUserToken); -// -// log.info("用户[{}]登出系统,清理token缓存成功", authUser.getUsername()); -// } catch (Exception e) { -// log.error("清理用户[{}]token缓存时出错", authUser.getUsername(), e); -// } -// } else { -// cache.remove(CachePrefix.ACCESS_TOKEN.getPrefix(userEnums) + currentUserToken); -// } -// } -// } -// -//// @Override -//// public void cancellation() { -//// -//// AuthUser tokenUser = UserContext.getCurrentUser(); -//// if (tokenUser == null) { -//// throw new ServiceException(ResultCode.USER_NOT_LOGIN); -//// } -//// Member member = this.getById(tokenUser.getId()); -//// //删除联合登录 -//// connectService.deleteByMemberId(member.getId()); -//// //混淆用户信息 -//// this.confusionMember(member); -//// } -//// -//// -//// /** -//// * 混淆之前的会员信息 -//// * -//// * @param member -//// */ -//// private void confusionMember(Member member) { -//// member.setUsername(UuidUtils.getUUID()); -//// member.setMobile(UuidUtils.getUUID() + member.getMobile()); -//// member.setNickName("用户已注销"); -//// member.setDisabled(false); -//// this.updateById(member); -//// } -// /** -// * 获取所有会员的手机号 -// * -// * @return 所有会员的手机号 -// */ -// @Override -// public List getAllMemberMobile() { -// return this.baseMapper.getAllMemberMobile(); -// } -// -// /** -// * 更新会员登录时间为最新时间 -// * -// * @param memberId 会员id -// * @return 是否更新成功 -// */ -// @Override -// public boolean updateMemberLoginTime(String memberId) { -// LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); -// updateWrapper.eq(Member::getId, memberId); -// updateWrapper.set(Member::getLastLoginDate, new Date()); -// return this.update(updateWrapper); -// } -// -// @Override -// public MemberVO getMember(String id) { -// return new MemberVO(this.getById(id)); -// } -// -// /** -// * 检测会员 -// * -// * @param userName 会员名称 -// * @param mobilePhone 手机号 -// */ -// private void checkMember(String userName, String mobilePhone) { -// // 判断手机号是否存在 -// if (findMember(userName, mobilePhone) > 0) { -// throw new ServiceException(ResultCode.USER_EXIST); -// } -// } -// -// @Override -// public Token registerNew(String userName, String password, String mobilePhone, String userSig) { -// // 检测会员信息 -// checkMember(userName, mobilePhone); -// // 设置会员信息 -// Member member = new Member(userName, -// StringUtils.isEmpty(password) ? new BCryptPasswordEncoder().encode("123456") : new BCryptPasswordEncoder().encode(password), -// mobilePhone); -// member.setUserSig(userSig); // 设置 UserSig -// member.setExpert(0); -// // 注册成功后用户自动登录 -// registerHandler(member); -// // 创建商城系统账号,获取短视频系统token -// String tikUser = registerFromShop(mobilePhone, member.getId()); -// if (StringUtils.isNotBlank(tikUser)) { -// Token token = memberTokenGenerate.createToken(member, false); -// token.setTikUser(tikUser); -// return token; -// } -// return null; -// } -// -// @Override -// public Token usernameLoginNew(String username, String password) { -// Member member = this.findMember(username); -// // 判断用户是否存在 -// if (member == null || !member.getDisabled()) { -// throw new ServiceException(ResultCode.USER_NOT_EXIST); -// } -// // 判断密码是否输入正确 -// if (!new BCryptPasswordEncoder().matches(password, member.getPassword())) { -// throw new ServiceException(ResultCode.USER_PASSWORD_ERROR); -// } -// loginBindUser(member); -// // 获取短视频系统账户信息 -// String tikUser = getUserFromShop(member.getId()); -// if (StringUtils.isNotBlank(tikUser)) { -// Token token = memberTokenGenerate.createToken(member, false); -// token.setTikUser(tikUser); -// return token; -// } -// return null; -// } -// -// @Override -// @SystemLogPoint(description = "会员登录", customerLog = "'会员登录请求:'+#mobilePhone") -// public Token mobilePhoneLoginNew(String mobilePhone) throws JSONException { -// try { -// log.info("手机号登录开始: {}", mobilePhone); -// -// // 1. 查询会员 -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// queryWrapper.eq("mobile", mobilePhone); -// Member member = this.baseMapper.selectOne(queryWrapper); -// -// // 2. 处理会员不存在的情况 -// if (member == null) { -// log.info("用户不存在,开始注册流程: {}", mobilePhone); -// member = registerNewMember(mobilePhone); -// // 记录注册日志 -// log.info("新用户注册成功: {}, 用户ID: {}", mobilePhone, member.getId()); -// } else { -// // 记录登录日志 -// log.info("用户登录成功: {}, 用户ID: {}", mobilePhone, member.getId()); -// } -// -// // 3. 检查会员状态 -//// if (!member.getDisabled()) { -//// log.warn("用户已被禁用: {}", mobilePhone); -//// throw new ServiceException(ResultCode.ERROR); -//// } -// -// // 4. 生成或获取 UserSig -// String userSig = member.getUserSig(); -// if (StringUtils.isEmpty(userSig)) { -// userSig = generateUserSig(mobilePhone); -// // 更新会员的 UserSig -// UpdateWrapper updateWrapper = new UpdateWrapper<>(); -// updateWrapper.eq("mobile", mobilePhone); -// updateWrapper.set("user_sig", userSig); -// this.update(updateWrapper); -// member.setUserSig(userSig); -// log.info("更新用户UserSig: {}", mobilePhone); -// } -// -// // 5. 获取短视频系统token -// String tikUser = null; -// try { -// tikUser = getUserFromShop(member.getId()); -// if (StringUtils.isEmpty(tikUser)) { -// log.info("尝试注册商城账号: {}", mobilePhone); -// tikUser = registerFromShop(mobilePhone, member.getId()); -// log.info("商城账号注册成功: {}", mobilePhone); -// } -// } catch (Exception e) { -// log.error("获取短视频系统token失败", e); -// // 这里不抛出异常,允许登录继续 -// } -// -// // 6. 生成登录token -// loginBindUser(member); -// Token token = memberTokenGenerate.createToken(member, false); -// if (StringUtils.isNotBlank(tikUser)) { -// token.setTikUser(tikUser); -// } -// -// log.info("登录流程完成: {}", mobilePhone); -// return token; -// -// } catch (ServiceException e) { -// log.error("登录失败: {}, 错误: {}", mobilePhone, e.getMessage()); -// throw e; -// } catch (Exception e) { -// log.error("登录异常: {}", mobilePhone, e); -// throw new ServiceException(ResultCode.ERROR); -// } -// } -// -// /** -// * 手机号注册新会员 -// */ -// private Member registerNewMember(String mobilePhone) { -// try { -// // 1. 生成 UserSig -// String userSig = generateUserSig(mobilePhone); -// -// // 2. 创建腾讯云IM账号 -// boolean imAccountCreated = createTencentIMAccount(mobilePhone, userSig); -// if (!imAccountCreated) { -// log.error("创建IM账号失败,手机号: {}", mobilePhone); -// throw new ServiceException(ResultCode.ERROR, "创建IM账号失败"); -// } -// -// // 3. 创建会员账号 - 使用默认密码123456 -// Member member = new Member(mobilePhone, UuidUtils.getUUID(), mobilePhone); -// member.setUserSig(userSig); -// member.setDisabled(true); // 设置账号可用 -// -// // 强制设置默认密码123456 -// BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); -// member.setPassword(passwordEncoder.encode("123456")); -// -// registerHandler(member); -// -// log.info("新会员注册成功: {}, 默认密码: 123456", mobilePhone); -// return member; -// } catch (ServiceException e) { -// log.error("注册新会员失败: {}, 错误: {}", mobilePhone, e.getMessage()); -// throw e; -// } catch (Exception e) { -// log.error("注册新会员异常: {}", mobilePhone, e); -// throw new ServiceException(ResultCode.ERROR, "注册失败,请稍后重试"); -// } -// } -// -// /** -// * 生成UserSig -// */ -// private String generateUserSig(String userId) { -// TLSSigAPIv2 tlsSigAPIv2 = new TLSSigAPIv2(SDKAPPID, SECRETKEY); -// long expire = TimeUnit.DAYS.toSeconds(365 * 50); // 50年有效期 -// return tlsSigAPIv2.genUserSig(userId, expire); -// } -// -// /** -// * 创建腾讯云IM账号 -// */ -// private boolean createTencentIMAccount(String userId, String userSig) { -// try { -// String random = String.valueOf(System.currentTimeMillis()); -// -// // 构建请求体 -// JSONObject requestBody = new JSONObject(); -// requestBody.put("UserID", userId); -// requestBody.put("Nick", userId); -// requestBody.put("FaceUrl", "http://www.qq.com"); -// -// // 构建URL - 使用管理员账号(administrator)而不是用户ID来生成签名 -// String urlString = String.format( -// "https://console.tim.qq.com/v4/im_open_login_svc/account_import" + -// "?sdkappid=%s&identifier=%s&usersig=%s&random=%s&contenttype=json", -// SDKAPPID, -// "administrator", // 使用管理员账号 -// generateAdminUserSig(), // 使用管理员的UserSig -// random); -// -// // 创建HTTP客户端 -// OkHttpClient client = new OkHttpClient.Builder() -// .connectTimeout(10, TimeUnit.SECONDS) -// .writeTimeout(10, TimeUnit.SECONDS) -// .readTimeout(10, TimeUnit.SECONDS) -// .build(); -// -// // 发送请求 -// Request request = new Request.Builder() -// .url(urlString) -// .post(RequestBody.create(MediaType.get("application/json; charset=utf-8"), -// requestBody.toString())) -// .build(); -// -// try (Response response = client.newCall(request).execute()) { -// if (!response.isSuccessful()) { -// log.error("创建IM账号失败: {}, 状态码: {}", userId, response.code()); -// return false; -// } -// -// String responseBody = response.body().string(); -// JSONObject jsonResponse = new JSONObject(responseBody); -// int errorCode = jsonResponse.getInt("ErrorCode"); -// -// if (errorCode == 0) { -// log.info("创建IM账号成功: {}", userId); -// return true; -// } else { -// log.error("创建IM账号失败: {}, 错误码: {}, 错误信息: {}", -// userId, errorCode, jsonResponse.optString("ErrorInfo")); -// return false; -// } -// } -// } catch (Exception e) { -// log.error("创建IM账号异常: {}", userId, e); -// return false; -// } -// } -// -// /** -// * 生成管理员UserSig -// */ -// private String generateAdminUserSig() { -// TLSSigAPIv2 tlsSigAPIv2 = new TLSSigAPIv2(SDKAPPID, SECRETKEY); -// long expire = TimeUnit.DAYS.toSeconds(180); // 180天有效期 -// return tlsSigAPIv2.genUserSig("administrator", expire); -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void endsetMemberAsAgent(String memberId, String region) { -// // 获取会员信息 -// Member member = this.getById(memberId); -// if (member == null) { -// throw new ServiceException(ResultCode.USER_NOT_EXIST); -// } -// -// // 设置为非代理人 -// member.setAgent(0); -// // 当 region 为 null 时,清除区域信息 -// member.setRegion(region); -// -// // 更新会员信息 -// if (!this.updateById(member)) { -// throw new ServiceException(ResultCode.ERROR); -// } -// } -// @Override -// @Transactional(rollbackFor = Exception.class) -// public void setMemberAsAgent(String memberId, String region) { -// // 获取会员信息 -// Member member = this.getById(memberId); -// if (member == null) { -// throw new ServiceException(ResultCode.USER_NOT_EXIST); -// } -// -// // 检查是否为达人 -// if (member.getExpert() != null && member.getExpert() == 1) { -// throw new ServiceException(ResultCode.EXPERT_EXIST); -// } -// -// // 检查该区域是否已有代理人 -// Integer count = Math.toIntExact(this.count(new LambdaQueryWrapper() -// .eq(Member::getRegion, region) -// .eq(Member::getAgent, 1))); -// if (count > 0) { -// throw new ServiceException(ResultCode.REGION_ALREADY_HAS_AGENT); -// } -// -// // 设置为代理人 -// member.setAgent(1); -// member.setRegion(region); -// -// // 更新会员信息 -// if (!this.updateById(member)) { -// throw new ServiceException(ResultCode.ERROR); -// } -// } -// -// @Override -// @Transactional(rollbackFor = Exception.class) -// public Member updateMemberS(Member member) { -// try { -// // 1. 参数校验 -// if (member == null || StringUtils.isEmpty(member.getId())) { -// throw new ServiceException(ResultCode.PARAMS_ERROR); -// } -// -// // 2. 获取原会员信息 -// Member oldMember = this.getById(member.getId()); -// if (oldMember == null) { -// throw new ServiceException(ResultCode.USER_NOT_EXIST); -// } -// -// // 3. 更新会员信息 -// LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); -// updateWrapper.eq(Member::getId, member.getId()); -// -// // 只更新非空字段 -// -// updateWrapper.set(Member::getNickName, member.getNickName()); -// -// -// updateWrapper.set(Member::getUsername, member.getUsername()); -// -// -// updateWrapper.set(Member::getSex, member.getSex()); -// -// -// updateWrapper.set(Member::getBirthday, member.getBirthday()); -// -// -// updateWrapper.set(Member::getFace, member.getFace()); -// -// -// updateWrapper.set(Member::getRegionId, member.getRegionId()); -// -// updateWrapper.set(Member::getRegion, member.getRegion()); -// -// -// // 4. 执行更新 -// boolean updated = this.update(updateWrapper); -// if (!updated) { -// throw new ServiceException(ResultCode.ERROR); -// } -// -// // 5. 返回更新后的会员信息 -// return this.getById(member.getId()); -// } catch (ServiceException e) { -// log.error("更新会员信息失败: {}", e.getMessage()); -// throw e; -// } catch (Exception e) { -// log.error("更新会员信息异常", e); -// throw new ServiceException(ResultCode.ERROR); -// } -// } -// -// /** -// * 设置默认密码(123456) -// * -// * @param member 会员对象 -// */ -// private void setDefaultPassword(Member member) { -// // 使用BCrypt加密默认密码123456 -// String encodedPassword = new BCryptPasswordEncoder().encode("123456"); -// member.setPassword(encodedPassword); -// } -// -// /** -// * 验证密码格式是否正确 -// * -// * @param password 密码 -// * @return 是否符合BCrypt格式 -// */ -// private boolean isValidBCryptPassword(String password) { -// return password != null && password.startsWith("$2a$") || password.startsWith("$2b$") || password.startsWith("$2y$"); -// } -// -// @Override -// public void updateRevenueSharingPercentage(String id, String percentage) { -// if (id == null || percentage == null) { -// throw new ServiceException("参数不能为空"); -// } -// int updated = revenueSharingMapper.updatePercentageById(id, percentage); -// if (updated == 0) { -// throw new ServiceException("更新失败,未找到对应分账角色"); -// } -// } -} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/VerificationServiceImpl.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/VerificationServiceImpl.java deleted file mode 100644 index 72142ef46..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/VerificationServiceImpl.java +++ /dev/null @@ -1,228 +0,0 @@ -package com.wzj.soopin.auth.service.impl; - - -import com.wzj.soopin.auth.domain.dto.VerificationDTO; -import com.wzj.soopin.auth.domain.dto.VerificationSource; -import com.wzj.soopin.auth.domain.dto.entity.enums.VerificationEnums; -import com.wzj.soopin.auth.service.IVerificationService; -import com.wzj.soopin.auth.service.IVerificationSourceService; -import com.wzj.soopin.auth.vo.SerializableStream; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.constant.CachePrefix; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.redis.redis.RedisCache; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import java.io.InputStream; -import java.net.URL; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.concurrent.TimeUnit; - -/** - * 认证处理类 - * - * @author Chopper - * @version v1.0 - * 2020-11-17 14:59 - */ -@Slf4j -@Component -public class VerificationServiceImpl { - - @Autowired - private IVerificationSourceService verificationSourceService; - -// -// @Autowired -// private VerificationCodeProperties verificationCodeProperties; -// -// -// @Autowired -// private RedisCache cache; -// -// /** -// * 创建校验 -// * -// * @return 验证码参数 -// */ -// @Override -// public Map createVerification(VerificationEnums verificationEnums, String uuid) { -//// if (uuid == null) { -//// throw new ServiceException(ResultCode.ILLEGAL_REQUEST_ERROR); -//// } -// -// // 添加日志 -// log.info("开始生成验证码 - uuid: {}, type: {}", uuid, verificationEnums); -// -// // 清除可能存在的旧的验证信息 -// String oldKey = cacheKey(verificationEnums, uuid); -// String oldResult = cacheResult(verificationEnums, uuid); -// cache.deleteObject(oldKey); -// cache.deleteObject(oldResult); -// log.info("已清除旧验证码 - oldKey: {}, oldResult: {}", oldKey, oldResult); -// -// //获取验证码配置 -// VerificationDTO verificationDTO = verificationSourceService.getVerificationCache(); -// log.info("获取到验证码配置 - resources: {}, sliders: {}", -// verificationDTO.getVerificationResources().size(), -// verificationDTO.getVerificationSlider().size()); -// -// List verificationResources = verificationDTO.getVerificationResources(); -// List verificationSlider = verificationDTO.getVerificationSlider(); -// -// Random random = new Random(); -// //随机选择需要切的图下标 -// int resourceNum = random.nextInt(verificationResources.size()); -// //随机选择剪切模版下标 -// int sliderNum = random.nextInt(verificationSlider.size()); -// -// //随机选择需要切的图片地址 -// String originalResource = verificationResources.get(resourceNum).getResource(); -// //随机选择剪切模版图片地址 -// String sliderResource = verificationSlider.get(sliderNum).getResource(); -// // 干扰块 -// String interfereResource = verificationSlider.get(sliderNum == verificationSlider.size() - 1 ? -// sliderNum - 1 : sliderNum + 1).getResource(); -// -// try { -// //获取缓存中的资源 -// SerializableStream originalFile = getInputStream(originalResource); -// SerializableStream sliderFile = getInputStream(sliderResource); -// SerializableStream interfereSliderFile = verificationCodeProperties.getInterfereNum() > 0 ? getInputStream(interfereResource) : null; -// //生成数据 -// Map resultMap = SliderImageUtil.pictureTemplatesCut( -// sliderFile, interfereSliderFile, originalFile, -// verificationCodeProperties.getWatermark(), verificationCodeProperties.getInterfereNum()); -// -// // 延长缓存时间到5分钟 -// int effectiveTime = (int) Math.max(verificationCodeProperties.getEffectiveTime(), 1000); -// -// //生成验证参数 -// String cacheKeyStr = cacheKey(verificationEnums, uuid); -// Object randomX = resultMap.get("randomX"); -// cache.setCacheObject(cacheKeyStr, randomX, effectiveTime, TimeUnit.MILLISECONDS); -// -// // 添加详细日志 -// log.info("验证码生成成功 - Key: {}, RandomX: {}, EffectiveTime: {}, ConfigTime: {}", -// cacheKeyStr, randomX, effectiveTime, verificationCodeProperties.getEffectiveTime()); -// -// // 验证缓存是否写入成功 -// Object cachedValue = cache.getCacheObject(cacheKeyStr); -// log.info("缓存写入验证 - Key: {}, CachedValue: {}", cacheKeyStr, cachedValue); -// -// resultMap.put("key", cacheKeyStr); -// resultMap.put("effectiveTime", effectiveTime); -// resultMap.remove("randomX"); -// return resultMap; -// } catch (ServiceException e) { -// log.error("验证码生成服务异常 - \"uuid\": {}, type: {}", uuid, verificationEnums, e); -// throw e; -// } catch (Exception e) { -// log.error("验证码生成异常 - uuid: {}, type: {}", uuid, verificationEnums, e); -// throw new ServiceException(ResultCode.ERROR); -// } -// } -// -// /** -// * 根据网络地址,获取源文件 -// * 这里简单说一下,这里是将不可序列化的inputstream序列化对象,存入redis缓存 -// * -// * @param originalResource -// * @return -// */ -// private SerializableStream getInputStream(String originalResource) throws Exception { -// -// Object object = cache.get(CachePrefix.VERIFICATION_IMAGE.getPrefix() + originalResource); -// if (object != null) { -// return (SerializableStream) object; -// } -// if (StringUtils.isNotEmpty(originalResource)) { -// URL url = new URL(originalResource); -// InputStream inputStream = url.openStream(); -// SerializableStream serializableStream = new SerializableStream(inputStream); -// cache.put(CachePrefix.VERIFICATION_IMAGE.getPrefix() + originalResource, serializableStream); -// return serializableStream; -// } -// return null; -// } -// -// /** -// * 预校验图片 用于前端回显 -// * -// * @param xPos X轴移动距离 -// * @param verificationEnums 验证key -// * @return 验证是否成功 -// */ -// @Override -// public boolean preCheck(Integer xPos, String uuid, VerificationEnums verificationEnums) { -// String key = cacheKey(verificationEnums, uuid); -// Integer randomX = (Integer) cache.get(key); -// -// // 添加调试日志 -// log.debug("验证码预校验 - Key: {}, ExpectedPos: {}, ActualPos: {}", key, randomX, xPos); -// -// if (randomX == null) { -// log.warn("验证码已过期或不存在 - Key: {}", key); -// throw new ServiceException(ResultCode.VERIFICATION_CODE_INVALID); -// } -// -// //验证结果正确 && 删除标记成功 -// if (Math.abs(randomX - xPos) < verificationCodeProperties.getFaultTolerant()) { -// String resultKey = cacheResult(verificationEnums, uuid); -// // 设置验证结果的有效期为60秒 -// cache.put(resultKey, true, 6000L); -// cache.remove(key); -// log.debug("验证码校验成功 - Key: {}, ResultKey: {}", key, resultKey); -// return true; -// } -// createVerification(verificationEnums, uuid); -// log.debug("验证码校验失败 - Key: {}, 误差: {}", key, Math.abs(randomX - xPos)); -// throw new ServiceException(ResultCode.VERIFICATION_ERROR); -// } -// -// /** -// * 验证码校验 -// * -// * @param uuid 用户标识 -// * @param verificationEnums 验证key -// * @return 验证是否成功 -// */ -// @Override -// public boolean check(String uuid, VerificationEnums verificationEnums) { -// String resultKey = cacheResult(verificationEnums, uuid); -// Boolean result = (Boolean) cache.get(resultKey); -// -// // 添加调试日志 -// log.debug("验证结果检查 - Key: {}, Result: {}", resultKey, result); -// -// if (Boolean.TRUE.equals(result)) { -// // 验证通过后,立即删除验证结果,防止重复使用 -// cache.remove(resultKey); -// return true; -// } -// -// // 如果验证结果不存在或已过期,抛出异常 -// log.warn("验证码已失效 - Key: {}", resultKey); -// throw new ServiceException(ResultCode.VERIFICATION_CODE_INVALID); -// } - - /** - * 生成缓存key 记录缓存需要验证的内容 - */ - public static String cacheKey(VerificationEnums verificationEnums, String uuid) { - return CachePrefix.VERIFICATION_KEY.getPrefix() + verificationEnums.name() + "_" + "wzj666"; - } - - /** - * 生成缓存key 记录缓存验证的结果 - */ - public static String cacheResult(VerificationEnums verificationEnums, String uuid) { - return CachePrefix.VERIFICATION_RESULT.getPrefix() + verificationEnums.name() + "_" + "wzj666"; - } - -} - diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/VerificationSourceServiceImpl.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/VerificationSourceServiceImpl.java deleted file mode 100644 index d0e566ee7..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/service/impl/VerificationSourceServiceImpl.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.wzj.soopin.auth.service.impl; - -import com.wzj.soopin.auth.domain.dto.VerificationDTO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -/** - * 验证码资源维护 业务层实现 - * - * @author Chopper - * @since 2020/11/17 3:48 下午 - */ -@Service -public class VerificationSourceServiceImpl -// extends ServiceImpl implements VerificationSourceService -{ - -// @Autowired -// private Cache cache; -// -// @Override -// public VerificationDTO initCache() { -// List dbList = this.list(); -// List resourceList = new ArrayList<>(); -// List sliderList = new ArrayList<>(); -// for (VerificationSource item : dbList) { -// if (item.getType().equals(VerificationSourceEnum.RESOURCE.name())) { -// resourceList.add(item); -// } else if (item.getType().equals(VerificationSourceEnum.SLIDER.name())) { -// sliderList.add(item); -// } -// } -// VerificationDTO verificationDTO = new VerificationDTO(); -// verificationDTO.setVerificationResources(resourceList); -// verificationDTO.setVerificationSlider(sliderList); -// cache.put(VERIFICATION_CACHE, verificationDTO); -// return verificationDTO; -// } -// -// @Override -// public VerificationDTO getVerificationCache() { -// VerificationDTO verificationDTO; -// try { -// verificationDTO = cache.get(VERIFICATION_CACHE); -// } catch (ClassCastException cce) { -// verificationDTO = null; -// } -// if (verificationDTO == null) { -// return initCache(); -// } -// return verificationDTO; -// } -} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/Base64DecodeMultipartFile.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/Base64DecodeMultipartFile.java deleted file mode 100644 index 1a03cb333..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/Base64DecodeMultipartFile.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.wzj.soopin.auth.util; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.multipart.MultipartFile; - -import java.io.*; -import java.util.Base64; -import java.util.Base64.Decoder; - -/** - * base64转为multipartFile工具类 - * - * @author Chopper - */ -@Slf4j -public class Base64DecodeMultipartFile implements MultipartFile { - - private final byte[] imgContent; - private final String header; - - public Base64DecodeMultipartFile(byte[] imgContent, String header) { - this.imgContent = imgContent; - this.header = header.split(";")[0]; - } - - @Override - public String getName() { - return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1]; - } - - @Override - public String getOriginalFilename() { - return System.currentTimeMillis() + (int) Math.random() * 10000 + "." + header.split("/")[1]; - } - - @Override - public String getContentType() { - return header.split(":")[1]; - } - - @Override - public boolean isEmpty() { - return imgContent == null || imgContent.length == 0; - } - - @Override - public long getSize() { - return imgContent.length; - } - - @Override - public byte[] getBytes() throws IOException { - return imgContent; - } - - @Override - public InputStream getInputStream() { - return new ByteArrayInputStream(imgContent); - } - - @Override - public void transferTo(File dest) throws IOException, IllegalStateException { - OutputStream stream = null; - try { - stream = new FileOutputStream(dest); - stream.write(imgContent); - } catch (IOException e) { - log.error("transferTo错误", e); - } finally { - assert stream != null; - stream.close(); - } - } - - - public static MultipartFile base64Convert(String base64) { - - String[] baseStrs = base64.split(","); - Decoder decoder = Base64.getDecoder(); - byte[] b = decoder.decode(baseStrs[1]); - - for (int i = 0; i < b.length; ++i) { - if (b[i] < 0) { - b[i] += 256; - } - } - return new Base64DecodeMultipartFile(b, baseStrs[0]); - } - - - public static InputStream base64ToInputStream(String base64) { - ByteArrayInputStream stream = null; - try { - byte[] bytes = Base64.getDecoder().decode(base64); - stream = new ByteArrayInputStream(bytes); - } catch (Exception e) { - log.error("base64ToInputStream错误", e); - } - return stream; - } - - public static String inputStreamToStream(InputStream in) { - byte[] data = null; - //读取图片字节数组 - try { - ByteArrayOutputStream swapStream = new ByteArrayOutputStream(); - byte[] buff = new byte[100]; - int rc = 0; - while ((rc = in.read(buff, 0, 100)) > 0) { - swapStream.write(buff, 0, rc); - } - data = swapStream.toByteArray(); - } catch (IOException e) { - log.error("转码错误", e); - } finally { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - log.error("inputStreamToStream错误", e); - } - } - } - return Base64.getEncoder().encodeToString(data); - } -} - diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/SmsUtil.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/SmsUtil.java deleted file mode 100644 index 654ff1225..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/SmsUtil.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.wzj.soopin.auth.util; - - -import com.wzj.soopin.auth.domain.dto.entity.enums.VerificationEnums; - -import java.util.List; -import java.util.Map; - -/** - * 短信接口 - * - * @author Chopper - * @version v4.0 - * @since 2020/11/30 15:44 - */ -public interface SmsUtil { - - - /** - * 验证码发送 - * - * @param mobile 手机号 - * @param verificationEnums 验证码场景 - * @param uuid 用户标识uuid - */ - void sendSmsCode(String mobile, VerificationEnums verificationEnums, String uuid); - - /** - * 验证码验证 - * - * @param mobile 手机号 - * @param verificationEnums 验证码场景 - * @param uuid 用户标识uuid - * @param code 待验证code - * @return 操作状态 - */ - boolean verifyCode(String mobile, VerificationEnums verificationEnums, String uuid, String code); - - /** - * 短信发送 - * - * @param mobile 接收手机号 - * @param param 参数 - * @param templateCode 模版code - * @param signName 签名名称 - */ - void sendSmsCode(String signName, String mobile, Map param, String templateCode); - - /** - * 短信批量发送 - * - * @param mobile 接收手机号 - * @param signName 签名 - * @param templateCode 模版code - */ - void sendBatchSms(String signName, List mobile, String templateCode); - - -} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/vo/MemberSearchVO.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/vo/MemberSearchVO.java deleted file mode 100644 index 2fcb2e366..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/vo/MemberSearchVO.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.wzj.soopin.auth.vo; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -/** - * 会员搜索VO - * - * @author Bulbasaur - * @since 2020/12/15 10:48 - */ -@Data -public class MemberSearchVO { - - @ApiModelProperty(value = "用户名") - private String username; - - @ApiModelProperty(value = "昵称") - private String nickName; - - @ApiModelProperty(value = "手机号") - private String mobile; - - @ApiModelProperty(value = "专家标识") - private Integer exper; - - @ApiModelProperty(value = "代理标识") - private Integer agent; - - /** - */ - @ApiModelProperty(value = "会员状态") - private String disabled; -} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/vo/SerializableStream.java b/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/vo/SerializableStream.java deleted file mode 100644 index e97d0483a..000000000 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/vo/SerializableStream.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.wzj.soopin.auth.vo; - -import com.wzj.soopin.auth.util.Base64DecodeMultipartFile; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.InputStream; - -/** - * 序列化的input stream - * - * @author Chopper - */ -@Data -@NoArgsConstructor -public class SerializableStream { - private String base64; - - public SerializableStream(InputStream inputStream) { - this.base64 = Base64DecodeMultipartFile.inputStreamToStream(inputStream); - } - -} - diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java index 4318569d2..7aa97c1cc 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/FeedbackController.java @@ -1,24 +1,29 @@ package com.wzj.soopin.member.controller; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.member.convert.FeedbackConvert; -import com.wzj.soopin.member.domain.po.Feedback; +import com.wzj.soopin.member.convert.MemberAccountConvert; import com.wzj.soopin.member.domain.bo.FeedbackBO; +import com.wzj.soopin.member.domain.po.Feedback; +import com.wzj.soopin.member.domain.po.MemberAccount; import com.wzj.soopin.member.domain.vo.FeedbackVO; import com.wzj.soopin.member.service.IFeedbackService; +import com.wzj.soopin.member.service.IMemberAccountService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.PageImpl; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import java.util.List; - /** * 意见反馈Controller * @@ -28,33 +33,42 @@ import java.util.List; @Api(description ="意见反馈接口列表") @RestController @RequestMapping("/ums/feedback") -public class FeedbackController extends BaseController { - @Autowired - private IFeedbackService service; - @Autowired - private FeedbackConvert convert; +@RequiredArgsConstructor +public class FeedbackController { -// @ApiOperation("查询意见反馈列表") -// @PostMapping("/list") -// public ResponseEntity> list(@RequestBody FeedbackBO query, IPage page) { -// service.page(page,query.toWrapper()); -// return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); -// } + private final IFeedbackService service; + private final FeedbackConvert convert; -// @ApiOperation("修改意见反馈备注信息") -// @Log(title = "意见反馈", businessType = BusinessType.UPDATE) -// @PostMapping("/mark/update") -// public ResponseEntity editMark(@RequestBody Feedback feedback) { -// return ResponseEntity.ok(service.updateMark(feedback)); -// } + @ApiOperation("查询意见反馈列表") + @PostMapping("/list") + public R> list(@RequestBody FeedbackBO query, Page page) { + Page feedBackPage= (Page)service.page(page,query.toWrapper()); + return R.ok(convert.toVO( feedBackPage)); + } -// @ApiOperation(("修改状态")) -// @Log(title = "意见反馈", businessType = BusinessType.UPDATE) -// @PostMapping("/handle/status/change") -// public ResponseEntity changeStatus(@RequestBody Feedback dto){ -// return ResponseEntity.ok(service.changeStatus(dto)); -// } + + @ApiOperation("修改意见反馈备注信息") + @Log(title = "意见反馈", businessType = BusinessType.UPDATE) + @PostMapping("/update") + public R editMark(@RequestBody FeedbackBO feedback) { + return R.ok(service.save(convert.toPo(feedback))); + } + + @ApiOperation("修改意见反馈备注信息") + @Log(title = "新增意见反馈", businessType = BusinessType.UPDATE) + @PostMapping("/add") + public R add(@RequestBody FeedbackBO feedback) { + return R.ok(service.save(convert.toPo(feedback))); + } + + + @ApiOperation(("修改状态")) + @Log(title = "意见反馈", businessType = BusinessType.UPDATE) + @PostMapping("/handle/status/change") + public R changeStatus(@RequestBody FeedbackBO bo){ + return R.ok(service.updateById(convert.toPo(bo))); + } @ApiOperation("删除意见反馈") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAccountController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAccountController.java index 621de8482..61429c791 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAccountController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAccountController.java @@ -1,18 +1,20 @@ package com.wzj.soopin.member.controller; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.member.convert.MemberAccountConvert; import com.wzj.soopin.member.domain.po.MemberAccount; -import com.wzj.soopin.member.domain.bo.MemberAccountQuery; +import com.wzj.soopin.member.domain.bo.MemberAccountBO; import com.wzj.soopin.member.domain.vo.MemberAccountVO; import com.wzj.soopin.member.service.IMemberAccountService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageImpl; -import org.springframework.data.domain.Pageable; +import org.dromara.common.mybatis.core.page.TableDataInfo; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -26,27 +28,27 @@ import java.util.List; @Api(description ="会员账户表接口列表") @RestController @RequestMapping("/ums/memberAccount") +@RequiredArgsConstructor public class MemberAccountController { - @Autowired - private IMemberAccountService service; - @Autowired - private MemberAccountConvert convert; -// @ApiOperation("查询会员账户表列表") -// @PostMapping("/list") -// public ResponseEntity> list(@RequestBody MemberAccountQuery query, Pageable page) { -// List list = service.selectList(query, page); -// return ResponseEntity.ok(new PageImpl<>(list, page, ((com.github.pagehelper.Page)list).getTotal())); -// } + private final IMemberAccountService service; + private final MemberAccountConvert convert; -// @ApiOperation("导出会员账户表列表") -// @Log(title = "会员账户表", businessType = BusinessType.EXPORT) -// @GetMapping("/export") -// public ResponseEntity export(MemberAccountBO query) { -// List list = service.selectList(query); -// ExcelUtil util = new ExcelUtil<>(MemberAccountVO.class); -// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "会员账户表数据")); -// } + @ApiOperation("查询会员账户表列表") + @PostMapping("/list") + public R> list(@RequestBody MemberAccountBO query, IPage page) { + Page list = (Page) service.page(page,query.toWrapper() ); + return R.ok(convert.toVO(list)); + } + + @ApiOperation("导出会员账户表列表") + @Log(title = "会员账户表", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public ResponseEntity export(MemberAccountBO query) { + List list = service.list(query.toWrapper()); + ExcelUtil util = new ExcelUtil<>(MemberAccountVO.class); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "会员账户表数据")); + } @ApiOperation("获取会员账户表详细信息") @GetMapping(value = "/{memberId}") @@ -57,15 +59,15 @@ public class MemberAccountController { @ApiOperation("新增会员账户表") @Log(title = "会员账户表", businessType = BusinessType.INSERT) @PostMapping - public ResponseEntity add(@RequestBody MemberAccount memberAccount) { - return ResponseEntity.ok(service.save(memberAccount)); + public ResponseEntity add(@RequestBody MemberAccountBO memberAccount) { + return ResponseEntity.ok(service.save(convert.toPo(memberAccount))); } @ApiOperation("修改会员账户表") @Log(title = "会员账户表", businessType = BusinessType.UPDATE) @PutMapping - public ResponseEntity edit(@RequestBody MemberAccount memberAccount) { - return ResponseEntity.ok(service.updateById(memberAccount)); + public ResponseEntity edit(@RequestBody MemberAccountBO memberAccount) { + return ResponseEntity.ok(service.updateById(convert.toPo(memberAccount))); } @ApiOperation("删除会员账户表") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java index a5eb19470..fd5e7083b 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberAddressController.java @@ -10,7 +10,9 @@ import com.wzj.soopin.member.domain.vo.MemberAddressVO; import com.wzj.soopin.member.service.IMemberAddressService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; +import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.springframework.beans.factory.annotation.Autowired; @@ -30,27 +32,27 @@ import java.util.List; @Api(description ="会员收货地址接口列表") @RestController @RequestMapping("/ums/memberAddress") +@RequiredArgsConstructor public class MemberAddressController { - @Autowired - private IMemberAddressService service; - @Autowired - private MemberAddressConvert convert; + + private final IMemberAddressService service; + + private final MemberAddressConvert convert; @ApiOperation("查询会员收货地址列表") @PostMapping("/list") public R list(@RequestBody MemberAddressBO query, IPage page) { - IPage list = service.page(page,query.toWrapper()); - return R.ok(convert.convertToVO(list)); + Page list =(Page ) service.page(page,query.toWrapper()); + return R.ok(convert.toVO(list)); } @ApiOperation("导出会员收货地址列表") @Log(title = "会员收货地址", businessType = BusinessType.EXPORT) @GetMapping("/export") public ResponseEntity export(MemberAddressBO query) { -// List list = service.selectList(query, null); -// ExcelUtil util = new ExcelUtil<>(MemberAddressVO.class); -// return ResponseEntity.ok(util.writeExcel(convert.dos2vos(list), "会员收货地址数据")); - return null; + List list = service.list(query.toWrapper()); + ExcelUtil util = new ExcelUtil<>(MemberAddressVO.class); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "会员收货地址数据")); } @ApiOperation("获取会员收货地址详细信息") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberCartController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberCartController.java index 2ebffb513..0ff4d5d9b 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberCartController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberCartController.java @@ -7,9 +7,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.member.convert.MemberCartConvert; import com.wzj.soopin.member.domain.po.MemberCart; import com.wzj.soopin.member.domain.bo.MemberCartBO; +import com.wzj.soopin.member.domain.vo.MemberCartVO; import com.wzj.soopin.member.service.IMemberCartService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.dromara.common.core.domain.R; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.web.core.BaseController; @@ -35,12 +37,9 @@ public class MemberCartController extends BaseController { @ApiOperation("查询购物车列表") @PostMapping("/list") - public ResponseEntity list(@RequestBody MemberCartBO query, Pageable page) { - IPage poPage=new Page(); - poPage.setSize(page.getPageSize()); - poPage.setCurrent(page.getPageNumber()); - IPage userPage=service.page(poPage,new QueryWrapper()); - return ResponseEntity.ok(convert.convertToVO(poPage)); + public R> list(@RequestBody MemberCartBO query, IPage page) { + Page userPage=(Page) service.page(page,new QueryWrapper()); + return R.ok(convert.toVO(userPage)); } @ApiOperation("导出购物车列表") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java index d27a3a1ef..fb2db0d05 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java @@ -3,12 +3,13 @@ package com.wzj.soopin.member.controller; import cn.dev33.satoken.annotation.SaCheckPermission; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.member.convert.MemberConvert; import com.wzj.soopin.member.domain.bo.MemberBO; import com.wzj.soopin.member.domain.form.ChangeMemberStatusForm; import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.member.domain.vo.MemberVO; -import com.wzj.soopin.member.service.IMemberCrudService; +import com.wzj.soopin.member.service.IMemberService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.dromara.common.core.domain.R; @@ -29,39 +30,36 @@ import java.util.List; * @date 2022-11-28 */ @Api(description ="会员信息接口列表") +@RequestMapping("/ums/member/") @RestController public class MemberController extends BaseController { @Autowired - private IMemberCrudService service; + private IMemberService service; @Autowired private MemberConvert convert; -// @RequestMapping(path ={"/ums/member/wechat/code","/h5/member/wechat/code","/no-auth/wechat/code"},method=RequestMethod.GET) -// public R getWechatCode(@RequestParam(required = false) String scene) { -// return R.ok(wechatAuthService.getQRCode(scene)); -// } @ApiOperation("查询会员信息列表") @SaCheckPermission("ums:member:list") - @PostMapping("/ums/member/list") - public TableDataInfo list(@RequestBody MemberBO bo, IPage page) { - IPage memberPage = service.page(page,bo.toWapper()); - return convert.convertToVO(memberPage); + @PostMapping("list") + public R> list(@RequestBody MemberBO bo, Page page) { + Page memberPage = service.page(page,bo.toWapper()); + return R.ok(convert.toVO(memberPage)); } @ApiOperation("导出会员信息列表") @SaCheckPermission("ums:member:export") @Log(title = "会员信息", businessType = BusinessType.EXPORT) - @GetMapping("/ums/member/export") + @GetMapping("export") public ResponseEntity export(MemberBO query) { List list = service.list(query.toWapper()); ExcelUtil util = new ExcelUtil<>(MemberVO.class); - return ResponseEntity.ok(util.writeExcel(convert.convertToVO(list), "会员信息数据")); + return ResponseEntity.ok(util.writeExcel(convert.toVO(list), "会员信息数据")); } @ApiOperation("获取会员信息详细信息") @SaCheckPermission("ums:member:query") - @GetMapping(value = "/ums/member/{id}") + @GetMapping(value = "{id}") public ResponseEntity getInfo(@PathVariable("id") Long id) { return ResponseEntity.ok(service.getById(id)); } @@ -71,7 +69,7 @@ public class MemberController extends BaseController { @Log(title = "会员信息", businessType = BusinessType.INSERT) @PostMapping("/ums/member") public R add(@RequestBody MemberBO member) { - return R.ok(service.save(convert.convertToPo(member))); + return R.ok(service.save(convert.toPo(member))); } @ApiOperation("修改会员信息") @@ -79,7 +77,7 @@ public class MemberController extends BaseController { @Log(title = "会员信息", businessType = BusinessType.UPDATE) @PutMapping("/ums/member") public R edit(@RequestBody MemberBO member) { - return R.ok(service.updateById(convert.convertToPo(member))); + return R.ok(service.updateById(convert.toPo(member))); } @ApiOperation("修改会员备注信息") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/FeedbackConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/FeedbackConvert.java index 1e91a1e61..13463ba2b 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/FeedbackConvert.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/FeedbackConvert.java @@ -13,7 +13,7 @@ import java.util.List; * * @author zcc */ -@Mapper(componentModel = "spring") +@Mapper(componentModel = "spring",uses = BaseConverter.class) public interface FeedbackConvert extends BaseConverter { } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAccountConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAccountConvert.java index 8afe3c3af..9d80d02f5 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAccountConvert.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAccountConvert.java @@ -1,17 +1,17 @@ package com.wzj.soopin.member.convert; +import com.wzj.soopin.member.domain.bo.MemberAccountBO; import com.wzj.soopin.member.domain.po.MemberAccount; import com.wzj.soopin.member.domain.vo.MemberAccountVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; -import java.util.List; /** * 会员账户表 DO <=> DTO <=> VO / BO / Query * * @author zcc */ -@Mapper(componentModel = "spring") -public interface MemberAccountConvert { +@Mapper(componentModel = "spring",uses = BaseConverter.class) +public interface MemberAccountConvert extends BaseConverter< MemberAccountVO, MemberAccountBO,MemberAccount> { - List dos2vos(List list); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAddressConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAddressConvert.java index 7e7e04386..f6db51d79 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAddressConvert.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberAddressConvert.java @@ -12,7 +12,7 @@ import java.util.List; * * @author zcc */ -@Mapper(componentModel = "spring") +@Mapper(componentModel = "spring",uses = BaseConverter.class) public interface MemberAddressConvert extends BaseConverter { } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberCartConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberCartConvert.java index 90bc9d7de..9dbcd0a4d 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberCartConvert.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberCartConvert.java @@ -13,16 +13,7 @@ import java.util.List; * * @author zcc */ -@Mapper(componentModel = "spring") +@Mapper(componentModel = "spring",uses = BaseConverter.class) public interface MemberCartConvert extends BaseConverter { - List dos2vos(List list); - -// @Mapping(target = "id", ignore = true) -// @Mapping(target = "skuId", source = "id") -// MemberCart sku2Cart(Sku sku); -// -// @BeanMapping(ignoreByDefault = true) -// @Mapping(source = "name", target = "productName") -// void injectProduct(@MappingTarget MemberCart memberCart, Product p); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberConvert.java index ea037c3da..10056bad5 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberConvert.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberConvert.java @@ -1,5 +1,6 @@ package com.wzj.soopin.member.convert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.member.domain.bo.MemberBO; import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.member.domain.vo.MemberVO; @@ -12,7 +13,8 @@ import java.util.List; * * @author zcc */ -@Mapper(componentModel = "spring") +@Mapper(componentModel = "spring",uses = BaseConverter.class) public interface MemberConvert extends BaseConverter { + } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberLogininforConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberLogininforConvert.java index c28067cbf..279deb304 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberLogininforConvert.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberLogininforConvert.java @@ -2,6 +2,7 @@ package com.wzj.soopin.member.convert; import com.wzj.soopin.member.domain.po.MemberLogininfor; import com.wzj.soopin.member.domain.vo.MemberLogininforVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; import java.util.List; @@ -10,7 +11,7 @@ import java.util.List; * * @author zcc */ -@Mapper(componentModel = "spring") +@Mapper(componentModel = "spring",uses = BaseConverter.class) public interface MemberLogininforConvert { List dos2vos(List list); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberWechatConvert.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberWechatConvert.java index 6a0f90551..0ea8f9d24 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberWechatConvert.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/convert/MemberWechatConvert.java @@ -2,6 +2,7 @@ package com.wzj.soopin.member.convert; import com.wzj.soopin.member.domain.po.MemberWechat; import com.wzj.soopin.member.domain.vo.MemberWechatVO; +import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; import java.util.List; @@ -10,7 +11,7 @@ import java.util.List; * * @author zcc */ -@Mapper(componentModel = "spring") +@Mapper(componentModel = "spring",uses = BaseConverter.class) public interface MemberWechatConvert { List dos2vos(List list); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/FeedbackBO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/FeedbackBO.java index f299960a8..b0aa175fc 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/FeedbackBO.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/FeedbackBO.java @@ -1,5 +1,6 @@ package com.wzj.soopin.member.domain.bo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -39,4 +40,8 @@ public class FeedbackBO extends BaseBO { private String endTime; + @Override + public LambdaQueryWrapper toWrapper() { + return super.toWrapper(); + } } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAccountBO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAccountBO.java new file mode 100644 index 000000000..73283f762 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAccountBO.java @@ -0,0 +1,41 @@ +package com.wzj.soopin.member.domain.bo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.member.domain.po.MemberAccount; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.dromara.common.core.domain.BaseBO; + +import java.math.BigDecimal; + +/** + * 会员账户表 查询 对象 + * + * @author zcc + */ +@ApiModel(description="会员账户表 查询 对象") +@Data +public class MemberAccountBO extends BaseBO { + @ApiModelProperty("积分余额 精确匹配") + private BigDecimal integralBalance; + + @ApiModelProperty("历史总共积分 精确匹配") + private BigDecimal totalIntegralBalance; + + + @ApiModelProperty("MEMBER_ID") + @TableId(value="member_id", type = IdType.ASSIGN_ID) + private Long memberId; + + public LambdaQueryWrapper toWrapper() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(MemberAccount::getIntegralBalance, integralBalance); + queryWrapper.eq(MemberAccount::getTotalIntegralBalance, totalIntegralBalance); + queryWrapper.eq(MemberAccount::getMemberId, memberId); + return queryWrapper; + } + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAccountQuery.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAccountQuery.java deleted file mode 100644 index 64525ebf2..000000000 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAccountQuery.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.wzj.soopin.member.domain.bo; - -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import lombok.Data; - -import java.math.BigDecimal; - -/** - * 会员账户表 查询 对象 - * - * @author zcc - */ -@ApiModel(description="会员账户表 查询 对象") -@Data -public class MemberAccountQuery { - @ApiModelProperty("积分余额 精确匹配") - private BigDecimal integralBalance; - - @ApiModelProperty("历史总共积分 精确匹配") - private BigDecimal totalIntegralBalance; - -} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAddressBO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAddressBO.java index 960be3221..c569e82b5 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAddressBO.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberAddressBO.java @@ -1,5 +1,6 @@ package com.wzj.soopin.member.domain.bo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.fasterxml.jackson.databind.ser.Serializers; import com.wzj.soopin.member.domain.po.Member; @@ -48,7 +49,7 @@ public class MemberAddressBO extends BaseBO { private Integer isDefault; @Override - public QueryWrapper toWrapper() { - return null; + public LambdaQueryWrapper toWrapper() { + return new QueryWrapper().lambda().eq(MemberAddress::getMemberId,this.getMemberId()); } } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberBO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberBO.java index fb0409e0a..682594277 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberBO.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/MemberBO.java @@ -74,7 +74,7 @@ public class MemberBO extends BaseBO { public QueryWrapper toWapper(){ QueryWrapper qw = new QueryWrapper<>(); - qw.lambda().like(!getNickname().isEmpty(),Member::getNickname, this.getNickname()); + qw.lambda().like(!StringUtils.isEmpty(this.getNickname()),Member::getNickname, this.getNickname()); String phone = this.getPhone(); if (!StringUtils.isEmpty(phone)) { diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Address.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Address.java index 81d5d6810..4af6e18ef 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Address.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Address.java @@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; +import org.dromara.common.mybatis.core.domain.BaseEntity; /** * 地址对象 @@ -13,7 +15,7 @@ import org.dromara.common.excel.annotation.Excel; @ApiModel(description="地址对象") @Data @TableName("address") -public class Address { +public class Address extends BaseAudit { private static final long serialVersionUID = 1L; @ApiModelProperty("ID") @@ -35,16 +37,6 @@ public class Address { @Excel(name = "地区层级") private Integer level; - @ApiModelProperty("CREATED_AT") - @Excel(name = "CREATED_AT") - private String createdAt; - @ApiModelProperty("UPDATED_AT") - @Excel(name = "UPDATED_AT") - private String updatedAt; - - @ApiModelProperty("DELETED_AT") - @Excel(name = "DELETED_AT") - private String deletedAt; } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Feedback.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Feedback.java index 1fa7118dc..8054f2a11 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Feedback.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Feedback.java @@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; +import org.dromara.common.mybatis.core.domain.BaseEntity; import java.time.LocalDateTime; /** @@ -15,7 +17,7 @@ import java.time.LocalDateTime; @ApiModel(description="意见反馈对象") @Data @TableName("ums_feedback") -public class Feedback { +public class Feedback extends BaseAudit { private static final long serialVersionUID = 1L; @ApiModelProperty("ID") @@ -37,12 +39,6 @@ public class Feedback { @Excel(name = "联系电话") private String phone; - @ApiModelProperty("创建人") - private Long createBy; - - @ApiModelProperty("创建时间") - private LocalDateTime createTime; - @ApiModelProperty("处理状态 0:未处理 1:已处理") @Excel(name = "处理状态 0:未处理 1:已处理") private Integer handleStatus; diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Member.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Member.java index 94496e4d3..93a6f026e 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Member.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/Member.java @@ -1,9 +1,12 @@ package com.wzj.soopin.member.domain.po; +import cn.dev33.satoken.annotation.SaCheckHttpDigest; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; import lombok.Data; +import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; import org.dromara.common.mybatis.core.domain.BaseEntity; @@ -17,13 +20,21 @@ import java.time.LocalDateTime; */ @ApiModel(description="会员信息对象") @Data +@Builder @TableName("ums_member") -public class Member extends BaseEntity { +public class Member extends BaseAudit { private static final long serialVersionUID = 1L; + + + @ApiModelProperty("ID") private Long id; + @ApiModelProperty("用户名") + @Excel(name = "用户名") + private String userName; + @ApiModelProperty("昵称") @Excel(name = "昵称") private String nickname; @@ -90,4 +101,9 @@ public class Member extends BaseEntity { @Excel(name = "用户剩余积分") private BigDecimal integral; + @ApiModelProperty("im签名") + @Excel(name = "im签名") + private String userSig; // 添加 UserSig 属性 + + } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAccount.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAccount.java index 6e2e6de97..eb3716e6f 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAccount.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAccount.java @@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; +import org.dromara.common.mybatis.core.domain.BaseEntity; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -18,7 +20,7 @@ import java.time.LocalDateTime; @ApiModel(description="会员账户表对象") @Data @TableName("ums_member_account") -public class MemberAccount { +public class MemberAccount extends BaseAudit { private static final long serialVersionUID = 1L; @ApiModelProperty("MEMBER_ID") @@ -33,10 +35,6 @@ public class MemberAccount { @Excel(name = "历史总共积分") private BigDecimal totalIntegralBalance; - @ApiModelProperty("修改时间") - private LocalDateTime updateTime; - @ApiModelProperty("创建时间") - private LocalDateTime createTime; } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAddress.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAddress.java index 36f7fdc25..6b84b0aa4 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAddress.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberAddress.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; import org.dromara.common.mybatis.core.domain.BaseEntity; @@ -15,7 +16,7 @@ import org.dromara.common.mybatis.core.domain.BaseEntity; @ApiModel(description="会员收货地址对象") @Data @TableName("ums_member_address") -public class MemberAddress extends BaseEntity { +public class MemberAddress extends BaseAudit { private static final long serialVersionUID = 1L; @ApiModelProperty("ID") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberCart.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberCart.java index ef33bf0b6..1d5fa178f 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberCart.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberCart.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; import org.dromara.common.mybatis.core.domain.BaseEntity; @@ -15,7 +16,7 @@ import org.dromara.common.mybatis.core.domain.BaseEntity; @ApiModel(description="购物车对象") @Data @TableName("ums_member_cart") -public class MemberCart extends BaseEntity { +public class MemberCart extends BaseAudit { private static final long serialVersionUID = 1L; @ApiModelProperty("购物车表ID") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberWechat.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberWechat.java index 13e157a1b..c776ed44a 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberWechat.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/po/MemberWechat.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import org.dromara.common.core.domain.model.BaseAudit; import org.dromara.common.excel.annotation.Excel; import org.dromara.common.mybatis.core.domain.BaseEntity; @@ -16,7 +17,7 @@ import java.time.LocalDateTime; @ApiModel(description="用户微信信息对象") @Data @TableName("ums_member_wechat") -public class MemberWechat extends BaseEntity { +public class MemberWechat extends BaseAudit { private static final long serialVersionUID = 1L; @ApiModelProperty("ID") diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberInfoVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberInfoVO.java new file mode 100644 index 000000000..ebb6f3703 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/MemberInfoVO.java @@ -0,0 +1,71 @@ +package com.wzj.soopin.member.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.dromara.common.excel.annotation.Excel; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 会员信息 用于 + * + * @author zcc + */ +@Data +public class MemberInfoVO { + /** ID */ + private Long id; + /** 昵称 */ + @Excel(name = "昵称") + private String nickname; + /** 手机号 */ + private String phone; + /** 隐藏前三位后四位的手机号 */ + private String phoneHidden; + /** 用户备注 */ + @Excel(name = "用户备注") + private String mark; + /** 帐号启用状态:0->禁用;1->启用 */ + @Excel(name = "帐号启用状态:0->禁用;1->启用") + private Integer status; + /** 头像 */ + @Excel(name = "头像") + private String avatar; + /** 性别:0->未知;1->男;2->女 */ + @Excel(name = "性别:0->未知;1->男;2->女") + private Integer gender; + /** 用户所在城市 */ + @Excel(name = "用户所在城市") + private String city; + /** 用户所在省份 */ + @Excel(name = "用户所在省份") + private String province; + /** 用户所在国家 */ + @Excel(name = "用户所在国家") + private String country; + /** 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注 */ + @Excel(name = "公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注") + private String remark; + /** 生日 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "生日", width = 30, dateFormat = "yyyy-MM-dd") + private LocalDate birthday; + /** 推广员id */ + @Excel(name = "推广员id") + private Long spreadUid; + /** 推广员关联时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "推广员关联时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime spreadTime; + /** 等级 */ + @Excel(name = "等级") + private Integer level; + /** 用户剩余积分 */ + @Excel(name = "用户剩余积分") + private BigDecimal integral; + /** openId */ + @Excel(name = "openId") + private String openId; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberCrudService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberCrudService.java deleted file mode 100644 index 5f49be0fc..000000000 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberCrudService.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.wzj.soopin.member.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.wzj.soopin.member.domain.form.ChangeMemberStatusForm; -import com.wzj.soopin.member.domain.po.Member; - -public interface IMemberCrudService extends IService { - Integer changeStatus(ChangeMemberStatusForm dto); - - int updateMark(Member member); -} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberService.java new file mode 100644 index 000000000..c8d0adcbc --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IMemberService.java @@ -0,0 +1,55 @@ +package com.wzj.soopin.member.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.wzj.soopin.member.domain.form.ChangeMemberStatusForm; +import com.wzj.soopin.member.domain.po.Member; +import org.dromara.common.core.constant.ResultCode; + +import java.util.List; + +public interface IMemberService extends IService { + Integer changeStatus(ChangeMemberStatusForm dto); + + int updateMark(Member member); + + boolean usernameExists(String username); // 确保这个方法在接口中定义 + + /** + * 是否可以通过手机获取用户 + * + * @param uuid UUID + * @param mobile 手机号 + * @return 操作状态 + */ + boolean findByMobile(String uuid, String mobile); + + /** + * 通过用户名获取用户 + * + * @param username 用户名 + * @return 会员信息 + */ + Member findByUsername(String username); + + /** + * 修改用户密码 + * + * @param oldPassword 旧密码 + * @param newPassword 新密码 + * @return 操作结果 + */ + Member modifyPass(String oldPassword, String newPassword); + + /** + * 修改当前会员的手机号 + * + * @param mobile 手机号 + * @return 操作结果 + */ + boolean changeMobile(String mobile); + + ResultCode updateMemberStatus(List memberIds, Boolean disabled, Integer banDays); + + + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java new file mode 100644 index 000000000..8c0e09724 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java @@ -0,0 +1,10 @@ +package com.wzj.soopin.member.service; + + +/**km//, + * 腾讯IM服务 + * @author wqx + */ +public interface ITencentIMServicce { + String createTencentIMAccount(String userId); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberRegisterService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberRegisterService.java new file mode 100644 index 000000000..7ff750f7f --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/MemberRegisterService.java @@ -0,0 +1,116 @@ +package com.wzj.soopin.member.service; + +import cn.dev33.satoken.secure.BCrypt; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.wzj.soopin.member.domain.po.Member; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.Constants; +import org.dromara.common.core.constant.GlobalConstants; +import org.dromara.common.core.domain.model.RegisterBody; +import org.dromara.common.core.enums.UserType; +import org.dromara.common.core.exception.user.CaptchaException; +import org.dromara.common.core.exception.user.CaptchaExpireException; +import org.dromara.common.core.exception.user.UserException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.SpringUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.log.event.LogininforEvent; +import org.dromara.common.redis.utils.RedisUtils; +import org.dromara.common.web.config.properties.CaptchaProperties; +import org.springframework.stereotype.Service; + +/** + * 注册校验方法 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class MemberRegisterService { + + private final IMemberService memberService; + private final CaptchaProperties captchaProperties; + private final ITencentIMServicce tencentIMServicce; + + /** + * 注册 + */ + public Member register(RegisterBody registerBody) { + String tenantId = registerBody.getTenantId(); + String username = registerBody.getUsername(); + String phoneNumber= registerBody.getPhoneNumber(); + String password = registerBody.getPassword(); + // 校验用户类型是否存在 + String userType = UserType.getUserType(registerBody.getUserType()).getUserType(); + + boolean captchaEnabled = captchaProperties.getEnable(); + // 验证码开关 + if (captchaEnabled) { + validateCaptcha(tenantId, username, registerBody.getCode(), registerBody.getUuid()); + } + Member member = Member.builder().phoneEncrypted(phoneNumber) + .userName(username==null?phoneNumber:username) + .nickname(username) + .password(BCrypt.hashpw(password==null?"123456":password)).build(); + + boolean exist = memberService.exists(new LambdaQueryWrapper() + .eq(Member::getPhoneEncrypted, phoneNumber)); + if (exist) { + throw new UserException("user.register.save.error", username); + } + + // 生成 UserSig + String userSig = tencentIMServicce.createTencentIMAccount(phoneNumber); + member.setUserSig(userSig); + + boolean regFlag = memberService.save(member); + if (!regFlag) { + throw new UserException("user.register.error"); + } + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); + return member; + + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + */ + public void validateCaptcha(String tenantId, String username, String code, String uuid) { + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); + String captcha = RedisUtils.getCacheObject(verifyKey); + RedisUtils.deleteObject(verifyKey); + if (captcha == null) { + recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); + throw new CaptchaException(); + } + } + + /** + * 记录登录信息 + * + * @param tenantId 租户ID + * @param username 用户名 + * @param status 状态 + * @param message 消息内容 + * @return + */ + private void recordLogininfor(String tenantId, String username, String status, String message) { + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(tenantId); + logininforEvent.setUsername(username); + logininforEvent.setStatus(status); + logininforEvent.setMessage(message); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + } + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberAccountServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberAccountServiceImpl.java index 507caf790..ab2a8f90b 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberAccountServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberAccountServiceImpl.java @@ -4,14 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.wzj.soopin.member.domain.po.MemberAccount; -import com.wzj.soopin.member.domain.bo.MemberAccountQuery; +import com.wzj.soopin.member.domain.bo.MemberAccountBO; import com.wzj.soopin.member.mapper.MemberAccountMapper; import com.wzj.soopin.member.service.IMemberAccountService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; -import java.time.LocalDateTime; /** * 会员账户表Service业务层处理 @@ -39,7 +37,7 @@ public class MemberAccountServiceImpl extends ServiceImpl selectList(MemberAccountQuery query, IPage page) { + public IPage selectList(MemberAccountBO query, IPage page) { QueryWrapper qw = new QueryWrapper<>(); BigDecimal integralBalance = query.getIntegralBalance(); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberAddressServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberAddressServiceImpl.java index 35ba294e5..6ce679fe6 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberAddressServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberAddressServiceImpl.java @@ -9,6 +9,8 @@ import com.wzj.soopin.member.domain.po.MemberAddress; import com.wzj.soopin.member.domain.bo.MemberAddressBO; import com.wzj.soopin.member.mapper.MemberAddressMapper; import com.wzj.soopin.member.service.IMemberAddressService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -23,9 +25,10 @@ import java.util.List; * @author zcc */ @Service +@RequiredArgsConstructor +@Slf4j public class MemberAddressServiceImpl extends ServiceImpl implements IMemberAddressService { - @Autowired - private MemberAddressConvert memberAddressConvert; + private final MemberAddressConvert memberAddressConvert; /** diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberCrudServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberCrudServiceImpl.java deleted file mode 100644 index f42ba8d46..000000000 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberCrudServiceImpl.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.wzj.soopin.member.service.impl; - -import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.wzj.soopin.member.domain.form.ChangeMemberStatusForm; -import com.wzj.soopin.member.domain.po.Member; -import com.wzj.soopin.member.mapper.MemberCartMapper; -import com.wzj.soopin.member.mapper.MemberMapper; -import com.wzj.soopin.member.service.IMemberCrudService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; - -/** - * 会员信息Service业务层处理 - * - * - * @author zcc - */ -@Service -public class MemberCrudServiceImpl extends ServiceImpl implements IMemberCrudService { - @Autowired - private MemberMapper memberMapper; - - - @Autowired - private MemberCartMapper memberCartMapper; - -// @Autowired -// private OrderMapper orderMapper; -// -// @Autowired -// private AftersaleMapper aftersaleMapper; - - - - - public int updateMark(Member member) { - UpdateWrapper updateWrapper = new UpdateWrapper<>(); - updateWrapper.set("mark",member.getMark()) - .set("update_time",LocalDateTime.now()) - .eq("id",member.getId()); - return memberMapper.update(null,updateWrapper); - } - - - - public Integer changeStatus(ChangeMemberStatusForm dto) { - UpdateWrapper wrapper = new UpdateWrapper<>(); - wrapper.eq("id", dto.getMemberId()); - wrapper.set("status", dto.getStatus()); - return memberMapper.update(null, wrapper); - } - - -// public MemberDataStatisticsVO viewStatistics(Long memberId) { -// LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); -// wrapper.eq(MemberCart::getMemberId, memberId); -// long cartCount = memberCartMapper.selectCount(wrapper); -// MemberDataStatisticsVO vo = orderMapper.statOrderCountAndAmount(memberId); -// vo.setCartCount(Long.bitCount(cartCount)); -// vo.setAftersaleCount(aftersaleMapper.countByMemberId(memberId)); -// return vo; -// } -} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java new file mode 100644 index 000000000..9524040a7 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java @@ -0,0 +1,219 @@ +package com.wzj.soopin.member.service.impl; + +import cn.dev33.satoken.secure.BCrypt; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.member.domain.form.ChangeMemberStatusForm; +import com.wzj.soopin.member.domain.po.Member; +import com.wzj.soopin.member.mapper.MemberCartMapper; +import com.wzj.soopin.member.mapper.MemberMapper; +import com.wzj.soopin.member.service.IMemberService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.CachePrefix; +import org.dromara.common.core.constant.ResultCode; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.redis.redis.RedisCache; +import org.dromara.common.satoken.utils.LoginHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +/** + * 会员信息Service业务层处理 + * + * + * @author zcc + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class MemberServiceImpl extends ServiceImpl implements IMemberService { + + private final MemberCartMapper memberCartMapper; + + private final RedisCache redisCache; + + @Override + public boolean usernameExists(String username) { + return baseMapper.countByUsername(username) > 0; // 确保实现 + } + + @Override + public Member findByUsername(String userName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("username", userName); + return this.baseMapper.selectOne(queryWrapper); + } + @Override + public boolean findByMobile(String uuid, String mobile) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("mobile", mobile); + Member member = this.baseMapper.selectOne(queryWrapper); + if (member == null) { + throw new ServiceException(ResultCode.USER_NOT_PHONE); + } + redisCache.setCacheObject(CachePrefix.FIND_MOBILE + uuid, mobile, 300, TimeUnit.SECONDS); + + return true; + } + + public int updateMark(Member member) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("mark",member.getMark()) + .set("update_time",LocalDateTime.now()) + .eq("id",member.getId()); + return baseMapper.update(null,updateWrapper); + } + + + + public Integer changeStatus(ChangeMemberStatusForm dto) { + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.eq("id", dto.getMemberId()); + wrapper.set("status", dto.getStatus()); + return baseMapper.update(null, wrapper); + } + + + + @Override + public Member modifyPass(String oldPassword, String newPassword) { + LoginUser tokenUser = LoginHelper.getLoginUser(); + if (tokenUser == null) { + throw new ServiceException(ResultCode.USER_NOT_LOGIN); + } + Member member = this.getById(tokenUser.getUserId()); + // 判断旧密码输入是否正确 + if (!BCrypt.checkpw(member.getPassword(),oldPassword)) { + throw new ServiceException(ResultCode.USER_OLD_PASSWORD_ERROR); + } + // 修改会员密码 + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.eq(Member::getId, member.getId()); + lambdaUpdateWrapper.set(Member::getPassword, BCrypt.hashpw(newPassword)); + this.update(lambdaUpdateWrapper); + return member; + } + + @Override + public boolean changeMobile(String mobile) { + LoginUser tokenUser = LoginHelper.getLoginUser(); + Member member = this.getById(tokenUser.getUserId()); + + // 修改会员手机号 + LambdaUpdateWrapper lambdaUpdateWrapper = Wrappers.lambdaUpdate(); + lambdaUpdateWrapper.eq(Member::getId, member.getId()); + lambdaUpdateWrapper.set(Member::getPhoneEncrypted, mobile); + return this.update(lambdaUpdateWrapper); + } + /** + * 更新会员状态 + * 支持设置封禁时长 + * + * @param memberIds 会员ID列表 + * @param disabled 是否禁用 + * @param banDays 封禁天数,null表示永久封禁 + * @return 操作结果代码 + */ + @Override + public ResultCode updateMemberStatus(List memberIds, Boolean disabled, Integer banDays) { + if (memberIds == null || memberIds.isEmpty()) { + return ResultCode.USER_NOT_EXIST; + } + + try { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.in("id", memberIds); + + if (Boolean.TRUE.equals(disabled)) { + // 计算解封时间 + Date banEndTime = null; + if (banDays != null && banDays > 0) { + // 使用 Calendar 设置解封日期 + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH, banDays); + banEndTime = calendar.getTime(); + } + // 设置封禁状态和解封时间 + updateWrapper.set("delete_flag", true); + updateWrapper.set("ban_end_time", banEndTime); + + // 记录操作日志 + log.info("封禁会员: memberIds={}, banDays={}, banEndTime={}", + memberIds, banDays, banEndTime); + } else { + // 解除封禁 + updateWrapper.set("delete_flag", false); + updateWrapper.set("ban_end_time", null); + + // 记录操作日志 + log.info("解封会员: memberIds={}", memberIds); + } + + boolean result = this.update(updateWrapper); + + // 如果更新失败,检查记录是否存在 + if (!result) { + long count = this.count(new QueryWrapper().in("id", memberIds)); + if (count == 0) { + log.warn("更新会员状态失败: 未找到指定会员, memberIds={}", memberIds); + return ResultCode.USER_NOT_EXIST; + } else { + log.warn("更新会员状态失败: 更新操作失败, memberIds={}", memberIds); + return ResultCode.ERROR; + } + } + + return ResultCode.SUCCESS; + } catch (Exception e) { + log.error("更新会员状态异常", e); + return ResultCode.ERROR; + } + } + + /** + * 定时任务:检查并解除到期的封禁账号 + * 每天凌晨执行 + */ + @Scheduled(cron = "0 0 0 * * ?") + public void checkAndUnbanMembers() { + log.info("开始执行会员自动解封任务"); + Date now = new Date(); + + // 查找到期需要解封的会员数量 + QueryWrapper countWrapper = new QueryWrapper<>(); + countWrapper.eq("disabled", true) + .isNotNull("ban_end_time") + .le("ban_end_time", now); + long count = this.count(countWrapper); + + if (count > 0) { + // 解除封禁 + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.set("disabled", false) + .set("ban_end_time", null) + .eq("disabled", true) + .isNotNull("ban_end_time") + .le("ban_end_time", now); + + boolean result = this.update(updateWrapper); + log.info("会员自动解封任务完成,解封会员数量:{},处理结果:{}", count, result); + } else { + log.info("会员自动解封任务完成,无需要解封的会员"); + } + } + + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java new file mode 100644 index 000000000..ccfd201ee --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java @@ -0,0 +1,92 @@ +package com.wzj.soopin.member.service.impl; + +import cn.hutool.json.JSONObject; +import com.wzj.soopin.member.service.ITencentIMServicce; +import com.wzj.soopin.member.util.GenerateTestUserSig; +import com.wzj.soopin.member.util.TLSSigAPIv2; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + + +@Slf4j +@Service +public class TencentIMServiceImpl implements ITencentIMServicce { + + + + /** + * 创建腾讯云IM账号 + */ + @Override + public String createTencentIMAccount(String userId) { + try { + + String userSig=generateUserSig(userId); + String random = String.valueOf(System.currentTimeMillis()); + + // 构建请求体 + JSONObject requestBody = new JSONObject(); + requestBody.put("UserID", userId); + requestBody.put("Nick", userId); + requestBody.put("FaceUrl", "http://www.qq.com"); + + // 构建URL - 使用管理员账号(administrator)而不是用户ID来生成签名 + String urlString = String.format( + "https://console.tim.qq.com/v4/im_open_login_svc/account_import" + + "?sdkappid=%s&identifier=%s&usersig=%s&random=%s&contenttype=json", + GenerateTestUserSig.SDKAPPID, + "administrator", // 使用管理员账号 + userSig, // 使用管理员的UserSig + random); + return userSig; + +// // 创建HTTP客户端 +// OkHttpClient client = new OkHttpClient.Builder() +// .connectTimeout(10, TimeUnit.SECONDS) +// .writeTimeout(10, TimeUnit.SECONDS) +// .readTimeout(10, TimeUnit.SECONDS) +// .build(); +// +// // 发送请求 +// Request request = new Request.Builder() +// .url(urlString) +// .post(RequestBody.create(MediaType.get("application/json; charset=utf-8"), +// requestBody.toString())) +// .build(); +// +// try (Response response = client.newCall(request).execute()) { +// if (!response.isSuccessful()) { +// log.error("创建IM账号失败: {}, 状态码: {}", userId, response.code()); +// return null; +// } +// +// String responseBody = response.body().string(); +// JSONObject jsonResponse = new JSONObject(responseBody); +// int errorCode = jsonResponse.getInt("ErrorCode"); +// +// if (errorCode == 0) { +// log.info("创建IM账号成功: {}", userId); +// return userSig; +// } else { +// log.error("创建IM账号失败: {}, 错误码: {}, 错误信息: {}", +// userId, errorCode, jsonResponse.optString("ErrorInfo")); +// return null; +// } +// } + } catch (Exception e) { + log.error("创建IM账号异常: {}", userId, e); + return null; + } + } + + /** + * 生成UserSig + */ + private String generateUserSig(String userId) { + TLSSigAPIv2 tlsSigAPIv2 = new TLSSigAPIv2(GenerateTestUserSig.SDKAPPID, GenerateTestUserSig.SECRETKEY); + long expire = TimeUnit.DAYS.toSeconds(365 * 50); // 50年有效期 + return tlsSigAPIv2.genUserSig(userId, expire); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/util/GenerateTestUserSig.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/util/GenerateTestUserSig.java new file mode 100644 index 000000000..6b6607379 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/util/GenerateTestUserSig.java @@ -0,0 +1,143 @@ +package com.wzj.soopin.member.util; + +import cn.hutool.json.JSONObject; +import org.dromara.common.core.utils.StringUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.Charset; +import java.util.Arrays; +import java.util.Base64; +import java.util.zip.Deflater; + +public class GenerateTestUserSig { + /** + * 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId + */ + public static final int SDKAPPID = 1600080789; // 请替换为您的 SDKAppId + + /** + * 签名过期时间,建议不要设置的过短 + * 时间单位:秒 + * 默认时间:7 天 + */ + private static final int EXPIRETIME = 604800; + + /** + * 计算签名用的加密密钥,获取步骤如下: + * + * step1. 进入腾讯云云通信[控制台] ,如果还没有应用就创建一个 + * step2. 单击"应用配置"进入基础配置页面,并进一步找到"帐号体系集成"部分 + * step3. 点击"查看密钥"按钮,就可以看到计算 UserSig 使用的加密的密钥了 + */ + public static final String SECRETKEY = "311b5309d714a20f7f5b54360ee21b1e24ec208ebcd25ce8f47d24753bccc091"; // 请替换为您的密钥 + + /** + * 生成 UserSig 签名 + * + * @param userId 用户ID + * @return 返回生成的UserSig签名 + */ + public static String genTestUserSig(String userId) { + return GenTLSSignature(SDKAPPID, userId, EXPIRETIME, null, SECRETKEY); + } + + /** + * 生成 TLS 票据 + * + * @param sdkappid 应用的 SDKAppID + * @param userId 用户 ID + * @param expire 有效期,单位是秒 + * @param userbuf 默认填null + * @param priKeyContent 私钥内容 + * @return 如果出错,会返回空字符串 + */ + private static String GenTLSSignature(long sdkappid, String userId, long expire, byte[] userbuf, String priKeyContent) { + if (StringUtils.isEmpty(priKeyContent)) { + return ""; + } + long currTime = System.currentTimeMillis() / 1000; + JSONObject sigDoc = new JSONObject(); + try { + sigDoc.set("TLS.ver", "2.0"); + sigDoc.set("TLS.identifier", userId); + sigDoc.set("TLS.sdkappid", sdkappid); + sigDoc.set("TLS.expire", expire); + sigDoc.set("TLS.time", currTime); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + + String base64UserBuf = null; + if (null != userbuf) { + base64UserBuf = Base64.getEncoder().encodeToString(userbuf); + try { + sigDoc.set("TLS.userbuf", base64UserBuf); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + } + + String sig = hmacsha256(sdkappid, userId, currTime, expire, priKeyContent, base64UserBuf); + if (sig.length() == 0) { + return ""; + } + + try { + sigDoc.set("TLS.sig", sig); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + + Deflater compressor = new Deflater(); + compressor.setInput(sigDoc.toString().getBytes(Charset.forName("UTF-8"))); + compressor.finish(); + byte[] compressedBytes = new byte[2048]; + int compressedBytesLength = compressor.deflate(compressedBytes); + compressor.end(); + return new String(base64EncodeUrl(Arrays.copyOfRange(compressedBytes, 0, compressedBytesLength))); + } + + private static String hmacsha256(long sdkappid, String userId, long currTime, long expire, String priKeyContent, String base64Userbuf) { + String contentToBeSigned = "TLS.identifier:" + userId + "\n" + + "TLS.sdkappid:" + sdkappid + "\n" + + "TLS.time:" + currTime + "\n" + + "TLS.expire:" + expire + "\n"; + if (null != base64Userbuf) { + contentToBeSigned += "TLS.userbuf:" + base64Userbuf + "\n"; + } + try { + byte[] byteKey = priKeyContent.getBytes("UTF-8"); + Mac hmac = Mac.getInstance("HmacSHA256"); + SecretKeySpec keySpec = new SecretKeySpec(byteKey, "HmacSHA256"); + hmac.init(keySpec); + byte[] byteSig = hmac.doFinal(contentToBeSigned.getBytes("UTF-8")); + return Base64.getEncoder().encodeToString(byteSig); + } catch (Exception e) { + return ""; + } + } + + private static byte[] base64EncodeUrl(byte[] input) { + byte[] base64 = Base64.getEncoder().encode(input); + for (int i = 0; i < base64.length; ++i) { + switch (base64[i]) { + case '+': + base64[i] = '*'; + break; + case '/': + base64[i] = '-'; + break; + case '=': + base64[i] = '_'; + break; + default: + break; + } + } + return base64; + } +} diff --git a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/TLSSigAPIv2.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/util/TLSSigAPIv2.java similarity index 99% rename from ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/TLSSigAPIv2.java rename to ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/util/TLSSigAPIv2.java index 590af2ea5..3afd9aceb 100644 --- a/ruoyi-modules/ruoyi-auth/src/main/java/com/wzj/soopin/auth/util/TLSSigAPIv2.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/util/TLSSigAPIv2.java @@ -1,4 +1,4 @@ -package com.wzj.soopin.auth.util; +package com.wzj.soopin.member.util; import cn.hutool.json.JSONException; diff --git a/script/sql/rzj.sql b/script/sql/rzj.sql new file mode 100644 index 000000000..89f2b3a2a --- /dev/null +++ b/script/sql/rzj.sql @@ -0,0 +1,6 @@ +-- 添加用户名字段 +ALTER TABLE `wzj`.`ums_member` + ADD COLUMN `user_name` varchar(255) NULL COMMENT '用户名' AFTER `update_time`; +-- 添加用户签名字段 +ALTER TABLE `wzj`.`ums_member` + ADD COLUMN `user_sig` varchar(255) NULL COMMENT '腾讯的签名' AFTER `user_name`;