From 177dfff3c76b39f8062b83d0dadc51e035af9c94 Mon Sep 17 00:00:00 2001 From: Hanserwei <2628273921@qq.com> Date: Sat, 25 Oct 2025 10:06:37 +0800 Subject: [PATCH] =?UTF-8?q?refactor(project):=E9=87=8D=E6=9E=84=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=BB=93=E6=9E=84=E5=B9=B6=E8=BF=81=E7=A7=BB=E8=87=B3?= =?UTF-8?q?snails-chat=E6=A8=A1=E5=9D=97-=20=E5=B0=86=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E4=B8=BB=E6=A8=A1=E5=9D=97=E6=9B=B4=E5=90=8D=E4=B8=BAsnails-ch?= =?UTF-8?q?at=EF=BC=8C=E8=B0=83=E6=95=B4=E5=8C=85=E7=BB=93=E6=9E=84=20-=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4JPA=E7=9B=B8=E5=85=B3=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=EF=BC=8C=E6=9B=BF=E6=8D=A2=E4=B8=BAMyBatis-Plus-=20=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BA=93=E4=BB=8EMySQL=E8=BF=81=E7=A7=BB=E8=87=B3Post?= =?UTF-8?q?greSQL-=20=E7=A7=BB=E9=99=A4QueryTool=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB=E5=8F=8A=E7=9B=B8=E5=85=B3=E4=BE=9D=E8=B5=96-=20?= =?UTF-8?q?=E6=9B=B4=E6=96=B0Redis=E9=85=8D=E7=BD=AE=EF=BC=8C=E4=BD=BF?= =?UTF-8?q?=E7=94=A8JSON=E5=BA=8F=E5=88=97=E5=8C=96-=20=E7=A7=BB=E9=99=A4D?= =?UTF-8?q?ashScopeController=E5=8F=8AAIResponse=E7=B1=BB=20-=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0User=E5=AE=9E=E4=BD=93=E7=B1=BB=E5=8F=8AMapper?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=20-=20=E8=B0=83=E6=95=B4ChatClientConfigurat?= =?UTF-8?q?ion=E9=85=8D=E7=BD=AE=E7=B1=BB-=20=E6=9B=B4=E6=96=B0pom.xml?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E7=AE=A1=E7=90=86=E5=8F=8A=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 45 ++++++++---- snails-chat/pom.xml | 28 ++++++++ .../hanserwei/chat/SnailsChatApplication.java | 13 ++++ .../chat}/config/ChatClientConfiguration.java | 6 +- .../hanserwei/chat}/config/CorsConfig.java | 2 +- .../hanserwei/chat/config/RedisConfig.java | 30 ++++++++ .../chat/domain/dataobject/User.java | 37 ++++++++++ .../chat/domain/mapper/UserMapper.java | 9 +++ .../hanserwei/chat/service/UserService.java | 9 +++ .../chat/service/impl/UserServiceImpl.java | 12 ++++ .../hanserwei/chat}/utils/EncryptorUtil.java | 2 +- .../main/resources/config/application.yml | 24 +++---- .../src}/main/resources/config/banner.txt | 0 .../main/resources/mapperxml/UserMapper.xml | 18 +++++ .../snailsai/SnailsAiApplication.java | 13 ---- .../snailsai/config/RedisConfig.java | 7 -- .../controller/DashScopeController.java | 41 ----------- .../controller/TestDataController.java | 29 -------- .../snailsai/dto/ChatMessageDTO.java | 17 ----- .../hanserwei/snailsai/entity/UserEntity.java | 54 --------------- .../hanserwei/snailsai/model/AIResponse.java | 15 ---- .../snailsai/repository/UserRepository.java | 21 ------ .../snailsai/service/UserService.java | 69 ------------------- .../hanserwei/snailsai/tools/QueryTool.java | 27 -------- .../snailsai/SnailsAiApplicationTests.java | 13 ---- 25 files changed, 203 insertions(+), 338 deletions(-) create mode 100644 snails-chat/pom.xml create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/SnailsChatApplication.java rename {src/main/java/com/hanserwei/snailsai => snails-chat/src/main/java/com/hanserwei/chat}/config/ChatClientConfiguration.java (92%) rename {src/main/java/com/hanserwei/snailsai => snails-chat/src/main/java/com/hanserwei/chat}/config/CorsConfig.java (95%) create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/config/RedisConfig.java create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/domain/dataobject/User.java create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/domain/mapper/UserMapper.java create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/service/UserService.java create mode 100644 snails-chat/src/main/java/com/hanserwei/chat/service/impl/UserServiceImpl.java rename {src/main/java/com/hanserwei/snailsai => snails-chat/src/main/java/com/hanserwei/chat}/utils/EncryptorUtil.java (89%) rename {src => snails-chat/src}/main/resources/config/application.yml (72%) rename {src => snails-chat/src}/main/resources/config/banner.txt (100%) create mode 100644 snails-chat/src/main/resources/mapperxml/UserMapper.xml delete mode 100644 src/main/java/com/hanserwei/snailsai/SnailsAiApplication.java delete mode 100644 src/main/java/com/hanserwei/snailsai/config/RedisConfig.java delete mode 100644 src/main/java/com/hanserwei/snailsai/controller/DashScopeController.java delete mode 100644 src/main/java/com/hanserwei/snailsai/controller/TestDataController.java delete mode 100644 src/main/java/com/hanserwei/snailsai/dto/ChatMessageDTO.java delete mode 100644 src/main/java/com/hanserwei/snailsai/entity/UserEntity.java delete mode 100644 src/main/java/com/hanserwei/snailsai/model/AIResponse.java delete mode 100644 src/main/java/com/hanserwei/snailsai/repository/UserRepository.java delete mode 100644 src/main/java/com/hanserwei/snailsai/service/UserService.java delete mode 100644 src/main/java/com/hanserwei/snailsai/tools/QueryTool.java delete mode 100644 src/test/java/com/hanserwei/snailsai/SnailsAiApplicationTests.java diff --git a/pom.xml b/pom.xml index 7db8d2d..b08430d 100644 --- a/pom.xml +++ b/pom.xml @@ -6,23 +6,33 @@ org.springframework.boot spring-boot-starter-parent 3.5.6 - + com.hanserwei snails-ai 0.0.1-SNAPSHOT + pom snails-ai snails-ai + + + + snails-chat + + + 21 1.0.3 + 3.0.5 + + org.springframework.boot spring-boot-starter-web - org.projectlombok lombok @@ -33,19 +43,10 @@ spring-boot-starter-test test - - org.springframework.boot - spring-boot-starter-data-jpa - org.springframework.boot spring-boot-starter-webflux - - com.mysql - mysql-connector-j - runtime - com.alibaba.cloud.ai @@ -55,7 +56,7 @@ com.github.ulisesbocchio jasypt-spring-boot-starter - 3.0.5 + ${jasypt-starter-version} com.alibaba.cloud.ai @@ -65,6 +66,19 @@ org.springframework.boot spring-boot-starter-data-redis + + org.postgresql + postgresql + runtime + + + com.baomidou + mybatis-plus-spring-boot3-starter + + + com.baomidou + mybatis-plus-jsqlparser + @@ -83,6 +97,13 @@ pom import + + com.baomidou + mybatis-plus-bom + 3.5.14 + pom + import + diff --git a/snails-chat/pom.xml b/snails-chat/pom.xml new file mode 100644 index 0000000..9d351e0 --- /dev/null +++ b/snails-chat/pom.xml @@ -0,0 +1,28 @@ + + 4.0.0 + + com.hanserwei + snails-ai + 0.0.1-SNAPSHOT + + + com.hanserwei.chat + snails-chat + jar + + snails-chat + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + diff --git a/snails-chat/src/main/java/com/hanserwei/chat/SnailsChatApplication.java b/snails-chat/src/main/java/com/hanserwei/chat/SnailsChatApplication.java new file mode 100644 index 0000000..62aa05c --- /dev/null +++ b/snails-chat/src/main/java/com/hanserwei/chat/SnailsChatApplication.java @@ -0,0 +1,13 @@ +package com.hanserwei.chat; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan("com.hanserwei.chat.domain.mapper") +public class SnailsChatApplication { + public static void main(String[] args) { + SpringApplication.run(SnailsChatApplication.class, args); + } +} diff --git a/src/main/java/com/hanserwei/snailsai/config/ChatClientConfiguration.java b/snails-chat/src/main/java/com/hanserwei/chat/config/ChatClientConfiguration.java similarity index 92% rename from src/main/java/com/hanserwei/snailsai/config/ChatClientConfiguration.java rename to snails-chat/src/main/java/com/hanserwei/chat/config/ChatClientConfiguration.java index 3493856..ca0d99f 100644 --- a/src/main/java/com/hanserwei/snailsai/config/ChatClientConfiguration.java +++ b/snails-chat/src/main/java/com/hanserwei/chat/config/ChatClientConfiguration.java @@ -1,9 +1,8 @@ -package com.hanserwei.snailsai.config; +package com.hanserwei.chat.config; import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel; import com.alibaba.cloud.ai.memory.redis.BaseRedisChatMemoryRepository; import com.alibaba.cloud.ai.memory.redis.LettuceRedisChatMemoryRepository; -import com.hanserwei.snailsai.tools.QueryTool; import jakarta.annotation.Resource; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor; @@ -29,8 +28,6 @@ public class ChatClientConfiguration { @Resource private DashScopeChatModel dashScopeChatModel; - @Resource - private QueryTool queryTool; @Bean public BaseRedisChatMemoryRepository redisChatMemoryRepository() { @@ -54,7 +51,6 @@ public class ChatClientConfiguration { @Bean public ChatClient dashScopeChatClient(ChatMemory chatMemory) { return ChatClient.builder(dashScopeChatModel) - .defaultTools(queryTool) .defaultAdvisors(PromptChatMemoryAdvisor.builder(chatMemory).build(), new SimpleLoggerAdvisor()) .build(); } diff --git a/src/main/java/com/hanserwei/snailsai/config/CorsConfig.java b/snails-chat/src/main/java/com/hanserwei/chat/config/CorsConfig.java similarity index 95% rename from src/main/java/com/hanserwei/snailsai/config/CorsConfig.java rename to snails-chat/src/main/java/com/hanserwei/chat/config/CorsConfig.java index ec9e2e7..ff850ce 100644 --- a/src/main/java/com/hanserwei/snailsai/config/CorsConfig.java +++ b/snails-chat/src/main/java/com/hanserwei/chat/config/CorsConfig.java @@ -1,4 +1,4 @@ -package com.hanserwei.snailsai.config; +package com.hanserwei.chat.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; diff --git a/snails-chat/src/main/java/com/hanserwei/chat/config/RedisConfig.java b/snails-chat/src/main/java/com/hanserwei/chat/config/RedisConfig.java new file mode 100644 index 0000000..5af31dc --- /dev/null +++ b/snails-chat/src/main/java/com/hanserwei/chat/config/RedisConfig.java @@ -0,0 +1,30 @@ +package com.hanserwei.chat.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + // 设置 RedisTemplate 的连接工厂 + redisTemplate.setConnectionFactory(connectionFactory); + + // 使用 StringRedisSerializer 来序列化和反序列化 redis 的 key 值,确保 key 是可读的字符串 + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + + // 使用 Jackson2JsonRedisSerializer 来序列化和反序列化 redis 的 value 值, 确保存储的是 JSON 格式 + Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class); + redisTemplate.setValueSerializer(serializer); + redisTemplate.setHashValueSerializer(serializer); + + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } +} diff --git a/snails-chat/src/main/java/com/hanserwei/chat/domain/dataobject/User.java b/snails-chat/src/main/java/com/hanserwei/chat/domain/dataobject/User.java new file mode 100644 index 0000000..6ca919a --- /dev/null +++ b/snails-chat/src/main/java/com/hanserwei/chat/domain/dataobject/User.java @@ -0,0 +1,37 @@ +package com.hanserwei.chat.domain.dataobject; + +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 lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "t_user") +public class User { + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @TableField(value = "\"name\"") + private String name; + + @TableField(value = "email") + private String email; + + @TableField(value = "age") + private Integer age; + + @TableField(value = "created_at") + private LocalDateTime createdAt; + + @TableField(value = "is_active") + private Boolean isActive; +} \ No newline at end of file diff --git a/snails-chat/src/main/java/com/hanserwei/chat/domain/mapper/UserMapper.java b/snails-chat/src/main/java/com/hanserwei/chat/domain/mapper/UserMapper.java new file mode 100644 index 0000000..cd3ae14 --- /dev/null +++ b/snails-chat/src/main/java/com/hanserwei/chat/domain/mapper/UserMapper.java @@ -0,0 +1,9 @@ +package com.hanserwei.chat.domain.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.hanserwei.chat.domain.dataobject.User; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserMapper extends BaseMapper { +} \ No newline at end of file diff --git a/snails-chat/src/main/java/com/hanserwei/chat/service/UserService.java b/snails-chat/src/main/java/com/hanserwei/chat/service/UserService.java new file mode 100644 index 0000000..f14a7da --- /dev/null +++ b/snails-chat/src/main/java/com/hanserwei/chat/service/UserService.java @@ -0,0 +1,9 @@ +package com.hanserwei.chat.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.hanserwei.chat.domain.dataobject.User; + +public interface UserService extends IService { + + +} diff --git a/snails-chat/src/main/java/com/hanserwei/chat/service/impl/UserServiceImpl.java b/snails-chat/src/main/java/com/hanserwei/chat/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..3af0667 --- /dev/null +++ b/snails-chat/src/main/java/com/hanserwei/chat/service/impl/UserServiceImpl.java @@ -0,0 +1,12 @@ +package com.hanserwei.chat.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.hanserwei.chat.domain.dataobject.User; +import com.hanserwei.chat.domain.mapper.UserMapper; +import com.hanserwei.chat.service.UserService; +import org.springframework.stereotype.Service; + +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { + +} diff --git a/src/main/java/com/hanserwei/snailsai/utils/EncryptorUtil.java b/snails-chat/src/main/java/com/hanserwei/chat/utils/EncryptorUtil.java similarity index 89% rename from src/main/java/com/hanserwei/snailsai/utils/EncryptorUtil.java rename to snails-chat/src/main/java/com/hanserwei/chat/utils/EncryptorUtil.java index 0b89eb4..e160236 100644 --- a/src/main/java/com/hanserwei/snailsai/utils/EncryptorUtil.java +++ b/snails-chat/src/main/java/com/hanserwei/chat/utils/EncryptorUtil.java @@ -1,4 +1,4 @@ -package com.hanserwei.snailsai.utils; +package com.hanserwei.chat.utils; import org.jasypt.util.text.AES256TextEncryptor; diff --git a/src/main/resources/config/application.yml b/snails-chat/src/main/resources/config/application.yml similarity index 72% rename from src/main/resources/config/application.yml rename to snails-chat/src/main/resources/config/application.yml index cfcca7f..86c7b3e 100644 --- a/src/main/resources/config/application.yml +++ b/snails-chat/src/main/resources/config/application.yml @@ -9,14 +9,6 @@ spring: name: snails-ai banner: location: config/banner.txt - jpa: - hibernate: - ddl-auto: update - properties: - # 开启 SQL 语句格式化 (重点:让 SQL 易读) - hibernate.format_sql: true - # 开启 SQL 语法高亮 (重点:让 SQL 醒目) - hibernate.highlight_sql: true data: redis: host: localhost @@ -32,10 +24,10 @@ spring: min-idle: 10 time-between-eviction-runs: 10000 datasource: - driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/snails_ai?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&allowMultiQueries=true&useSSL=false&allowPublicKeyRetrieval=true - username: root - password: mysql + driver-class-name: org.postgresql.Driver + url: jdbc:postgresql://localhost:5432/postgres + username: postgres + password: postgressql # HikariCP 连接池配置 hikari: maximum-pool-size: 20 # 最大连接数设置为 20 @@ -55,9 +47,15 @@ spring: options: model: qwen-plus temperature: 0.5 +mybatis-plus: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl + global-config: + banner: false + mapper-locations: classpath*:/mapperxml/*.xml logging: level: - org.hibernate.SQL: debug # 隐藏掉 Hibernate 冗长的连接池 INFO 信息 org.hibernate.orm.connections.pooling: WARN org.springframework.ai.chat.client.advisor: DEBUG diff --git a/src/main/resources/config/banner.txt b/snails-chat/src/main/resources/config/banner.txt similarity index 100% rename from src/main/resources/config/banner.txt rename to snails-chat/src/main/resources/config/banner.txt diff --git a/snails-chat/src/main/resources/mapperxml/UserMapper.xml b/snails-chat/src/main/resources/mapperxml/UserMapper.xml new file mode 100644 index 0000000..b4e217e --- /dev/null +++ b/snails-chat/src/main/resources/mapperxml/UserMapper.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + id, "name", email, age, created_at, is_active + + \ No newline at end of file diff --git a/src/main/java/com/hanserwei/snailsai/SnailsAiApplication.java b/src/main/java/com/hanserwei/snailsai/SnailsAiApplication.java deleted file mode 100644 index e050bb5..0000000 --- a/src/main/java/com/hanserwei/snailsai/SnailsAiApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.hanserwei.snailsai; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class SnailsAiApplication { - - public static void main(String[] args) { - SpringApplication.run(SnailsAiApplication.class, args); - } - -} diff --git a/src/main/java/com/hanserwei/snailsai/config/RedisConfig.java b/src/main/java/com/hanserwei/snailsai/config/RedisConfig.java deleted file mode 100644 index b75f668..0000000 --- a/src/main/java/com/hanserwei/snailsai/config/RedisConfig.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.hanserwei.snailsai.config; - -import org.springframework.context.annotation.Configuration; - -@Configuration -public class RedisConfig { -} diff --git a/src/main/java/com/hanserwei/snailsai/controller/DashScopeController.java b/src/main/java/com/hanserwei/snailsai/controller/DashScopeController.java deleted file mode 100644 index 1c5df91..0000000 --- a/src/main/java/com/hanserwei/snailsai/controller/DashScopeController.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.hanserwei.snailsai.controller; - -import com.hanserwei.snailsai.model.AIResponse; -import com.hanserwei.snailsai.dto.ChatMessageDTO; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.chat.memory.ChatMemory; -import org.springframework.ai.chat.messages.UserMessage; -import org.springframework.ai.chat.model.Generation; -import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.*; -import reactor.core.publisher.Flux; - -@Slf4j -@RequestMapping("/dashscope") -@RestController -@CrossOrigin -public class DashScopeController { - - @Resource - private ChatClient dashScopeChatClient; - - @PostMapping(value = "/generateStream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) - public Flux generateStream(@RequestBody ChatMessageDTO chatMessageDTO) { - // 构建提示词 - Prompt prompt = new Prompt(new UserMessage(chatMessageDTO.getMessage())); - - // 流式输出 - return dashScopeChatClient.prompt(prompt) - .advisors(a -> a.param(ChatMemory.CONVERSATION_ID, chatMessageDTO.getConversionId())) - .stream() // 流式输出 - .chatResponse() - .mapNotNull(chatResponse -> { - Generation generation = chatResponse.getResult(); - String text = generation.getOutput().getText(); - return AIResponse.builder().v(text).build(); - }); - } -} diff --git a/src/main/java/com/hanserwei/snailsai/controller/TestDataController.java b/src/main/java/com/hanserwei/snailsai/controller/TestDataController.java deleted file mode 100644 index 47dd755..0000000 --- a/src/main/java/com/hanserwei/snailsai/controller/TestDataController.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.hanserwei.snailsai.controller; - -import com.hanserwei.snailsai.entity.UserEntity; -import com.hanserwei.snailsai.service.UserService; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RestController -public class TestDataController { - - private final UserService userService; - - public TestDataController(UserService userService) { - this.userService = userService; - } - - /** - * POST /api/test/generate-users?count=100 - * 插入假数据用于分页测试 - */ - @PostMapping("/api/test/generate-users") - public String generateTestData(@RequestParam(defaultValue = "100") int count) { - List insertedUsers = userService.insertDummyUsers(count); - return String.format("成功插入了 %d 条假数据!", insertedUsers.size()); - } -} \ No newline at end of file diff --git a/src/main/java/com/hanserwei/snailsai/dto/ChatMessageDTO.java b/src/main/java/com/hanserwei/snailsai/dto/ChatMessageDTO.java deleted file mode 100644 index 11b1cf8..0000000 --- a/src/main/java/com/hanserwei/snailsai/dto/ChatMessageDTO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.hanserwei.snailsai.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class ChatMessageDTO { - - private String message; - - private Long conversionId; -} diff --git a/src/main/java/com/hanserwei/snailsai/entity/UserEntity.java b/src/main/java/com/hanserwei/snailsai/entity/UserEntity.java deleted file mode 100644 index 247405f..0000000 --- a/src/main/java/com/hanserwei/snailsai/entity/UserEntity.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.hanserwei.snailsai.entity; - -import jakarta.persistence.*; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serial; -import java.io.Serializable; -import java.time.LocalDateTime; - - -@Entity -@Table( - name = "users", - uniqueConstraints = @UniqueConstraint( - name = "UQ_USER_NAME", - columnNames = {"user_name"} // 指定应用约束的列 - ) -) -@Data -@NoArgsConstructor -@AllArgsConstructor -public class UserEntity implements Serializable { - - @Serial - private static final long serialVersionUID = 812305521669146765L; - - // 1. 主键:自增ID - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id") - private Long id; - - // 2. 用户名:不能为空,长度限制 - @Column(name = "user_name", nullable = false, unique = true, length = 50) - private String username; - - // 3. 密码:加密存储,不能为空,长度需足够长 - @Column(name = "password", nullable = false, length = 100) - private String password; - - // 4. 逻辑外键 - @Column(name = "hobby_id") - private Long hobbyId; - - // 5. 补充审计字段 (推荐) - @Column(name = "create_time", nullable = false) - private LocalDateTime createTime; - - @Column(name = "update_time") - private LocalDateTime updateTime; - -} diff --git a/src/main/java/com/hanserwei/snailsai/model/AIResponse.java b/src/main/java/com/hanserwei/snailsai/model/AIResponse.java deleted file mode 100644 index 0114702..0000000 --- a/src/main/java/com/hanserwei/snailsai/model/AIResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.hanserwei.snailsai.model; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class AIResponse { - // 流式响应内容 - private String v; -} \ No newline at end of file diff --git a/src/main/java/com/hanserwei/snailsai/repository/UserRepository.java b/src/main/java/com/hanserwei/snailsai/repository/UserRepository.java deleted file mode 100644 index 7d83d2f..0000000 --- a/src/main/java/com/hanserwei/snailsai/repository/UserRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.hanserwei.snailsai.repository; - -import com.hanserwei.snailsai.entity.UserEntity; -import org.jetbrains.annotations.NotNull; -import org.springframework.ai.tool.annotation.Tool; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface UserRepository extends JpaRepository { - - @NotNull List findAll(); - - @NotNull List findAllByIdIn(List ids); - - @NotNull List findAllByUsernameContaining(String name); - - -} \ No newline at end of file diff --git a/src/main/java/com/hanserwei/snailsai/service/UserService.java b/src/main/java/com/hanserwei/snailsai/service/UserService.java deleted file mode 100644 index 44012da..0000000 --- a/src/main/java/com/hanserwei/snailsai/service/UserService.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.hanserwei.snailsai.service; - -import com.hanserwei.snailsai.entity.UserEntity; -import com.hanserwei.snailsai.repository.UserRepository; -import jakarta.transaction.Transactional; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@Service -public class UserService { - - private final UserRepository userRepository; - - // 构造器注入 - public UserService(UserRepository userRepository) { - this.userRepository = userRepository; - } - - /** - * 批量生成并插入指定数量的假用户数据 - * @param count 要插入的用户数量 - * @return 插入成功的用户列表 - */ - @Transactional // 确保整个批量操作在一个事务中完成 - public List insertDummyUsers(int count) { - if (count <= 0) { - return List.of(); // 返回空列表 - } - - List dummyUsers = new ArrayList<>(count); - LocalDateTime now = LocalDateTime.now(); - - // 确保用户名是唯一的 - // 我们可以先获取当前数据库中用户数量,作为生成唯一用户名的起始点 - long startId = userRepository.count(); - - for (int i = 1; i <= count; i++) { - - // 使用 startId + i 来保证生成的用户名在多次运行时尽可能不重复 - long userIndex = startId + i; - - // 注意:密码通常应该是加密后的,这里为了演示使用明文 - UserEntity user = new UserEntity( - null, // ID 设为 null,让 JPA 自动生成 - "testUser_" + userIndex, // 确保用户名唯一 - "123456", // 模拟一个加密后的密码,或者使用一个测试用的明文,例如 "password" - (long) (i % 3) + 1, // 随机分配一个 hobbyId (例如 1, 2, 3) - now.plusSeconds(i), // 模拟创建时间略微递增 - null // updateTime 初始为 null - ); - dummyUsers.add(user); - } - - // 使用 JpaRepository 的 saveAll 方法进行批量插入,效率比单个 save 要高 - return userRepository.saveAll(dummyUsers); - } - - public List findAll() { - return userRepository.findAll(); - } - - public List findAllByIdIn(List ids) { - return userRepository.findAllByIdIn(ids); - } - -} \ No newline at end of file diff --git a/src/main/java/com/hanserwei/snailsai/tools/QueryTool.java b/src/main/java/com/hanserwei/snailsai/tools/QueryTool.java deleted file mode 100644 index f52773a..0000000 --- a/src/main/java/com/hanserwei/snailsai/tools/QueryTool.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.hanserwei.snailsai.tools; - -import com.hanserwei.snailsai.entity.UserEntity; -import com.hanserwei.snailsai.service.UserService; -import jakarta.annotation.Resource; -import org.springframework.ai.tool.annotation.Tool; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Component -public class QueryTool { - - @Resource - private UserService userService; - - @Tool(name = "findAll", description = "查询所有用户") - public List findAll() { - return userService.findAll(); - } - - @Tool(name = "findAllByIdIn", description = "根据id列表查询用户") - public List findAllByIdIn(List ids) { - return userService.findAllByIdIn(ids); - } - -} diff --git a/src/test/java/com/hanserwei/snailsai/SnailsAiApplicationTests.java b/src/test/java/com/hanserwei/snailsai/SnailsAiApplicationTests.java deleted file mode 100644 index a778e39..0000000 --- a/src/test/java/com/hanserwei/snailsai/SnailsAiApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.hanserwei.snailsai; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class SnailsAiApplicationTests { - - @Test - void contextLoads() { - } - -}