每日总结

屏幕截图 2026-01-06 031614
// 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,实际项目中需要修改
    }
}

}

posted @ 2025-11-19 19:02  李蕊lr  阅读(1)  评论(0)    收藏  举报