Browse Source

1.2 会话管理功能

zrh1922741520 6 days ago
parent
commit
c2dcaebe9a

+ 2 - 1
src/main/java/ai/java/back/config/SecurityConfig.java

@@ -36,7 +36,8 @@ public class SecurityConfig {
             .csrf(AbstractHttpConfigurer::disable)
             .cors(Customizer.withDefaults())
             .authorizeHttpRequests(auth -> auth
-                .requestMatchers("/v1/auth/**","/api/disease/by-date").permitAll()
+                // .requestMatchers("/v1/auth/**","/api/disease/by-date").permitAll()
+                .requestMatchers("/**").permitAll()
                 .anyRequest().authenticated()
             )
             .sessionManagement(session -> session

+ 1 - 3
src/main/java/ai/java/back/controller/DailyQuestionInfoController.java

@@ -3,12 +3,10 @@ package ai.java.back.controller;
 import ai.java.back.entity.DailyQuestionInfo;
 import ai.java.back.service.DailyQuestionInfoService;
 import ai.java.back.model.DateRequest;
+
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.web.bind.annotation.*;
 
-import java.time.LocalDate;
-
 @RestController
 @RequestMapping("/api/disease")
 public class DailyQuestionInfoController {

+ 37 - 0
src/main/java/ai/java/back/controller/SessionController.java

@@ -0,0 +1,37 @@
+package ai.java.back.controller;
+
+import ai.java.back.model.SessionRequest;
+import ai.java.back.model.SessionResponse;
+import ai.java.back.service.SessionService;
+import ai.java.back.model.Message;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+
+@RestController
+@RequestMapping("/v1/session")
+public class SessionController {
+    @Autowired
+    private SessionService sessionService;
+
+    @PostMapping("/start")
+    public SessionResponse startSession(@RequestBody SessionRequest request) {
+        return sessionService.startSession(request);
+    }
+
+    @GetMapping("/list/{userId}")
+    public List<SessionResponse> listSessions(@PathVariable Integer userId) {
+        return sessionService.listSessions(userId);
+    }
+
+    @GetMapping("/previous/{userId}")
+    public SessionResponse previousSession(@PathVariable Integer userId) {
+        return sessionService.previousSession(userId);
+    }
+
+    // 新增:通过会话id获取前50条消息
+    @GetMapping("/messages/{sessionId}")
+    public List<Message> getSessionMessages(@PathVariable Integer sessionId) {
+        return ((ai.java.back.service.impl.SessionServiceImpl)sessionService).getSessionMessages(sessionId);
+    }
+}

+ 0 - 1
src/main/java/ai/java/back/entity/DailyQuestionInfo.java

@@ -5,7 +5,6 @@ import lombok.Getter;
 import lombok.Setter;
 import java.time.LocalDate;
 
-import org.hibernate.annotations.CreationTimestamp;
 
 @Getter
 @Setter

+ 8 - 0
src/main/java/ai/java/back/model/SessionRequest.java

@@ -0,0 +1,8 @@
+package ai.java.back.model;
+
+import lombok.Data;
+
+@Data
+public class SessionRequest {
+    private Integer userId;
+}

+ 13 - 0
src/main/java/ai/java/back/model/SessionResponse.java

@@ -0,0 +1,13 @@
+package ai.java.back.model;
+
+import lombok.Data;
+import java.time.Instant;
+import java.util.List;
+
+@Data
+public class SessionResponse {
+    private Integer sessionId;
+    private Instant createdAt;
+    private Instant updatedAt;
+    private List<Message> messages;
+}

+ 6 - 0
src/main/java/ai/java/back/repository/HistoryRecordsRepository.java

@@ -2,10 +2,16 @@ package ai.java.back.repository;
 
 
 import ai.java.back.entity.HistoryRecordInfo;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 
 import java.util.List;
 
 public interface HistoryRecordsRepository extends JpaRepository<HistoryRecordInfo, Long> {
     List<HistoryRecordInfo> findById(Integer userId);
+
+    @Query("SELECT h FROM HistoryRecordInfo h WHERE h.session.id = :sessionId ORDER BY h.timestamp DESC")
+    List<HistoryRecordInfo> findRecentBySessionId(@Param("sessionId") Integer sessionId, Pageable pageable);
 }

+ 11 - 0
src/main/java/ai/java/back/service/SessionService.java

@@ -0,0 +1,11 @@
+package ai.java.back.service;
+
+import ai.java.back.model.SessionRequest;
+import ai.java.back.model.SessionResponse;
+import java.util.List;
+
+public interface SessionService {
+    SessionResponse startSession(SessionRequest request);
+    List<SessionResponse> listSessions(Integer userId);
+    SessionResponse previousSession(Integer userId);
+}

+ 83 - 0
src/main/java/ai/java/back/service/impl/SessionServiceImpl.java

@@ -0,0 +1,83 @@
+package ai.java.back.service.impl;
+
+import ai.java.back.entity.DialogueSessionInfo;
+import ai.java.back.entity.UserInfo;
+import ai.java.back.entity.HistoryRecordInfo;
+import ai.java.back.model.SessionRequest;
+import ai.java.back.model.SessionResponse;
+import ai.java.back.model.Message;
+import ai.java.back.repository.DialogueSessionsRepository;
+import ai.java.back.repository.UserRepository;
+import ai.java.back.repository.HistoryRecordsRepository;
+import ai.java.back.service.SessionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+
+import java.time.Instant;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class SessionServiceImpl implements SessionService {
+    @Autowired
+    private DialogueSessionsRepository dialogueSessionsRepository;
+    @Autowired
+    private UserRepository userRepository;
+    @Autowired
+    private HistoryRecordsRepository historyRecordsRepository;
+
+    @Override
+    public SessionResponse startSession(SessionRequest request) {
+        UserInfo user = userRepository.findById(request.getUserId()).orElse(null);
+        DialogueSessionInfo session = new DialogueSessionInfo();
+        session.setUser(user);
+        session.setCreatedAt(Instant.now());
+        session.setUpdatedAt(Instant.now());
+        session = dialogueSessionsRepository.save(session);
+        SessionResponse response = new SessionResponse();
+        response.setSessionId(session.getId());
+        response.setCreatedAt(session.getCreatedAt());
+        response.setUpdatedAt(session.getUpdatedAt());
+        return response;
+    }
+
+    @Override
+    public List<SessionResponse> listSessions(Integer userId) {
+        List<DialogueSessionInfo> sessions = dialogueSessionsRepository.findAll().stream()
+                .filter(s -> s.getUser() != null && s.getUser().getId().equals(userId))
+                .collect(Collectors.toList());
+        return sessions.stream().map(s -> {
+            SessionResponse resp = new SessionResponse();
+            resp.setSessionId(s.getId());
+            resp.setCreatedAt(s.getCreatedAt());
+            resp.setUpdatedAt(s.getUpdatedAt());
+            // 查询最近20条记录
+            List<HistoryRecordInfo> records = historyRecordsRepository.findRecentBySessionId(s.getId(), PageRequest.of(0, 20));
+            List<Message> messages = records.stream().map(r -> new Message(r.getRole(), r.getContent(), r.getTimestamp())).collect(Collectors.toList());
+            resp.setMessages(messages);
+            return resp;
+        }).collect(Collectors.toList());
+    }
+
+    // 新增:通过会话id获取前50条记录
+    public List<Message> getSessionMessages(Integer sessionId) {
+        List<HistoryRecordInfo> records = historyRecordsRepository.findRecentBySessionId(sessionId, PageRequest.of(0, 50));
+        return records.stream().map(r -> new Message(r.getRole(), r.getContent(), r.getTimestamp())).collect(Collectors.toList());
+    }
+
+    @Override
+    public SessionResponse previousSession(Integer userId) {
+        List<DialogueSessionInfo> sessions = dialogueSessionsRepository.findAll().stream()
+                .filter(s -> s.getUser() != null && s.getUser().getId().equals(userId))
+                .sorted((a, b) -> b.getCreatedAt().compareTo(a.getCreatedAt()))
+                .collect(Collectors.toList());
+        if (sessions.size() < 2) return null;
+        DialogueSessionInfo prev = sessions.get(1);
+        SessionResponse resp = new SessionResponse();
+        resp.setSessionId(prev.getId());
+        resp.setCreatedAt(prev.getCreatedAt());
+        resp.setUpdatedAt(prev.getUpdatedAt());
+        return resp;
+    }
+}