- 当前阶段:
Beta 上线联调(Web 已上线,Rust 后端已上 Lightsail) - 项目定位:
产品内核已完成,正在把真实线上入口接到 Rust 后端 - 更新时间:
2026-06-24
总体进度 [########--] 75%
产品功能 [#########-] 90%
工程质量 [#########-] 90%
生产部署 [##########] 98%
小程序落地 [#####-----] 50%
真实用户验证 [##--------] 20%
- 做成一个可以公开访问、可分享、可持续演示的社区情绪花圃产品。
- 先完成 Web 端稳定上线,再补齐小程序真机闭环。
- 在真实用户试用后,验证产品价值,再决定是否继续做国际化和 Web3 扩展。
- 状态:
已完成 - 目标:把 Roselet 做成一个完整可玩的产品,而不是只有 demo 页面
- 已完成:
- 核心玩法:种花、花圃、详情、编辑、删除、点赞、送玫瑰、资料页
- 核心体验:AI 回复、音效、动态背景、烟花、实时更新
- 核心安全:JWT、Refresh Token、速率限制、私密玫瑰、账号软删除
- 核心工程:WASM 业务下沉、测试覆盖率、CI、Docker、Swagger
- 状态:
进行中 - 目标:把当前项目从“本地开发可用”推进到“外网可访问、可稳定演示”
- 当前小目标:
- 明确 Cloudflare 方案边界:Web 先上,后端按 API 分阶段迁移到 Workers
- 确定生产部署拓扑:Vercel Web + AWS Lightsail Rust API + Docker Postgres
- 补充部署文档、环境变量、服务器操作记录与故障处理
- 完成 Rust 后端线上环境并跑通基本冒烟检查
- 新增 GitHub Actions 自动构建 GHCR 镜像并部署到 Lightsail
- 修复自动部署 compose 项目名漂移,避免
lightsail_*临时容器抢占端口或数据卷漂移 - 验证
Deploy Backendworkflow 端到端成功,服务器已运行 GHCR 后端镜像 - 配置 Caddy HTTPS 临时域名,避免 Vercel HTTPS 页面调用 HTTP API 被浏览器拦截
- 将应用统计后台迁回 Rust
/api/stats,减少 Worker 作为生产依赖 - 将 Vercel 生产环境变量切到 Lightsail HTTPS 后端并重新部署
- 完成线上 Web + Rust HTTPS 后端冒烟:注册、私密种花、详情、反馈、统计后台
- 新增 Cloudflare Pages 国内镜像
https://roselet.paxonqiao.com,解决国内访问 Vercel 困难的问题
- 状态:
进行中 - 目标:让小程序不只是“代码存在”,而是能真机走通核心路径
- 当前小目标:
- 接入微信登录:
wx.login()→/api/auth/wechat-login - 完成真机联调:登录、种花、花圃、详情、静默刷新、WASM
- 补一轮小程序体验问题修复
- 接入微信登录:
- 状态:
进行中 - 目标:验证 Roselet 是否真的让人愿意用,而不是只在代码层面完整
- 当前小目标:
- 增加公开使用动态页,用现有数据库聚合判断是否有人在用
- 邀请至少 5 个真实用户试用
- 收集反馈:注册是否顺滑、种花是否有表达欲、花圃是否有互动感
- 以 100 个活跃注册用户作为是否买服务器/域名的第一条判断线
- 根据反馈决定优先级:国际化 / 社交传播 / 运营玩法 / Web3
- 邀请 5 个真实用户试用
https://roselet-web.vercel.app和https://roselet.paxonqiao.com,对比国内访问速度。 - 观察
/stats后台数据,判断是否接近 100 用户目标线。 - 整理 Worker/免费方案遗留入口,明确 Rust Lightsail + Vercel/Cloudflare Pages 是当前生产主线。
- 我们下一步应该先做:
邀请真实用户试用线上 Web,并用 stats 后台观察是否有人在用 - 当前已经完成:
Vercel前端真实上线AWS Lightsail服务器创建并绑定静态 IP:47.131.238.0Rust Axum backend + Docker Postgres已在 Lightsail 启动Caddy已监听80并反代到后端3001Caddy已通过roselet.47.131.238.0.sslip.io提供 HTTPS 入口,给 Vercel 前端使用Deploy BackendGitHub Actions 已新增:CI 绿后构建 GHCR 镜像并 SSH 部署到 Lightsailscripts/lightsail-deploy.sh已固定COMPOSE_PROJECT_NAME=roselet,避免自动部署生成第二套 compose 项目Deploy Backendrun28082921658已成功,当前后端镜像为ghcr.io/qiaopengjun5162/roselet-backend:648d2747da283f3e956e44c3438e3337b980fe97GET /health、GET /api/garden、注册、种花、详情读取均已公网冒烟通过- Vercel 生产环境变量已切到
https://roselet.47.131.238.0.sslip.io - Vercel bundle 已确认包含新后端地址,未命中旧 Worker/localhost 地址
- 线上冒烟通过:注册、私密种花、详情读取、反馈提交,公开花圃总数未被私密测试污染
GET /api/gardenWorker 真实查NeonGET /api/rose/:idWorker 迁移完成,私有访问规则已对齐 RustPOST /api/auth/refresh/POST /api/auth/logoutWorker 最小闭环已迁移GET /api/statsWorker 聚合统计已迁移- Rust
GET /api/stats已实现并要求ADMIN_USER_IDS管理员白名单 - Web 已开始把
refresh/logout和garden/rose detail切到 Worker 基址 - Web 已新增
/stats使用动态后台,显示 100 用户判断线进度
- 现在最有价值的动作变成:
- 邀请真实用户试用线上 Web
- 观察
/stats后台数据和反馈 - 再考虑正式域名、备份、监控和小程序上线
- 当前结论:
可以部署,但推荐 Web 先上 Cloudflare,后端分阶段迁移 - 详细路线图:
docs/CLOUDFLARE_DEPLOYMENT_ROADMAP.md
- 当前推荐:
Vercel + AWS Lightsail Rust backend + Docker Postgres - 对比文档:
docs/DEPLOYMENT_OPTIONS_COMPARISON.md - 当前操作手册:
docs/AWS_LIGHTSAIL_DEPLOYMENT.md
- 当前推荐:
Vercel + Neon Free + Cloudflare Workers(后端迁移中) - 详细方案:
docs/FREE_DEPLOYMENT_PLAN.md - 执行清单:
docs/FREE_DEPLOYMENT_CHECKLIST.md - 无绑卡迁移计划:
docs/CLOUDFLARE_MIGRATION_PLAN.md
Vercel前端主入口已成功创建并可访问- 当前线上地址:
https://roselet-web.vercel.app
- 当前线上地址:
Cloudflare Pages国内镜像已成功创建并可访问- 当前国内镜像地址:
https://roselet.paxonqiao.com - DNS:
roselet.paxonqiao.comCNAME →roselet.pages.dev(Proxy 开启) - 构建命令:
cd apps/web && pnpm build:cf,输出目录:apps/web/dist
- 当前国内镜像地址:
Render与Koyeb在真实部署中都被支付验证拦住- 后端当前已切换为:
AWS Lightsail 上运行 Rust Axum + Docker Postgres - 后端公网地址:
http://47.131.238.0,仅用于 IP/服务器冒烟 - 后端 HTTPS 地址:
https://roselet.47.131.238.0.sslip.io,用于 Vercel / Cloudflare Pages 生产前端 - 当前未完成:备份策略、监控告警、小程序真机闭环
- Worker API 起点:
apps/worker-api - Worker 当前已迁移:
GET /healthGET /api/gardenGET /api/rose/:idGET /api/statsPOST /api/auth/refreshPOST /api/auth/logout
- Web 生产环境已统一指向 Rust HTTPS 后端。
- Worker 保留为历史免费迁移参考,不再是当前生产主线。
- Rust workspace + Axum 后端框架
- Next.js 16 前端 + shadcn UI
- pnpm monorepo 结构
- PostgreSQL 数据库 + SQLx 迁移
- GitHub Actions CI/CD
- POST /api/rose - 创建玫瑰(后台异步生成 AI 回复)
- GET /health - 健康检查(数据库连接 + 版本信息)
- GET /api/garden - 获取花圃(分页 + 颜色筛选)
- GET /api/rose/:id - 获取单朵玫瑰
- PUT /api/rose/:id - 编辑玫瑰(仅创建者)
- DELETE /api/rose/:id - 删除玫瑰(仅创建者)
- POST /api/auth/register - 用户注册(JWT)
- POST /api/auth/deactivate - 注销账号(软删除 + 30 天冷却期恢复)
- GET /api/my/roses - 获取个人花圃(需 JWT,分页)
- GET /api/user/profile - 用户资料 + 种花统计(需 JWT)
- POST /api/rose/:id/like - 点赞/取消点赞(需 JWT)
- GET /api/ws - WebSocket 实时推送
- GET /api/openapi.json - OpenAPI 3.0 规范
- GET /api/stats - 应用使用统计后台(需 JWT + ADMIN_USER_IDS 管理员白名单)
- AI 个性化回复(OpenAI 兼容 API,后台异步)
- 输入验证(颜色、字段长度、至少一个字段)
- thiserror 错误处理(404/400/403/500 区分)
- CORS 配置
- JWT 认证(jsonwebtoken v9)
- tracing 结构化日志(tracing-subscriber)
- Swagger API 文档(/swagger)
- 首页:规则介绍 + "种一朵玫瑰"按钮
- 种花页:交互式玫瑰(3 个可点击热点)+ 对话框输入 + 种植成功动画
- 花圃页:分页加载 + 卡片展示 + WebSocket 实时更新 + 颜色筛选
- 玫瑰详情页:/rose/[id] + 编辑/删除(owner)+ 点赞 + AI 回复展示
- 登录页:昵称注册 + JWT 存储
- 登录页:支持冷却期账号恢复提示
- 导航栏:登录状态 + 昵称显示 + 登出 + 我的花圃 + 资料链接
- 个人花圃页:/my + 只显示自己的玫瑰
- 用户资料页:/profile + 种花统计
- 资料页:注销账号入口 + 冷却期说明
- 关于页:/about + /health 状态 + 帮助折叠 + 反馈表单 + 联系方式
- 音效系统(Tone.js):种植/点赞/通知/背景音乐 + 静音切换(默认开启)
- 响应式布局
- 深色星空主题(毛玻璃卡片 + 霓虹发光)
- 日夜动态背景(8 时段渐变,跟随系统时间)
- 种花成功烟花粒子动画
- 种花/点赞强制登录,登录后跳回原页面
- 玫瑰点击绽放特效(全局 click → 玫瑰 emoji 弹出动画)
- 玫瑰→声音融合:详情页"听这朵玫瑰" + 成功页自动播放 + 卡片悬停音效
- 情绪示波器:预设模式 + 文字输入实时驱动音乐(TextAnalyzer 接口)
- 110 个后端测试(60 集成 + 50 单元)
- 139 个 Rust WASM/推荐模块测试
- 146 个 Web 前端测试(20 套件)
- 66 个小程序测试(6 套件)
- 覆盖率:Rust workspace 90.37% 行覆盖;Web 91.32% statements / 96.48% lines;小程序 99.33% statements / 100% lines / 96.05% branches
- 覆盖率门禁:Web + 小程序 Jest coverage threshold 已接入本地脚本与 CI
- 质量门禁:TypeScript、ESLint、cargo-deny、Next build、小程序 build 已接入本地 justfile 与 CI
- RoseCard 通用组件(消除 garden/my 重复代码)
- Docker 一键部署(docker-compose:PostgreSQL + 后端 + 前端)
- Swagger API 文档(/swagger,OpenAPI 3.0)
- 纯 Rust → WASM 智能内容推荐(crates/recommend)
- 中文关键词词典(45 个词,8 个分类)
- 花语数据库 + 主题推荐 + 颜色推荐算法
- 种花页面集成推荐卡片
- wasm-pack 构建流程(112KB)
- emotion.rs:analyze_text() WASM 函数,48 关键词,三类情绪权重评分
- README.md(英文)+ README_zh.md(中文)
- CONTRIBUTING.md(英文)
- CLAUDE.md / DEVLOG.md / PROGRESS.md
- Rust Dev Workflow 经验库:
docs/RUST_DEV_WORKFLOW_EXPERIENCE.md - 小程序云测验收流程:
docs/MINIPROGRAM_CLOUD_TEST.md(含 AIMonkey / AI 自定义测试) - Tauri Spike 方案:
docs/TAURI_SPIKE.md - 多语言策略:
docs/I18N_STRATEGY.md(当前默认中文,后续 i18n 优先 Rust WASM 单一事实来源)
- 私密玫瑰后端访问控制补齐:公共花圃隐藏、详情仅 owner、非 owner 点赞返回 404、公共 WebSocket 不广播
- Web 创建玫瑰正确传递
is_private,详情请求带认证头 - 后端集成测试改为生产
create_app路由,避免测试路由与线上路由分叉 - 后端测试清库改为
TRUNCATE ... RESTART IDENTITY CASCADE,清理 likes/refresh_tokens/feedbacks 残留 - Web 覆盖 RosePlayer、音频、WASM wrapper、认证刷新、反馈、Nav、Fireworks、详情编辑删除等路径
- 修复星尘粒子
left随机数缺少 16-bit mask 导致越界的问题
- Rust nextest: 249 passed
- Web Jest: 146 passed
- Miniprogram Jest: 66 passed
- Total: 461 passed
- Rust llvm-cov workspace: 90.37% 行覆盖
- Web Jest coverage: 91.32% statements / 96.48% lines
- Miniprogram Jest coverage: 99.33% statements / 100% lines / 96.05% branches
- Frontend coverage gate:
pnpm test:coverage/just coverage - Quality gates:
just typecheck/just lint/just audit/just next-build/just miniprogram-build
-
audio.rs:玫瑰属性→示波器音频参数(12 tests) -
color.rs:颜色元数据单一事实来源(3 tests),Web + 小程序同源 -
offline.rs:乐观更新和花圃缓存合并规则(Web IndexedDB + 小程序 wx storage 已接入) - 双令牌静默刷新拦截器(小程序 request.ts,Promise 并发锁)
- storage.ts 新增 getRefreshToken/setRefreshToken/logout 清除 refresh key
- 删 miniprogram/utils/validate.ts(plant.rs 已覆盖)
- 删 miniprogram/utils/constants.ts(color.rs 替代)
- rose-sound.ts:删除 TS fallback,强制 WASM,playRose→playWithParams
- text-to-sound.ts:135行→35行,删 LocalKeywordAnalyzer(emotion.rs 替代)
- 删 52 个 TS 算法测试(Rust 侧已覆盖)
- Web rose-card.tsx + rose/[id]/page.tsx:COLOR_MAP → colorEmoji/colorLabel
-
migrations/007_create_feedbacks.sql:feedbacks 表 -
routes/feedback.rs:POST /api/feedback(匿名/登录均可提交,登录用户关联 user_id) -
/api/feedback后端路由注册 + OpenAPI 文档 + 8 个集成测试
-
migrations/009_add_recipient.sql:roses 表加recipient_nickname+recipient_user_id - CreateRose 加 recipient 字段,种花时查/建接收人,防止送给自己
-
GET /api/my/roses?view=received查看收到的玫瑰 - get_rose 允许接收人查看私密玫瑰
- WASM
build_plant_body支持 recipient_nickname - 前端种花页加「送给谁?」输入框,按钮文案联动
- RoseCard + 详情页显示赠送关系
-
migrations/010_add_passphrase.sql:users 表加passphrase_hash - 三态认证路由:新用户 / 无密码老用户 / 有密码验证
- 密码哈希:SHA-256 → Argon2id(OWASP 推荐,内存硬度防 GPU 爆破)
- CORS:
AllowOrigin改为ALLOWED_ORIGINS环境变量 - 速率限制:接入 register + create_rose 路由
- JWT 强制:生产环境用默认密钥拒绝启动
- docker-compose.yml 加
NODE_ENV+ALLOWED_ORIGINS
-
docs/PRESENTATION.md:分享讲稿 -
docs/GIFT_ROSE.md:送玫瑰需求文档 -
docs/screenshots/:6 张界面截图
- 部署上线:选 VPS / Cloudflare Tunnel 方案,Web 端先上
- 小程序微信登录:
wx.login()→/api/auth/wechat-login,零成本 - 真机联调:AppID 已有,拉起后端验证双令牌 + WASM 花瓣
- 找 5 个真实用户试用
- 多语言 Spike:若试用反馈需要英文,再按
docs/I18N_STRATEGY.md从 RustLocale+ WASM 文案映射开始 - Web3 功能(已设计,待实现)
- Ethereum Solidity + Solana Anchor 双链,ChainAdapter trait
- 上链内容:精选一句话(≤200字)+ 颜色,完整内容留链下