优化
This commit is contained in:
@@ -8,9 +8,6 @@ import com.emotion.dto.request.EmotionRecordUpdateRequest;
|
||||
import com.emotion.dto.response.EmotionRecordResponse;
|
||||
import com.emotion.service.EmotionRecordService;
|
||||
import com.emotion.util.CurrentUserUtil;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
@@ -18,8 +15,6 @@ import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -30,8 +25,7 @@ import java.util.Map;
|
||||
* @date 2025-07-22
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/emotion-records")
|
||||
@Tag(name = "情绪记录管理", description = "用户情绪记录的增删改查功能")
|
||||
@RequestMapping("/emotionRecord")
|
||||
public class EmotionRecordController {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(EmotionRecordController.class);
|
||||
@@ -42,8 +36,7 @@ public class EmotionRecordController {
|
||||
/**
|
||||
* 创建情绪记录
|
||||
*/
|
||||
@PostMapping
|
||||
@Operation(summary = "创建情绪记录", description = "创建新的情绪记录")
|
||||
@PostMapping(value = "/create")
|
||||
public Result<EmotionRecordResponse> createRecord(@RequestBody @Valid EmotionRecordCreateRequest request) {
|
||||
log.info("创建情绪记录: userId={}", request.getUserId());
|
||||
|
||||
@@ -56,51 +49,27 @@ public class EmotionRecordController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户情绪记录列表
|
||||
* 分页查询情绪记录
|
||||
*/
|
||||
@Operation(summary = "获取用户情绪记录列表", description = "分页获取当前用户的情绪记录,按创建时间倒序")
|
||||
@GetMapping("/user")
|
||||
public Result<PageResult<EmotionRecordResponse>> getRecordList(
|
||||
@Validated EmotionRecordPageRequest request) {
|
||||
|
||||
@GetMapping(value = "/page")
|
||||
public Result<PageResult<EmotionRecordResponse>> getPage(@Validated EmotionRecordPageRequest request) {
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
|
||||
log.info("获取用户情绪记录列表: userId={}, current={}, size={}", userId, request.getCurrent(), request.getSize());
|
||||
log.info("分页查询情绪记录: userId={}, current={}, size={}", userId, request.getCurrent(), request.getSize());
|
||||
|
||||
PageResult<EmotionRecordResponse> page = emotionRecordService.getPageByUserIdWithResponse(userId, request);
|
||||
|
||||
log.info("获取用户情绪记录成功: userId={}, total={}, records={}",
|
||||
userId, page.getTotal(), page.getRecords().size());
|
||||
log.info("分页查询情绪记录成功: userId={}, total={}, records={}",
|
||||
userId, page.getTotal(), page.getRecords().size());
|
||||
|
||||
return Result.success(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户最近情绪记录
|
||||
*/
|
||||
@Operation(summary = "获取用户最近情绪记录", description = "获取当前用户最近的情绪记录列表")
|
||||
@GetMapping("/user/recent")
|
||||
public Result<List<EmotionRecordResponse>> getRecentRecords(
|
||||
@Parameter(description = "限制数量") @RequestParam(defaultValue = "5") Integer limit) {
|
||||
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
|
||||
log.info("获取用户最近情绪记录: userId={}, limit={}", userId, limit);
|
||||
|
||||
List<EmotionRecordResponse> records = emotionRecordService.getRecentByUserIdWithResponse(userId, limit);
|
||||
|
||||
log.info("获取用户最近情绪记录成功: userId={}, records={}", userId, records.size());
|
||||
|
||||
return Result.success(records);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取情绪记录详情
|
||||
*/
|
||||
@Operation(summary = "获取情绪记录详情", description = "根据ID获取情绪记录详情")
|
||||
@GetMapping
|
||||
@GetMapping(value = "/detail")
|
||||
public Result<EmotionRecordResponse> getRecord(@RequestParam String id) {
|
||||
log.info("获取情绪记录详情: {}", id);
|
||||
|
||||
@@ -114,8 +83,7 @@ public class EmotionRecordController {
|
||||
/**
|
||||
* 更新情绪记录
|
||||
*/
|
||||
@Operation(summary = "更新情绪记录", description = "更新指定的情绪记录")
|
||||
@PutMapping
|
||||
@PutMapping(value = "/update")
|
||||
public Result<EmotionRecordResponse> updateRecord(@RequestBody @Valid EmotionRecordUpdateRequest request) {
|
||||
log.info("更新情绪记录: {}", request.getId());
|
||||
|
||||
@@ -129,8 +97,7 @@ public class EmotionRecordController {
|
||||
/**
|
||||
* 删除情绪记录
|
||||
*/
|
||||
@Operation(summary = "删除情绪记录", description = "删除指定的情绪记录")
|
||||
@DeleteMapping
|
||||
@DeleteMapping(value = "/delete")
|
||||
public Result<String> deleteRecord(@RequestParam String id) {
|
||||
log.info("删除情绪记录: {}", id);
|
||||
|
||||
@@ -144,8 +111,7 @@ public class EmotionRecordController {
|
||||
/**
|
||||
* 获取情绪统计
|
||||
*/
|
||||
@Operation(summary = "获取情绪统计", description = "获取当前用户的情绪统计信息")
|
||||
@GetMapping("/stats")
|
||||
@GetMapping(value = "/stats")
|
||||
public Result<Map<String, Object>> getEmotionStats(
|
||||
@RequestParam(required = false) String startDate,
|
||||
@RequestParam(required = false) String endDate) {
|
||||
|
||||
@@ -1,16 +1,20 @@
|
||||
package com.emotion.controller;
|
||||
|
||||
import com.emotion.common.Result;
|
||||
import com.emotion.dto.request.EmotionSummaryGenerateRequest;
|
||||
import com.emotion.dto.request.EmotionSummaryStatusRequest;
|
||||
import com.emotion.dto.response.EmotionSummaryGenerateResponse;
|
||||
import com.emotion.dto.response.EmotionSummaryStatusResponse;
|
||||
import com.emotion.service.AiChatService;
|
||||
import com.emotion.util.CurrentUserUtil;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.validation.Valid;
|
||||
|
||||
/**
|
||||
* 情绪总结控制器
|
||||
@@ -20,64 +24,49 @@ import java.util.Map;
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/emotion-summary")
|
||||
@RequestMapping("/emotionSummary")
|
||||
@Tag(name = "情绪总结管理", description = "用户情绪记录总结和分析功能")
|
||||
public class EmotionSummaryController {
|
||||
|
||||
@Autowired
|
||||
private AiChatService aiChatService;
|
||||
|
||||
/**
|
||||
* 生成用户当天的情绪记录总结
|
||||
*/
|
||||
@Operation(summary = "生成用户当天的情绪记录总结", description = "基于用户当天的聊天记录生成情绪分析和记录")
|
||||
@PostMapping("/generate")
|
||||
public Result<Map<String, Object>> generateEmotionSummary() {
|
||||
try {
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
log.info("收到生成情绪记录总结请求: userId={}", userId);
|
||||
// 调用AI服务异步生成情绪总结(阻塞获取结果)
|
||||
Map<String, Object> result = aiChatService.generateEmotionSummaryAsync(userId).get();
|
||||
if ((Boolean) result.get("success")) {
|
||||
log.info("情绪记录总结生成成功: userId={}", userId);
|
||||
return Result.success("情绪记录总结生成成功", result);
|
||||
} else {
|
||||
String message = (String) result.get("message");
|
||||
log.warn("情绪记录总结生成失败: userId={}, message={}", userId, message);
|
||||
return Result.error(message);
|
||||
}
|
||||
} catch (IllegalStateException e) {
|
||||
log.warn("用户认证失败: {}", e.getMessage());
|
||||
return Result.error(e.getMessage());
|
||||
} catch (Exception e) {
|
||||
log.error("生成情绪记录总结时发生异常", e);
|
||||
return Result.error("生成情绪记录总结失败: " + e.getMessage());
|
||||
@PostMapping(value = "/generate")
|
||||
public Result<EmotionSummaryGenerateResponse> generateEmotionSummary(
|
||||
@RequestBody @Valid EmotionSummaryGenerateRequest request) {
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
log.info("收到生成情绪记录总结请求: userId={}", userId);
|
||||
|
||||
// 调用AI服务生成情绪总结
|
||||
EmotionSummaryGenerateResponse response = aiChatService.generateEmotionSummaryWithResponse(userId);
|
||||
|
||||
if (response.getSuccess()) {
|
||||
log.info("情绪记录总结生成成功: userId={}", userId);
|
||||
return Result.success("情绪记录总结生成成功", response);
|
||||
} else {
|
||||
log.warn("情绪记录总结生成失败: userId={}, message={}", userId, response.getMessage());
|
||||
return Result.error(response.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户情绪记录总结状态
|
||||
*/
|
||||
@Operation(summary = "获取用户情绪记录总结状态", description = "检查用户今天是否已经生成过情绪记录")
|
||||
@GetMapping("/status")
|
||||
public Result<Map<String, Object>> getEmotionSummaryStatus() {
|
||||
@GetMapping(value = "/status")
|
||||
public Result<EmotionSummaryStatusResponse> getEmotionSummaryStatus(
|
||||
@Validated EmotionSummaryStatusRequest request) {
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
log.info("查询用户情绪记录总结状态: userId={}", userId);
|
||||
|
||||
try {
|
||||
// 从上下文中获取当前用户ID
|
||||
String userId = CurrentUserUtil.requireCurrentUserId();
|
||||
// 调用AI服务获取状态信息
|
||||
EmotionSummaryStatusResponse response = aiChatService.getEmotionSummaryStatusWithResponse(userId);
|
||||
|
||||
log.info("查询用户情绪记录总结状态: userId={}", userId);
|
||||
|
||||
// 这里可以添加检查用户今天是否已经生成过情绪记录的逻辑
|
||||
// 暂时返回基本状态信息
|
||||
Map<String, Object> status = Map.of(
|
||||
"userId", userId,
|
||||
"canGenerate", true,
|
||||
"message", "可以生成情绪记录总结"
|
||||
);
|
||||
|
||||
return Result.success(status);
|
||||
|
||||
} catch (IllegalStateException e) {
|
||||
log.warn("用户认证失败: {}", e.getMessage());
|
||||
return Result.error(e.getMessage());
|
||||
} catch (Exception e) {
|
||||
log.error("查询情绪记录总结状态时发生异常", e);
|
||||
return Result.error("查询状态失败: " + e.getMessage());
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,26 @@
|
||||
package com.emotion.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.common.Result;
|
||||
import com.emotion.dto.request.PageRequest;
|
||||
import com.emotion.entity.GrowthTopic;
|
||||
import com.emotion.dto.request.growth.GrowthTopicCreateRequest;
|
||||
import com.emotion.dto.request.growth.GrowthTopicPageRequest;
|
||||
import com.emotion.dto.request.growth.GrowthTopicUpdateRequest;
|
||||
import com.emotion.dto.response.growth.GrowthTopicResponse;
|
||||
import com.emotion.service.GrowthTopicService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import javax.validation.Valid;
|
||||
|
||||
/**
|
||||
* 成长话题控制器
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/growth-topic")
|
||||
@RequestMapping("/growthTopic")
|
||||
public class GrowthTopicController {
|
||||
|
||||
@Autowired
|
||||
@@ -22,49 +29,54 @@ public class GrowthTopicController {
|
||||
/**
|
||||
* 分页查询成长话题
|
||||
*/
|
||||
@GetMapping("/page")
|
||||
public Result<IPage<GrowthTopic>> getPage(@Validated PageRequest request) {
|
||||
IPage<GrowthTopic> page = growthTopicService.getPage(request);
|
||||
return Result.success(page);
|
||||
@GetMapping(value = "/page")
|
||||
public Result<PageResult<GrowthTopicResponse>> getPage(@Validated GrowthTopicPageRequest request) {
|
||||
PageResult<GrowthTopicResponse> pageResult = growthTopicService.getPageWithResponse(request);
|
||||
return Result.success(pageResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取成长话题
|
||||
*/
|
||||
@GetMapping(value = "/detail")
|
||||
public Result<GrowthTopicResponse> getById(@RequestParam String id) {
|
||||
GrowthTopicResponse response = growthTopicService.getGrowthTopicResponseById(id);
|
||||
if (response == null) {
|
||||
return Result.notFound("成长话题不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建成长话题
|
||||
*/
|
||||
@PostMapping("/create")
|
||||
public Result<GrowthTopic> createGrowthTopic(@RequestBody @Validated GrowthTopicCreateRequest request) {
|
||||
GrowthTopic topic = growthTopicService.createGrowthTopic(
|
||||
request.getTitle(),
|
||||
request.getDescription(),
|
||||
request.getCategory(),
|
||||
request.getDifficultyLevel(),
|
||||
request.getTags(),
|
||||
request.getEndTime()
|
||||
);
|
||||
return Result.success(topic);
|
||||
@PostMapping(value = "/create")
|
||||
public Result<GrowthTopicResponse> create(@Valid @RequestBody GrowthTopicCreateRequest request) {
|
||||
GrowthTopicResponse response = growthTopicService.createGrowthTopicWithResponse(request);
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
// 可根据GrowthTopicService接口继续补充其他接口...
|
||||
|
||||
public static class GrowthTopicCreateRequest {
|
||||
private String title;
|
||||
private String description;
|
||||
private String category;
|
||||
private String difficultyLevel;
|
||||
private String tags;
|
||||
private LocalDateTime endTime;
|
||||
// getter/setter
|
||||
public String getTitle() { return title; }
|
||||
public void setTitle(String title) { this.title = title; }
|
||||
public String getDescription() { return description; }
|
||||
public void setDescription(String description) { this.description = description; }
|
||||
public String getCategory() { return category; }
|
||||
public void setCategory(String category) { this.category = category; }
|
||||
public String getDifficultyLevel() { return difficultyLevel; }
|
||||
public void setDifficultyLevel(String difficultyLevel) { this.difficultyLevel = difficultyLevel; }
|
||||
public String getTags() { return tags; }
|
||||
public void setTags(String tags) { this.tags = tags; }
|
||||
public LocalDateTime getEndTime() { return endTime; }
|
||||
public void setEndTime(LocalDateTime endTime) { this.endTime = endTime; }
|
||||
/**
|
||||
* 更新成长话题
|
||||
*/
|
||||
@PutMapping(value = "/update")
|
||||
public Result<GrowthTopicResponse> update(@Valid @RequestBody GrowthTopicUpdateRequest request) {
|
||||
GrowthTopicResponse response = growthTopicService.updateGrowthTopicWithResponse(request);
|
||||
if (response == null) {
|
||||
return Result.notFound("成长话题不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除成长话题
|
||||
*/
|
||||
@DeleteMapping(value = "/delete")
|
||||
public Result<Void> delete(@RequestParam String id) {
|
||||
boolean deleted = growthTopicService.deleteGrowthTopic(id);
|
||||
if (!deleted) {
|
||||
return Result.error("删除失败");
|
||||
}
|
||||
return Result.success();
|
||||
}
|
||||
}
|
||||
@@ -1,19 +1,26 @@
|
||||
package com.emotion.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.common.Result;
|
||||
import com.emotion.dto.request.PageRequest;
|
||||
import com.emotion.entity.GuestUser;
|
||||
import com.emotion.dto.request.guest.GuestUserCreateRequest;
|
||||
import com.emotion.dto.request.guest.GuestUserPageRequest;
|
||||
import com.emotion.dto.request.guest.GuestUserUpdateRequest;
|
||||
import com.emotion.dto.response.guest.GuestUserResponse;
|
||||
import com.emotion.service.GuestUserService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import javax.validation.Valid;
|
||||
|
||||
/**
|
||||
* 访客用户控制器
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/guest-user")
|
||||
@RequestMapping("/guestUser")
|
||||
public class GuestUserController {
|
||||
|
||||
@Autowired
|
||||
@@ -22,64 +29,54 @@ public class GuestUserController {
|
||||
/**
|
||||
* 分页查询访客用户
|
||||
*/
|
||||
@GetMapping("/page")
|
||||
public Result<IPage<GuestUser>> getPage(@Validated PageRequest request) {
|
||||
IPage<GuestUser> page = guestUserService.getPage(request);
|
||||
return Result.success(page);
|
||||
@GetMapping(value = "/page")
|
||||
public Result<PageResult<GuestUserResponse>> getPage(@Validated GuestUserPageRequest request) {
|
||||
PageResult<GuestUserResponse> pageResult = guestUserService.getPageWithResponse(request);
|
||||
return Result.success(pageResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取访客用户
|
||||
*/
|
||||
@GetMapping(value = "/detail")
|
||||
public Result<GuestUserResponse> getById(@RequestParam String id) {
|
||||
GuestUserResponse response = guestUserService.getGuestUserResponseById(id);
|
||||
if (response == null) {
|
||||
return Result.notFound("访客用户不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建访客用户
|
||||
*/
|
||||
@PostMapping("/create")
|
||||
public Result<GuestUser> createGuestUser(@RequestBody @Validated GuestUserCreateRequest request) {
|
||||
GuestUser guestUser = guestUserService.createGuestUser(
|
||||
request.getDeviceId(),
|
||||
request.getIpAddress(),
|
||||
request.getUserAgent(),
|
||||
request.getLocation());
|
||||
return Result.success(guestUser);
|
||||
@PostMapping(value = "/create")
|
||||
public Result<GuestUserResponse> create(@Valid @RequestBody GuestUserCreateRequest request) {
|
||||
GuestUserResponse response = guestUserService.createGuestUserWithResponse(request);
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
// 可根据GuestUserService接口继续补充其他接口...
|
||||
|
||||
public static class GuestUserCreateRequest {
|
||||
private String deviceId;
|
||||
private String ipAddress;
|
||||
private String userAgent;
|
||||
private String location;
|
||||
|
||||
// getter/setter
|
||||
public String getDeviceId() {
|
||||
return deviceId;
|
||||
/**
|
||||
* 更新访客用户
|
||||
*/
|
||||
@PutMapping(value = "/update")
|
||||
public Result<GuestUserResponse> update(@Valid @RequestBody GuestUserUpdateRequest request) {
|
||||
GuestUserResponse response = guestUserService.updateGuestUserWithResponse(request);
|
||||
if (response == null) {
|
||||
return Result.notFound("访客用户不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
public void setDeviceId(String deviceId) {
|
||||
this.deviceId = deviceId;
|
||||
}
|
||||
|
||||
public String getIpAddress() {
|
||||
return ipAddress;
|
||||
}
|
||||
|
||||
public void setIpAddress(String ipAddress) {
|
||||
this.ipAddress = ipAddress;
|
||||
}
|
||||
|
||||
public String getUserAgent() {
|
||||
return userAgent;
|
||||
}
|
||||
|
||||
public void setUserAgent(String userAgent) {
|
||||
this.userAgent = userAgent;
|
||||
}
|
||||
|
||||
public String getLocation() {
|
||||
return location;
|
||||
}
|
||||
|
||||
public void setLocation(String location) {
|
||||
this.location = location;
|
||||
/**
|
||||
* 删除访客用户
|
||||
*/
|
||||
@DeleteMapping(value = "/delete")
|
||||
public Result<Void> delete(@RequestParam String id) {
|
||||
boolean deleted = guestUserService.deleteGuestUser(id);
|
||||
if (!deleted) {
|
||||
return Result.error("删除失败");
|
||||
}
|
||||
return Result.success();
|
||||
}
|
||||
}
|
||||
@@ -10,16 +10,16 @@ import com.emotion.dto.response.MessageResponse;
|
||||
import com.emotion.service.MessageService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 消息控制器
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-23
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/message")
|
||||
@@ -32,104 +32,72 @@ public class MessageController {
|
||||
/**
|
||||
* 创建消息
|
||||
*/
|
||||
@PostMapping
|
||||
@PostMapping(value = "/create")
|
||||
public Result<MessageResponse> create(@Valid @RequestBody MessageCreateRequest request) {
|
||||
log.info("创建消息: conversationId={}", request.getConversationId());
|
||||
|
||||
try {
|
||||
MessageResponse response = messageService.createMessageFromRequest(request);
|
||||
log.info("创建消息成功: messageId={}", response.getId());
|
||||
return Result.success(response);
|
||||
|
||||
} catch (IllegalStateException e) {
|
||||
log.error("用户未认证: {}", e.getMessage());
|
||||
return Result.error(401, "用户未登录或认证失败");
|
||||
} catch (Exception e) {
|
||||
log.error("创建消息失败", e);
|
||||
return Result.error(500, "创建消息失败,请稍后重试");
|
||||
}
|
||||
MessageResponse response = messageService.createMessageFromRequest(request);
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取消息
|
||||
*/
|
||||
@GetMapping("/{id}")
|
||||
public Result<MessageResponse> getById(@PathVariable String id) {
|
||||
log.info("获取消息详情: id={}", id);
|
||||
|
||||
try {
|
||||
MessageResponse response = messageService.getMessageById(id);
|
||||
if (response == null) {
|
||||
return Result.error(404, "消息不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("获取消息详情失败", e);
|
||||
return Result.error(500, "获取消息详情失败,请稍后重试");
|
||||
@GetMapping(value = "/detail")
|
||||
public Result<MessageResponse> getById(@RequestParam String id) {
|
||||
MessageResponse response = messageService.getMessageById(id);
|
||||
if (response == null) {
|
||||
return Result.notFound("消息不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID分页查询消息
|
||||
* 分页查询消息
|
||||
*/
|
||||
@GetMapping("/user/page")
|
||||
public Result<PageResult<MessageResponse>> getPageByUserId(
|
||||
@RequestParam(defaultValue = "1") Long current,
|
||||
@RequestParam(defaultValue = "20") Long size) {
|
||||
log.info("获取用户消息分页: current={}, size={}", current, size);
|
||||
|
||||
// 构建请求对象
|
||||
MessagePageRequest request = new MessagePageRequest();
|
||||
request.setCurrent(current);
|
||||
request.setSize(size);
|
||||
|
||||
PageResult<MessageResponse> pageResult = messageService.getUserMessagesWithPage(request);
|
||||
log.info("获取用户消息分页成功: total={}", pageResult.getTotal());
|
||||
@GetMapping(value = "/page")
|
||||
public Result<PageResult<MessageResponse>> getPage(@Validated MessagePageRequest request) {
|
||||
PageResult<MessageResponse> pageResult = messageService.getPageWithResponse(request);
|
||||
return Result.success(pageResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID和关键词搜索消息
|
||||
* 搜索消息
|
||||
*/
|
||||
@PostMapping("/user/search")
|
||||
public Result<List<MessageResponse>> searchByUserId(@Valid @RequestBody MessageSearchRequest request) {
|
||||
log.info("搜索用户消息: keyword={}, limit={}", request.getKeyword(), request.getLimit());
|
||||
|
||||
try {
|
||||
List<MessageResponse> responses = messageService.searchUserMessages(request);
|
||||
log.info("搜索用户消息成功: {} 条消息", responses.size());
|
||||
return Result.success(responses);
|
||||
|
||||
} catch (IllegalStateException e) {
|
||||
log.error("用户未认证: {}", e.getMessage());
|
||||
return Result.error(401, "用户未登录或认证失败");
|
||||
} catch (Exception e) {
|
||||
log.error("搜索用户消息失败", e);
|
||||
return Result.error(500, "搜索失败,请稍后重试");
|
||||
}
|
||||
@PostMapping(value = "/search")
|
||||
public Result<PageResult<MessageResponse>> search(@Valid @RequestBody MessageSearchRequest request) {
|
||||
PageResult<MessageResponse> pageResult = messageService.searchWithResponse(request);
|
||||
return Result.success(pageResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户最近的聊天记录
|
||||
* 获取最近的消息
|
||||
*/
|
||||
@PostMapping("/user/recent")
|
||||
public Result<List<MessageResponse>> getRecentMessages(@Valid @RequestBody MessageRecentRequest request) {
|
||||
log.info("获取用户最近消息: limit={}", request.getLimit());
|
||||
|
||||
try {
|
||||
List<MessageResponse> responses = messageService.getUserRecentMessages(request);
|
||||
log.info("获取用户最近消息成功: {} 条消息", responses.size());
|
||||
return Result.success(responses);
|
||||
|
||||
} catch (IllegalStateException e) {
|
||||
log.error("用户未认证: {}", e.getMessage());
|
||||
return Result.error(401, "用户未登录或认证失败");
|
||||
} catch (Exception e) {
|
||||
log.error("获取最近消息失败", e);
|
||||
return Result.error(500, "获取最近消息失败,请稍后重试");
|
||||
}
|
||||
@PostMapping(value = "/recent")
|
||||
public Result<PageResult<MessageResponse>> getRecentMessages(@Valid @RequestBody MessageRecentRequest request) {
|
||||
PageResult<MessageResponse> pageResult = messageService.getRecentWithResponse(request);
|
||||
return Result.success(pageResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新消息
|
||||
*/
|
||||
@PutMapping(value = "/update")
|
||||
public Result<MessageResponse> update(@RequestParam String id, @RequestParam String content) {
|
||||
MessageResponse response = messageService.updateMessage(id, content);
|
||||
if (response == null) {
|
||||
return Result.notFound("消息不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除消息
|
||||
*/
|
||||
@DeleteMapping(value = "/delete")
|
||||
public Result<Void> delete(@RequestParam String id) {
|
||||
boolean deleted = messageService.deleteMessage(id);
|
||||
if (!deleted) {
|
||||
return Result.error("删除失败");
|
||||
}
|
||||
return Result.success();
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,24 @@
|
||||
package com.emotion.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.common.Result;
|
||||
import com.emotion.dto.request.PageRequest;
|
||||
import com.emotion.dto.request.IdRequest;
|
||||
import com.emotion.dto.response.BaseResponse;
|
||||
import com.emotion.entity.Reward;
|
||||
import com.emotion.dto.request.reward.RewardCreateRequest;
|
||||
import com.emotion.dto.request.reward.RewardPageRequest;
|
||||
import com.emotion.dto.request.reward.RewardUpdateRequest;
|
||||
import com.emotion.dto.response.reward.RewardResponse;
|
||||
import com.emotion.service.RewardService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.validation.Valid;
|
||||
|
||||
/**
|
||||
* 奖励控制器
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/reward")
|
||||
public class RewardController {
|
||||
@@ -25,67 +29,54 @@ public class RewardController {
|
||||
/**
|
||||
* 分页查询奖励
|
||||
*/
|
||||
@GetMapping("/page")
|
||||
public Result<IPage<Reward>> getPage(@Validated PageRequest request) {
|
||||
IPage<Reward> page = rewardService.getPage(request);
|
||||
return Result.success(page);
|
||||
@GetMapping(value = "/page")
|
||||
public Result<PageResult<RewardResponse>> getPage(@Validated RewardPageRequest request) {
|
||||
PageResult<RewardResponse> pageResult = rewardService.getPageWithResponse(request);
|
||||
return Result.success(pageResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID分页查询奖励
|
||||
* 根据ID获取奖励
|
||||
*/
|
||||
@GetMapping("/page/user/{userId}")
|
||||
public Result<IPage<Reward>> getPageByUserId(@Validated PageRequest request, @PathVariable String userId) {
|
||||
IPage<Reward> page = rewardService.getPageByUserId(request, userId);
|
||||
return Result.success(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID查询奖励
|
||||
*/
|
||||
@GetMapping("/user/{userId}")
|
||||
public Result<List<Reward>> getByUserId(@PathVariable String userId) {
|
||||
List<Reward> list = rewardService.getByUserId(userId);
|
||||
return Result.success(list);
|
||||
@GetMapping(value = "/detail")
|
||||
public Result<RewardResponse> getById(@RequestParam String id) {
|
||||
RewardResponse response = rewardService.getRewardResponseById(id);
|
||||
if (response == null) {
|
||||
return Result.notFound("奖励不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建奖励
|
||||
*/
|
||||
@PostMapping("/create")
|
||||
public Result<Reward> createReward(@RequestBody @Validated RewardCreateRequest request) {
|
||||
Reward reward = rewardService.createReward(
|
||||
request.getUserId(),
|
||||
request.getRewardType(),
|
||||
request.getPoints(),
|
||||
request.getSource(),
|
||||
request.getDescription(),
|
||||
request.getExpiredTime()
|
||||
);
|
||||
return Result.success(reward);
|
||||
@PostMapping(value = "/create")
|
||||
public Result<RewardResponse> create(@Valid @RequestBody RewardCreateRequest request) {
|
||||
RewardResponse response = rewardService.createRewardWithResponse(request);
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
// 可根据RewardService接口继续补充其他接口...
|
||||
|
||||
public static class RewardCreateRequest {
|
||||
private String userId;
|
||||
private String rewardType;
|
||||
private Integer points;
|
||||
private String source;
|
||||
private String description;
|
||||
private LocalDateTime expiredTime;
|
||||
// getter/setter
|
||||
public String getUserId() { return userId; }
|
||||
public void setUserId(String userId) { this.userId = userId; }
|
||||
public String getRewardType() { return rewardType; }
|
||||
public void setRewardType(String rewardType) { this.rewardType = rewardType; }
|
||||
public Integer getPoints() { return points; }
|
||||
public void setPoints(Integer points) { this.points = points; }
|
||||
public String getSource() { return source; }
|
||||
public void setSource(String source) { this.source = source; }
|
||||
public String getDescription() { return description; }
|
||||
public void setDescription(String description) { this.description = description; }
|
||||
public LocalDateTime getExpiredTime() { return expiredTime; }
|
||||
public void setExpiredTime(LocalDateTime expiredTime) { this.expiredTime = expiredTime; }
|
||||
/**
|
||||
* 更新奖励
|
||||
*/
|
||||
@PutMapping(value = "/update")
|
||||
public Result<RewardResponse> update(@Valid @RequestBody RewardUpdateRequest request) {
|
||||
RewardResponse response = rewardService.updateRewardWithResponse(request);
|
||||
if (response == null) {
|
||||
return Result.notFound("奖励不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除奖励
|
||||
*/
|
||||
@DeleteMapping(value = "/delete")
|
||||
public Result<Void> delete(@RequestParam String id) {
|
||||
boolean deleted = rewardService.deleteReward(id);
|
||||
if (!deleted) {
|
||||
return Result.error("删除失败");
|
||||
}
|
||||
return Result.success();
|
||||
}
|
||||
}
|
||||
+56
-39
@@ -1,18 +1,26 @@
|
||||
package com.emotion.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.common.Result;
|
||||
import com.emotion.dto.request.PageRequest;
|
||||
import com.emotion.entity.TopicInteraction;
|
||||
import com.emotion.dto.request.TopicInteractionCreateRequest;
|
||||
import com.emotion.dto.request.TopicInteractionPageRequest;
|
||||
import com.emotion.dto.request.TopicInteractionUpdateRequest;
|
||||
import com.emotion.dto.response.TopicInteractionResponse;
|
||||
import com.emotion.service.TopicInteractionService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
import javax.validation.Valid;
|
||||
|
||||
/**
|
||||
* 话题互动控制器
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-09-08
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/topic-interaction")
|
||||
@RequestMapping("/topicInteraction")
|
||||
public class TopicInteractionController {
|
||||
|
||||
@Autowired
|
||||
@@ -21,45 +29,54 @@ public class TopicInteractionController {
|
||||
/**
|
||||
* 分页查询话题互动
|
||||
*/
|
||||
@GetMapping("/page")
|
||||
public Result<IPage<TopicInteraction>> getPage(@Validated PageRequest request) {
|
||||
IPage<TopicInteraction> page = topicInteractionService.getPage(request);
|
||||
return Result.success(page);
|
||||
@GetMapping(value = "/page")
|
||||
public Result<PageResult<TopicInteractionResponse>> getPage(@Validated TopicInteractionPageRequest request) {
|
||||
PageResult<TopicInteractionResponse> pageResult = topicInteractionService.getPageWithResponse(request);
|
||||
return Result.success(pageResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取话题互动
|
||||
*/
|
||||
@GetMapping(value = "/detail")
|
||||
public Result<TopicInteractionResponse> getById(@RequestParam String id) {
|
||||
TopicInteractionResponse response = topicInteractionService.getTopicInteractionResponseById(id);
|
||||
if (response == null) {
|
||||
return Result.notFound("话题互动不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建话题互动
|
||||
*/
|
||||
@PostMapping("/create")
|
||||
public Result<TopicInteraction> createTopicInteraction(@RequestBody @Validated TopicInteractionCreateRequest request) {
|
||||
TopicInteraction interaction = topicInteractionService.createTopicInteraction(
|
||||
request.getTopicId(),
|
||||
request.getUserId(),
|
||||
request.getInteractionType(),
|
||||
request.getContent(),
|
||||
request.getAttachments()
|
||||
);
|
||||
return Result.success(interaction);
|
||||
@PostMapping(value = "/create")
|
||||
public Result<TopicInteractionResponse> create(@Valid @RequestBody TopicInteractionCreateRequest request) {
|
||||
TopicInteractionResponse response = topicInteractionService.createTopicInteractionWithResponse(request);
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
// 可根据TopicInteractionService接口继续补充其他接口...
|
||||
|
||||
public static class TopicInteractionCreateRequest {
|
||||
private String topicId;
|
||||
private String userId;
|
||||
private String interactionType;
|
||||
private String content;
|
||||
private String attachments;
|
||||
// getter/setter
|
||||
public String getTopicId() { return topicId; }
|
||||
public void setTopicId(String topicId) { this.topicId = topicId; }
|
||||
public String getUserId() { return userId; }
|
||||
public void setUserId(String userId) { this.userId = userId; }
|
||||
public String getInteractionType() { return interactionType; }
|
||||
public void setInteractionType(String interactionType) { this.interactionType = interactionType; }
|
||||
public String getContent() { return content; }
|
||||
public void setContent(String content) { this.content = content; }
|
||||
public String getAttachments() { return attachments; }
|
||||
public void setAttachments(String attachments) { this.attachments = attachments; }
|
||||
/**
|
||||
* 更新话题互动
|
||||
*/
|
||||
@PutMapping(value = "/update")
|
||||
public Result<TopicInteractionResponse> update(@Valid @RequestBody TopicInteractionUpdateRequest request) {
|
||||
TopicInteractionResponse response = topicInteractionService.updateTopicInteractionWithResponse(request);
|
||||
if (response == null) {
|
||||
return Result.notFound("话题互动不存在");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除话题互动
|
||||
*/
|
||||
@DeleteMapping(value = "/delete")
|
||||
public Result<Void> delete(@RequestParam String id) {
|
||||
boolean deleted = topicInteractionService.deleteTopicInteraction(id);
|
||||
if (!deleted) {
|
||||
return Result.error("删除失败");
|
||||
}
|
||||
return Result.success();
|
||||
}
|
||||
}
|
||||
@@ -1,27 +1,18 @@
|
||||
package com.emotion.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.emotion.common.BasePageRequest;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.common.Result;
|
||||
import com.emotion.dto.request.UserCreateRequest;
|
||||
import com.emotion.dto.request.UserUpdateRequest;
|
||||
import com.emotion.dto.request.UserPageRequest;
|
||||
import com.emotion.dto.request.UserProfileUpdateRequest;
|
||||
import com.emotion.dto.request.UserUpdateRequest;
|
||||
import com.emotion.dto.response.UserResponse;
|
||||
import com.emotion.entity.User;
|
||||
import com.emotion.service.UserService;
|
||||
import com.emotion.util.UserContextHolder;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 用户控制器
|
||||
@@ -36,183 +27,81 @@ public class UserController {
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
/**
|
||||
* 分页查询用户
|
||||
*/
|
||||
@GetMapping("/page")
|
||||
public Result<PageResult<UserResponse>> getPage(@Validated BasePageRequest request) {
|
||||
IPage<User> page = userService.getPage(request);
|
||||
List<UserResponse> userResponses = page.getRecords().stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
PageResult<UserResponse> pageResult = new PageResult<>();
|
||||
pageResult.setCurrent(page.getCurrent());
|
||||
pageResult.setSize(page.getSize());
|
||||
pageResult.setTotal(page.getTotal());
|
||||
pageResult.setPages(page.getPages());
|
||||
pageResult.setRecords(userResponses);
|
||||
|
||||
@GetMapping(value = "/page")
|
||||
public Result<PageResult<UserResponse>> getPage(@Validated UserPageRequest request) {
|
||||
PageResult<UserResponse> pageResult = userService.getPageWithResponse(request);
|
||||
return Result.success(pageResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取用户信息
|
||||
*/
|
||||
@GetMapping("/{id}")
|
||||
public Result<UserResponse> getById(@PathVariable String id) {
|
||||
User user = userService.getById(id);
|
||||
@GetMapping(value = "/detail")
|
||||
public Result<UserResponse> getById(@RequestParam String id) {
|
||||
UserResponse user = userService.getUserResponseById(id);
|
||||
if (user == null) {
|
||||
return Result.notFound("用户不存在");
|
||||
}
|
||||
return Result.success(convertToResponse(user));
|
||||
return Result.success(user);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建用户
|
||||
*/
|
||||
@PostMapping
|
||||
@PostMapping(value = "/create")
|
||||
public Result<UserResponse> create(@Valid @RequestBody UserCreateRequest request) {
|
||||
User user = userService.createUser(
|
||||
request.getAccount(),
|
||||
request.getUsername(),
|
||||
request.getPassword(),
|
||||
request.getEmail(),
|
||||
request.getPhone()
|
||||
);
|
||||
return Result.success(convertToResponse(user));
|
||||
UserResponse user = userService.createUserWithResponse(request);
|
||||
return Result.success(user);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户
|
||||
*/
|
||||
@PutMapping("/{id}")
|
||||
public Result<UserResponse> update(@PathVariable String id, @Valid @RequestBody UserUpdateRequest request) {
|
||||
User user = new User();
|
||||
BeanUtils.copyProperties(request, user);
|
||||
user.setId(id);
|
||||
|
||||
boolean updated = userService.updateById(user);
|
||||
if (!updated) {
|
||||
@PutMapping(value = "/update")
|
||||
public Result<UserResponse> update(@Valid @RequestBody UserUpdateRequest request) {
|
||||
UserResponse updatedUser = userService.updateUserWithResponse(request);
|
||||
if (updatedUser == null) {
|
||||
return Result.error("更新失败");
|
||||
}
|
||||
|
||||
User updatedUser = userService.getById(id);
|
||||
return Result.success(convertToResponse(updatedUser));
|
||||
return Result.success(updatedUser);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除用户
|
||||
*/
|
||||
@DeleteMapping("/{id}")
|
||||
public Result<Void> delete(@PathVariable String id) {
|
||||
boolean deleted = userService.removeById(id);
|
||||
@DeleteMapping(value = "/delete")
|
||||
public Result<Void> delete(@RequestParam String id) {
|
||||
boolean deleted = userService.deleteUser(id);
|
||||
if (!deleted) {
|
||||
return Result.error("删除失败");
|
||||
}
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据账号查询用户
|
||||
*/
|
||||
@GetMapping("/account/{account}")
|
||||
public Result<UserResponse> getByAccount(@PathVariable String account) {
|
||||
User user = userService.getByAccount(account);
|
||||
if (user == null) {
|
||||
return Result.notFound("用户不存在");
|
||||
}
|
||||
return Result.success(convertToResponse(user));
|
||||
}
|
||||
|
||||
/**
|
||||
* 统计用户数量
|
||||
*/
|
||||
@GetMapping("/count/status/{status}")
|
||||
public Result<Long> countByStatus(@PathVariable Integer status) {
|
||||
Long count = userService.countByStatus(status);
|
||||
return Result.success(count);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前用户个人资料
|
||||
*/
|
||||
@GetMapping("/profile")
|
||||
public Result<UserResponse> getCurrentUserProfile(HttpServletRequest request) {
|
||||
String currentUserId = getCurrentUserId(request);
|
||||
if (currentUserId == null) {
|
||||
@GetMapping(value = "/profile")
|
||||
public Result<UserResponse> getCurrentUserProfile() {
|
||||
UserResponse user = userService.getCurrentUserProfileWithResponse();
|
||||
if (user == null) {
|
||||
return Result.unauthorized("用户未登录");
|
||||
}
|
||||
|
||||
User user = userService.getById(currentUserId);
|
||||
if (user == null) {
|
||||
return Result.notFound("用户不存在");
|
||||
}
|
||||
return Result.success(convertToResponse(user));
|
||||
return Result.success(user);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新当前用户个人资料
|
||||
*/
|
||||
@PutMapping("/profile")
|
||||
public Result<UserResponse> updateCurrentUserProfile(@Valid @RequestBody UserProfileUpdateRequest request,
|
||||
HttpServletRequest httpRequest) {
|
||||
String currentUserId = getCurrentUserId(httpRequest);
|
||||
if (currentUserId == null) {
|
||||
@PutMapping(value = "/profile")
|
||||
public Result<UserResponse> updateCurrentUserProfile(@Valid @RequestBody UserProfileUpdateRequest request) {
|
||||
UserResponse updatedUser = userService.updateCurrentUserProfileWithResponse(request);
|
||||
if (updatedUser == null) {
|
||||
return Result.unauthorized("用户未登录");
|
||||
}
|
||||
|
||||
User user = new User();
|
||||
BeanUtils.copyProperties(request, user);
|
||||
user.setId(currentUserId);
|
||||
|
||||
boolean updated = userService.updateById(user);
|
||||
if (!updated) {
|
||||
return Result.error("更新失败");
|
||||
}
|
||||
|
||||
User updatedUser = userService.getById(currentUserId);
|
||||
return Result.success(convertToResponse(updatedUser));
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取当前用户ID
|
||||
* 从JWT拦截器设置的请求属性中获取用户ID
|
||||
*/
|
||||
private String getCurrentUserId(HttpServletRequest request) {
|
||||
// 优先从UserContextHolder获取(线程本地存储)
|
||||
String userId = UserContextHolder.getCurrentUserId();
|
||||
if (userId != null) {
|
||||
return userId;
|
||||
}
|
||||
|
||||
// 如果UserContextHolder中没有,从请求属性中获取(兼容性)
|
||||
Object userIdAttr = request.getAttribute("userId");
|
||||
if (userIdAttr != null) {
|
||||
return userIdAttr.toString();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为响应对象
|
||||
*/
|
||||
private UserResponse convertToResponse(User user) {
|
||||
UserResponse response = new UserResponse();
|
||||
BeanUtils.copyProperties(user, response);
|
||||
response.setId(user.getId());
|
||||
if (user.getCreateTime() != null) {
|
||||
response.setCreateTime(user.getCreateTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
if (user.getUpdateTime() != null) {
|
||||
response.setUpdateTime(user.getUpdateTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
if (user.getLastActiveTime() != null) {
|
||||
response.setLastActiveTime(user.getLastActiveTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
return response;
|
||||
return Result.success(updatedUser);
|
||||
}
|
||||
}
|
||||
@@ -1,22 +1,20 @@
|
||||
package com.emotion.controller;
|
||||
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.emotion.common.PageResult;
|
||||
import com.emotion.common.Result;
|
||||
import com.emotion.dto.request.PageRequest;
|
||||
import com.emotion.dto.response.BaseResponse;
|
||||
import com.emotion.entity.UserStats;
|
||||
import com.emotion.dto.request.UserStatsCreateRequest;
|
||||
import com.emotion.dto.request.UserStatsIncrementRequest;
|
||||
import com.emotion.dto.request.UserStatsPageRequest;
|
||||
import com.emotion.dto.request.UserStatsUpdateValueRequest;
|
||||
import com.emotion.dto.response.UserStatsResponse;
|
||||
import com.emotion.service.UserStatsService;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.Valid;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 用户统计控制器
|
||||
@@ -25,123 +23,37 @@ import java.util.stream.Collectors;
|
||||
* @date 2025-07-23
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/user-stats")
|
||||
@RequestMapping("/userStats")
|
||||
@Validated
|
||||
public class UserStatsController {
|
||||
|
||||
@Autowired
|
||||
private UserStatsService userStatsService;
|
||||
|
||||
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
/**
|
||||
* 分页查询用户统计
|
||||
*/
|
||||
@GetMapping("/page")
|
||||
public Result<PageResult<UserStatsResponse>> getPage(@Validated PageRequest request) {
|
||||
IPage<UserStats> page = userStatsService.getPage(request);
|
||||
List<UserStatsResponse> responses = page.getRecords().stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
PageResult<UserStatsResponse> pageResult = new PageResult<>();
|
||||
pageResult.setCurrent(page.getCurrent());
|
||||
pageResult.setSize(page.getSize());
|
||||
pageResult.setTotal(page.getTotal());
|
||||
pageResult.setPages(page.getPages());
|
||||
pageResult.setRecords(responses);
|
||||
|
||||
@GetMapping(value = "/page")
|
||||
public Result<PageResult<UserStatsResponse>> getPage(@Validated UserStatsPageRequest request) {
|
||||
PageResult<UserStatsResponse> pageResult = userStatsService.getPageWithResponse(request);
|
||||
return Result.success(pageResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID获取统计信息
|
||||
*/
|
||||
@GetMapping("/user/{userId}")
|
||||
public Result<UserStatsResponse> getByUserId(@PathVariable String userId) {
|
||||
UserStats stats = userStatsService.getByUserId(userId);
|
||||
if (stats == null) {
|
||||
return Result.notFound("用户统计不存在");
|
||||
}
|
||||
return Result.success(convertToResponse(stats));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据用户ID和统计类型获取统计信息
|
||||
*/
|
||||
@GetMapping("/user/{userId}/type/{statsType}")
|
||||
public Result<UserStatsResponse> getByUserIdAndStatsType(@PathVariable String userId, @PathVariable String statsType) {
|
||||
UserStats stats = userStatsService.getByUserIdAndStatsType(userId, statsType);
|
||||
if (stats == null) {
|
||||
return Result.notFound("用户统计不存在");
|
||||
}
|
||||
return Result.success(convertToResponse(stats));
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据统计类型查询统计信息
|
||||
*/
|
||||
@GetMapping("/type/{statsType}")
|
||||
public Result<List<UserStatsResponse>> getByStatsType(@PathVariable String statsType) {
|
||||
List<UserStats> statsList = userStatsService.getByStatsType(statsType);
|
||||
List<UserStatsResponse> responses = statsList.stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
return Result.success(responses);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询用户的所有统计类型
|
||||
*/
|
||||
@GetMapping("/user/{userId}/all")
|
||||
public Result<List<UserStatsResponse>> getAllStatsByUserId(@PathVariable String userId) {
|
||||
List<UserStats> statsList = userStatsService.getAllStatsByUserId(userId);
|
||||
List<UserStatsResponse> responses = statsList.stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
return Result.success(responses);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询排名前N的用户统计
|
||||
*/
|
||||
@GetMapping("/type/{statsType}/top")
|
||||
public Result<List<UserStatsResponse>> getTopUsersByStatsType(@PathVariable String statsType, @RequestParam(defaultValue = "10") Integer limit) {
|
||||
List<UserStats> statsList = userStatsService.getTopUsersByStatsType(statsType, limit);
|
||||
List<UserStatsResponse> responses = statsList.stream()
|
||||
.map(this::convertToResponse)
|
||||
.collect(Collectors.toList());
|
||||
return Result.success(responses);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询用户在指定统计类型中的排名
|
||||
*/
|
||||
@GetMapping("/user/{userId}/type/{statsType}/rank")
|
||||
public Result<Long> getUserRankByStatsType(@PathVariable String userId, @PathVariable String statsType) {
|
||||
Long rank = userStatsService.getUserRankByStatsType(userId, statsType);
|
||||
return Result.success(rank);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建或更新用户统计
|
||||
*/
|
||||
@PostMapping
|
||||
public Result<UserStatsResponse> createOrUpdate(@RequestBody @Validated UserStatsCreateRequest request) {
|
||||
UserStats stats = userStatsService.createOrUpdateUserStats(
|
||||
request.getUserId(),
|
||||
request.getStatsType(),
|
||||
request.getValue(),
|
||||
request.getPeriod()
|
||||
);
|
||||
return Result.success(convertToResponse(stats));
|
||||
@PostMapping(value = "/createOrUpdate")
|
||||
public Result<UserStatsResponse> createOrUpdate(@Valid @RequestBody UserStatsCreateRequest request) {
|
||||
UserStatsResponse stats = userStatsService.createOrUpdateUserStatsWithResponse(request);
|
||||
return Result.success(stats);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户统计值
|
||||
*/
|
||||
@PutMapping("/user/{userId}/type/{statsType}")
|
||||
public Result<Void> updateStatsValue(@PathVariable String userId, @PathVariable String statsType, @RequestParam Double value) {
|
||||
boolean updated = userStatsService.updateStatsValue(userId, statsType, value);
|
||||
@PutMapping(value = "/updateStatsValue")
|
||||
public Result<Void> updateStatsValue(@Valid @RequestBody UserStatsUpdateValueRequest request) {
|
||||
boolean updated = userStatsService.updateStatsValue(request);
|
||||
if (!updated) {
|
||||
return Result.error("更新失败");
|
||||
}
|
||||
@@ -151,9 +63,9 @@ public class UserStatsController {
|
||||
/**
|
||||
* 增加用户统计值
|
||||
*/
|
||||
@PutMapping("/user/{userId}/type/{statsType}/increment")
|
||||
public Result<Void> incrementStatsValue(@PathVariable String userId, @PathVariable String statsType, @RequestParam Double increment) {
|
||||
boolean updated = userStatsService.incrementStatsValue(userId, statsType, increment);
|
||||
@PutMapping(value = "/incrementStatsValue")
|
||||
public Result<Void> incrementStatsValue(@Valid @RequestBody UserStatsIncrementRequest request) {
|
||||
boolean updated = userStatsService.incrementStatsValue(request);
|
||||
if (!updated) {
|
||||
return Result.error("增加失败");
|
||||
}
|
||||
@@ -163,8 +75,8 @@ public class UserStatsController {
|
||||
/**
|
||||
* 重新计算用户统计
|
||||
*/
|
||||
@PutMapping("/user/{userId}/recalculate")
|
||||
public Result<Void> recalculateUserStats(@PathVariable String userId) {
|
||||
@PutMapping(value = "/recalculateUserStats")
|
||||
public Result<Void> recalculateUserStats(@RequestParam String userId) {
|
||||
boolean recalculated = userStatsService.recalculateUserStats(userId);
|
||||
if (!recalculated) {
|
||||
return Result.error("重新计算失败");
|
||||
@@ -175,7 +87,7 @@ public class UserStatsController {
|
||||
/**
|
||||
* 重新计算所有用户统计
|
||||
*/
|
||||
@PutMapping("/recalculate-all")
|
||||
@PutMapping(value = "/recalculateAll")
|
||||
public Result<Void> recalculateAllUserStats() {
|
||||
boolean recalculated = userStatsService.recalculateAllUserStats();
|
||||
if (!recalculated) {
|
||||
@@ -184,37 +96,10 @@ public class UserStatsController {
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询平均统计值
|
||||
*/
|
||||
@GetMapping("/type/{statsType}/avg")
|
||||
public Result<Double> getAvgValueByStatsType(@PathVariable String statsType) {
|
||||
Double avgValue = userStatsService.getAvgValueByStatsType(statsType);
|
||||
return Result.success(avgValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询最大统计值
|
||||
*/
|
||||
@GetMapping("/type/{statsType}/max")
|
||||
public Result<Double> getMaxValueByStatsType(@PathVariable String statsType) {
|
||||
Double maxValue = userStatsService.getMaxValueByStatsType(statsType);
|
||||
return Result.success(maxValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询最小统计值
|
||||
*/
|
||||
@GetMapping("/type/{statsType}/min")
|
||||
public Result<Double> getMinValueByStatsType(@PathVariable String statsType) {
|
||||
Double minValue = userStatsService.getMinValueByStatsType(statsType);
|
||||
return Result.success(minValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除过期的统计数据
|
||||
*/
|
||||
@DeleteMapping("/expired")
|
||||
@DeleteMapping(value = "/deleteExpired")
|
||||
public Result<Void> deleteExpiredStats(@RequestParam(defaultValue = "30") Integer days) {
|
||||
boolean deleted = userStatsService.deleteExpiredStats(days);
|
||||
if (!deleted) {
|
||||
@@ -222,49 +107,4 @@ public class UserStatsController {
|
||||
}
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换为响应对象
|
||||
*/
|
||||
private UserStatsResponse convertToResponse(UserStats stats) {
|
||||
UserStatsResponse response = new UserStatsResponse();
|
||||
BeanUtils.copyProperties(stats, response);
|
||||
response.setId(stats.getId());
|
||||
if (stats.getCreateTime() != null) {
|
||||
response.setCreateTime(stats.getCreateTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
if (stats.getUpdateTime() != null) {
|
||||
response.setUpdateTime(stats.getUpdateTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户统计创建请求
|
||||
*/
|
||||
@lombok.Data
|
||||
public static class UserStatsCreateRequest {
|
||||
@NotBlank(message = "用户ID不能为空")
|
||||
private String userId;
|
||||
|
||||
@NotBlank(message = "统计类型不能为空")
|
||||
private String statsType;
|
||||
|
||||
@NotNull(message = "统计值不能为空")
|
||||
private Double value;
|
||||
|
||||
private String period;
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户统计响应类
|
||||
*/
|
||||
@lombok.Data
|
||||
@lombok.EqualsAndHashCode(callSuper = true)
|
||||
public static class UserStatsResponse extends BaseResponse {
|
||||
private String userId;
|
||||
private String statsType;
|
||||
private Double value;
|
||||
private String period;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
package com.emotion.controller;
|
||||
|
||||
import com.emotion.service.AiChatService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.messaging.handler.annotation.MessageMapping;
|
||||
import org.springframework.messaging.handler.annotation.Payload;
|
||||
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
|
||||
import org.springframework.messaging.simp.SimpMessagingTemplate;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.ResponseBody;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* WebSocket控制器
|
||||
*
|
||||
* @author emotion-museum
|
||||
* @date 2025-07-22
|
||||
*/
|
||||
@Controller
|
||||
public class WebSocketController {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(WebSocketController.class);
|
||||
|
||||
@Autowired
|
||||
private SimpMessagingTemplate messagingTemplate;
|
||||
|
||||
@Autowired
|
||||
private AiChatService aiChatService;
|
||||
|
||||
// 已移除旧的WebSocket消息处理方法,使用新的ChatWebSocketController
|
||||
|
||||
// 已移除旧的用户连接处理方法,使用新的ChatWebSocketController
|
||||
|
||||
/**
|
||||
* 处理AI聊天消息
|
||||
*/
|
||||
@MessageMapping("/chat.ai")
|
||||
public void handleAiChat(@Payload Map<String, Object> chatMessage,
|
||||
SimpMessageHeaderAccessor headerAccessor) {
|
||||
log.info("收到AI聊天消息: {}", chatMessage);
|
||||
|
||||
try {
|
||||
String content = (String) chatMessage.get("content");
|
||||
String conversationId = (String) chatMessage.get("conversationId");
|
||||
String userId = (String) chatMessage.get("userId");
|
||||
|
||||
// 调用AI服务
|
||||
String aiReply = aiChatService.sendMessage(conversationId, content, userId);
|
||||
|
||||
// 构建AI回复消息
|
||||
Map<String, Object> aiResponse = new HashMap<>();
|
||||
aiResponse.put("content", aiReply);
|
||||
aiResponse.put("sender", "AI助手");
|
||||
aiResponse.put("type", "AI_REPLY");
|
||||
aiResponse.put("conversationId", conversationId);
|
||||
aiResponse.put("timestamp", System.currentTimeMillis());
|
||||
|
||||
// 发送给特定用户
|
||||
if (userId != null) {
|
||||
messagingTemplate.convertAndSendToUser(userId, "/queue/messages", aiResponse);
|
||||
} else {
|
||||
// 发送到公共频道
|
||||
messagingTemplate.convertAndSend("/topic/conversation/" + conversationId, aiResponse);
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("处理AI聊天失败", e);
|
||||
|
||||
Map<String, Object> errorResponse = new HashMap<>();
|
||||
errorResponse.put("content", "AI服务暂时不可用,请稍后再试");
|
||||
errorResponse.put("sender", "System");
|
||||
errorResponse.put("type", "ERROR");
|
||||
errorResponse.put("timestamp", System.currentTimeMillis());
|
||||
|
||||
String userId = (String) chatMessage.get("userId");
|
||||
if (userId != null) {
|
||||
messagingTemplate.convertAndSendToUser(userId, "/queue/messages", errorResponse);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送系统消息
|
||||
*/
|
||||
public void sendSystemMessage(String destination, String message) {
|
||||
Map<String, Object> systemMessage = new HashMap<>();
|
||||
systemMessage.put("content", message);
|
||||
systemMessage.put("sender", "System");
|
||||
systemMessage.put("type", "SYSTEM");
|
||||
systemMessage.put("timestamp", System.currentTimeMillis());
|
||||
|
||||
messagingTemplate.convertAndSend(destination, systemMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* WebSocket状态监控接口
|
||||
*/
|
||||
@GetMapping("/api/ws/status")
|
||||
@ResponseBody
|
||||
public Map<String, Object> getWebSocketStatus() {
|
||||
Map<String, Object> status = new HashMap<>();
|
||||
status.put("status", "active");
|
||||
status.put("timestamp", System.currentTimeMillis());
|
||||
status.put("endpoint", "/ws/chat");
|
||||
status.put("protocols", new String[]{"websocket", "sockjs"});
|
||||
status.put("message", "WebSocket服务正常运行");
|
||||
return status;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user