灵感笔记应用:开发架构详解
1. 我的灵感
核心功能点:语音输入、语音转文字、文字输入、多个笔记合并、笔记复制、笔记编辑、笔记删除、笔记导出为图片。
目标功能简述
“像微信、豆包那样按住说话 → 自动转为文字 → 自动整理成小册子(可回顾、可导出)”
1. 语音输入(按住说话)
- 前端实现:像微信那种“按住说话”,松开发送。
- 支持格式:语音文件(如 .mp3、.wav)
- 框架参考(前端):
- H5:使用 MediaRecorder 进行录音。
- App/小程序:使用系统 API 支持语音。
2. 语音转文字
- 使用语音识别 API:
- ✅ 腾讯云语音识别(准确度高,中文支持好)
- ✅ 阿里云智能语音交互
- ✅ 科大讯飞
- ✅ OpenAI Whisper(自部署可控,需 GPU)
3. 内容自动整理(小册子)
- 每次语音转成一段文字,可按时间或主题归类。
- 自动加时间戳、章节标题(如“2025 年 4 月 10 日:灵感记录”)。
- 支持手动编辑、修改文字。
4. 小册子展示和管理
- 展示方式:
- 时间线
- 按主题分类
- 编辑支持:
- 手动修改标题、内容
- 合并多段文字成一篇
5. 导出与分享
- 支持导出格式:
- PDF、小册子 H5 页面、Markdown
- 可一键分享到微信、朋友圈、邮箱等
前端(H5/小程序/APP):
- Vue3/Nuxt3(PC & 移动端兼容)
- 或 React Native / Flutter(做成 App)
- 使用 MediaRecorder / wx.getRecorderManager()(小程序)
后端:
- Node.js / Go + 云函数
- 接入语音转文字服务
- 存储文字内容,自动归类入“章节/小册子”
2. 我的笔记
注意:
在数据库中不设置外键约束,而是通过应用层的逻辑来维护表之间的关系,可以调整数据库表结构,去掉外键约束。这样做的好处是减少数据库之间的依赖,提升数据库的性能,但需要通过业务逻辑来确保数据的一致性。
1. 数据库表结构
1.1 用户表(users
)
用户表存储每个用户的基本信息,主要用于用户注册、登录等操作。
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT, -- 用户ID,自增长
username VARCHAR(255) NOT NULL, -- 用户名
email VARCHAR(255) NOT NULL UNIQUE, -- 用户邮箱,唯一
password_hash VARCHAR(255) NOT NULL, -- 密码的哈希值
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间
);
1.2 笔记表(notes
)
存储笔记的元数据,如标题、标签、创建时间、修改时间、可见性等。
sql
CREATE TABLE notes (
id INT PRIMARY KEY AUTO_INCREMENT, -- 笔记ID,自增长
user_id INT, -- 用户ID,外键关联到用户表
title VARCHAR(255) NOT NULL, -- 笔记标题
content TEXT, -- 笔记内容(可以是markdown)
category VARCHAR(255), -- 笔记分类
tags JSON, -- 标签(可以使用JSON数组存储)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 创建时间
modified_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 修改时间
directory VARCHAR(255), -- 笔记所属目录(文件夹名称)
visibility BOOLEAN DEFAULT FALSE -- 可见性(false:隐藏,true:公开)
-- FOREIGN KEY (user_id) REFERENCES users(id) -- 外键关联到用户表
);
1.3 目录表(directories
)
存储用户的目录结构,包括文件夹名称、父子关系等。
sql
CREATE TABLE directories (
id INT PRIMARY KEY AUTO_INCREMENT, -- 目录ID,自增长
user_id INT, -- 用户ID,外键关联到用户表
parent_id INT, -- 父目录ID,如果是顶级目录则为NULL
name VARCHAR(255) NOT NULL -- 目录名称
-- FOREIGN KEY (user_id) REFERENCES users(id), -- 外键关联到用户表
-- FOREIGN KEY (parent_id) REFERENCES directories(id) -- 外键关联到父目录表
);
1.4 笔记文件存储路径(服务器文件系统)
笔记的实际内容将存储在服务器的文件系统中,按照以下路径格式:
/user/<user_id>/<directory>/<note_id>.md
例如:
/user/01/work/1.md -- 用户01的工作目录下的笔记1.md文件
1.5 同步记录表(sync_records
)
用来记录笔记从本地缓存同步到云端的历史记录,可以帮助追踪同步状态。
sql
CREATE TABLE sync_records (
id INT PRIMARY KEY AUTO_INCREMENT, -- 同步记录ID,自增长
user_id INT, -- 用户ID,外键关联到用户表
note_id INT, -- 笔记ID,外键关联到笔记表
sync_status ENUM('pending', 'success', 'failed') DEFAULT 'pending', -- 同步状态:pending(待同步)、success(同步成功)、failed(同步失败)
sync_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 同步时间
-- FOREIGN KEY (user_id) REFERENCES users(id),
-- FOREIGN KEY (note_id) REFERENCES notes(id)
);
2. API 接口设计
2.1 用户相关接口
用户注册
POST /api/users/register
- 请求体:json
{ "username": "user1", "email": "user1@example.com", "password": "securepassword" }
用户登录
POST /api/users/login
- 请求体:json
{ "email": "user1@example.com", "password": "securepassword" }
获取用户信息
GET /api/users/me
- 响应:json
{ "id": 1, "username": "user1", "email": "user1@example.com" }
2.2 笔记相关接口
创建笔记
POST /api/notes
- 请求体:json
{ "title": "笔记标题", "content": "# 这是笔记的内容", "category": "工作", "tags": ["tag1", "tag2"], "directory": "工作", "visibility": false // 默认是隐藏的 }
获取笔记列表(公开笔记)
GET /api/notes?visibility=true
- 响应:json
{ "notes": [ { "id": 1, "title": "公开笔记1", "content": "# 笔记内容", "visibility": true }, { "id": 2, "title": "公开笔记2", "content": "# 笔记内容", "visibility": true } ] }
获取某个用户的所有笔记(包括隐藏笔记)
GET /api/notes/user/:user_id
- 响应:json
{ "notes": [ { "id": 1, "title": "笔记1", "visibility": true }, { "id": 2, "title": "笔记2", "visibility": false } ] }
更新笔记(包括公开/隐藏状态)
PUT /api/notes/:note_id
- 请求体:json
{ "title": "更新后的笔记标题", "content": "# 更新后的内容", "category": "学习", "tags": ["tag3", "tag4"], "visibility": true // 设置为公开 }
删除笔记
DELETE /api/notes/:note_id
- 响应:json
{ "success": true, "message": "笔记已删除" }
2.3 目录相关接口
创建目录
POST /api/directories
- 请求体:json
{ "name": "工作目录", "parent_id": null // 顶级目录 }
获取用户目录列表
GET /api/directories?user_id=1
- 响应:json
{ "directories": [ { "id": 1, "name": "工作" }, { "id": 2, "name": "学习" } ] }
更新目录
PUT /api/directories/:directory_id
- 请求体:json
{ "name": "更新后的目录名称", "parent_id": 1 // 设定父目录 }
删除目录
DELETE /api/directories/:directory_id
- 响应:json
{ "success": true, "message": "目录已删除" }
2.4 同步相关接口
同步本地笔记到云端
POST /api/sync/notes
- 请求体:json
{ "note_id": 1, "content": "# 笔记的内容", "visibility": true }
获取同步记录
GET /api/sync/records
- 响应:json
{ "sync_records": [ { "note_id": 1, "sync_status": "success", "sync_time": "2025-04-21T12:00:00Z" }, { "note_id": 2, "sync_status": "failed", "sync_time": "2025-04-21T12:10:00Z" } ] }
总结
- 数据库表:包括用户表、笔记表、目录表和同步记录表。
- API 接口:涵盖了用户管理、笔记管理、目录管理、同步记录等各类接口。