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);
|
}
|
|
|
}
|