Initial commit: backend code

This commit is contained in:
Agent
2026-03-20 04:59:00 +00:00
commit e7c7f3b174
42 changed files with 2855 additions and 0 deletions

View File

@@ -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));
// 存入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;
}
}