狗包 ai
注
项目地址:https://ai.wisdog.site
1 - 项目总览
一、项目介绍
基于 Spring Boot 3 + LangChain4j + Vue 3 开发
首页

功能展示
实时搜索

代码生成

用户管理(管理员)

对话管理(管理员)


技术选型
后端
核心:
- Spring Boot 3.x 框架
- Java 21 虚拟线程
- ⭐️ MyBatis Flex 数据访问
AI 技术:
⭐️ LangChain4j 框架
⭐️ LangGraph4j 工作流引擎
⭐️ Tool Calling 工具调用
⭐️ Guardrails 护轨
DeepSeek Chat/Reasoner 大模型
Open AI ChatModel 接入
数据存储:
- MySQL 数据库
- ⭐️ Redis 分布式缓存
- ⭐️ Caffeine 本地缓存
设计模式:
- ⭐️ 实战:门面模式、模板方法模式、策略模式、工厂模式、执行器模式
- 了解:适配器模式、代理模式、单例模式、观察者模式、建造者模式
工具库:
- ⭐️ setinel 流量保护
- jsoup 解析库
- Hutool 工具库
- Lombok 注解库
- Knife4j + Swagger 接口文档
前端
核心:
- Vue 3 + Composition API
- Ant Design Vue 组件库
- Markdown 渲染 + 代码高亮
- Pinia 全局状态管理
- Axios 请求库
⭐️ 工程化:
- Vite 构建工具
- TypeScript 类型安全
- ESLint 代码校验
- Prettier 代码美化
- OpenAPI 代码生成
工具
部署工具
- Nginx Web 服务器
开发工具
- JetBrains IDEA 后端
- JetBrains WebStorm 前端
2 - 项目初始化
一、后端项目初始化
该配置是基于 Spring Boot 3.5.7 构建的 ai-helper 项目(Java 21)的 Maven pom.xml 核心配置,整合了 Web 开发、ORM 框架、AI 能力(LangChain4j)、缓存、限流、数据库连接、接口文档、分布式会话等核心能力,以下是各依赖的详细说明:
核心基础依赖
- Spring Boot Web 核心依赖
功能:提供 Spring Boot Web 开发核心能力,包含嵌入式 Servlet 容器、MVC 框架、RESTful 接口支持等,是 Web 项目的基础。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>2. Lombok 简化代码依赖
功能:通过注解(如 @Data、@Slf4j)自动生成 getter/setter、构造方法、toString 等代码,减少重复编码。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<optional>true</optional>
</dependency>- Spring Boot 测试依赖
功能:提供单元测试、集成测试能力,整合 JUnit、Mockito 等框架,仅在 test 环境生效。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>- Hutool 全能工具类库
功能:集成字符串处理、日期操作、文件处理、加解密、反射等海量工具类,轻量化无侵入,减少重复工具代码。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.37</version>
</dependency>- Spring Boot AOP 依赖
功能:提供面向切面编程能力,支持切面、通知、切点等特性,可用于日志记录、权限控制、性能监控等场景。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>接口文档依赖
Knife4j 接口文档
功能:基于 OpenAPI 3.0 规范的可视化接口文档工具,适配 Jakarta 规范,支持接口调试、文档自动生成。
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>数据库相关依赖
- MySQL 驱动
功能:提供 MySQL 数据库 JDBC 驱动,用于项目连接 MySQL 数据库,仅运行时生效。
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>- MyBatis-Flex Spring Boot 3 启动器
功能:轻量高性能的 ORM 框架启动器,适配 Spring Boot 3,简化 MyBatis-Flex 集成配置。
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot3-starter</artifactId>
<version>1.11.0</version>
</dependency>- MyBatis-Flex 代码生成模块
功能:根据数据库表结构自动生成实体类、Mapper 等代码,提升开发效率。
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-codegen</artifactId>
<version>1.11.0</version>
</dependency>- HikariCP 数据库连接池
功能:Spring Boot 默认的高性能 JDBC 连接池,提供连接复用、管理能力,提升数据库操作性能。
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>AI 能力依赖(LangChain4j)
- LangChain4j 核心依赖
功能:Java 版大语言模型(LLM)应用开发框架,提供与各类大模型交互的核心能力。
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
<version>1.1.0</version>
</dependency>- LangChain4j OpenAI Spring Boot 启动器
功能:适配 Spring Boot 的 OpenAI 集成模块,简化与 OpenAI 大模型的交互配置。
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
<version>1.1.0-beta7</version>
</dependency>- LangChain4j Reactor 依赖
功能:为 LangChain4j 提供响应式编程(Reactor)支持,适配异步非阻塞场景。
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-reactor</artifactId>
<version>1.1.0-beta7</version>
</dependency>- LangChain4j Redis
功能:LangChain4j 社区版 Redis 集成,适配 Spring Boot,用于大模型相关的缓存、记忆存储。
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-community-redis-spring-boot-starter</artifactId>
<version>1.1.0-beta7</version>
</dependency>缓存与分布式会话依赖
- Caffeine 本地缓存
功能:高性能本地缓存库,性能优于 Guava Cache,支持多种缓存策略。
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>- Spring Session Redis
功能:整合 Spring Session 与 Redis,实现分布式会话管理,解决分布式系统会话共享问题。
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>流量治理依赖(Sentinel)
- Sentinel 核心库
功能:Alibaba Sentinel 流量治理组件核心库,提供限流、熔断、降级等流量控制能力,保障系统稳定性。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.6</version>
</dependency>- Sentinel 热点参数限流扩展
功能:Sentinel 热点参数限流必备扩展,支持 ParamFlowRule 实现热点参数精准限流。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-parameter-flow-control</artifactId>
<version>1.8.6</version>
</dependency>项目配置
spring:
application:
name: ai-helper
# redis
data:
redis:
host: localhost
port: 6379
password:
ttl: 3600
# session 配置
session:
store-type: redis
# session 30 天过期
timeout: 2592000
# mysql
profiles:
active: local
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ai_helper
username: root
password: 123456
server:
port: 8123
servlet:
context-path: /api
# cookie 30 天过期
session:
cookie:
max-age: 2592000
encoding:
charset: UTF-8
enabled: true
force: true
# springdoc-openapi
springdoc:
swagger-ui:
path: /swagger-ui.html
tags-sorter: alpha
operations-sorter: alpha
api-docs:
path: /v3/api-docs
group-configs:
- group: 'default'
paths-to-match: '/**'
packages-to-scan: com.ybs.aihelper.controller
# knife4j
knife4j:
enable: true
setting:
language: zh_cn
# ai
langchain4j:
open-ai:
chat-model:
base-url:
model-name:
api-key:
log-requests: true
log-responses: true
timeout: 900000
max-tokens: 32768
streaming-chat-model:
base-url:
api-key:
model-name:
max-tokens: 32768
timeout: 900000
log-requests: true
log-responses: true
temperature: 0.1通用基础代码
在common下创建
package com.ybs.aihelper.common;
import com.ybs.aihelper.exception.ErrorCode;
import lombok.Data;
import java.io.Serializable;
@Data
public class BaseResponse<T> implements Serializable {
private int code;
private T data;
private String message;
public BaseResponse(int code, T data, String message) {
this.code = code;
this.data = data;
this.message = message;
}
public BaseResponse(int code, T data) {
this(code, data, "");
}
public BaseResponse(ErrorCode errorCode) {
this(errorCode.getCode(), null, errorCode.getMessage());
}
}@Data
public class DeleteRequest implements Serializable {
/**
* id
*/
private Long id;
private static final long serialVersionUID = 1L;
}package com.ybs.aihelper.common;
import lombok.Data;
@Data
public class PageRequest {
/**
* 当前页号
*/
private int pageNum = 1;
/**
* 页面大小
*/
private int pageSize = 10;
/**
* 排序字段
*/
private String sortField;
/**
* 排序顺序(默认降序)
*/
private String sortOrder = "descend";
}package com.ybs.aihelper.common;
import com.ybs.aihelper.exception.ErrorCode;
public class ResultUtils {
/**
* 成功
*
* @param data 数据
* @param <T> 数据类型
* @return 响应
*/
public static <T> BaseResponse<T> success(T data) {
return new BaseResponse<>(0, data, "ok");
}
/**
* 失败
*
* @param errorCode 错误码
* @return 响应
*/
public static BaseResponse<?> error(ErrorCode errorCode) {
return new BaseResponse<>(errorCode);
}
/**
* 失败
*
* @param code 错误码
* @param message 错误信息
* @return 响应
*/
public static BaseResponse<?> error(int code, String message) {
return new BaseResponse<>(code, null, message);
}
/**
* 失败
*
* @param errorCode 错误码
* @return 响应
*/
public static BaseResponse<?> error(ErrorCode errorCode, String message) {
return new BaseResponse<>(errorCode.getCode(), null, message);
}
}在exception下创建
package com.ybs.aihelper.exception;
import lombok.Getter;
@Getter
public class BusinessException extends RuntimeException {
/**
* 错误码
*/
private final int code;
public BusinessException(int code, String message) {
super(message);
this.code = code;
}
public BusinessException(ErrorCode errorCode) {
super(errorCode.getMessage());
this.code = errorCode.getCode();
}
public BusinessException(ErrorCode errorCode, String message) {
super(message);
this.code = errorCode.getCode();
}
}package com.ybs.aihelper.exception;
import lombok.Getter;
@Getter
public enum ErrorCode {
SUCCESS(0, "ok"),
PARAMS_ERROR(40000, "请求参数错误"),
NOT_LOGIN_ERROR(40100, "未登录"),
NO_AUTH_ERROR(40101, "无权限"),
NOT_FOUND_ERROR(40400, "请求数据不存在"),
FORBIDDEN_ERROR(40300, "禁止访问"),
SYSTEM_ERROR(50000, "系统内部异常"),
OPERATION_ERROR(50001, "操作失败");
/**
* 状态码
*/
private final int code;
/**
* 信息
*/
private final String message;
ErrorCode(int code, String message) {
this.code = code;
this.message = message;
}
}package com.ybs.aihelper.exception;
import com.ybs.aihelper.common.BaseResponse;
import com.ybs.aihelper.common.ResultUtils;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Hidden
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public BaseResponse<?> businessExceptionHandler(BusinessException e) {
log.error("BusinessException", e);
return ResultUtils.error(e.getCode(), e.getMessage());
}
@ExceptionHandler(RuntimeException.class)
public BaseResponse<?> runtimeExceptionHandler(RuntimeException e) {
log.error("RuntimeException", e);
return ResultUtils.error(ErrorCode.SYSTEM_ERROR, "系统错误");
}
}package com.ybs.aihelper.exception;
public class ThrowUtils {
/**
* 条件成立则抛异常
*
* @param condition 条件
* @param runtimeException 异常
*/
public static void throwIf(boolean condition, RuntimeException runtimeException) {
if (condition) {
throw runtimeException;
}
}
/**
* 条件成立则抛异常
*
* @param condition 条件
* @param errorCode 错误码
*/
public static void throwIf(boolean condition, ErrorCode errorCode) {
throwIf(condition, new BusinessException(errorCode));
}
/**
* 条件成立则抛异常
*
* @param condition 条件
* @param errorCode 错误码
* @param message 错误信息
*/
public static void throwIf(boolean condition, ErrorCode errorCode, String message) {
throwIf(condition, new BusinessException(errorCode, message));
}
}