Files
todo-backend/src/main/java/com/example/building/service/impl/AuthServiceImpl.java
Agent a0c2fd31ee
Some checks failed
continuous-integration/drone/push Build is failing
Revert "feat: 微信登录获取用户信息,客户列表按最后登录排序"
This reverts commit e35189b203.
2026-03-24 02:42:37 +00:00

190 lines
6.0 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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));
// 存入Redis5分钟有效
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;
}
}