feat: 完善后端架构和service层实现
- 创建完整的entity实体类体系,包括所有业务实体 - 实现BaseEntity基类,统一管理公共字段 - 创建雪花算法ID生成器和自动填充处理器 - 简化所有mapper接口,只继承BaseMapper - 重构service层,使用LambdaQueryWrapper进行数据库操作 - 创建BasePageRequest分页查询基类 - 完善用户上下文管理和JWT认证 - 新增WebSocket聊天功能和相关控制器 - 更新前端配置和组件,完善用户认证流程 - 同步数据库建表脚本
This commit is contained in:
@@ -11,6 +11,11 @@ import org.springframework.web.bind.annotation.*;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import com.wf.captcha.SpecCaptcha;
|
||||
import com.wf.captcha.base.Captcha;
|
||||
import com.emotion.util.JwtUtil;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* 认证控制器
|
||||
@@ -24,9 +29,15 @@ public class AuthController {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(AuthController.class);
|
||||
|
||||
// 验证码存储(生产环境应使用Redis)
|
||||
private static final Map<String, String> captchaStore = new ConcurrentHashMap<>();
|
||||
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
@Autowired
|
||||
private JwtUtil jwtUtil;
|
||||
|
||||
/**
|
||||
* 用户登录
|
||||
*/
|
||||
@@ -37,10 +48,30 @@ public class AuthController {
|
||||
try {
|
||||
String account = request.get("account");
|
||||
String password = request.get("password");
|
||||
|
||||
String captcha = request.get("captcha");
|
||||
String captchaKey = request.get("captchaKey");
|
||||
|
||||
if (account == null || password == null) {
|
||||
return Result.error("账号和密码不能为空");
|
||||
}
|
||||
|
||||
// 验证验证码
|
||||
if (captcha == null || captchaKey == null) {
|
||||
return Result.error("验证码不能为空");
|
||||
}
|
||||
|
||||
String storedCaptcha = captchaStore.get(captchaKey);
|
||||
if (storedCaptcha == null) {
|
||||
return Result.error("验证码已过期");
|
||||
}
|
||||
|
||||
if (!storedCaptcha.equals(captcha.toLowerCase())) {
|
||||
captchaStore.remove(captchaKey); // 验证失败后移除验证码
|
||||
return Result.error("验证码错误");
|
||||
}
|
||||
|
||||
// 验证成功后移除验证码
|
||||
captchaStore.remove(captchaKey);
|
||||
|
||||
// 查找用户
|
||||
User user = userService.findByAccount(account);
|
||||
@@ -56,9 +87,14 @@ public class AuthController {
|
||||
// 更新最后活跃时间
|
||||
userService.updateLastActiveTime(user.getId());
|
||||
|
||||
// 生成JWT token
|
||||
String accessToken = jwtUtil.generateToken(user.getId(), user.getUsername());
|
||||
String refreshToken = jwtUtil.generateRefreshToken(user.getId(), user.getUsername());
|
||||
|
||||
// 构建响应
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("accessToken", "token-" + user.getId() + "-" + System.currentTimeMillis());
|
||||
response.put("accessToken", accessToken);
|
||||
response.put("refreshToken", refreshToken);
|
||||
response.put("expiresIn", 86400L);
|
||||
|
||||
Map<String, Object> userInfo = new HashMap<>();
|
||||
@@ -85,7 +121,7 @@ public class AuthController {
|
||||
@PostMapping("/register")
|
||||
public Result<Map<String, Object>> register(@RequestBody Map<String, String> request) {
|
||||
log.info("用户注册请求: {}", request.get("account"));
|
||||
|
||||
|
||||
try {
|
||||
String account = request.get("account");
|
||||
String password = request.get("password");
|
||||
@@ -93,11 +129,31 @@ public class AuthController {
|
||||
String email = request.get("email");
|
||||
String phone = request.get("phone");
|
||||
String nickname = request.get("nickname");
|
||||
|
||||
String captcha = request.get("captcha");
|
||||
String captchaKey = request.get("captchaKey");
|
||||
|
||||
if (account == null || password == null) {
|
||||
return Result.error("账号和密码不能为空");
|
||||
}
|
||||
|
||||
|
||||
// 验证验证码
|
||||
if (captcha == null || captchaKey == null) {
|
||||
return Result.error("验证码不能为空");
|
||||
}
|
||||
|
||||
String storedCaptcha = captchaStore.get(captchaKey);
|
||||
if (storedCaptcha == null) {
|
||||
return Result.error("验证码已过期");
|
||||
}
|
||||
|
||||
if (!storedCaptcha.equals(captcha.toLowerCase())) {
|
||||
captchaStore.remove(captchaKey); // 验证失败后移除验证码
|
||||
return Result.error("验证码错误");
|
||||
}
|
||||
|
||||
// 验证成功后移除验证码
|
||||
captchaStore.remove(captchaKey);
|
||||
|
||||
// 检查账号是否已存在
|
||||
if (userService.accountExists(account)) {
|
||||
return Result.error("账号已存在");
|
||||
@@ -113,37 +169,112 @@ public class AuthController {
|
||||
user.setNickname(nickname != null ? nickname : username != null ? username : account);
|
||||
|
||||
User createdUser = userService.createUser(user);
|
||||
|
||||
// 构建响应
|
||||
|
||||
// 生成JWT token(注册成功后自动登录)
|
||||
String accessToken = jwtUtil.generateToken(createdUser.getId(), createdUser.getUsername());
|
||||
String refreshToken = jwtUtil.generateRefreshToken(createdUser.getId(), createdUser.getUsername());
|
||||
|
||||
// 构建用户信息
|
||||
Map<String, Object> userInfo = new HashMap<>();
|
||||
userInfo.put("id", createdUser.getId());
|
||||
userInfo.put("username", createdUser.getUsername());
|
||||
userInfo.put("account", createdUser.getAccount());
|
||||
userInfo.put("nickname", createdUser.getNickname());
|
||||
userInfo.put("avatar", createdUser.getAvatar());
|
||||
userInfo.put("status", createdUser.getStatus());
|
||||
userInfo.put("createTime", createdUser.getCreateTime());
|
||||
|
||||
return Result.success("注册成功", userInfo);
|
||||
|
||||
// 构建完整响应(包含token信息)
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("accessToken", accessToken);
|
||||
response.put("refreshToken", refreshToken);
|
||||
response.put("expiresIn", 86400L); // 24小时
|
||||
response.put("userInfo", userInfo);
|
||||
response.put("loginTime", LocalDateTime.now());
|
||||
|
||||
log.info("用户注册并自动登录成功: {}", createdUser.getAccount());
|
||||
return Result.success("注册成功,已自动登录", response);
|
||||
} catch (Exception e) {
|
||||
log.error("用户注册失败: {}", e.getMessage());
|
||||
return Result.error("注册失败: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前用户信息
|
||||
*/
|
||||
@GetMapping("/user-info")
|
||||
public Result<Map<String, Object>> getCurrentUserInfo(HttpServletRequest request) {
|
||||
try {
|
||||
// 从请求属性中获取用户信息(由JWT拦截器设置)
|
||||
String userId = (String) request.getAttribute("userId");
|
||||
String username = (String) request.getAttribute("username");
|
||||
|
||||
if (userId == null) {
|
||||
return Result.error("用户未登录");
|
||||
}
|
||||
|
||||
// 根据用户ID获取完整用户信息
|
||||
User user = userService.findById(userId);
|
||||
if (user == null) {
|
||||
return Result.error("用户不存在");
|
||||
}
|
||||
|
||||
// 构建用户信息响应
|
||||
Map<String, Object> userInfo = new HashMap<>();
|
||||
userInfo.put("id", user.getId());
|
||||
userInfo.put("username", user.getUsername());
|
||||
userInfo.put("account", user.getAccount());
|
||||
userInfo.put("nickname", user.getNickname());
|
||||
userInfo.put("avatar", user.getAvatar());
|
||||
userInfo.put("email", user.getEmail());
|
||||
userInfo.put("phone", user.getPhone());
|
||||
userInfo.put("status", user.getStatus());
|
||||
userInfo.put("createTime", user.getCreateTime());
|
||||
|
||||
return Result.success("获取用户信息成功", userInfo);
|
||||
} catch (Exception e) {
|
||||
log.error("获取用户信息失败: {}", e.getMessage());
|
||||
return Result.error("获取用户信息失败");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取验证码
|
||||
*/
|
||||
@GetMapping("/captcha")
|
||||
public Result<Map<String, Object>> getCaptcha() {
|
||||
log.info("获取验证码请求");
|
||||
|
||||
|
||||
try {
|
||||
// 生成验证码
|
||||
SpecCaptcha captcha = new SpecCaptcha(130, 48, 4);
|
||||
captcha.setCharType(Captcha.TYPE_DEFAULT);
|
||||
|
||||
// 生成验证码key
|
||||
String captchaKey = "captcha_" + System.currentTimeMillis();
|
||||
String captchaText = captcha.text().toLowerCase();
|
||||
|
||||
// 存储验证码(5分钟过期)
|
||||
captchaStore.put(captchaKey, captchaText);
|
||||
|
||||
// 5分钟后清理验证码
|
||||
new Thread(() -> {
|
||||
try {
|
||||
Thread.sleep(300000); // 5分钟
|
||||
captchaStore.remove(captchaKey);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}).start();
|
||||
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("captchaId", "captcha-" + System.currentTimeMillis());
|
||||
response.put("captchaImage", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==");
|
||||
response.put("type", "spec");
|
||||
response.put("key", captchaKey);
|
||||
response.put("image", captcha.toBase64().replace("data:image/png;base64,", ""));
|
||||
response.put("expireTime", 300);
|
||||
|
||||
|
||||
log.info("生成验证码成功,key: {}, text: {}", captchaKey, captchaText);
|
||||
|
||||
return Result.success("获取验证码成功", response);
|
||||
} catch (Exception e) {
|
||||
log.error("获取验证码失败: {}", e.getMessage());
|
||||
|
||||
Reference in New Issue
Block a user