当前位置: 首页 > news >正文

山东大学软件学院项目实训-创新实训-计科智伴(一)——个人博客(后端搭建)

本项目为山东大学软件学院创新项目实训团队项目,技术栈采用Spring Boot 3.4.3+PostgreSQL(pgvector)+Neo4j+MinIO+Redis混合存储架构,前端为微信小程序。

一、工作概览

本周我主要完成了以下工作:

模块

工作内容

数据库设计

完成14张PostgreSQL核心业务表的DDL设计,集成pgvector向量扩展

后端框架

Spring Boot 3.4.3 + MyBatis Plus 3.5.10.1 + JPA混合ORM,自定义VectorTypeHandler

服务配置

Docker Compose一键部署PostgreSQL(pgvector)、Redis、MinIO

接口开发

用户模块完整CRUD + AI对话流式接口,对接前端小程序

产出:14张表设计文档 + 完整DDL脚本 + 12个实体类 + 12个Mapper + 12个Service + AI ChatClient配置 + 项目已推送至Gitee仓库。

二、数据库设计:混合存储架构

2.1 选型思路

本项目采用混合存储架构,根据不同数据特征选择合适的数据库:

数据库

用途

核心场景

PostgreSQL + pgvector

业务数据 + 向量检索

用户、课程、题库、RAG

Neo4j

知识图谱

知识点关联、错题诊断

MinIO

多模态文件存储

视频、PPT、图片

Redis

热点数据缓存

学习计划、会话状态

2.2 表结构设计

完成14张 PostgreSQL 业务表的设计,涵盖用户、课程、习题、学习记录等核心业务。重点说明几个关键设计:

(1)用户学情画像表(user_profile):采用 JSONB 字段存储知识点掌握度、学习偏好等非结构化数据,便于后续 AI Agent 读取。

(2)四级内容结构:课程(course)→ 章节(chapter)→ 知识点(knowledge_point)→ 习题(question),完整支持知识点定位。

(3)pgvector 向量扩展:vector_embedding 表使用 vector(1024) 类型存储教材切片向量(实际使用阿里云 text-embedding-v3 模型,输出 1024 维),支持语义检索。向量表与 learning_resource 关联,确保题干、教材、图片 OCR 等资源均可被统一索引。

2.3 建表脚本与自动迁移

采用Flyway管理数据库版本。建表 SQL 脚本位于 src/main/resources/db/migration/V1__initial_schema.sql,包含所有表的 CREATE TABLE 语句、主外键约束、索引及注释。Spring Boot 启动时自动执行,确保团队成员数据库结构一致。

三、后端框架搭建

3.1 技术栈选型

技术

版本

用途

Spring Boot

3.4.3

主框架

MyBatis Plus

3.5.10.1

ORM,简化数据库操作

Spring AI

1.0.0-M6

AI集成(Ollama + 阿里云通义)

PostgreSQL

16

关系数据库

pgvector

内置

向量检索扩展

MinIO

8.5.11

对象存储

Redis

7-alpine

缓存 + 会话存储

Flyway

9.x

数据库版本迁移

3.2 项目初始化

  • Spring Boot 项目通过Spring Initializr初始化,选择Spring Boot 3.4.3。
  • 包结构:controller/ service/ mapper/ entity/ config/ handler/ utils/ memory/ tools/
  • 核心依赖包含 Spring Boot Starter Web、MyBatis Plus、PostgreSQL Driver、Lombok、MinIO Client、Spring AI(Ollama + OpenAI 兼容)、Flyway。

3.3 MyBatis Plus配置

配置位于 application.yml,开启驼峰映射并输出 SQL 日志。

3.4 pgvector 类型处理器

pgvector 使用自定义 VectorTypeHandler 实现 Java float[] 与 PostgreSQL vector 类型的转换,代码位于 handler/VectorTypeHandler.java。由于 Spring AI 官方已提供 spring-ai-pgvector-store-spring-boot-starter,但我们仍保留自定义处理器以保证灵活性。

3.5 AI 集成配置(Spring AI + 阿里云通义千问)

项目使用 Spring AI 1.0.0-M6,同时支持本地 Ollama(gemma3:4b)和阿里云通义千问(qwen-max-latest)。关键配置:

通过 CommonConfiguration 配置了多个 ChatClient Bean,分别用于不同场景,并集成了 PersistentChatMemory实现对话持久化。

3.6 流式对话接口

ChatController 提供 /ai/chat 接口,支持流式响应(Flux)、多模态文件上传(图片/音频)和会话记忆。前端传入 prompt、chatId、type 和可选的 files,后端通过 MessageChatMemoryAdvisor 自动管理对话历史,无需手动保存消息。

四、Docker 环境配置

为避免队友配置环境时出错,编写 docker-compose.yml 实现一键部署。

队友只需执行 docker-compose up -d,即可完成全部服务部署。

