package com.ks.app.service.impl.user; import com.ks.app.dto.user.LoginInfoDTO; import com.ks.app.entity.config.SystemConfigKey; import com.ks.app.entity.user.UserInfo; import com.ks.app.entity.user.UserLoginRecord; import com.ks.app.entity.user.WXUserInfo; import com.ks.app.exception.user.LoginException; import com.ks.app.service.inter.config.SystemConfigService; import com.ks.app.service.inter.user.*; import com.ks.app.service.manager.VerifyCodeManager; import com.ks.app.utils.AliyunOneKeyLoginUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.yeshi.utils.StringUtil; import org.yeshi.utils.entity.wx.WeiXinUser; import org.yeshi.utils.wx.WXAppLoginUtil; import javax.annotation.Resource; import java.util.UUID; @Service public class UserAccountServiceImpl implements UserAccountService { @Resource private UserInfoService userInfoService; @Resource private UserLoginRecordService userLoginRecordService; @Resource private VerifyCodeManager verifyCodeManager; @Resource private WXUserInfoService wxUserInfoService; @Resource private QQUserInfoService qqUserInfoService; @Resource private SystemConfigService systemConfigService; @Transactional(rollbackFor = Exception.class) @Override public UserInfo login(LoginInfoDTO loginInfo) throws LoginException { if (loginInfo == null) { throw new LoginException("登录信息为空"); } UserInfo user = null; switch (loginInfo.getLoginType()) { case UserLoginRecord .TYPE_LOGIN_PHONE: { if (!StringUtil.isNullOrEmpty(loginInfo.getPhoneAuthInfo())) { //一键登录 //获取电话号码 String mobile = AliyunOneKeyLoginUtil.getMobile(loginInfo.getPhoneAuthInfo(), UUID.randomUUID().toString(), systemConfigService.getValueCache(loginInfo.getSystem(), SystemConfigKey.aliyunOneKeyAuthAcessKey), systemConfigService.getValueCache(loginInfo.getSystem(), SystemConfigKey.aliyunOneKeyAuthAcessSecret)); if (StringUtil.isNullOrEmpty(mobile)) { throw new LoginException("电话号码获取失败"); } loginInfo.setPhone(mobile); } else { //验证码登录 if (!verifyCodeManager.isPhoneCodeRight(loginInfo.getSystem(), loginInfo.getPhone(), loginInfo.getVcode())) { throw new LoginException("验证码出错"); } } //执行登录操作 user = userInfoService.selectByPhoneAndSystemAndStatus(loginInfo.getPhone(), loginInfo.getSystem(), UserInfo.STATUS_NORMAL); if (user == null) { //创建用户 UserInfo newUser = new UserInfo(); newUser.setPhone(loginInfo.getPhone()); newUser.setSystem(loginInfo.getSystem()); newUser.setNickName(""); newUser.setPortrait(systemConfigService.getValueCache(loginInfo.getSystem(), SystemConfigKey.defaultPortrait)); try { userInfoService.add(newUser); } catch (Exception e) { throw new LoginException("注册用户失败"); } //更改昵称 UserInfo updateUser = new UserInfo(); updateUser.setId(newUser.getId()); updateUser.setNickName(systemConfigService.getValueCache(loginInfo.getSystem(), SystemConfigKey.defaultNickNamePrefix) + newUser.getId()); userInfoService.update(updateUser); user = newUser; } } break; case UserLoginRecord .TYPE_LOGIN_WX: { String appId = systemConfigService.getValueCache(loginInfo.getSystem(), SystemConfigKey.wxAppId); String appSecret = systemConfigService.getValueCache(loginInfo.getSystem(), SystemConfigKey.wxAppSecret); WeiXinUser weiXinUser = WXAppLoginUtil.getWeiXinUser(loginInfo.getWxCode(), appId, appSecret); if (weiXinUser == null) { throw new LoginException("微信授权信息获取失败"); } //保存微信用户信息 WXUserInfo wxUserInfo = null; try { wxUserInfo = wxUserInfoService.save(WXUserInfo.create(weiXinUser)); } catch (Exception e) { throw new LoginException("保存微信授权信息失败"); } wxUserInfo.setSystem(loginInfo.getSystem()); user = userInfoService.selectByWXIdAndSystemAndStatus(wxUserInfo.getId(), wxUserInfo.getSystem(), UserInfo.STATUS_NORMAL); if (user == null) { //新建用户 UserInfo newUser = new UserInfo(); newUser.setWxUser(wxUserInfo); newUser.setSystem(loginInfo.getSystem()); newUser.setNickName(wxUserInfo.getNickName()); newUser.setPortrait(wxUserInfo.getHeadImgUrl()); try { userInfoService.add(newUser); } catch (Exception e) { throw new LoginException("注册用户失败"); } user = newUser; } } break; case UserLoginRecord .TYPE_LOGIN_QQ: //保存QQ信息 break; case UserLoginRecord .TYPE_LOGIN_EMAIL: //验证密码是否正确 UserInfo oldUser = userInfoService.selectByEmailAndSystemAndStatus(loginInfo.getEmail(), loginInfo.getSystem(), UserInfo.STATUS_NORMAL); if (oldUser == null) { throw new LoginException("邮箱未注册"); } if (!StringUtil.Md5(loginInfo.getPwd()).equalsIgnoreCase(oldUser.getPwd())) { throw new LoginException("密码错误"); } user = oldUser; break; default: throw new LoginException("登录方式不存在"); } loginSuccess(user.getId(), loginInfo); return null; } @Override public void unRegister(Long uid) { UserInfo update = new UserInfo(); update.setId(uid); update.setStatus(UserInfo.STATUS_OWN_DELETE); userInfoService.update(update); } /** * @return void * @author hxh * @description 登录成功 * @date 18:21 2021/11/15 **/ private void loginSuccess(Long uid, LoginInfoDTO dto) { UserLoginRecord record = new UserLoginRecord(); record.setLoginIPInfo(dto.getIpInfo()); record.setLoginType(dto.getLoginType()); record.setUid(uid); userLoginRecordService.addUserLoginRecord(record); } }