feat: 完善后端架构和service层实现
- 创建完整的entity实体类体系,包括所有业务实体 - 实现BaseEntity基类,统一管理公共字段 - 创建雪花算法ID生成器和自动填充处理器 - 简化所有mapper接口,只继承BaseMapper - 重构service层,使用LambdaQueryWrapper进行数据库操作 - 创建BasePageRequest分页查询基类 - 完善用户上下文管理和JWT认证 - 新增WebSocket聊天功能和相关控制器 - 更新前端配置和组件,完善用户认证流程 - 同步数据库建表脚本
This commit is contained in:
@@ -0,0 +1,220 @@
|
||||
package com.emotion.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.emotion.common.Result;
|
||||
import com.emotion.entity.Message;
|
||||
import com.emotion.service.IMessageService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 消息控制器
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-23
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/api/message")
|
||||
public class MessageController {
|
||||
|
||||
@Autowired
|
||||
private IMessageService messageService;
|
||||
|
||||
/**
|
||||
* 保存消息
|
||||
*/
|
||||
@PostMapping("/save")
|
||||
public Result<Message> saveMessage(@RequestBody Map<String, String> request) {
|
||||
try {
|
||||
String conversationId = request.get("conversationId");
|
||||
String content = request.get("content");
|
||||
String type = request.get("type");
|
||||
String sender = request.get("sender");
|
||||
|
||||
if (content == null || content.trim().isEmpty()) {
|
||||
return Result.error("消息内容不能为空");
|
||||
}
|
||||
|
||||
if (sender == null || sender.trim().isEmpty()) {
|
||||
return Result.error("发送者不能为空");
|
||||
}
|
||||
|
||||
Message message = messageService.saveMessage(conversationId, content, type, sender);
|
||||
if (message != null) {
|
||||
return Result.success(message);
|
||||
} else {
|
||||
return Result.error("保存消息失败");
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("保存消息失败", e);
|
||||
return Result.error("保存消息失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据会话ID分页查询消息
|
||||
*/
|
||||
@GetMapping("/conversation/{conversationId}")
|
||||
public Result<IPage<Message>> getMessagesByConversationId(
|
||||
@PathVariable String conversationId,
|
||||
@RequestParam(defaultValue = "1") Integer current,
|
||||
@RequestParam(defaultValue = "20") Integer size) {
|
||||
try {
|
||||
Page<Message> page = new Page<>(current, size);
|
||||
IPage<Message> result = messageService.getByConversationId(page, conversationId);
|
||||
return Result.success(result);
|
||||
} catch (Exception e) {
|
||||
log.error("查询会话消息失败", e);
|
||||
return Result.error("查询会话消息失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据发送者分页查询消息
|
||||
*/
|
||||
@GetMapping("/sender/{sender}")
|
||||
public Result<IPage<Message>> getMessagesBySender(
|
||||
@PathVariable String sender,
|
||||
@RequestParam(defaultValue = "1") Integer current,
|
||||
@RequestParam(defaultValue = "20") Integer size) {
|
||||
try {
|
||||
Page<Message> page = new Page<>(current, size);
|
||||
IPage<Message> result = messageService.getBySender(page, sender);
|
||||
return Result.success(result);
|
||||
} catch (Exception e) {
|
||||
log.error("查询发送者消息失败", e);
|
||||
return Result.error("查询发送者消息失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询会话的最后一条消息
|
||||
*/
|
||||
@GetMapping("/last/{conversationId}")
|
||||
public Result<Message> getLastMessage(@PathVariable String conversationId) {
|
||||
try {
|
||||
Message message = messageService.getLastMessageByConversationId(conversationId);
|
||||
return Result.success(message);
|
||||
} catch (Exception e) {
|
||||
log.error("查询最后一条消息失败", e);
|
||||
return Result.error("查询最后一条消息失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 统计会话消息数量
|
||||
*/
|
||||
@GetMapping("/count/{conversationId}")
|
||||
public Result<Long> countMessages(@PathVariable String conversationId) {
|
||||
try {
|
||||
Long count = messageService.countByConversationId(conversationId);
|
||||
return Result.success(count);
|
||||
} catch (Exception e) {
|
||||
log.error("统计消息数量失败", e);
|
||||
return Result.error("统计消息数量失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新消息状态
|
||||
*/
|
||||
@PutMapping("/{messageId}/status")
|
||||
public Result<Boolean> updateStatus(@PathVariable String messageId,
|
||||
@RequestBody Map<String, String> request) {
|
||||
try {
|
||||
String status = request.get("status");
|
||||
if (status == null || status.trim().isEmpty()) {
|
||||
return Result.error("状态不能为空");
|
||||
}
|
||||
|
||||
boolean success = messageService.updateStatus(messageId, status);
|
||||
return Result.success(success);
|
||||
} catch (Exception e) {
|
||||
log.error("更新消息状态失败", e);
|
||||
return Result.error("更新消息状态失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 标记消息为已读
|
||||
*/
|
||||
@PutMapping("/{messageId}/read")
|
||||
public Result<Boolean> markAsRead(@PathVariable String messageId) {
|
||||
try {
|
||||
boolean success = messageService.updateReadStatus(messageId, 1);
|
||||
return Result.success(success);
|
||||
} catch (Exception e) {
|
||||
log.error("标记消息已读失败", e);
|
||||
return Result.error("标记消息已读失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量标记会话消息为已读
|
||||
*/
|
||||
@PutMapping("/conversation/{conversationId}/read")
|
||||
public Result<Boolean> markConversationAsRead(@PathVariable String conversationId) {
|
||||
try {
|
||||
boolean success = messageService.markConversationMessagesAsRead(conversationId);
|
||||
return Result.success(success);
|
||||
} catch (Exception e) {
|
||||
log.error("批量标记消息已读失败", e);
|
||||
return Result.error("批量标记消息已读失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取消息统计信息
|
||||
*/
|
||||
@GetMapping("/stats")
|
||||
public Result<Map<String, Object>> getMessageStats(
|
||||
@RequestParam(required = false) String conversationId,
|
||||
@RequestParam(required = false) String sender) {
|
||||
try {
|
||||
Map<String, Object> stats = new HashMap<>();
|
||||
|
||||
if (conversationId != null && !conversationId.trim().isEmpty()) {
|
||||
Long conversationCount = messageService.countByConversationId(conversationId);
|
||||
stats.put("conversationMessageCount", conversationCount);
|
||||
|
||||
Message lastMessage = messageService.getLastMessageByConversationId(conversationId);
|
||||
stats.put("lastMessage", lastMessage);
|
||||
}
|
||||
|
||||
if (sender != null && !sender.trim().isEmpty()) {
|
||||
Long senderCount = messageService.countBySender(sender);
|
||||
stats.put("senderMessageCount", senderCount);
|
||||
}
|
||||
|
||||
stats.put("timestamp", System.currentTimeMillis());
|
||||
|
||||
return Result.success(stats);
|
||||
} catch (Exception e) {
|
||||
log.error("获取消息统计失败", e);
|
||||
return Result.error("获取消息统计失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除会话的所有消息
|
||||
*/
|
||||
@DeleteMapping("/conversation/{conversationId}")
|
||||
public Result<Boolean> deleteConversationMessages(@PathVariable String conversationId) {
|
||||
try {
|
||||
boolean success = messageService.deleteByConversationId(conversationId);
|
||||
return Result.success(success);
|
||||
} catch (Exception e) {
|
||||
log.error("删除会话消息失败", e);
|
||||
return Result.error("删除会话消息失败:" + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user