Some checks failed
continuous-integration/drone/push Build is failing
This reverts commit e35189b203.
190 lines
6.0 KiB
Java
190 lines
6.0 KiB
Java
package com.example.building.service.impl;
|
||
|
||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||
import com.example.building.common.JwtUtil;
|
||
import com.example.building.entity.User;
|
||
import com.example.building.mapper.UserMapper;
|
||
import com.example.building.service.AuthService;
|
||
import org.springframework.beans.factory.annotation.Autowired;
|
||
import org.springframework.beans.factory.annotation.Value;
|
||
import org.springframework.data.redis.core.RedisTemplate;
|
||
import org.springframework.stereotype.Service;
|
||
|
||
import java.util.HashMap;
|
||
import java.util.Map;
|
||
import java.util.UUID;
|
||
import java.util.concurrent.TimeUnit;
|
||
|
||
/**
|
||
* 认证服务实现类
|
||
* 支持:手机号验证码登录、微信扫码登录、支付宝扫码登录
|
||
*/
|
||
@Service
|
||
public class AuthServiceImpl implements AuthService {
|
||
|
||
@Autowired
|
||
private UserMapper userMapper;
|
||
|
||
@Autowired
|
||
private JwtUtil jwtUtil;
|
||
|
||
@Autowired
|
||
private RedisTemplate<String, Object> redisTemplate;
|
||
|
||
@Value("${jwt.expiration:7200000}")
|
||
private Long expiration;
|
||
|
||
/**
|
||
* 发送验证码
|
||
* 实际生产中应调用阿里云短信服务
|
||
*/
|
||
@Override
|
||
public void sendCode(String phone) {
|
||
// 生成6位随机验证码
|
||
String code = String.format("%06d", (int) (Math.random() * 1000000));
|
||
// 存入Redis,5分钟有效
|
||
redisTemplate.opsForValue().set("sms:code:" + phone, code, 5, TimeUnit.MINUTES);
|
||
// TODO: 调用短信服务发送验证码
|
||
System.out.println("验证码已发送: " + phone + " - " + code);
|
||
}
|
||
|
||
/**
|
||
* 手机号验证码登录
|
||
*/
|
||
@Override
|
||
public Map<String, Object> phoneLogin(String phone, String code) {
|
||
// 验证验证码
|
||
String savedCode = (String) redisTemplate.opsForValue().get("sms:code:" + phone);
|
||
if (savedCode == null || !savedCode.equals(code)) {
|
||
throw new RuntimeException("验证码错误或已过期");
|
||
}
|
||
|
||
// 查询用户,不存在则创建
|
||
User user = userMapper.selectOne(new LambdaQueryWrapper<User>()
|
||
.eq(User::getPhone, phone));
|
||
if (user == null) {
|
||
user = new User();
|
||
user.setUserId(UUID.randomUUID().toString());
|
||
user.setPhone(phone);
|
||
user.setUsername("用户" + phone.substring(7));
|
||
user.setRole("sales");
|
||
user.setStatus(1);
|
||
userMapper.insert(user);
|
||
}
|
||
|
||
// 生成Token
|
||
return generateTokens(user);
|
||
}
|
||
|
||
/**
|
||
* 微信扫码登录
|
||
* 实际生产中需要调用微信API获取openid
|
||
*/
|
||
@Override
|
||
public Map<String, Object> wechatLogin(String code) {
|
||
// TODO: 调用微信API获取openid
|
||
// String openid = wechatService.getOpenId(code);
|
||
String openid = "wechat_" + code;
|
||
|
||
// 查询用户,不存在则创建
|
||
User user = userMapper.selectOne(new LambdaQueryWrapper<User>()
|
||
.eq(User::getWechatOpenid, openid));
|
||
if (user == null) {
|
||
user = new User();
|
||
user.setUserId(UUID.randomUUID().toString());
|
||
user.setWechatOpenid(openid);
|
||
user.setUsername("微信用户");
|
||
user.setRole("sales");
|
||
user.setStatus(1);
|
||
userMapper.insert(user);
|
||
}
|
||
|
||
return generateTokens(user);
|
||
}
|
||
|
||
/**
|
||
* 支付宝扫码登录
|
||
* 实际生产中需要调用支付宝API获取openid
|
||
*/
|
||
@Override
|
||
public Map<String, Object> alipayLogin(String code) {
|
||
// TODO: 调用支付宝API获取openid
|
||
// String openid = alipayService.getOpenId(code);
|
||
String openid = "alipay_" + code;
|
||
|
||
// 查询用户,不存在则创建
|
||
User user = userMapper.selectOne(new LambdaQueryWrapper<User>()
|
||
.eq(User::getAlipayOpenid, openid));
|
||
if (user == null) {
|
||
user = new User();
|
||
user.setUserId(UUID.randomUUID().toString());
|
||
user.setAlipayOpenid(openid);
|
||
user.setUsername("支付宝用户");
|
||
user.setRole("sales");
|
||
user.setStatus(1);
|
||
userMapper.insert(user);
|
||
}
|
||
|
||
return generateTokens(user);
|
||
}
|
||
|
||
/**
|
||
* 刷新Token
|
||
*/
|
||
@Override
|
||
public Map<String, Object> refreshToken(String refreshToken) {
|
||
if (!jwtUtil.validateToken(refreshToken)) {
|
||
throw new RuntimeException("刷新Token无效");
|
||
}
|
||
String userId = jwtUtil.getUserId(refreshToken);
|
||
User user = userMapper.selectById(userId);
|
||
if (user == null) {
|
||
throw new RuntimeException("用户不存在");
|
||
}
|
||
return generateTokens(user);
|
||
}
|
||
|
||
/**
|
||
* 获取当前用户信息
|
||
*/
|
||
@Override
|
||
public Map<String, Object> getCurrentUser(String userId) {
|
||
User user = userMapper.selectById(userId);
|
||
if (user == null) {
|
||
throw new RuntimeException("用户不存在");
|
||
}
|
||
Map<String, Object> result = new HashMap<>();
|
||
result.put("userId", user.getUserId());
|
||
result.put("username", user.getUsername());
|
||
result.put("phone", user.getPhone());
|
||
result.put("role", user.getRole());
|
||
return result;
|
||
}
|
||
|
||
/**
|
||
* 退出登录
|
||
*/
|
||
@Override
|
||
public void logout(String token) {
|
||
// 将token加入黑名单
|
||
redisTemplate.opsForValue().set("blacklist:" + token, "1", 2, TimeUnit.HOURS);
|
||
}
|
||
|
||
/**
|
||
* 生成Token和RefreshToken
|
||
*/
|
||
private Map<String, Object> generateTokens(User user) {
|
||
String token = jwtUtil.generateToken(user.getUserId(), user.getUsername(), user.getRole());
|
||
String refreshToken = jwtUtil.generateRefreshToken(user.getUserId());
|
||
|
||
Map<String, Object> result = new HashMap<>();
|
||
result.put("token", token);
|
||
result.put("refreshToken", refreshToken);
|
||
result.put("userId", user.getUserId());
|
||
result.put("username", user.getUsername());
|
||
result.put("role", user.getRole());
|
||
|
||
return result;
|
||
}
|
||
}
|