五、接口开发与前端对接

5.1 RESTful 接口设计

首日完成用户模块基础接口和 AI 对话接口,供前端小程序调用:

方法

路径

功能

POST

/api/users/register

用户注册

GET

/api/users/{id}

获取用户信息

PUT

/api/users/{id}

更新用户信息

POST

/ai/chat

流式 AI 对话(支持文件)

统一响应格式:Result 类定义 {ok: 1/0, msg: string},简洁明了。

5.2 Service 层设计

MyBatis Plus的 ServiceImpl 已内置 save()、getById()、list()、page() 等通用 CRUD 方法,无需重复编写。同时项目保留了 JPA 依赖用于部分复杂查询。

六、Git 协作与团队同步

项目代码已推送至 https://gitee.com/mlgasreil/eduagent,分支规范:

  • main:稳定主分支,通过 PR 合并
  • feature/*:功能分支,个人开发使用

团队成员协作流程:

  1. 克隆仓库:git clone https://gitee.com/mlgasreil/eduagent.git
  2. 启动 Docker 环境:docker-compose up -d
  3. 配置环境变量:OPENAI_API_KEY(阿里云 DashScope API Key)
  4. 运行 Spring Boot 应用(Flyway 自动建表)
  5. 开发完成后提交 PR 合并至 main

七、踩坑记录

7.1 pgAdmin 导出乱码

使用 pgAdmin 的 Backup 功能时,默认 Format 为 Custom,生成二进制文件。解决方法:改用命令行 pg_dump --schema-only 导出纯文本 SQL。

7.2 pgvector 类型转换

MyBatis Plus 默认不支持 PostgreSQL vector 类型,需自定义 VectorTypeHandler。参考官方文档实现 float[] 与 [0.1,0.2,...] 字符串的互转。

7.3 Spring AI 依赖版本兼容

Spring AI 1.0.0-M6 需要 Spring Boot 3.4.x 以上,且需显式声明 spring-ai-bom。同时注意排除冲突的 tomcat-embed-core 版本(pom.xml 中存在两个不同版本,已保留较新版)。

7.4 Git 推送 403 错误

首次推送时因 Gitee 要求使用个人访问令牌(Personal Access Token)而非密码,需在凭据管理器中更新。解决后成功推送。

http://www.jsqmd.com/news/668873/

相关文章:

  • 常识不是知识,而是推理操作系统:解密AGI底层常识架构的5层抽象模型与2个已被验证的轻量化嵌入方案
  • 第 4 篇 - Redis 数据类型总览:5 种核心类型
  • 10分钟掌握Fideo:跨平台直播录制终极指南
  • SpringBoot+Vue基于爬虫的在线新闻聚合平台源码+论文
  • MongoPlus 教程
  • 2026奇点智能技术大会核心洞察(AGI-VR协同架构白皮书首发)
  • 【2026奇点智能技术大会权威内参】:AGI人才争夺战已打响,HR必须掌握的5大精准匹配模型与实时评估框架
  • 如何同步SQL冗余字段信息_通过触发器实现自动反向填充
  • 从模糊到通透:CSS filter与backdrop-filter打造沉浸式视觉体验
  • 告别ThreadLocal!Spring WebFlux中如何用Reactor Context优雅传递用户Token?
  • 湖南华商文化商务有限公司官网介绍
  • 还在用简单 AI 对话?Spring AI 自定义工具 + MCP 协议直接打通外部服务!
  • SpringBoot+Vue编程语言学习辅导网站源码+论文
  • ImageMagick进阶玩法:结合Windows批处理,自动备份并生成网站缩略图与社交分享图
  • 打造简易Agent,深度解析LLM与工具的完美协作!
  • 深入AUTOSAR内存管理:拆解vLinkGen如何配置数据段的多阶段初始化(Early/One/HardReset)
  • async,future,packaged_task,promise
  • 从毛玻璃到沉浸式界面:探索CSS filter与backdrop-filter的进阶应用
  • 别再只会用‘w‘和‘r‘了!Matlab fopen函数权限参数全解析(含编码与字节序)
  • 项目实训博客2 刻画能力画像:动态用户与岗位画像建模
  • 怎样设计一块独特的牌匾?
  • 深度空间装饰回头客多
  • Notion 白屏故障排查:从客户端到浏览器的全方位修复指南
  • 手机无限重启怎么办
  • [MYSQL/K8s] 基于 Kubenetes 集群安装 MYSQL
  • 实战指南|3类高频软件漏洞,从识别到修复一步到位
  • 7岁、10岁、14岁开始学C++,收益与必要性有何不同?
  • Spring Boot 条件装配入门:一文搞懂 @ConditionalOnClass(附实战)
  • 2026年泰迪杯A完整题解方案-详细解题思路和论文+完整项目代码+全套资源
  • C语言之Redis源码阅读学习顺序