Initial commit: backend code
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user