山东大学软件学院项目实训-创新实训-计科智伴(一)——个人博客(后端搭建)
本项目为山东大学软件学院创新项目实训团队项目,技术栈采用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/*:功能分支,个人开发使用
团队成员协作流程:
- 克隆仓库:git clone https://gitee.com/mlgasreil/eduagent.git
- 启动 Docker 环境:docker-compose up -d
- 配置环境变量:OPENAI_API_KEY(阿里云 DashScope API Key)
- 运行 Spring Boot 应用(Flyway 自动建表)
- 开发完成后提交 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)而非密码,需在凭据管理器中更新。解决后成功推送。
