ai聊天功能搭建
parent
988d790ae4
commit
7e82814906
@ -0,0 +1,66 @@
|
||||
package com.example.venue_reservation_service.controller;
|
||||
|
||||
import com.example.venue_reservation_service.domain.VeMessage;
|
||||
import com.example.venue_reservation_service.domain.VeSession;
|
||||
import com.example.venue_reservation_service.service.VeMessageService;
|
||||
import com.example.venue_reservation_service.service.VeSessionService;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/session")
|
||||
@Api("ai会话管理模块")
|
||||
@CrossOrigin
|
||||
public class SessionController {
|
||||
|
||||
@Resource
|
||||
private VeSessionService sessionService;
|
||||
|
||||
@Resource
|
||||
private VeMessageService messageService;
|
||||
|
||||
@ApiOperation("创建新会话")
|
||||
@PostMapping("/create")
|
||||
public ResponseEntity<VeSession> createSession(@RequestBody VeSession session) {
|
||||
VeSession savedSession = sessionService.saveSession(session);
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(savedSession);
|
||||
}
|
||||
|
||||
@ApiOperation("获取用户会话历史")
|
||||
@GetMapping("/list")
|
||||
public ResponseEntity<List<VeSession>> getUserSessions(@RequestParam(name = "userId") Integer userId) {
|
||||
List<VeSession> sessions = sessionService.getSessionsByUserId(userId);
|
||||
return ResponseEntity.ok(sessions);
|
||||
}
|
||||
|
||||
@ApiOperation("获取会话详情")
|
||||
@GetMapping("/{sessionId}")
|
||||
public ResponseEntity<VeSession> getSession(@PathVariable("sessionId") Integer sessionId) {
|
||||
VeSession session = sessionService.getById(sessionId);
|
||||
if (session != null) {
|
||||
return ResponseEntity.ok(session);
|
||||
} else {
|
||||
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
|
||||
}
|
||||
}
|
||||
|
||||
@ApiOperation("获取指定会话的所有消息")
|
||||
@GetMapping("/message/{sessionId}")
|
||||
public ResponseEntity<List<VeMessage>> getSessionMessages(@PathVariable("sessionId") Integer sessionId) {
|
||||
List<VeMessage> messages = messageService.getMessagesBySessionId(sessionId);
|
||||
return ResponseEntity.ok(messages);
|
||||
}
|
||||
|
||||
@ApiOperation("创建新消息")
|
||||
@PostMapping("/message/create")
|
||||
public ResponseEntity<VeMessage> createMessage(@RequestBody VeMessage message) {
|
||||
VeMessage savedMessage = messageService.saveMessage(message);
|
||||
return ResponseEntity.status(HttpStatus.CREATED).body(savedMessage);
|
||||
}
|
||||
}
|
@ -0,0 +1,52 @@
|
||||
package com.example.venue_reservation_service.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Date;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
/**
|
||||
*
|
||||
* @TableName venue_message
|
||||
*/
|
||||
@TableName(value ="venue_message")
|
||||
@Data
|
||||
public class VeMessage implements Serializable {
|
||||
/**
|
||||
*
|
||||
*/
|
||||
@TableId(type = IdType.AUTO)
|
||||
private Integer id;
|
||||
|
||||
/**
|
||||
* 所属会话ID
|
||||
*/
|
||||
private Integer sessionId;
|
||||
|
||||
/**
|
||||
* 消息内容
|
||||
*/
|
||||
private String content;
|
||||
|
||||
/**
|
||||
* 发送者类型
|
||||
*/
|
||||
private Object sender;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private LocalDateTime createdAt;
|
||||
|
||||
@TableField(exist = false)
|
||||
private static final long serialVersionUID = 1L;
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package com.example.venue_reservation_service.mapper;
|
||||
|
||||
import com.example.venue_reservation_service.domain.VeMessage;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
/**
|
||||
* @author 31586
|
||||
* @description 针对表【venue_message】的数据库操作Mapper
|
||||
* @createDate 2025-06-17 15:36:33
|
||||
* @Entity generator.domain.VeMessage
|
||||
*/
|
||||
public interface VeMessageMapper extends BaseMapper<VeMessage> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,24 @@
|
||||
package com.example.venue_reservation_service.mapper;
|
||||
|
||||
import com.example.venue_reservation_service.domain.VeSession;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Insert;
|
||||
import org.apache.ibatis.annotations.Options;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author 31586
|
||||
* @description 针对表【venue_session】的数据库操作Mapper
|
||||
* @createDate 2025-06-17 15:36:33
|
||||
* @Entity generator.domain.VeSession
|
||||
*/
|
||||
public interface VeSessionMapper extends BaseMapper<VeSession> {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,18 @@
|
||||
package com.example.venue_reservation_service.service;
|
||||
|
||||
import com.example.venue_reservation_service.domain.VeMessage;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author 31586
|
||||
* @description 针对表【venue_message】的数据库操作Service
|
||||
* @createDate 2025-06-17 15:36:33
|
||||
*/
|
||||
public interface VeMessageService extends IService<VeMessage> {
|
||||
|
||||
VeMessage saveMessage(VeMessage message);
|
||||
|
||||
List<VeMessage> getMessagesBySessionId(Integer sessionId);
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package com.example.venue_reservation_service.service;
|
||||
|
||||
import com.example.venue_reservation_service.domain.VeSession;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author 31586
|
||||
* @description 针对表【venue_session】的数据库操作Service
|
||||
* @createDate 2025-06-17 15:36:33
|
||||
*/
|
||||
public interface VeSessionService extends IService<VeSession> {
|
||||
|
||||
VeSession saveSession(VeSession session);
|
||||
|
||||
List<VeSession> getSessionsByUserId(Integer userId);
|
||||
}
|
@ -0,0 +1,45 @@
|
||||
package com.example.venue_reservation_service.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.example.venue_reservation_service.domain.VeMessage;
|
||||
import com.example.venue_reservation_service.service.VeMessageService;
|
||||
import com.example.venue_reservation_service.mapper.VeMessageMapper;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author 31586
|
||||
* @description 针对表【venue_message】的数据库操作Service实现
|
||||
* @createDate 2025-06-17 15:36:33
|
||||
*/
|
||||
@Service
|
||||
public class VeMessageServiceImpl extends ServiceImpl<VeMessageMapper, VeMessage>
|
||||
implements VeMessageService{
|
||||
|
||||
@Resource
|
||||
private VeMessageMapper messageMapper;
|
||||
|
||||
@Override
|
||||
public VeMessage saveMessage(VeMessage message) {
|
||||
message.setCreatedAt(LocalDateTime.now());
|
||||
messageMapper.insert(message);
|
||||
return message;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<VeMessage> getMessagesBySessionId(Integer sessionId) {
|
||||
QueryWrapper<VeMessage> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("session_id", sessionId)
|
||||
.orderByAsc("created_at");
|
||||
return messageMapper.selectList(queryWrapper);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,48 @@
|
||||
package com.example.venue_reservation_service.service.impl;
|
||||
|
||||
import cn.hutool.core.lang.UUID;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.example.venue_reservation_service.service.VeSessionService;
|
||||
import com.example.venue_reservation_service.domain.VeSession;
|
||||
import com.example.venue_reservation_service.mapper.VeSessionMapper;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author 31586
|
||||
* @description 针对表【venue_session】的数据库操作Service实现
|
||||
* @createDate 2025-06-17 15:36:33
|
||||
*/
|
||||
@Service
|
||||
public class VeSessionServiceImpl extends ServiceImpl<VeSessionMapper, VeSession>
|
||||
implements VeSessionService {
|
||||
|
||||
@Resource
|
||||
private VeSessionMapper sessionMapper;
|
||||
|
||||
public VeSession saveSession(VeSession session) {
|
||||
session.setStartTime(LocalDateTime.now());
|
||||
if (StringUtils.isEmpty(session.getSessionToken())) {
|
||||
session.setSessionToken("sess_" + UUID.randomUUID());
|
||||
}
|
||||
sessionMapper.insert(session);
|
||||
return session;
|
||||
}
|
||||
|
||||
public List<VeSession> getSessionsByUserId(Integer userId) {
|
||||
QueryWrapper<VeSession> queryWrapper = new QueryWrapper<>();
|
||||
queryWrapper.eq("user_id", userId)
|
||||
.orderByDesc("start_time");
|
||||
return sessionMapper.selectList(queryWrapper);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.example.venue_reservation_service.mapper.VeMessageMapper">
|
||||
|
||||
<resultMap id="BaseResultMap" type="com.example.venue_reservation_service.domain.VeMessage">
|
||||
<id property="id" column="id" jdbcType="INTEGER"/>
|
||||
<result property="sessionId" column="session_id" jdbcType="INTEGER"/>
|
||||
<result property="content" column="content" jdbcType="VARCHAR"/>
|
||||
<result property="sender" column="sender" jdbcType="OTHER"/>
|
||||
<result property="createdAt" column="created_at" jdbcType="TIMESTAMP"/>
|
||||
</resultMap>
|
||||
|
||||
<sql id="Base_Column_List">
|
||||
id,session_id,content,
|
||||
sender,created_at
|
||||
</sql>
|
||||
</mapper>
|
@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.example.venue_reservation_service.mapper.VeSessionMapper">
|
||||
|
||||
<resultMap id="BaseResultMap" type="com.example.venue_reservation_service.domain.VeSession">
|
||||
<id property="id" column="id" jdbcType="INTEGER"/>
|
||||
<result property="userId" column="user_id" jdbcType="INTEGER"/>
|
||||
<result property="userIp" column="user_ip" jdbcType="VARCHAR"/>
|
||||
<result property="startTime" column="start_time" jdbcType="TIMESTAMP"/>
|
||||
<result property="endTime" column="end_time" jdbcType="TIMESTAMP"/>
|
||||
<result property="sessionToken" column="session_token" jdbcType="VARCHAR"/>
|
||||
</resultMap>
|
||||
|
||||
<sql id="Base_Column_List">
|
||||
id,user_id,user_ip,
|
||||
start_time,end_time,session_token
|
||||
</sql>
|
||||
</mapper>
|
Loading…
Reference in New Issue