Skip to content

Latest commit

 

History

History
310 lines (264 loc) · 16 KB

File metadata and controls

310 lines (264 loc) · 16 KB

Roselet 开发进度

当前状态

  • 当前阶段:Beta 上线联调(Web 已上线,Rust 后端已上 Lightsail)
  • 项目定位:产品内核已完成,正在把真实线上入口接到 Rust 后端
  • 更新时间:2026-06-24

总体进度(主观里程碑)

总体进度        [########--] 75%
产品功能        [#########-] 90%
工程质量        [#########-] 90%
生产部署        [##########] 98%
小程序落地      [#####-----] 50%
真实用户验证    [##--------] 20%

最终目标

  1. 做成一个可以公开访问、可分享、可持续演示的社区情绪花圃产品。
  2. 先完成 Web 端稳定上线,再补齐小程序真机闭环。
  3. 在真实用户试用后,验证产品价值,再决定是否继续做国际化和 Web3 扩展。

路线图

Phase 1:产品内核完成

  • 状态:已完成
  • 目标:把 Roselet 做成一个完整可玩的产品,而不是只有 demo 页面
  • 已完成:
    • 核心玩法:种花、花圃、详情、编辑、删除、点赞、送玫瑰、资料页
    • 核心体验:AI 回复、音效、动态背景、烟花、实时更新
    • 核心安全:JWT、Refresh Token、速率限制、私密玫瑰、账号软删除
    • 核心工程:WASM 业务下沉、测试覆盖率、CI、Docker、Swagger

Phase 2:上线准备

  • 状态:进行中
  • 目标:把当前项目从“本地开发可用”推进到“外网可访问、可稳定演示”
  • 当前小目标:
    • 明确 Cloudflare 方案边界:Web 先上,后端按 API 分阶段迁移到 Workers
    • 确定生产部署拓扑:Vercel Web + AWS Lightsail Rust API + Docker Postgres
    • 补充部署文档、环境变量、服务器操作记录与故障处理
    • 完成 Rust 后端线上环境并跑通基本冒烟检查
    • 新增 GitHub Actions 自动构建 GHCR 镜像并部署到 Lightsail
    • 修复自动部署 compose 项目名漂移,避免 lightsail_* 临时容器抢占端口或数据卷漂移
    • 验证 Deploy Backend workflow 端到端成功,服务器已运行 GHCR 后端镜像
    • 配置 Caddy HTTPS 临时域名,避免 Vercel HTTPS 页面调用 HTTP API 被浏览器拦截
    • 将应用统计后台迁回 Rust /api/stats,减少 Worker 作为生产依赖
    • 将 Vercel 生产环境变量切到 Lightsail HTTPS 后端并重新部署
    • 完成线上 Web + Rust HTTPS 后端冒烟:注册、私密种花、详情、反馈、统计后台
    • 新增 Cloudflare Pages 国内镜像 https://roselet.paxonqiao.com,解决国内访问 Vercel 困难的问题

Phase 3:多端闭环

  • 状态:进行中
  • 目标:让小程序不只是“代码存在”,而是能真机走通核心路径
  • 当前小目标:
    • 接入微信登录:wx.login() → /api/auth/wechat-login
    • 完成真机联调:登录、种花、花圃、详情、静默刷新、WASM
    • 补一轮小程序体验问题修复

Phase 4:用户验证

  • 状态:进行中
  • 目标:验证 Roselet 是否真的让人愿意用,而不是只在代码层面完整
  • 当前小目标:
    • 增加公开使用动态页,用现有数据库聚合判断是否有人在用
    • 邀请至少 5 个真实用户试用
    • 收集反馈:注册是否顺滑、种花是否有表达欲、花圃是否有互动感
    • 以 100 个活跃注册用户作为是否买服务器/域名的第一条判断线
    • 根据反馈决定优先级:国际化 / 社交传播 / 运营玩法 / Web3

接下来 3 个小目标

  1. 邀请 5 个真实用户试用 https://roselet-web.vercel.app 和 https://roselet.paxonqiao.com,对比国内访问速度。
  2. 观察 /stats 后台数据,判断是否接近 100 用户目标线。
  3. 整理 Worker/免费方案遗留入口,明确 Rust Lightsail + Vercel/Cloudflare Pages 是当前生产主线。

下一步

  • 我们下一步应该先做:邀请真实用户试用线上 Web,并用 stats 后台观察是否有人在用
  • 当前已经完成:
    • Vercel 前端真实上线
    • AWS Lightsail 服务器创建并绑定静态 IP:47.131.238.0
    • Rust Axum backend + Docker Postgres 已在 Lightsail 启动
    • Caddy 已监听 80 并反代到后端 3001
    • Caddy 已通过 roselet.47.131.238.0.sslip.io 提供 HTTPS 入口,给 Vercel 前端使用
    • Deploy Backend GitHub Actions 已新增:CI 绿后构建 GHCR 镜像并 SSH 部署到 Lightsail
    • scripts/lightsail-deploy.sh 已固定 COMPOSE_PROJECT_NAME=roselet,避免自动部署生成第二套 compose 项目
    • Deploy Backend run 28082921658 已成功,当前后端镜像为 ghcr.io/qiaopengjun5162/roselet-backend:648d2747da283f3e956e44c3438e3337b980fe97
    • GET /health、GET /api/garden、注册、种花、详情读取均已公网冒烟通过
    • Vercel 生产环境变量已切到 https://roselet.47.131.238.0.sslip.io
    • Vercel bundle 已确认包含新后端地址,未命中旧 Worker/localhost 地址
    • 线上冒烟通过:注册、私密种花、详情读取、反馈提交,公开花圃总数未被私密测试污染
    • GET /api/garden Worker 真实查 Neon
    • GET /api/rose/:id Worker 迁移完成,私有访问规则已对齐 Rust
    • POST /api/auth/refresh / POST /api/auth/logout Worker 最小闭环已迁移
    • GET /api/stats Worker 聚合统计已迁移
    • Rust GET /api/stats 已实现并要求 ADMIN_USER_IDS 管理员白名单
    • Web 已开始把 refresh/logout 和 garden/rose detail 切到 Worker 基址
    • Web 已新增 /stats 使用动态后台,显示 100 用户判断线进度
  • 现在最有价值的动作变成:
    • 邀请真实用户试用线上 Web
    • 观察 /stats 后台数据和反馈
    • 再考虑正式域名、备份、监控和小程序上线

Cloudflare 判断

  • 当前结论:可以部署,但推荐 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.com CNAME → 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 /health
    • GET /api/garden
    • GET /api/rose/:id
    • GET /api/stats
    • POST /api/auth/refresh
    • POST /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)

WASM 推荐模块

  • 纯 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 单一事实来源)

最近完成(会话 #29–43)

覆盖率提升(会话 #29)

  • 私密玫瑰后端访问控制补齐:公共花圃隐藏、详情仅 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

Rust WASM 架构深化

  • 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

DRY 大扫除(净删 ~500 行 TS)

  • 删 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 个集成测试

送玫瑰功能(会话 #37)

  • 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 + 详情页显示赠送关系

可选密码 + 生产安全加固(会话 #37)

  • 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 从 Rust Locale + WASM 文案映射开始
  • Web3 功能(已设计,待实现)
    • Ethereum Solidity + Solana Anchor 双链,ChainAdapter trait
    • 上链内容:精选一句话(≤200字)+ 颜色,完整内容留链下