每日总结

// ConsultationRoomController.java
package com.mentalhealth.controller;
import com.mentalhealth.dto.ConsultationBookingDTO;
import com.mentalhealth.dto.ConsultationMessageDTO;
import com.mentalhealth.entity.ConsultationRoom;
import com.mentalhealth.entity.ConsultationSession;
import com.mentalhealth.service.ConsultationBookingService;
import com.mentalhealth.service.ConsultationMessageService;
import com.mentalhealth.service.ConsultationRoomService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
@RestController
@RequestMapping("/api/consultation/room") // 修改路径,添加 /room 避免冲突
@RequiredArgsConstructor
public class ConsultationRoomController {
private final ConsultationBookingService bookingService;
private final ConsultationRoomService roomService;
private final ConsultationMessageService messageService;
@PostMapping("/book")
public ResponseEntity<ConsultationSession> bookConsultation(
@Valid @RequestBody ConsultationBookingDTO bookingDTO,
@RequestHeader("X-User-Id") Long userId) {
ConsultationSession session = bookingService.bookConsultation(bookingDTO, userId);
return ResponseEntity.ok(session);
}
@GetMapping("/{sessionId}")
public ResponseEntity<ConsultationRoom> getConsultationRoom(@PathVariable Long sessionId) {
ConsultationRoom room = roomService.getRoomBySessionId(sessionId);
return ResponseEntity.ok(room);
}
@PostMapping("/{sessionId}/activate")
public ResponseEntity<ConsultationRoom> activateRoom(@PathVariable Long sessionId) {
ConsultationRoom room = roomService.activateRoom(sessionId);
return ResponseEntity.ok(room);
}
@GetMapping("/{roomId}/messages")
public ResponseEntity<List<ConsultationMessageDTO>> getRoomMessages(@PathVariable String roomId) {
List<ConsultationMessageDTO> messages = messageService.getRoomMessages(roomId);
return ResponseEntity.ok(messages);
}
@PostMapping("/{roomId}/join")
public ResponseEntity<?> joinRoom(@PathVariable String roomId,
@RequestHeader("X-User-Id") Long userId) {
roomService.joinRoom(roomId, userId);
return ResponseEntity.ok().build();
}
@PostMapping("/{roomId}/leave")
public ResponseEntity<?> leaveRoom(@PathVariable String roomId,
@RequestHeader("X-User-Id") Long userId) {
roomService.leaveRoom(roomId, userId);
return ResponseEntity.ok().build();
}
@PutMapping("/{roomId}/mode")
public ResponseEntity<ConsultationRoom> changeRoomMode(
@PathVariable String roomId,
@RequestParam String mode) {
ConsultationRoom room = roomService.changeRoomMode(roomId, mode);
return ResponseEntity.ok(room);
}
@GetMapping("/{roomId}/participants")
public ResponseEntity<?> getRoomParticipants(@PathVariable String roomId) {
Object participants = roomService.getOnlineParticipants(roomId);
return ResponseEntity.ok(participants);
}
}
package com.mentalhealth.controller;
import com.mentalhealth.entity.ConsultationRoom;
import com.mentalhealth.entity.ConsultationSession;
import com.mentalhealth.service.ConsultationRoomService;
import com.mentalhealth.service.ConsultationSessionService;
import com.mentalhealth.util.JwtTokenUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.util.Optional;
@Controller
@RequiredArgsConstructor
public class ConsultationRoomPageController {
private final ConsultationSessionService consultationSessionService;
private final ConsultationRoomService consultationRoomService;
private final JwtTokenUtil jwtTokenUtil;
@GetMapping("/consultation-room")
public String consultationRoom(@RequestParam Long sessionId,
@RequestParam(required = false) String token,
HttpServletRequest request,
Model model) {
try {
// 获取会话信息
ConsultationSession session = consultationSessionService.getSessionById(sessionId);
// 获取咨询室信息
ConsultationRoom room = consultationRoomService.getRoomBySessionId(sessionId);
// 验证用户权限
if (!validateUserAccess(session, request, token)) {
model.addAttribute("error", "无权访问此咨询室");
return "error";
}
// 检查咨询室状态
if (!room.getIsActive()) {
model.addAttribute("error", "咨询室尚未激活,请在预约时间到达后进入");
return "error";
}
// 添加数据到模型
model.addAttribute("sessionId", sessionId);
model.addAttribute("roomId", room.getRoomId());
model.addAttribute("consultantId", session.getConsultantId());
model.addAttribute("userId", session.getUserId());
model.addAttribute("sessionType", session.getType().name());
model.addAttribute("scheduledTime", session.getScheduledTime());
// 添加token到模型(如果存在)
if (token != null) {
model.addAttribute("token", token);
}
return "consultation-room";
} catch (RuntimeException e) {
model.addAttribute("error", "咨询室不存在或无权访问: " + e.getMessage());
return "error";
} catch (Exception e) {
model.addAttribute("error", "系统错误: " + e.getMessage());
return "error";
}
}
/**
* 验证用户是否有权访问咨询室
*/
private boolean validateUserAccess(ConsultationSession session, HttpServletRequest request, String token) {
try {
// 从token或session中获取当前用户ID
Long currentUserId = getCurrentUserId(request, token);
if (currentUserId == null) {
return false;
}
// 检查用户是否是咨询会话的参与者(用户或咨询师)
return currentUserId.equals(session.getUserId()) ||
currentUserId.equals(session.getConsultantId());
} catch (Exception e) {
return false;
}
}
/**
* 从请求中获取当前用户ID
*/
private Long getCurrentUserId(HttpServletRequest request, String token) {
// 首先尝试从URL参数获取token
if (token != null && jwtTokenUtil.validateToken(token)) {
String username = jwtTokenUtil.getIdentifierFromToken(token);
return getUserIdFromUsername(username);
}
// 然后尝试从Header获取token
String authHeader = request.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
token = authHeader.substring(7);
if (jwtTokenUtil.validateToken(token)) {
String username = jwtTokenUtil.getIdentifierFromToken(token);
return getUserIdFromUsername(username);
}
}
// 最后尝试从session获取
Object userIdObj = request.getSession().getAttribute("userId");
if (userIdObj instanceof Long) {
return (Long) userIdObj;
}
return null;
}
/**
* 根据用户名获取用户ID(这里需要根据你的用户服务实现)
*/
private Long getUserIdFromUsername(String username) {
// 这里需要调用你的用户服务来根据用户名获取用户ID
// 暂时返回一个默认值,实际项目中需要实现这个逻辑
try {
// 模拟实现 - 实际项目中需要调用UserService
return Long.parseLong(username); // 假设用户名就是用户ID
} catch (NumberFormatException e) {
// 如果用户名不是数字,需要查询数据库
return 1L; // 默认返回1,实际项目中需要修改
}
}
}

浙公网安备 33010602011771号