# SmartNotboot **Repository Path**: husb/smart-notboot ## Basic Information - **Project Name**: SmartNotboot - **Description**: 这是是一款 AI 驱动的智能笔记系统 -个人知识库,通过将人工智能技术与传统笔记管理相结合,帮助用户更高效地组织和利用个人知识资产。 - **Primary Language**: Unknown - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-04-01 - **Last Updated**: 2026-04-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SmartNotbook - AI 驱动的个人知识库系统
![Java](https://img.shields.io/badge/Java-21-blue) ![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.5.11-brightgreen) ![Vue](https://img.shields.io/badge/Vue-3.3.4-green) ![Spring AI](https://img.shields.io/badge/Spring%20AI-1.1.2-purple) ![PostgreSQL](https://img.shields.io/badge/PostgreSQL-15+-blue) ![License](https://img.shields.io/badge/License-MIT-yellow) ![Redis](https://img.shields.io/badge/Redis-5.0.14-blue) **一个智能化的个人知识管理平台,让 AI 成为你的第二大脑** [功能特性](#-功能特性) • [技术栈](#-技术栈) • [快速开始](#-快速开始) • [配置说明](#-配置说明) • [部署指南](#-部署指南)
--- ## 📖 项目简介 SmartNotbook(大家可以帮取个名字) 是一款**AI 驱动的智能笔记系统**(个人知识库),通过将人工智能技术与传统笔记管理相结合,帮助用户更高效地组织和利用个人知识资产。 ### 为什么创建这个项目? 最主要是大部分需要付费,不是说付费不好而是如果可以自己做一款部署在自己的服务器上想来也不错。 正好可以通过这个项目与AI合作进行并测试以下Claude,OpenCode,Trea,千问等AI在编程上的表现并且能够探索出一些使用经验,总结的经验也会顺带发布,(●'◡'●) 在知识爆炸的时代,我们每天都面临着大量的信息输入: - 📝 学习笔记、工作记录、会议纪需要整理 - 📄 PDF 文档、Word 文件、Excel 表格需要管理 - 💡 灵感想法、知识片段需要记录和关联 - 🔍 需要快速找到所需信息,而不是淹没在信息海洋中 传统的笔记软件存在以下痛点: 1. ❌ **检索效率低** - 只能关键词匹配,无法理解语义 2. ❌ **整理耗时** - 手动分类、打标签费时费力 3. ❌ **知识孤立** - 笔记之间缺乏关联,难以形成知识网络 4. ❌ **文件管理弱** - 对附件、图片等多媒体内容支持不足 5. ❌ **缺乏智能** - 无法自动摘要、提取关键信息 **NoteMind 的解决方案**: - ✅ **AI 智能助手** - 自动摘要、关键词提取、智能推荐 - ✅ **语义检索** - 基于向量相似度,理解你的搜索意图 - ✅ **知识图谱** - 可视化展示笔记间的关联关系 - ✅ **文件智能管理** - 支持多种格式文件的 AI 分析 - ✅ **智能对话** - 基于你的个人知识库进行问答 --- ## ✨ 功能特性 ### 核心功能 | 功能模块 | 说明 | |---------|------| | 📝 **笔记管理** | 支持富文本编辑、Markdown、图片上传、分类标签 | | 📁 **文件管理** | 支持多种格式文件上传、预览、AI 分析 | | 🤖 **AI 聊天** | 智能对话、流式响应、会话管理、知识库访问 | | 🧠 **知识图谱** | 可视化展示笔记关联关系,发现知识网络 | | 🔍 **智能搜索** | 全文搜索 + 向量语义搜索,精准定位信息 | | 🔐 **安全认证** | JWT Token 认证、权限控制、数据隔离 | | ⚙️ **用户设置** | 个性化配置、主题切换、AI 模型配置 | ### AI 核心能力 1. **智能对话** - 支持多种 AI 供应商(Ollama、OpenAI、DeepSeek 等) - 流式响应,实时显示 AI 回复 - 支持上下文记忆,连续对话 - 可访问个人知识库进行问答 2. **内容分析** - 自动摘要生成 - 关键词提取 - 智能标签推荐 - 文件内容理解 3. **向量检索** - 文本向量化 - 语义相似度搜索 - RAG(检索增强生成) - 知识库智能检索 4. **知识图谱** - 待更新 --- ## 🛠️ 技术栈 ### 后端技术 | 技术 | 版本 | 用途 | |------|------|------| | **Java** | 21 | 运行环境 | | **Spring Boot** | 3.5.11 | 基础框架 | | **Spring AI** | 1.1.2 | AI 框架核心 | | **Spring Security** | 6.x | 安全认证 | | **Spring Data JPA** | - | 数据访问 | | **Spring Data Redis** | - | 缓存/会话 | | **Spring Data Elasticsearch** | 8.x | 全文搜索 | | **PostgreSQL** | 15+ | 主数据库 | | **Redis** | 7.x | 缓存/Token 存储 | | **Elasticsearch** | 8.x | 全文检索 | | **MinIO** | 8.5.9 | 对象存储(开发用) | | **JWT** | 0.12.5 | Token 认证 | ### 前端技术 | 技术 | 版本 | 用途 | |------|------|------| | **Vue** | 3.3.4 | 基础框架 | | **Vite** | 4.5.0 | 构建工具 | | **Pinia** | 2.1.7 | 状态管理 | | **Vue Router** | 4.2.5 | 路由管理 | | **Element Plus** | 2.3.14 | UI 组件库 | | **Axios** | 1.5.0 | HTTP 客户端 | | **TipTap** | 3.20.0 | 富文本编辑器 | | **Marked** | 9.1.2 | Markdown 渲染 | | **ECharts** | 5.4.3 | 图表可视化 | | **Highlight.js** | 11.8.0 | 代码高亮 | ### AI 供应商支持 | 供应商 | 模型系列 | 状态 | |--------------|----------|------| | **Ollama** | Llama3, Qwen, Gemma | ✅ 已集成 | | **DeepSeek** | DeepSeek-R1, V3 | ⚠️ 可选 | | **MiniMax** | MiniMax 系列 | ⚠️ 可选 | | **其他** | 更多供应商持续集成中 | 🔄 规划中 | --- ## 🚀 快速开始 ### 环境要求 在开始之前,请确保你的系统满足以下要求: #### 必需软件 | 软件 | 版本 | 用途 | 下载链接 | |------|------|------|----------| | **JDK** | 21+ | Java 运行环境 | [Oracle JDK](https://www.oracle.com/java/technologies/downloads/) | | **Node.js** | 18+ | 前端运行环境 | [Node.js](https://nodejs.org/) | | **PostgreSQL** | 15+ | 数据库 | [PostgreSQL](https://www.postgresql.org/download/) | | **Redis** | 7.x | 缓存 | [Redis](https://redis.io/download/) | | **Ollama** | latest | 本地 AI 模型 | [Ollama](https://ollama.ai/) | #### 可选软件 | 软件 | 版本 | 用途 | |------|------|------| | **MinIO** | latest | 对象存储(开发环境用,生产环境可用阿里云 OSS) | ### 安装步骤 #### 1. 克隆项目 ```bash git clone https://gitee.com/Luoyi_good/smart-notboot.git ``` #### 2. 数据库初始化 ```bash # 连接到 PostgreSQL psql -U postgres # 创建数据库 CREATE DATABASE smartnotebook; # 退出 \q # 执行初始化脚本 psql -U postgres -d smartnotebook -f sql/init.sql ``` #### 3. 安装 Ollama 和 AI 模型 ```bash # 安装 Ollama(Windows) # 访问 https://ollama.ai 下载安装包 # 拉取模型 ollama pull gemma3:4b # 对话模型 ollama pull qwen3-embedding:4b # 向量化模型(RAG) # 验证模型 ollama list ``` #### 4. 启动 Redis ```bash # Windows(使用 Redis 安装包) redis-server # Linux/Mac redis-server --daemonize yes # 验证 redis-cli ping # 应返回 PONG ``` ``` #### 5. 配置后端 编辑 `src/main/resources/application.yml` 或使用环境变量: ```yaml spring: datasource: url: jdbc:postgresql://localhost:5432/smartnotebook username: postgres password: your_password # 修改为你的数据库密码 data: redis: host: localhost port: 6379 ai: ollama: base-url: http://localhost:11434 chat: model: gemma3:4b embedding: model: qwen3-embedding:4b ``` #### 6. 启动后端 ```bash # 使用 Maven cd notemind mvn spring-boot:run # 或者打包后运行 mvn clean package java -jar target/smart-notebook-1.0.0.jar ``` 后端将在 `http://localhost:8080` 启动 #### 7. 配置并启动前端 ```bash # 进入前端目录 cd frontend # 安装依赖 npm install # 配置 API 地址(可选,默认 http://localhost:8080) # 编辑 vite.config.js 或创建 .env 文件 # 启动开发服务器 npm run dev # 构建生产版本 npm run build ``` 前端将在 `http://localhost:5173` 启动 #### 9. 访问系统 打开浏览器访问:`http://localhost:5173` **默认账号**(需要注册): - 访问 `/register` 注册新账号 - 使用注册的账号登录 --- ## 运行图片 ### 登录页 ![登录页.png](photo/%E7%99%BB%E5%BD%95%E9%A1%B5.png) ### 笔记主页 支持笔记分类 ![笔记首页.png](photo/%E7%AC%94%E8%AE%B0%E9%A6%96%E9%A1%B5.png) ### 笔记编辑页 支持AI分析笔记功能,AI聊天; 笔记分享功能(暂不支持) ![笔记编辑.png](photo/%E7%AC%94%E8%AE%B0%E7%BC%96%E8%BE%91.png) ### 文件管理 上传文件AI自动异步生成摘要(暂不支持图片生成摘要,需要视觉模型接入) 支持文件打标签分类,文件预览,文件下载等功能; 文件编辑(暂不支持) ![文件管理.png](photo/%E6%96%87%E4%BB%B6%E7%AE%A1%E7%90%86.png) ### 笔记分类管理 和 文件标签管理 ![分类和标签管理.png](photo/%E5%88%86%E7%B1%BB%E5%92%8C%E6%A0%87%E7%AD%BE%E7%AE%A1%E7%90%86.png) ### AI聊天 可开启知识库搜索,笔记库单独搜索和文件库单独搜索 ![AI聊天.png](photo/AI%E8%81%8A%E5%A4%A9.png) ### 主题切换 快捷主题切换,无惧白天黑夜 ![主题切换.png](photo/%E4%B8%BB%E9%A2%98%E5%88%87%E6%8D%A2.png) ### AI模型配置 模型自由配置,即时切换 *API安全保护* 可自行增加其他安全措施 | 安全措施 | 说明 | |----------------|----| | 🔐 密码派生密钥 | 用户密码通过 SHA-256 派生,不存储明文| | 🔒 AES-256-GCM | 工业级加密,GCM 模式提供完整性验证| | ⏱️ 密钥缓存过期 | Redis 缓存 24 小时,过期需重新验证| | 🚪 登出清除 | 用户登出时立即删除密钥缓存| | 📝 日志脱敏 | 所有日志不打印 API Key 明文| | 💾 密文存储 | 数据库只存储加密后的密文 | | 🏷️ 字段重命名 | 字段名改为 encryptedApiKey 避免混淆| | 🔄 自动刷新 | 访问配置时自动刷新 Redis 过期时间 | | 👤 用户隔离 | 每个用户独立密钥,无法互相访问| ![AI模型配置.png](photo/AI%E6%A8%A1%E5%9E%8B%E9%85%8D%E7%BD%AE.png) --- ## ⚙️ 配置说明 ### 环境变量配置 推荐使用环境变量管理敏感配置: ```bash # 数据库配置 export DB_USERNAME=postgres export DB_PASSWORD=your_password # Redis 配置 export REDIS_HOST=localhost export REDIS_PORT=6379 export REDIS_PASSWORD= # Elasticsearch 配置 export ELASTICSEARCH_URI=http://localhost:9200 # JWT 配置 export JWT_SECRET=your_jwt_secret_key_min_32_characters export JWT_EXPIRATION=604800000 # 服务器端口 export SERVER_PORT=8080 ``` ### AI 模型配置 #### 使用 Ollama(本地部署) ```yaml spring: ai: ollama: base-url: http://localhost:11434 chat: model: gemma3:4b # 对话模型 embedding: model: qwen3-embedding:4b # 向量化模型 ``` **推荐模型组合**: - 对话:`gemma3:4b`、`qwen2.5:7b`、`llama3.2:3b` - 向量化:`qwen3-embedding:4b`、`mxbai-embed-large` #### 使用 OpenAI ```yaml spring: ai: openai: api-key: ${OPENAI_API_KEY} chat: options: model: gpt-4o embedding: options: model: text-embedding-3-small ``` #### 使用 DeepSeek ```yaml spring: ai: deepseek: api-key: ${DEEPSEEK_API_KEY} chat: options: model: deepseek-chat ``` ### 文件上传配置 ```yaml spring: servlet: multipart: enabled: true max-file-size: 100MB # 单个文件最大 100MB max-request-size: 100MB # 请求最大 100MB file: upload: local-path: D:/SmartNotbook/images # 本地存储路径 max-size: 5242880 # 5MB allowed-types: image/png,image/jpeg,image/gif,image/webp url-prefix: /api/images ``` ### OSS 对象存储配置(生产环境) ```yaml oss: endpoint: ${OSS_ENDPOINT:http://localhost:9000} # MinIO 或阿里云 OSS access-key: ${OSS_ACCESS_KEY:minioadmin} secret-key: ${OSS_SECRET_KEY:minioadmin} bucket: ${OSS_BUCKET:notemind} ``` ### 日志配置 ```yaml logging: level: root: INFO com.notemind: DEBUG # 开发环境可设为 DEBUG org.springframework.security: DEBUG pattern: console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n" ``` --- ## 📦 部署指南 ### 开发环境部署 使用 Docker Compose 快速搭建开发环境: ```yaml # docker-compose.yml version: '3.8' services: postgres: image: postgres:15 container_name: notemind-postgres environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: smartnotebook ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data redis: image: redis:7-alpine container_name: notemind-redis ports: - "6379:6379" volumes: - redis_data:/data elasticsearch: image: elasticsearch:8.11.0 container_name: notemind-elasticsearch environment: - discovery.type=single-node - xpack.security.enabled=false - "ES_JAVA_OPTS=-Xms512m -Xmx512m" ports: - "9200:9200" volumes: - es_data:/usr/share/elasticsearch/data minio: image: minio/minio container_name: notemind-minio environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin ports: - "9000:9000" - "9001:9001" volumes: - minio_data:/data command: server /data --console-address ":9001" volumes: postgres_data: redis_data: es_data: minio_data: ``` 启动服务: ```bash docker-compose up -d ``` ### 生产环境部署 #### 1. 后端打包 ```bash mvn clean package -DskipTests ``` #### 2. 前端构建 ```bash cd frontend npm run build ``` 将 `dist` 目录部署到 Nginx 或其他 Web 服务器。 #### 3. Nginx 配置示例 ```nginx server { listen 80; server_name your-domain.com; # 前端静态文件 location / { root /path/to/frontend/dist; try_files $uri $uri/ /index.html; } # 后端 API 代理 location /api/ { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 图片资源 location /api/images/ { proxy_pass http://localhost:8080; proxy_set_header Host $host; } } ``` #### 4. 使用 Systemd 管理后端服务 ```ini # /etc/systemd/system/notemind.service [Unit] Description=NoteMind Backend Service After=syslog.target network.target [Service] Type=simple User=notemind WorkingDirectory=/opt/notemind ExecStart=/usr/bin/java -jar smart-notebook-1.0.0.jar Restart=always RestartSec=10 Environment="DB_USERNAME=postgres" Environment="DB_PASSWORD=your_password" Environment="JWT_SECRET=your_jwt_secret" [Install] WantedBy=multi-user.target ``` 启动服务: ```bash sudo systemctl daemon-reload sudo systemctl enable notemind sudo systemctl start notemind sudo systemctl status notemind ``` --- ## 📚 项目结构 ``` notemind/ ├── docs/ # 📖 项目文档目录 │ ├── design/ # 设计文档 │ ├── guide/ # 使用指南 │ ├── implementation/ # 实现方案 │ ├── fix/ # 问题修复报告 │ └── test/ # 测试文档 ├── sql/ # 💾 数据库 SQL 脚本 │ ├── init.sql # 初始化脚本 │ ├── sqljieshi.sql # 表结构注释 │ └── migration/ # 迁移脚本 ├── src/ # 🔧 后端源代码 │ ├── main/java/com/notemind/ │ │ ├── modules/ # 业务模块 │ │ │ ├── note/ # 笔记模块 │ │ │ ├── file/ # 文件模块 │ │ │ ├── ai/ # AI 模块 │ │ │ ├── chat/ # 聊天模块 │ │ │ └── knowledge/ # 知识图谱模块 │ │ ├── config/ # 配置类 │ │ ├── common/ # 通用模块 │ │ └── security/ # 安全模块 │ └── main/resources/ │ └── application.yml # 配置文件 ├── frontend/ # 🎨 前端源代码 │ ├── src/ │ │ ├── views/ # 页面组件 │ │ ├── components/ # 公共组件 │ │ ├── api/ # API 接口 │ │ └── store/ # 状态管理 │ └── package.json ├── .gitignore # Git 忽略文件 ├── pom.xml # Maven 配置 └── README.md # 项目说明 ``` --- ## 🔑 关键技术:AI 交互 ### AI 交互架构 ``` ┌─────────────────────────────────────────────────────────┐ │ 前端 (Vue 3) │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ 聊天界面 │ │ 笔记编辑 │ │ 文件管理 │ │ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ │ │ │ │ │ └──────────────────┼──────────────────┘ │ │ │ │ └────────────────────────────┼──────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ 后端 (Spring Boot) │ │ ┌─────────────────────────────────────────────────────┐│ │ │ AI 服务抽象层 ││ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ││ │ │ │ Chat │ │Summary │ │Keywords │ ││ │ │ │ Service │ │ Service │ │ Service │ ││ │ │ └─────────┘ └─────────┘ └─────────┘ ││ │ └─────────────────────────────────────────────────────┘│ │ │ │ │ ┌─────────────┼─────────────┐ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Ollama │ │ OpenAI │ │ DeepSeek │ │ │ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────┘ ``` ### AI 核心功能实现 #### 1. 智能对话(流式响应) 使用 **SSE (Server-Sent Events)** 实现流式输出: ```java @PostMapping("/sessions/{id}/messages/stream") public Flux> streamChat( @PathVariable Long id, @RequestBody ChatRequest request ) { return chatService.streamChat(id, request) .map(content -> SseEmitter.event() .data(content, MediaType.TEXT_PLAIN)); } ``` 前端接收: ```javascript const eventSource = new EventSource(`/api/chat/sessions/${id}/messages/stream`, { headers: { 'Authorization': `Bearer ${token}` } }); eventSource.onmessage = (event) => { // 实时显示 AI 回复内容 aiResponse.value += event.data; }; ``` #### 2. 知识库检索(RAG) 检索增强生成流程: ``` 用户提问 ↓ 向量化查询文本 ↓ 向量数据库检索 Top-K 相关片段 ↓ 构建 Prompt(上下文 + 问题) ↓ LLM 生成答案 ↓ 返回结果 + 引用来源 ``` #### 3. 多供应商支持 通过 **Spring AI** 统一接口,支持多种 AI 供应商: ```java @Service public class AiService { @Autowired private ChatClient chatClient; // Spring AI 统一接口 public Flux chat(ChatRequest request) { return chatClient.prompt() .system(request.getSystemMessage()) .user(request.getMessage()) .stream() .content(); } } ``` --- ## 📊 数据库设计 ### 核心表结构 ``` sys_user (用户表) ├── note (笔记表) ├── note_category (分类表) ├── note_tag (标签表) ├── file (文件表) ├── chat_session (聊天会话) │ └── chat_message (聊天消息) ├── knowledge_node (知识节点) │ └── knowledge_edge (知识边) └── note_embedding (笔记向量) ``` 详细表结构请查看:[sql/README.md](sql/README.md) --- ## 🧪 测试 ### 后端测试 ```bash # 运行所有测试 mvn test # 运行特定测试类 mvn test -Dtest=AiServiceTest # 生成测试报告 mvn test jacoco:report ``` ### 前端测试 ```bash # 运行测试 npm run test # 运行测试并生成覆盖率报告 npm run test:coverage ``` --- ## 📝 常见问题 ### Q1: Ollama 模型下载慢? **解决方案**: ```bash # 使用国内镜像 export OLLAMA_MIRROR=https://ollama.aa.com.cn # 或者手动下载模型文件 # 访问 https://ollama.ai/library 下载 ``` ### Q2: 向量检索报错? **检查清单**: 1. ✅ 确认 Ollama 服务已启动:`ollama list` 2. ✅ 确认模型已下载:`ollama pull qwen3-embedding:4b` 3. ✅ 检查数据库连接 4. ✅ 查看日志:`logging.level.com.notemind=DEBUG` ### Q3: 文件上传失败? **解决方案**: 1. 检查 `file.upload.local-path` 目录是否存在 2. 检查文件大小限制配置 3. 检查文件类型白名单 4. 查看后端日志 ### Q4: AI 响应慢? **优化建议**: 1. 使用本地 Ollama 部署(低延迟) 2. 选择较小的模型(如 `gemma3:4b` 而非 `llama3:70b`) 3. 增加 GPU 支持(如有) 4. 调整温度参数降低随机性 --- ## 🤝 贡献指南 欢迎贡献代码、报告 Bug 或提出新功能建议! 1. Fork 本仓库 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 开启 Pull Request --- ## 📄 开源协议 本项目采用 LGPL-3.0 协议开源 - 查看 [LGPL-3.0](LGPL-3.0) 文件了解详情 --- ## 📞 联系方式 - 📧 Email: 19847534107@163.com - 💬 Issues: [GitHub Issues](https://github.com/your-repo/notemind/issues) - 📖 文档:[项目文档](docs/) --- ## 🙏 致谢 感谢以下开源项目: - [Spring Boot](https://spring.io/projects/spring-boot) - [Vue.js](https://vuejs.org/) - [Spring AI](https://spring.io/projects/spring-ai) - [Ollama](https://ollama.ai/) - [Element Plus](https://element-plus.org/) - [TipTap](https://tiptap.dev/) ---
**⭐ 如果这个项目对你有帮助,请给一个 Star 支持一下!⭐** Made with ❤️ by Luoyi