From 81120e17946d321fb14687c3913dfb7794d01bfd Mon Sep 17 00:00:00 2001 From: limqhz <540344226@qq.com> Date: Sat, 18 Apr 2026 18:36:56 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=E9=87=8D=E6=9E=84=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=99=BB=E5=BD=95=E5=92=8C=E6=89=8B=E6=9C=BA=E5=8F=B7?= =?UTF-8?q?=E7=BB=91=E5=AE=9A=E5=8A=9F=E8=83=BD=20-=20=E7=AE=80=E5=8C=96?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3=E5=8F=82?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E7=A7=BB=E9=99=A4=E6=98=B5=E7=A7=B0=E5=92=8C?= =?UTF-8?q?=E5=A4=B4=E5=83=8F=E5=8F=82=E6=95=B0=20-=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=89=8B=E6=9C=BA=E5=8F=B7=E7=BB=91=E5=AE=9A=E6=B5=81=E7=A8=8B?= =?UTF-8?q?=EF=BC=8C=E7=9B=B4=E6=8E=A5=E9=80=9A=E8=BF=87openId=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=20-=20=E5=AE=8C?= =?UTF-8?q?=E5=96=84=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BB=8E=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E7=9C=9F=E5=AE=9E=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=20-=20=E4=BF=AE=E5=A4=8D=E9=97=A8=E7=A6=81=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=AE=BE=E5=A4=87=E7=A6=BB=E7=BA=BF=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=20-=20=E6=9B=B4=E6=96=B0=E4=BC=9A=E5=91=98=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=EF=BC=8C=E6=94=AF=E6=8C=81=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=92=8C=E4=BF=A1=E6=81=AF=E5=AE=8C=E5=96=84?= =?UTF-8?q?=20-=20=E8=B0=83=E6=95=B4MyBatis=E6=98=A0=E5=B0=84=E6=96=87?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E4=BC=98=E5=8C=96=E7=94=A8=E6=88=B7=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=8F=92=E5=85=A5=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/sv/api/context/PlatformContext.java | 4 + .../controller/LoginOrRegisterController.java | 24 ++--- .../impl/LoginRegisterServiceImpl.java | 87 +++++++++++-------- .../service/impl/wechat/WechatService.java | 3 +- .../impl/ServerMessageHandlerAdapter.java | 10 ++- .../com/sv/dto/api/MemberInformationDTO.java | 11 ++- .../com/sv/service/api/MemberAuthService.java | 17 +++- .../com/sv/service/api/MemberService.java | 22 +++++ .../mybatis/mapper/sv/MemberMapper.xml | 20 ++--- 9 files changed, 132 insertions(+), 66 deletions(-) diff --git a/api/src/main/java/com/sv/api/context/PlatformContext.java b/api/src/main/java/com/sv/api/context/PlatformContext.java index 85bb743..411c68c 100644 --- a/api/src/main/java/com/sv/api/context/PlatformContext.java +++ b/api/src/main/java/com/sv/api/context/PlatformContext.java @@ -33,6 +33,10 @@ public class PlatformContext { return null; } + public static Integer getPlatFormValue () { + return 1; + } + public static void set(String key,Integer value){ PlatformDTO platformDTO = new PlatformDTO(); platformDTO.setKey(key); diff --git a/api/src/main/java/com/sv/api/controller/LoginOrRegisterController.java b/api/src/main/java/com/sv/api/controller/LoginOrRegisterController.java index 093b147..84739d7 100644 --- a/api/src/main/java/com/sv/api/controller/LoginOrRegisterController.java +++ b/api/src/main/java/com/sv/api/controller/LoginOrRegisterController.java @@ -71,15 +71,13 @@ public class LoginOrRegisterController extends BaseApiController { */ @RequestMapping(value = "/member/login/wx" , method = RequestMethod.POST) @Deprecated - public ResponseDTO loginWx(@RequestParam("code") String code, @RequestParam("nickname") String nickname, - @RequestParam("avatar") String avatar){ -// String openId = wechatService.getXcxOpenId(code); //查询openId: -// MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithXcx(openId,nickname,avatar); -// -// // memberTokenDTO为null则跳绑定手机页面 -// return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO) -// .addAttribute("information",loginRegisterService.info(avatar,nickname,openId)); - return null; + public ResponseDTO loginWx(@RequestParam("code") String code){ + String openId = wechatService.getXcxOpenId(code); //查询openId: + MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithXcx(openId); + + // memberTokenDTO为null则跳绑定手机页面 + return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO) + .addAttribute("information",loginRegisterService.info(openId)); } /** @@ -89,9 +87,11 @@ public class LoginOrRegisterController extends BaseApiController { */ @RequestMapping(value = "/member/login/wx/phone" , method = RequestMethod.POST) public ResponseDTO phone(BindMobileDTO bindMobileDTO){ - MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithPhoneCode(bindMobileDTO); + String openId = wechatService.getXcxOpenId(bindMobileDTO.getLoginCode()); //查询openId: + MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithPhoneCode(bindMobileDTO,openId); return ResponseDTO.ok() - .addAttribute("authorization",memberTokenDTO); + .addAttribute("authorization",memberTokenDTO) + .addAttribute("information",loginRegisterService.info(openId)); } /** @@ -115,6 +115,6 @@ public class LoginOrRegisterController extends BaseApiController { // memberTokenDTO为null则跳绑定手机页面 return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO) - .addAttribute("information",loginRegisterService.info(avatar,nickname,openId)); + .addAttribute("information",loginRegisterService.info(openId)); } } diff --git a/api/src/main/java/com/sv/api/service/impl/LoginRegisterServiceImpl.java b/api/src/main/java/com/sv/api/service/impl/LoginRegisterServiceImpl.java index 5771d7d..5473d94 100644 --- a/api/src/main/java/com/sv/api/service/impl/LoginRegisterServiceImpl.java +++ b/api/src/main/java/com/sv/api/service/impl/LoginRegisterServiceImpl.java @@ -11,7 +11,6 @@ import com.sv.dto.api.wechat.WechatLoginResult; import com.sv.entity.Member; import com.sv.entity.MemberAuth; import com.sv.exception.api.ExceptionCodeTemplate; -import com.sv.api.util.OSSHelper; import com.sv.api.service.impl.wechat.WechatService; import com.sv.service.api.MemberAuthService; import com.sv.service.api.MemberService; @@ -135,23 +134,23 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { /** * 微信快捷登录 */ -// @Deprecated -// public MemberTokenDTO loginWithXcx(String openId,String nickname, String avatar){ -// -// MemberTokenDTO memberTokenDTO = null; -// synchronized (openId){ -// // 判断用户是否注册过,用微信登录过 -// MemberAuth memberAuth = memberAuthService.findByAuthId(openId); -// // 登录过,则直接登录成功 -// if (memberAuth != null){ -// // 查询访问凭证,并强制更新 -// memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE); -// // 修改用户图像 -// updateInformation(memberAuth.getMemberId(),nickname,avatar); -// } -// } -// return memberTokenDTO; -// } + public MemberTokenDTO loginWithXcx(String openId){ + MemberTokenDTO memberTokenDTO = null; + Integer platformId = PlatformContext.getPlatFormValue(); + synchronized (openId.intern()){ + // 判断用户是否注册过,用微信登录过 + MemberAuth memberAuth = memberAuthService.findByAuthId(openId); + // 登录过,则直接登录成功 + if (memberAuth == null){ + // 先创建用户 + Member member = memberService.createUser(platformId); + // 创建用户登录认证 + memberAuth = memberAuthService.createByOpenId( member.getId(), platformId, openId); + } + memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE); + } + return memberTokenDTO; + } /** * 已用手机号登录,支付,再跳转微信登录 @@ -166,7 +165,6 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { if (memberId == null){ throw new ServiceException("token过期"); } - MemberTokenDTO memberTokenDTO = null; synchronized (openId){ // 1.根据openId,查找登录表,是否有记录,无,直接登录,插入信息到登录表 @@ -213,11 +211,18 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { * * 返回openId */ - public MemberInformationDTO info(String avatar,String nickname,String openId){ + public MemberInformationDTO info(String openId){ MemberInformationDTO informationDTO = new MemberInformationDTO(); - informationDTO.setAvatar(avatar); - informationDTO.setNickname(nickname); - informationDTO.setOpenId(openId); + MemberAuth memberAuth = memberAuthService.findByAuthId(openId); + if (memberAuth != null) { + Member byId = memberService.findById(memberAuth.getMemberId()); + if (byId != null) { + informationDTO.setAvatar(byId.getAvatar()); + informationDTO.setNickname(byId.getNickname()); + informationDTO.setMobile(byId.getMobile()); + informationDTO.setOpenId(openId); + } + } return informationDTO; } @@ -345,31 +350,33 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { * 通过loginCode获取openId,通过phoneCode获取手机号,直接完成登录 */ @Transactional - public MemberTokenDTO loginWithPhoneCode(BindMobileDTO bindMobileDTO){ - String loginCode = bindMobileDTO.getLoginCode(); + public MemberTokenDTO loginWithPhoneCode(BindMobileDTO bindMobileDTO,String openId){ String phoneCode = bindMobileDTO.getPhoneCode(); - if (StringUtils.isBlank(loginCode)) { + if (StringUtils.isBlank(openId)) { throw new ServiceException("loginCode不能为空"); } if (StringUtils.isBlank(phoneCode)) { throw new ServiceException("phoneCode不能为空"); } - Integer value = PlatformContext.getValue(); - WechatLoginResult wechatResult = wechatService.getXcxOpenIdAndPhone(loginCode, phoneCode); - String openId = wechatResult.getOpenId(); + Integer value = PlatformContext.getPlatFormValue(); + WechatLoginResult wechatResult = wechatService.getXcxOpenIdAndPhone(openId, phoneCode); String mobile = wechatResult.getPhoneNumber(); MemberTokenDTO memberTokenDTO = null; synchronized (openId.intern()){ Member member = memberService.findByMobile(mobile); if (member == null) { - member = memberService.createByMobile(mobile, value); - MemberAuth memberAuth = memberAuthService.findByMobile(mobile); + MemberAuth memberAuth = memberAuthService.findByAuthId(openId); if (memberAuth == null) { - memberAuth = memberAuthService.createByMobileByOpenId(member.getId(), member.getPlatformId(), mobile, openId); + member = memberService.createByMobile(mobile, value); } - memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE); + MemberAuth memberAuthMobile = memberAuthService.findByMobile(mobile); + if (memberAuthMobile == null) { + memberAuthMobile = memberAuthService.createByMobileByOpenId(memberAuth.getMemberId(), value, mobile, openId); + } + bindMobile(memberAuth.getMemberId(),mobile); + memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuthMobile.getMemberId(), Boolean.TRUE); } else { if (DeletedEnum.YES.value.equals(member.getDeleted())) { throw new ServiceException(ExceptionCodeTemplate.NONE_MEMBER_INFORMATION); @@ -392,6 +399,14 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { return memberTokenDTO; } + + private void bindMobile(Integer memberId,String mobile) { + Member member = memberService.findById(memberId); + memberService.verify(member); + member.setMobile( mobile); + memberService.update(member); + } + /*** * 修改用户图像 */ @@ -404,13 +419,13 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { if (nickname != null){ member.setNickname(nickname); } - + // 如果更新了头像,增加修改次数 if (avatar != null && !avatar.equals(member.getAvatar())) { int currentYear = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); Integer modifyCount = member.getAvatarModifyCount(); Integer modifyYear = member.getAvatarModifyYear(); - + if (modifyYear == null || modifyYear != currentYear) { member.setAvatarModifyCount(1); member.setAvatarModifyYear(currentYear); @@ -418,7 +433,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { member.setAvatarModifyCount((modifyCount == null ? 0 : modifyCount) + 1); } } - + member.setAvatar(avatar); memberService.update(member); } diff --git a/api/src/main/java/com/sv/api/service/impl/wechat/WechatService.java b/api/src/main/java/com/sv/api/service/impl/wechat/WechatService.java index 1afb309..861ffca 100644 --- a/api/src/main/java/com/sv/api/service/impl/wechat/WechatService.java +++ b/api/src/main/java/com/sv/api/service/impl/wechat/WechatService.java @@ -50,14 +50,13 @@ public class WechatService extends BaseServiceImpl { return response.getOpenid(); } - public WechatLoginResult getXcxOpenIdAndPhone(String loginCode, String phoneCode) { + public WechatLoginResult getXcxOpenIdAndPhone(String openId, String phoneCode) { Platform platform = platformServiceImpl.findById(PLATFORM_ID); if (platform == null) { logger.error("平台信息不存在,platformId: " + PLATFORM_ID); throw new ServiceException(ExceptionCodeTemplate.SERVICE_EXCEPTION); } - String openId = getXcxOpenId(loginCode); String accessToken = getAccessToken(platform); String phoneNumber = getPhoneNumber(phoneCode, accessToken); diff --git a/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java b/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java index 3b7c99a..e5f5d1f 100644 --- a/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java +++ b/api/src/main/java/com/sv/netty/netty/service/impl/ServerMessageHandlerAdapter.java @@ -88,7 +88,7 @@ public class ServerMessageHandlerAdapter implements MessageService { logger.info("=========" + JsonUtils.encode(heartBeat) + clientId); String deviceName = heartBeat.getDeviceName(); Integer venueId = heartBeat.getVenueId(); - + Channel oldChannel = getCurrentChannel(deviceName, venueId); if (oldChannel == null) { Venue thisVenue = venueService.findById(venueId); @@ -196,6 +196,10 @@ public class ServerMessageHandlerAdapter implements MessageService { throw new ServiceException("二维码已经使用"); } Channel channel = getCurrentChannel(doorSn,venueBarCode.getVenueId()); + if (channel == null) { + logger.error("门禁异常"); + throw new ServiceException("门禁异常离线中"); + } Member member = memberService.findByMember(venueBarCode.getMemberId()); if (member != null) { BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId()); @@ -240,6 +244,10 @@ public class ServerMessageHandlerAdapter implements MessageService { throw new ServiceException("二维码已经使用"); } Channel channel = getCurrentChannel(doorSn, venueBarCode.getVenueId()); + if (channel == null) { + logger.error("门禁异常"); + throw new ServiceException("门禁异常离线中"); + } Member member = memberService.findByMember(venueBarCode.getMemberId()); if (member != null) { BarcodeOrderTime lastOrder = barcodeOrderTimeMapper.findLastOrder(member.getId(), venueBarCode.getVenueId()); diff --git a/entity/src/main/java/com/sv/dto/api/MemberInformationDTO.java b/entity/src/main/java/com/sv/dto/api/MemberInformationDTO.java index cddcb44..fb74f2c 100644 --- a/entity/src/main/java/com/sv/dto/api/MemberInformationDTO.java +++ b/entity/src/main/java/com/sv/dto/api/MemberInformationDTO.java @@ -13,6 +13,8 @@ public class MemberInformationDTO implements Serializable { private String avatar; + private String mobile; + public String getOpenId() { return openId; } @@ -36,4 +38,11 @@ public class MemberInformationDTO implements Serializable { public void setAvatar(String avatar) { this.avatar = avatar; } -} \ No newline at end of file + + public String getMobile() { + return mobile; + } + public void setMobile(String mobile) { + this.mobile = mobile; + } +} diff --git a/service/src/main/java/com/sv/service/api/MemberAuthService.java b/service/src/main/java/com/sv/service/api/MemberAuthService.java index 7f4bdab..443372d 100644 --- a/service/src/main/java/com/sv/service/api/MemberAuthService.java +++ b/service/src/main/java/com/sv/service/api/MemberAuthService.java @@ -147,7 +147,7 @@ public class MemberAuthService extends BaseServiceImpl { * 创建登录认证,存在openId */ @Transactional - public MemberAuth createByMobileByOpenId(Integer memberId,Integer platformId, String mobile, String openId) { + public MemberAuth createByOpenId(Integer memberId,Integer platformId, String openId) { MemberAuth memberAuth = new MemberAuth(); memberAuth.setMemberId(memberId); // memberAuth.setMobile(mobile); @@ -155,6 +155,21 @@ public class MemberAuthService extends BaseServiceImpl { memberAuth.setAuthId(openId); memberAuth.setPlatformId(platformId); memberAuthMapper.insert(memberAuth); + return memberAuth; + } + + /** + * 创建登录认证,存在openId + */ + @Transactional + public MemberAuth createByMobileByOpenId(Integer memberId,Integer platformId, String mobile, String openId) { + MemberAuth memberAuth = new MemberAuth(); + memberAuth.setMemberId(memberId); +// memberAuth.setMobile(mobile); + memberAuth.setType(MemberAuthTypeEnum.WEIXIN.value); + memberAuth.setAuthId(openId); + memberAuth.setPlatformId(platformId); +// memberAuthMapper.insert(memberAuth); // 判断是否有用手机号登陆过 MemberAuth auth = memberAuthMapper.findByType(memberId); diff --git a/service/src/main/java/com/sv/service/api/MemberService.java b/service/src/main/java/com/sv/service/api/MemberService.java index db0e8bc..dfe1b7f 100644 --- a/service/src/main/java/com/sv/service/api/MemberService.java +++ b/service/src/main/java/com/sv/service/api/MemberService.java @@ -240,6 +240,28 @@ public class MemberService extends BaseServiceImpl { return member; } + @Transactional + public Member createUser(Integer platformId) { + // 创建用户 + Member member = new Member(); + member.setNickname("用户" + RandomStringUtils.randomNumeric(8)); + String inviteCode = ""; + Integer count = 1; + while (count == 1) { + inviteCode = RandomStringUtils.randomNumeric(10); + count = memberMapper.checkInviteCode(inviteCode); + } + member.setInviteCode(inviteCode); + member.setPlatformId(platformId); + + // 初始化头像修改次数 + member.setAvatarModifyCount(0); + member.setAvatarModifyYear(java.util.Calendar.getInstance().get(java.util.Calendar.YEAR)); + + memberMapper.insert(member); + return member; + } + /** * 断言手机号码未使用 * diff --git a/service/src/main/resources/mybatis/mapper/sv/MemberMapper.xml b/service/src/main/resources/mybatis/mapper/sv/MemberMapper.xml index f229859..e9e8cb4 100644 --- a/service/src/main/resources/mybatis/mapper/sv/MemberMapper.xml +++ b/service/src/main/resources/mybatis/mapper/sv/MemberMapper.xml @@ -63,7 +63,7 @@ sv_member - + id, @@ -87,7 +87,7 @@ avatar_modify_count, avatar_modify_year - + #{id, jdbcType=INTEGER}, @@ -140,15 +140,12 @@ WHERE sm.deleted = 0 - + INSERT INTO - - id, - nickname, @@ -205,9 +202,6 @@ - - #{id}, - #{nickname}, @@ -264,7 +258,7 @@ - + UPDATE @@ -287,7 +281,7 @@ #{item} - + UPDATE @@ -381,7 +375,7 @@ LEFT JOIN sv_member_face_info AS smfi ON sm.id = smfi.member_id WHERE sm.id = #{id} - + - \ No newline at end of file +