|
@@ -6,13 +6,16 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
import com.zhentao.common.user.domain.GooseUser;
|
|
|
+import com.zhentao.common.user.domain.UserLocation;
|
|
|
+import com.zhentao.common.user.domain.UserLogin;
|
|
|
import com.zhentao.common.user.dto.LoginDto;
|
|
|
import com.zhentao.common.user.mapper.GooseUserMapper;
|
|
|
+import com.zhentao.common.user.mapper.UserLocationMapper;
|
|
|
+import com.zhentao.common.user.mapper.UserLoginMapper;
|
|
|
import com.zhentao.common.user.service.GooseUserService;
|
|
|
-import com.zhentao.util.AppJwtUtil;
|
|
|
-import com.zhentao.util.HttpUtils;
|
|
|
-import com.zhentao.util.ResultVo;
|
|
|
-import com.zhentao.util.SnowflakeIdGenerator;
|
|
|
+import com.zhentao.constants.CommonConstant;
|
|
|
+import com.zhentao.exceptions.ApiException;
|
|
|
+import com.zhentao.util.*;
|
|
|
import lombok.SneakyThrows;
|
|
|
import org.apache.http.HttpResponse;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -27,7 +30,9 @@ import org.springframework.web.client.HttpClientErrorException;
|
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
import redis.clients.jedis.Jedis;
|
|
|
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
+import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
import java.util.UUID;
|
|
@@ -42,6 +47,8 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
|
|
|
implements GooseUserService {
|
|
|
@Autowired
|
|
|
private GooseUserMapper userMapper;
|
|
|
+ @Autowired
|
|
|
+ private UserLocationMapper userLocationMapper;
|
|
|
@Value("${wechat.appid}")
|
|
|
private String APPID;
|
|
|
|
|
@@ -49,7 +56,7 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
|
|
|
private String SECRET;
|
|
|
private static final ObjectMapper objectMapper = new ObjectMapper(); // JSON 解析器
|
|
|
@Override
|
|
|
- public ResultVo login(LoginDto loginDto) {
|
|
|
+ public ResultVo login(LoginDto loginDto,HttpServletRequest request) {
|
|
|
if(StringUtils.checkValNotNull(loginDto.getPhone())){
|
|
|
QueryWrapper<GooseUser> queryWrapper=new QueryWrapper<>();
|
|
|
queryWrapper.eq("phone",loginDto.getPhone());
|
|
@@ -60,13 +67,29 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
|
|
|
if(StringUtils.checkValNotNull(loginDto.getPassword())){
|
|
|
gooseUser1.setId(SnowflakeIdGenerator.getSnowId());
|
|
|
gooseUser1.setNickname("普通用户"+ UUID.randomUUID().toString().replace("-","").substring(0,8));
|
|
|
- String password = gooseUser1.getPassword();
|
|
|
- String salt=UUID.randomUUID().toString().replace(",","");
|
|
|
- String pwd= DigestUtils.md5DigestAsHex((password+salt).getBytes(StandardCharsets.UTF_8));
|
|
|
+ String salt=UUID.randomUUID().toString().replace("-","");
|
|
|
+ String pwd= DigestUtils.md5DigestAsHex((loginDto.getPassword()+salt).getBytes(StandardCharsets.UTF_8));
|
|
|
gooseUser1.setPassword(pwd);
|
|
|
gooseUser1.setSalt(salt);
|
|
|
userMapper.insert(gooseUser1);
|
|
|
String token= AppJwtUtil.getToken(gooseUser1.getId());
|
|
|
+ UserLocation location=new UserLocation();
|
|
|
+ location.setLastLoginTime(new Date());
|
|
|
+ location.setUserId(user.getId());
|
|
|
+ location.setAppId(APPID);
|
|
|
+ String requestIp = request.getHeader("X-Forwarded-For");
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("WL-Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getRemoteAddr(); // 最后兜底
|
|
|
+ }
|
|
|
+ System.out.println("请求IP: " + requestIp);
|
|
|
+ location.setReqIp(requestIp);
|
|
|
+ userLocationMapper.insert(location);
|
|
|
return ResultVo.OK(token);
|
|
|
}
|
|
|
if(StringUtils.checkValNotNull(loginDto.getCode())){
|
|
@@ -77,6 +100,23 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
|
|
|
if(loginDto.getCode().equals(code)){
|
|
|
userMapper.insert(gooseUser1);
|
|
|
String token= AppJwtUtil.getToken(gooseUser1.getId());
|
|
|
+ UserLocation location=new UserLocation();
|
|
|
+ location.setLastLoginTime(new Date());
|
|
|
+ location.setUserId(user.getId());
|
|
|
+ location.setAppId(APPID);
|
|
|
+ String requestIp = request.getHeader("X-Forwarded-For");
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("WL-Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getRemoteAddr(); // 最后兜底
|
|
|
+ }
|
|
|
+ System.out.println("请求IP: " + requestIp);
|
|
|
+ location.setReqIp(requestIp);
|
|
|
+ userLocationMapper.insert(location);
|
|
|
return ResultVo.OK(token);
|
|
|
}
|
|
|
}
|
|
@@ -88,7 +128,24 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
|
|
|
String pwd=DigestUtils.md5DigestAsHex((loginDto.getPassword()+salt).getBytes(StandardCharsets.UTF_8));
|
|
|
if(pwd.equals(password)){
|
|
|
String token=AppJwtUtil.getToken(user.getId());
|
|
|
- return ResultVo.OK();
|
|
|
+ UserLocation location=new UserLocation();
|
|
|
+ location.setLastLoginTime(new Date());
|
|
|
+ location.setUserId(user.getId());
|
|
|
+ location.setAppId(APPID);
|
|
|
+ String requestIp = request.getHeader("X-Forwarded-For");
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("WL-Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getRemoteAddr(); // 最后兜底
|
|
|
+ }
|
|
|
+ System.out.println("请求IP: " + requestIp);
|
|
|
+ location.setReqIp(requestIp);
|
|
|
+ userLocationMapper.insert(location);
|
|
|
+ return ResultVo.OK(token);
|
|
|
}
|
|
|
return ResultVo.ERROR();
|
|
|
}
|
|
@@ -97,6 +154,23 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
|
|
|
String code = jedis.get("code");
|
|
|
if(loginDto.getCode().equals(code)){
|
|
|
String token=AppJwtUtil.getToken(user.getId());
|
|
|
+ UserLocation location=new UserLocation();
|
|
|
+ location.setLastLoginTime(new Date());
|
|
|
+ location.setUserId(user.getId());
|
|
|
+ location.setAppId(APPID);
|
|
|
+ String requestIp = request.getHeader("X-Forwarded-For");
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("WL-Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getRemoteAddr(); // 最后兜底
|
|
|
+ }
|
|
|
+ System.out.println("请求IP: " + requestIp);
|
|
|
+ location.setReqIp(requestIp);
|
|
|
+ userLocationMapper.insert(location);
|
|
|
return ResultVo.OK(token);
|
|
|
}
|
|
|
}
|
|
@@ -106,11 +180,17 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
|
|
|
|
|
|
@SneakyThrows
|
|
|
@Override
|
|
|
- public ResultVo Wxlogin(Map<String, String> requestData) {
|
|
|
+ public ResultVo Wxlogin(Map<String, String> requestData, HttpServletRequest request) {
|
|
|
String code = requestData.get("code");
|
|
|
+ String encryptedData = requestData.get("encryptedData");
|
|
|
+ String iv = requestData.get("iv");
|
|
|
+ String avatarUrl=requestData.get("avatar_url");
|
|
|
+ String nickname=requestData.get("nickname");
|
|
|
System.out.println(code);
|
|
|
+ System.out.println(encryptedData);
|
|
|
+ System.out.println(iv);
|
|
|
if (code == null) {
|
|
|
- return new ResultVo(400,"Missing code",null);
|
|
|
+ return new ResultVo(CommonConstant.ERROR,"Missing code",null);
|
|
|
}
|
|
|
String url = "https://api.weixin.qq.com/sns/jscode2session?" +
|
|
|
"appid=" + APPID +
|
|
@@ -125,13 +205,10 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
|
|
|
// 改用 String 接收响应,兼容所有 Content-Type
|
|
|
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
|
|
|
String responseBody = response.getBody();
|
|
|
-
|
|
|
- System.out.println(responseBody);
|
|
|
-
|
|
|
// 手动解析 JSON
|
|
|
Map<String, Object> result = objectMapper.readValue(responseBody, Map.class);
|
|
|
if (result.containsKey("errcode")) { // 微信错误响应
|
|
|
- return new ResultVo(400,"微信接口返回错误: " + result.get("errmsg"),null);
|
|
|
+ return new ResultVo(CommonConstant.ERROR,"微信接口返回错误: " + result.get("errmsg"),null);
|
|
|
}
|
|
|
// 成功响应
|
|
|
QueryWrapper<GooseUser>queryWrapper=new QueryWrapper<>();
|
|
@@ -139,21 +216,63 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
|
|
|
String session_key=(String) result.get("session_key");
|
|
|
queryWrapper.eq("open_id",openId);
|
|
|
GooseUser gooseUser = userMapper.selectOne(queryWrapper);
|
|
|
+ System.out.println(gooseUser);
|
|
|
if(gooseUser==null){
|
|
|
GooseUser user=new GooseUser();
|
|
|
user.setId(SnowflakeIdGenerator.getSnowId());
|
|
|
user.setOpenId(openId);
|
|
|
- user.setNickname("微信用户"+ UUID.randomUUID().toString().replace("-","").substring(0,8));
|
|
|
+ user.setNickname(nickname);
|
|
|
+ user.setAvatarUrl(avatarUrl);
|
|
|
userMapper.insert(user);
|
|
|
String token=AppJwtUtil.getToken(user.getId());
|
|
|
- return new ResultVo(200,"登录成功",token);
|
|
|
+ String userInfo = WXBizDataCryptUtil.decryptData(APPID, session_key, encryptedData, iv);
|
|
|
+ System.out.println(userInfo);
|
|
|
+ UserLocation location=new UserLocation();
|
|
|
+ location.setLastLoginTime(new Date());
|
|
|
+ location.setUserId(user.getId());
|
|
|
+ location.setAppId(APPID);
|
|
|
+ location.setDeviceId(openId);
|
|
|
+ String requestIp = request.getHeader("X-Forwarded-For");
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("WL-Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getRemoteAddr(); // 最后兜底
|
|
|
+ }
|
|
|
+ System.out.println("请求IP: " + requestIp);
|
|
|
+ location.setReqIp(requestIp);
|
|
|
+ userLocationMapper.insert(location);
|
|
|
+ return new ResultVo(CommonConstant.OK,"登录成功",token);
|
|
|
}
|
|
|
+ String userInfo = WXBizDataCryptUtil.decryptData(APPID, session_key, encryptedData, iv);
|
|
|
+ System.out.println(userInfo);
|
|
|
String token=AppJwtUtil.getToken(gooseUser.getId());
|
|
|
- return new ResultVo(200,"登录成功",token);
|
|
|
+ UserLocation location=new UserLocation();
|
|
|
+ location.setLastLoginTime(new Date());
|
|
|
+ location.setUserId(gooseUser.getId());
|
|
|
+ location.setAppId(APPID);
|
|
|
+ location.setDeviceId(openId);
|
|
|
+ String requestIp = request.getHeader("X-Forwarded-For");
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getHeader("WL-Proxy-Client-IP");
|
|
|
+ }
|
|
|
+ if (requestIp == null || requestIp.isEmpty() || "unknown".equalsIgnoreCase(requestIp)) {
|
|
|
+ requestIp = request.getRemoteAddr(); // 最后兜底
|
|
|
+ }
|
|
|
+ System.out.println("请求IP: " + requestIp);
|
|
|
+ location.setReqIp(requestIp);
|
|
|
+ userLocationMapper.insert(location);
|
|
|
+ return new ResultVo(CommonConstant.OK,"登录成功",token);
|
|
|
} catch (HttpClientErrorException e) { // 处理 HTTP 错误(如 400、500)
|
|
|
- return new ResultVo(400,"请求微信接口失败: " + e.getResponseBodyAsString(),null);
|
|
|
+ throw new ApiException(CommonConstant.ERROR,"请求微信接口失败: " + e.getResponseBodyAsString());
|
|
|
} catch (Exception e) { // 处理 JSON 解析错误
|
|
|
- return new ResultVo(400,"响应解析失败: " + e.getMessage(),null);
|
|
|
+ throw new ApiException(CommonConstant.ERROR,"响应解析失败: " + e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -205,7 +324,6 @@ public class GooseUserServiceImpl extends ServiceImpl<GooseUserMapper, GooseUser
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
// 构建成功响应
|
|
|
private Map<String, Object> buildSuccessResponse(String openid, String sessionKey) {
|
|
|
Map<String, Object> response = new HashMap<>();
|