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 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 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() .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 wechatLogin(String code) { // TODO: 调用微信API获取openid // String openid = wechatService.getOpenId(code); String openid = "wechat_" + code; // 查询用户,不存在则创建 User user = userMapper.selectOne(new LambdaQueryWrapper() .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 alipayLogin(String code) { // TODO: 调用支付宝API获取openid // String openid = alipayService.getOpenId(code); String openid = "alipay_" + code; // 查询用户,不存在则创建 User user = userMapper.selectOne(new LambdaQueryWrapper() .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 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 getCurrentUser(String userId) { User user = userMapper.selectById(userId); if (user == null) { throw new RuntimeException("用户不存在"); } Map 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 generateTokens(User user) { String token = jwtUtil.generateToken(user.getUserId(), user.getUsername(), user.getRole()); String refreshToken = jwtUtil.generateRefreshToken(user.getUserId()); Map 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; } }