# privnote **Repository Path**: wu_zhao/privnote ## Basic Information - **Project Name**: privnote - **Description**: 微信消息阅后即焚,通过小程序分享页面实现 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-13 - **Last Updated**: 2026-08-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一号指令 临时信息分享工具:输入一段短文本生成分享,对方打开后 **3 秒自动销毁,服务器不留痕迹**。 适合分享 WiFi 密码、临时验证码、临时账号密码、一句话秘密——不想长期留在聊天记录里的内容。 ## 功能简介 - ✍️ 输入一段短文本,一键生成分享 - 🔗 复制链接,或调用系统分享面板直接发送(H5) - 🎁 微信小程序转发卡片,标题自定义(小程序) - 🔒 对方打开链接即可看到内容 - ⏱️ 3 秒倒计时,结束自动销毁 - 🗑️ **真·阅后即焚:内容存云端,读取瞬间即从服务器删除,链接不可二次使用** ## 架构 ``` 微信小程序 ──wx.cloud.callFunction──┐ ├──▶ 云函数 createNote/readNote ──▶ 云数据库 notes H5 ──@cloudbase/js-sdk(Web SDK)────┘ ``` - **创建**:内容存入云数据库,返回 8 位短 ID(链接只含 ID,不含明文) - **读取**:云函数 CAS 乐观锁(`consumed` 标记)保证**仅可读一次**,读后物理删除 - **过期**:未读消息 24 小时自动作废(可配置 ttl) - **并发安全**:两个请求同时到达时只有一个能读到内容 - **双端**:小程序与 H5 共用同一套云函数;H5 未配置 `CLOUD_ENV` 时自动降级为 localStorage 模拟(仅演示) ## 使用流程 ``` 输入内容 → 云函数存库返回短ID → 分享链接/卡片 → 对方打开 → 云函数读取即删 → 3 秒倒计时销毁 ``` ## 技术栈 - [uni-app](https://uniapp.dcloud.net.cn/)(Vue 3 + TypeScript + Vite) - 微信云开发(云函数 + 云数据库) - H5 部署:GitHub Pages(Actions 自动构建部署) ## 微信小程序部署(首次必做) 1. **创建云环境**:微信开发者工具导入 `dist/build/mp-weixin` → 工具栏「云开发」→ 开通并创建环境(基础版 19.9 元/月,新用户首月免费试用) 2. **上传云函数**:在 `dist/build/mp-weixin/cloudfunctions` 下对 `createNote`、`readNote` 分别右键 →「上传并部署:云端安装依赖」(以后改过云函数代码需重新上传) 3. **创建集合**:云开发控制台 → 数据库 → 新建集合 `notes` 和 `rate_limits`,**两者权限都设为「所有用户不可读写」**(前端不直连数据库,云函数拥有管理员权限不受限;这样即使环境 ID 泄露,数据也完全不可达) 4. **配置环境 ID**:打开 `src/utils/cloud.ts`,把 `CLOUD_ENV` 改成你的环境 ID(云开发控制台 → 设置 → 环境 ID);只有一个环境时留空即可 5. **配置云函数权限(H5 匿名调用必需)**:云开发平台 → 云函数 →「权限控制」,把规则改为 `{ "*": { "invoke": "auth != null" } }`(默认规则排除匿名用户,不改为会报 `EXCEED_AUTHORITY`) 6. 重新构建:`npm run build:mp-weixin`,导入微信开发者工具预览 > 注:`project.config.json` 已配置 `cloudfunctionRoot: "cloudfunctions/"`, > 构建脚本(`scripts/prepare-cloud.js`)会自动把 `src/cloudfunctions` 复制进产物。 ## H5 接入云端(可选,需配 CLOUD_ENV) H5 通过 `@cloudbase/js-sdk` 调用同一环境的云函数,实现真·阅后即焚。 控制台入口:微信开发者工具 →「云开发」按钮(或腾讯云开发平台 tcb.cloud.tencent.com,同一环境): 1. **开启匿名登录**:云开发平台 → **身份认证** → **登录方式** → 启用「匿名登录」 2. **添加 Web 安全域名**:云开发平台 → **环境配置** → **安全来源** → 添加域名白名单: - 本地调试:`http://localhost:5173` - 生产(GitHub Pages):`https://withwz.github.io` 3. `src/utils/cloud.ts` 配置 `CLOUD_ENV`(Web 端必须填;地域不对时再填 `CLOUD_REGION`) 4. **云函数权限控制**:云开发平台 → 云函数 →「权限控制」,规则改为 `{ "*": { "invoke": "auth != null" } }`(否则匿名调用报 `EXCEED_AUTHORITY`) 5. 重新构建 `npm run build:h5` > 提示:新版 CloudBase 还支持 Publishable Key(环境配置 → API Key 配置)鉴权, > 无需开启匿名登录即可在浏览器使用;本工程默认走匿名登录,两者择一即可。 ## 本地开发 ```bash npm install # 安装依赖 npm run dev:mp-weixin # 小程序开发(配合微信开发者工具) npm run dev:h5 # H5 本地调试 npm run build:mp-weixin # 小程序构建 npm run build:h5 # H5 构建产物输出到 dist/build/h5 ``` ## 部署(H5 版) 推送 `main` 分支后,GitHub Actions 自动构建并部署到 GitHub Pages: ```bash git push origin main ``` ## 云函数接口 ### createNote ``` 入参: { text: string, ttl?: 秒(默认 86400,最长 7 天) } 返回: { ok: true, id } | { ok: false, code: 'EMPTY' | 'TOO_LONG' | 'RATE_LIMITED' | 'INTERNAL' } 频控: 同一调用者每分钟最多 20 次(rate_limits 集合计数) ``` ### readNote(读取即焚) ``` 入参: { id: string } 返回: { ok: true, text } | { ok: false, code: 'GONE' | 'EMPTY_ID' | 'RATE_LIMITED' | 'INTERNAL' } 频控: 同一调用者每分钟最多 60 次 ``` `GONE` 表示:不存在 / 已被读过 / 已过期(记录已被物理删除)。 ## 安全边界 - `CLOUD_ENV` 只是环境 ID(类似服务器地址),**不是密钥**,前端可见是设计如此;真正的管理密钥(AppSecret / SecretId)绝不能放前端,本工程未引入 - 数据只经云函数读写,数据库集合权限设为「所有用户不可读写」,前端无法绕过云函数直接访问数据 - 频控挡脚本化批量调用,防止别人拿环境 ID 刷存储/调用配额 - 阅后即焚数据读后即删,即使链接泄露也无法二次读取