「用像素风格回忆你的一天,通过 AI 互动生成专属于你的“人生存档”故事日记。」
《今日存档》是一款源码公开的、高颜值像素风 AI 故事日记 Web 应用程序。它将经典的复古像素风(木纹与皮革质感、拍立得照片卡片、复古中文字体)与先进的大语言模型相结合。在这里,写日记不再是枯燥的单向记录,而是像玩游戏“存档”一样,在温暖的朋友(AI)引导下,通过轻松的对话或实时语音聊天,沉浸式地整理每日记忆,并最终汇编成一篇充满故事感的精美日记。
- 🎮 极致的像素美学 UI
- 精心调校的复古游戏色调,搭配精致的皮革书本外壳与拍立得照片卡片交互设计。
- 全局使用开源像素中文字体 Zpix,带给用户如同置身复古 RPG/模拟经营游戏般的“存档仪式感”。
- 📸 智能多模态记忆对话
- 内置 3 种极具故事感的预置像素主题:《星空营火》(
camping)、《窗前小橘》(cat)、《雨角咖啡》(coffee)。 - 支持用户上传个人独家记忆照片作为日记起点。
- AI 能够多模态解析载入的图片内容,自动生成第一条极具场景感和温情的 AI 开场引导语。
- 内置 3 种极具故事感的预置像素主题:《星空营火》(
- 🎙️ 腾讯云 WebSocket 实时语音转文字 (ASR)
- 集成腾讯云实时语音识别(ASR),支持直接通过麦克风输入语音进行聊天。
- 采用服务端动态签名 URL 机制,腾讯云敏感 Secret Key 始终保留在服务端,客户端零泄漏,安全可靠。
- ✍️ 智能日记生成与手动微调
- 聊天充分后一键汇编生成日记,AI 会将用户杂乱的叙述整合为行文流畅、充满画面感的精美日记。
- 支持日记重复生成(覆盖当前正文),后台保留完整生成历史与 Token 消耗统计。
- 内置手动修改功能,用户可直接对生成的日记进行编辑微调,该操作不消耗 AI 配额。
- 🛡️ 数据库结构自检查与自修复 (Schema Auto-migration)
- 基于 Node.js 脚本,项目启动前会自动读取并校验本地 PostgreSQL 的表结构、约束和索引(参照
docs/database-schema.md)。 - 缺失或失效 of 的结构会自动在启动时完成同步与修复,免去手动执行复杂 SQL 的麻烦,开箱即用。
- 基于 Node.js 脚本,项目启动前会自动读取并校验本地 PostgreSQL 的表结构、约束和索引(参照
- 🔒 安全与用量控制
- 采用手机号验证码登录机制,具备严格的发送防盗刷限流策略(手机号日限制、IP 日/时限制、单验证码校验上限)。
- 支持
HttpOnlyCookie 安全会话(Session)。 - 支持限制用户每日 AI 调用额度,防止接口被恶意刷取。
- 本地上传的文件(记忆照片)受到访问鉴权保护,杜绝跨用户水平越权。
- 前端框架:React 19 + Next.js 16 (App Router) + TypeScript
- 样式体系:Tailwind CSS 4 + Lucide React
- 数据库:PostgreSQL (使用原生
pg连接池) - 工具链:pnpm (包管理器) +
tsx(TypeScript 执行环境) + ESLint 9 - 外部服务集成:
- 大语言模型:兼容 OpenAI 协议的任何大模型 API (可使用 DeepSeek, GPT 等)
- 短信服务:腾讯云短信服务 (SMS)
- 语音识别:腾讯云实时语音识别 (ASR WebSocket)
├── docs/ # 核心文档 (包含数据库设计、接口协议、语音识别说明等)
├── public/ # 静态资源 (像素插画、字体文件、图标等)
├── scripts/ # 数据库同步检测脚本及启动中间件
├── src/
│ ├── app/ # Next.js App Router 页面与路由
│ │ ├── api/ # 后端 Route Handlers (API 接口)
│ │ ├── globals.css # 全局样式文件
│ │ ├── layout.tsx # 全局布局
│ │ └── page.tsx # 主页面 (交互主界面)
│ ├── components/ # 可复用像素风 UI 组件 (书本、日记本、聊天框、书架等)
│ ├── hooks/ # 客户端自定义 Hooks (如 useAudio.ts 录音组件)
│ ├── lib/ # 客户端工具方法与网络请求封装
│ └── server/ # 服务端业务逻辑集中管理层
│ ├── ai/ # AI 大模型接口调用与 Prompts 逻辑
│ ├── asr/ # 腾讯云 ASR 签名鉴权逻辑
│ ├── auth/ # 用户会话与短信登录态校验
│ ├── conversations/ # 创作记录与消息存取逻辑
│ ├── db/ # 数据库连接池与结构比对逻辑
│ ├── sms/ # 腾讯云短信发送与限流缓存管理
│ └── uploads/ # 本地图片上传、校验与防穿越读取
└── storage/ # 本地存储 (包含上传的照片、短信缓存文件等,已在 .gitignore 中忽略)
确保本地已安装 Node.js (推荐 v20+) 和 pnpm。
pnpm install复制 .env.example 文件为 .env.local:
- Linux / macOS / Git Bash:
cp .env.example .env.local
- Windows PowerShell:
Copy-Item .env.example .env.local
编辑 .env.local 并配置相应的密钥:
# 1. 数据库配置
DATABASE_URL=postgresql://用户名:密码@localhost:5432/tongnian
# 2. AI 接口配置 (兼容 OpenAI 格式,例如 DeepSeek)
OPENAI_BASE_URL=https://api.deepseek.com/v1
OPENAI_API_KEY=sk-your-openai-api-key
OPENAI_MODEL=deepseek-chat
DAILY_AI_REQUEST_LIMIT=30 # 每日最大 AI 请求次数限制
# 3. 登录 Session 加密密钥 (随机长字符串即可)
SESSION_SECRET=your-random-long-session-secret
# 4. 腾讯云短信配置 (用于发送登录验证码,本地预览模式下可不填真实密钥,见下文说明)
SMS_SECRET_ID=your-tencent-secret-id
SMS_SECRET_KEY=your-tencent-secret-key
SMS_SDK_APP_ID=your-sms-sdk-app-id
SMS_SIGN_NAME=your-sms-sign-name
SMS_TEMPLATE_ID=your-sms-template-id
# 5. 腾讯云实时语音识别配置 (用于语音输入)
ASR_APP_ID=your-asr-app-id
ASR_SECRET_ID=your-asr-secret-id
ASR_SECRET_KEY=your-asr-secret-key如果您在本地开发阶段,没有购买腾讯云短信服务,可以通过开启 短信预览模式 绕过真实发送:
- 将
.env.local中的SMS_PREVIEW_ENABLED设为True:SMS_PREVIEW_ENABLED=True - 发送验证码时,终端控制台将直接打印出发送日志和 6 位数验证码,同时本地文件
storage/cache/sms-state.json中也会记录当前短信状态。您只需要在登录框中输入终端打印的验证码即可成功登录。
运行开发模式。系统在启动 Next.js 之前,会自动检查并修复 PostgreSQL 的表结构状态,随后开启本地服务:
pnpm dev运行成功后,在浏览器中打开:http://localhost:3000。
| 命令 | 描述 |
|---|---|
pnpm dev |
启动本地开发服务,并在启动前自动校验/同步数据库 Schema |
pnpm build |
检查 TypeScript 类型并执行生产构建编译 |
pnpm start |
在生产环境下启动 Next.js 运行服务 |
pnpm db:check |
手动对比 docs/database-schema.md 与本地 PostgreSQL,自动修复不一致结构 |
pnpm lint |
运行 ESLint 静态代码检查 |
为了保证代码的可维护性与源码公开协作规范,请遵循以下规则:
- 代码风格
- 统一使用 2 个空格 缩进,使用 双引号 和 分号。
- React 组件文件命名使用 PascalCase(如
BookChat.tsx),自定义 Hooks 命名使用 camelCase 且以use开头(如useAudio.ts)。
- 安全与敏感信息
- 切勿将包含真实
DATABASE_URL、腾讯云密钥、AI API Key 等敏感信息的.env.local文件提交至 Git 仓库。 - 项目内置的
storage/文件夹已被.gitignore自动忽略,请勿强行提交任何本地上传的测试照片或短信缓存状态文件。
- 切勿将包含真实
- 提交规范
- 提倡使用简短清晰的中文 Commit 信息,并分类标明,例如:
功能:集成腾讯云实时语音识别或修复:优化书本翻页布局高度。
- 提倡使用简短清晰的中文 Commit 信息,并分类标明,例如:
本项目基于仓库根目录的 PolyForm Noncommercial License 1.0.0 进行源码公开授权,SPDX 标识为 PolyForm-Noncommercial-1.0.0。该许可证允许非商业学习、研究、运行、修改和分享,但不是 OSI 意义上的开源协议,因为它明确限制商业使用。
- 禁止擅自商用:未经版权持有人书面授权,严禁将本项目或任何修改版本用于商业目的,包括但不限于销售、收费服务、SaaS、客户项目交付、商业分发、商业内部系统、广告获客或其他营利性用途。
- 商用必须授权:如需商业部署、闭源二开、商业集成、客户交付、SaaS 服务或其他商业使用,请先联系版权持有人获取单独的商业授权。
- 必须署名并保留通知:如果您使用、修改、分发、发布、部署或向第三方提供本项目或其修改版本,请按
LICENSE顶部的Required Notice保留“今日存档 / SavePoint”署名、许可证链接和原仓库链接(在合理可行时)。 - 二开开源建议:PolyForm Noncommercial 允许非商业修改和创建衍生作品,但它本身不强制所有二开版本必须公开源码。为了社区协作,建议对外发布或部署的二开版本同步公开对应源码,并继续保留本许可证与署名通知。
- 私有非商用修改:仅在本地或私有环境中进行非商业学习、研究、测试且不向第三方提供服务的修改版本,可以不公开源码;但这不授予任何商业使用权。
第三方依赖、字体、图片、云服务 API 等可能拥有各自独立的许可证或服务条款,请在使用前自行确认并遵守。
如果这个项目对您有所启发或帮助,不妨为我们点上一颗 ⭐️!