Skip to content

Wanyi424/SavePoint

Repository files navigation

今日存档 (SavePoint) 🎮📖

「用像素风格回忆你的一天,通过 AI 互动生成专属于你的“人生存档”故事日记。」

《今日存档》是一款源码公开的、高颜值像素风 AI 故事日记 Web 应用程序。它将经典的复古像素风(木纹与皮革质感、拍立得照片卡片、复古中文字体)与先进的大语言模型相结合。在这里,写日记不再是枯燥的单向记录,而是像玩游戏“存档”一样,在温暖的朋友(AI)引导下,通过轻松的对话或实时语音聊天,沉浸式地整理每日记忆,并最终汇编成一篇充满故事感的精美日记。


✨ 核心功能亮点

  • 🎮 极致的像素美学 UI
    • 精心调校的复古游戏色调,搭配精致的皮革书本外壳与拍立得照片卡片交互设计。
    • 全局使用开源像素中文字体 Zpix,带给用户如同置身复古 RPG/模拟经营游戏般的“存档仪式感”。
  • 📸 智能多模态记忆对话
    • 内置 3 种极具故事感的预置像素主题:《星空营火》(camping)、《窗前小橘》(cat)、《雨角咖啡》(coffee)。
    • 支持用户上传个人独家记忆照片作为日记起点。
    • AI 能够多模态解析载入的图片内容,自动生成第一条极具场景感和温情的 AI 开场引导语
  • 🎙️ 腾讯云 WebSocket 实时语音转文字 (ASR)
    • 集成腾讯云实时语音识别(ASR),支持直接通过麦克风输入语音进行聊天。
    • 采用服务端动态签名 URL 机制,腾讯云敏感 Secret Key 始终保留在服务端,客户端零泄漏,安全可靠。
  • ✍️ 智能日记生成与手动微调
    • 聊天充分后一键汇编生成日记,AI 会将用户杂乱的叙述整合为行文流畅、充满画面感的精美日记。
    • 支持日记重复生成(覆盖当前正文),后台保留完整生成历史与 Token 消耗统计。
    • 内置手动修改功能,用户可直接对生成的日记进行编辑微调,该操作不消耗 AI 配额。
  • 🛡️ 数据库结构自检查与自修复 (Schema Auto-migration)
    • 基于 Node.js 脚本,项目启动前会自动读取并校验本地 PostgreSQL 的表结构、约束和索引(参照 docs/database-schema.md)。
    • 缺失或失效 of 的结构会自动在启动时完成同步与修复,免去手动执行复杂 SQL 的麻烦,开箱即用。
  • 🔒 安全与用量控制
    • 采用手机号验证码登录机制,具备严格的发送防盗刷限流策略(手机号日限制、IP 日/时限制、单验证码校验上限)。
    • 支持 HttpOnly Cookie 安全会话(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 中忽略)

🚀 快速开始

1. 克隆并安装依赖

确保本地已安装 Node.js (推荐 v20+) 和 pnpm

pnpm install

2. 配置环境变量

复制 .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

🔋 短信本地预览模式 (无需真实短信密钥即可开发)

如果您在本地开发阶段,没有购买腾讯云短信服务,可以通过开启 短信预览模式 绕过真实发送:

  1. .env.local 中的 SMS_PREVIEW_ENABLED 设为 True
    SMS_PREVIEW_ENABLED=True
  2. 发送验证码时,终端控制台将直接打印出发送日志和 6 位数验证码,同时本地文件 storage/cache/sms-state.json 中也会记录当前短信状态。您只需要在登录框中输入终端打印的验证码即可成功登录。

3. 运行项目

运行开发模式。系统在启动 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 静态代码检查

🤝 开发与代码规范

为了保证代码的可维护性与源码公开协作规范,请遵循以下规则:

  1. 代码风格
    • 统一使用 2 个空格 缩进,使用 双引号分号
    • React 组件文件命名使用 PascalCase(如 BookChat.tsx),自定义 Hooks 命名使用 camelCase 且以 use 开头(如 useAudio.ts)。
  2. 安全与敏感信息
    • 切勿将包含真实 DATABASE_URL、腾讯云密钥、AI API Key 等敏感信息的 .env.local 文件提交至 Git 仓库。
    • 项目内置的 storage/ 文件夹已被 .gitignore 自动忽略,请勿强行提交任何本地上传的测试照片或短信缓存状态文件。
  3. 提交规范
    • 提倡使用简短清晰的中文 Commit 信息,并分类标明,例如:功能:集成腾讯云实时语音识别修复:优化书本翻页布局高度

📄 许可证与商业授权

本项目基于仓库根目录的 PolyForm Noncommercial License 1.0.0 进行源码公开授权,SPDX 标识为 PolyForm-Noncommercial-1.0.0。该许可证允许非商业学习、研究、运行、修改和分享,但不是 OSI 意义上的开源协议,因为它明确限制商业使用。

⚠️ 使用条款摘要

  • 禁止擅自商用:未经版权持有人书面授权,严禁将本项目或任何修改版本用于商业目的,包括但不限于销售、收费服务、SaaS、客户项目交付、商业分发、商业内部系统、广告获客或其他营利性用途。
  • 商用必须授权:如需商业部署、闭源二开、商业集成、客户交付、SaaS 服务或其他商业使用,请先联系版权持有人获取单独的商业授权。
  • 必须署名并保留通知:如果您使用、修改、分发、发布、部署或向第三方提供本项目或其修改版本,请按 LICENSE 顶部的 Required Notice 保留“今日存档 / SavePoint”署名、许可证链接和原仓库链接(在合理可行时)。
  • 二开开源建议:PolyForm Noncommercial 允许非商业修改和创建衍生作品,但它本身不强制所有二开版本必须公开源码。为了社区协作,建议对外发布或部署的二开版本同步公开对应源码,并继续保留本许可证与署名通知。
  • 私有非商用修改:仅在本地或私有环境中进行非商业学习、研究、测试且不向第三方提供服务的修改版本,可以不公开源码;但这不授予任何商业使用权。

第三方依赖、字体、图片、云服务 API 等可能拥有各自独立的许可证或服务条款,请在使用前自行确认并遵守。


如果这个项目对您有所启发或帮助,不妨为我们点上一颗 ⭐️!

About

一款像素风的AI日记Web应用 | AI chat/聊天生成日记 | An immersive pixel-art AI diary web app.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors