kurihada
df2e373beb
feat: 改进计划生成体验与 AI 提示词
...
- 生成中状态改为滚动日志列表,底部新增消息自动滚动
- 返回想法池不再清空计划,pool 页面保留"待确认计划"横幅
- 换方案时才清空旧计划
- 提示词补充午餐/晚餐时间窗口约束(午餐11:30-13:00,晚餐17:30-19:30)
- get_travel_time 从驾车改为公共交通,阈值从30分钟调整为45分钟
2026-03-02 11:26:20 +08:00
kurihada
b78063739b
fix: 盲盒想法打标改为后台异步,新增 retag 补打接口
...
- applyTags 改为 fire-and-forget,用户投入想法立即返回(<200ms)
- 打标超时设为 60s,失败静默,由 /api/blindbox/retag 兜底
- 新增 POST /api/blindbox/retag:补打房间内所有无标签想法
2026-03-02 10:55:27 +08:00
kurihada
9d891fb702
feat: 为行程规划 agent 添加 get_travel_time 工具,调用高德驾车 API 验证交通时间
...
agent 之前完全靠 LLM 猜测地理距离,现在可以查询真实驾车时间,超过 30 分钟会换更近地点。
同时修复 dev 端口未生效的问题(next dev 加 --port 3721)。
2026-03-02 10:21:00 +08:00
kurihada
ea49ce6081
chore: 端口从 3000 改为 3721 避免冲突
2026-03-02 01:07:45 +08:00
kurihada
7fd1005e03
feat: 行程规划改用 tool-calling agent,旧逻辑保留为降级方案
...
ai.ts 新增通用 runAgentLoop(),blindboxPlanGen.ts 拆分为
agent 主路径(list_ideas/search_poi/finalize_plan 三个工具)
和 legacy 降级路径,agent 失败时自动回退。
AI 思考和工具调用实时推送给前端。
2026-03-02 01:07:25 +08:00
kurihada
93499867d5
feat: 改进标签系统 — 新增品类/费用/强度/预约标签,timeSlot 参与选活动
...
- IdeaCategory 扩展 7→9,新增 experience(体验)和 nature(自然)
- 替换 outdoor boolean 为 costLevel/intensity/needsBooking 三个高价值字段
- AI 标注 prompt 同步更新,行程规划新增强度交替、费用平衡、预约提醒原则
- selectIdeasForSlots 重写为四优先级:timeSlot+category > category > timeSlot > 任意
- 前端想法卡片展示费用/强度/预约标签
2026-03-02 00:03:35 +08:00
kurihada
bc2b0e40c6
fix: 修复生产数据库 schema 同步脚本的双重 IF NOT EXISTS bug
...
prisma db push 生成的 .schema 已自带 CREATE TABLE IF NOT EXISTS,
旧脚本的 sed 替换会生成 IF NOT EXISTS IF NOT EXISTS 导致 SQL 语法错误,
建表全部静默失败。现在只对 CREATE INDEX 做 IF NOT EXISTS 补充。
2026-03-01 22:44:44 +08:00
kurihada
dfb7f464a0
fix: 改用 prisma db push 同步生产数据库 schema
...
旧的 sqlite3 手动同步脚本会静默吞掉建表失败的错误,
导致 BlindBoxMember 等表在生产环境从未创建成功。
改用 prisma db push 做 schema 同步,由 Prisma 自身保证正确性。
2026-03-01 22:12:25 +08:00
kurihada
fe9a52e2e4
fix: API 500 错误返回具体原因,便于线上排查
2026-03-01 21:59:23 +08:00
kurihada
0e9d4ae43e
fix: 修复 Vitest 4.x 构建兼容性问题
...
environmentMatchGlobs 在 Vitest 4 中已移除,改用 projects 配置;
排除 vitest.config.ts 不参与 Next.js 类型检查。
2026-03-01 21:51:14 +08:00
kurihada
3ccd1262f9
test: 添加完整测试套件(52 个文件,326 个用例)
...
基于 Vitest 搭建测试基础设施,覆盖后端纯函数、API 路由、
前端 hooks、UI 组件和页面级集成测试。
2026-02-28 20:19:14 +08:00
kurihada
11eeec868e
Revert "feat: 从 SQLite 切换到 PostgreSQL"
...
This reverts commit 827fb761bd .
2026-02-28 18:27:42 +08:00
kurihada
827fb761bd
feat: 从 SQLite 切换到 PostgreSQL
...
- Prisma provider 改为 postgresql
- docker-compose 新增 postgres 服务(带健康检查)
- Dockerfile 移除 sqlite3/template.db,改用 npm install prisma 做运行时 schema 同步
- docker-entrypoint.sh 简化为 prisma db push + node server.js
2026-02-28 17:47:01 +08:00
kurihada
bf806f0891
fix: 改用 sqlite3 原生工具做 schema 同步,替代不可靠的 prisma CLI 方案
2026-02-28 17:33:49 +08:00
kurihada
3e7bb51618
fix: 房间加载失败时显示具体错误原因,便于线上排查
2026-02-28 17:30:09 +08:00
kurihada
039887547d
fix: 容器启动时自动同步数据库 schema,解决线上部署后表结构不同步导致的加载失败
2026-02-28 17:24:03 +08:00
kurihada
1e39c72a63
fix(blindbox): 修复房间创建后返回大厅不可见 + 大厅房间列表管理
...
- 修复房主退出房间时误删整间房的问题,改为返回大厅(房间保留)
- 修复大厅页 fetchRooms 时序依赖导致导航回来不刷新的问题
- fetch 添加 cache:no-store + router.refresh() 确保数据始终最新
- 房间列表增加 max-h 滚动 + 底部渐变遮罩防溢出
- 大厅房间卡片支持内联删除/退出(··· 按钮 → 确认栏)
- rooms API 返回 creatorId 以区分房主/成员操作
2026-02-27 18:38:05 +08:00
kurihada
2d49744dd0
feat(blindbox): AI 计划生成流式进度与渐进式文案
...
- 新增 runPlanGeneration 与 onProgress 回调 (blindboxPlanGen.ts)
- 新增 POST /api/blindbox/plan/stream 推送 SSE 进度事件
- 前端优先走流式接口,实时展示「分析想法→搜索地点→规划路线→快好了」
- 流式失败时回退普通 POST,客户端轮播进度文案作为后备
- 规划阶段 UI 显示 planStatusMessage 替代静态文案
2026-02-27 17:37:40 +08:00
kurihada
9aee4f0e9b
fix(blindbox): 周末契约页输入框无法输入 — 非受控输入 + 全局 input 样式
...
- 创建/加入房间输入改为 ref + defaultValue,提交时从 DOM 取值,避免受控 state 导致无法打字
- globals: input/textarea 增加 user-select: text !important、touch-action: manipulation
- Input 组件: cursor-text、touch-manipulation、min-w-0、autoComplete=off
2026-02-27 17:27:51 +08:00
kurihada
61ef54b2bd
feat: 盲盒想法输入增加 AI 灵感推荐
...
输入框下方展示灵感建议标签,点击即填入,降低创作门槛:
- 房间有 ≥2 条想法时调用 DeepSeek 生成贴合调性的推荐
- 想法不足或 AI 失败时 fallback 到 18 条静态灵感随机选 4 条
- 提交新想法后自动刷新推荐,支持手动换一批
2026-02-27 16:52:59 +08:00
kurihada
76349f0dcf
feat: 接入全站图片资源 + 修复卡片滑动与房间轮询问题
...
图片资源接入:
- OG/Twitter 社交分享元数据 (og-image.png)
- 错误页插画替换图标 (error-robot.png)
- EmptyState 组件支持 image prop,空状态页面接入插画
- 餐厅图片 fallback 改用 restaurant-fallback.png
- 极速救场/周末契约页面添加 hero 装饰图
- 分享卡片添加背景图层 (share-bg-*.png),通过 base64 预加载
- 更新 App 图标 (apple-touch-icon, icon-192/512)
Bug 修复:
- SwipeDeck: swipe action 从 "nope" 改为 "pass",匹配 API 预期
- SwipeDeck: 用 ref 读取 currentIndex 避免竞态重置(本地滑动后
被服务端旧 swipeCounts 立即清零)
- SwipeDeck: 卡片 key 加入 isTop 标识,强制 remount 解决
framer-motion drag 手势在 isTop 切换时不重新初始化的问题
- SwipeableCard: initial 统一为背景位置,确保晋升为顶部卡片时
有一致的放大动画
- useRoomPolling: roomId 为空时跳过 SWR 和 EventSource
- room page: joinRoom 前 guard roomId,消除退房时 404
- layout: 添加 metadataBase 消除 Next.js OG 图片警告
2026-02-27 16:08:38 +08:00
kurihada
4073be9066
fix: invite 页面补充 Utensils 图标导入,修复编译失败
2026-02-27 11:43:40 +08:00
kurihada
3409456ca5
merge: dev → main (v2.0 周末契约 + 全站重构)
2026-02-27 10:48:13 +08:00
kurihada
3335f7f872
refactor: 移除 Service Worker 离线缓存 + 统一注册引导文案
...
- 删除 sw.js、ServiceWorkerRegistrar、offline 页面
- 保留 manifest 和 PWA 图标(添加到主屏幕仍可用)
- 注册引导文案统一为"10 秒注册,无需手机号"
2026-02-27 10:38:33 +08:00
kurihada
4cc9d66403
fix: SW 缓存导致页面不更新 — fetch 绕过 HTTP 缓存 + hydration 闪屏修复
...
- sw.js: HTML fetch 加 cache:"no-cache",避免从浏览器缓存拿旧页面
- ServiceWorkerRegistrar: 注册时 updateViaCache:"none",确保 SW 自身及时更新
- blindbox/page: 增加 hydrated 状态,防止 SSR/CSR 内容不一致导致闪屏
2026-02-27 10:28:23 +08:00
kurihada
beb2c632bb
refactor: 移除个人页面决策记录,统一由成就墙展示
...
决策记录已完整迁移至 /achievements 成就墙页面,
个人中心不再重复展示,减少冗余数据请求。
2026-02-27 10:05:22 +08:00
kurihada
c17b13b6a8
feat: 契约生命周期 + 到期通知 + 成就墙
...
- 扩展 WeekendPlan schema: 新增 endTime 字段与 userId 索引
- PATCH /api/blindbox/plan 支持 accept/complete/expire 操作,
接受时自动计算契约结束时间
- GET /api/blindbox/plan 支持 mode 参数 (latest/pending/history)
- 房间页接受契约后自动返回想法池,顶部显示"契约进行中"指示器
- 契约到期时触发浏览器通知 + 页面加载时弹出完成确认弹窗
- 新增 /achievements 成就墙页面:统计数据 + 决策记录/契约记录双标签
- 首页和个人中心新增成就墙入口
2026-02-27 02:12:18 +08:00
kurihada
d8e42b860f
feat: 已接受契约持久化 — 保存/加载/自动展示
...
- PATCH /api/blindbox/plan: 接受契约时更新状态为 accepted
- GET /api/blindbox/plan: 查询房间内最近一次已接受的计划
- 进入房间时自动加载已接受计划并展示行程视图
- 修复整个周末想法不足时重复活动的问题(不足则只生成一天)
2026-02-27 01:57:42 +08:00
kurihada
9c680ec11e
feat: AI 周末行程规划 — DeepSeek 智能排期 + 高德 POI + 多日翻页
...
- 接入 DeepSeek API,提交想法时自动 AI 打标(品类/时段/时长/搜索策略)
- 新增行程规划 API:智能选取想法 → 高德 POI 搜索 → AI 生成最优行程
- 支持多日计划("整个周末"拆分周六/周日,并行 AI 调用)
- 行程展示逐日翻页,时间线可滚动,操作按钮固定底部
- 分享卡适配多日格式,支持图片保存与原生分享
- Prisma schema 新增 WeekendPlan 模型及 BlindBoxIdea AI 标签字段
- Jenkinsfile 集成 DEEPSEEK_API_KEY 环境变量
2026-02-27 01:51:47 +08:00
kurihada
8c6da410ca
style: 周末契约顶部对齐极速救场 + 首页卡片样式统一
...
- blindbox/page: 加 justify-center 让标题垂直位置与 panic 页保持一致,移除 flex-1 子容器
- page: 周末契约卡片色值统一用 white/* 透明度,去掉紫色 drop-shadow,简化 hover 光晕
2026-02-27 00:12:58 +08:00
kurihada
fbb2c22964
feat: 场景细分为餐厅/咖啡奶茶/甜品 + 附近搜索优先 + 美食多选标签
2026-02-26 23:04:25 +08:00
kurihada
c0662de3dd
feat: 美食多选 + 自定义输入标签
2026-02-26 21:40:14 +08:00
kurihada
ab55f0981e
feat: 地点搜索附近优先 — 透传用户坐标给高德 inputtips
2026-02-26 21:00:48 +08:00
kurihada
838f98b48b
docs: 更新 BUGFIX.md 标记 Low 优先级 #27-#31 为已完成,BUGFIX.md 全部清零
2026-02-26 20:26:13 +08:00
kurihada
deba7ab2bb
fix: AudioContext 复用 + 盲盒加载错误提示 + icon 按钮 aria-label
...
- #27 : panic/blindbox/ShareCardModal/AuthModal 中 icon-only 按钮补 aria-label
- #28 : playChime 缓存复用单个 AudioContext,避免超出浏览器 ~6 个上限
- #29 : 已完成(上一批次 ApiError.name = "ApiError")
- #30 : blindbox lobby fetchRooms 失败时显示"加载失败/点击重试"
- #31 : 已完成(theme.ts VALID_THEMES 校验)
2026-02-26 20:25:56 +08:00
kurihada
f4a8fd7fee
docs: 更新 BUGFIX.md 标记 Medium 优先级 #15-#26 为已完成
2026-02-26 20:22:30 +08:00
kurihada
5adfe8d3f1
fix: 客户端资源清理 — ShareCard 依赖 + 定时器 + 死代码
...
- #20 : ShareCardModal useEffect 依赖改为 imageSrc 字符串,避免对象引用变化重复加载
- #21 : BlindboxRoomPage 所有 setTimeout/rAF 统一收集,unmount 时清理
- #25 : 删除未使用的 confettiCanvasRef 和 canvas 元素
2026-02-26 20:21:59 +08:00
kurihada
cf88d3a1d2
fix: 外部 API 错误处理 + 导航 URL 校验 + reset/narrow 错误反馈
...
- #22 : 高德 API fetch 加 try/catch,失败返回 503 而非泛化 500
- #23 : buildNavUrl 校验 location.split(",") 结果长度和非空
- #24 : handleReset/handleNarrow 检查 res.ok,失败时 toast 提示
2026-02-26 20:20:59 +08:00
kurihada
dfb3cfa136
fix: 服务端验证强化 — 房间ID/坐标/swipe/盲盒竞态/空格
...
- #15 : 房间 ID 扩展为 6 位字母数字,createRoom 用 P2002 重试替代 find-then-create
- #16 : 盲盒编辑/删除改用 updateMany/deleteMany 原子操作,防止 TOCTOU
- #17 : lat/lng 用 Number.isFinite + 范围校验 (-90~90, -180~180)
- #18 : swipe action 必须为 'like' 或 'pass'
- #19 : user PUT 的 JSON.parse(preferences) 加 try/catch
- #26 : requireString 拒绝纯空格字符串
2026-02-26 20:19:56 +08:00
kurihada
93f20747e4
docs: 更新 BUGFIX.md 标记 High 优先级 #6-#14 为已完成
2026-02-26 20:16:54 +08:00
kurihada
50ae46fe15
fix: AuthModal 重开时重置表单 + 邀请页加入失败显示错误
...
- #13 : useEffect 监听 open 变化时重置所有表单状态(用户名、密码、错误等)
- #14 : handleJoin catch 中捕获错误消息并渲染到页面
2026-02-26 20:16:25 +08:00
kurihada
508903b67d
fix: SSE 认证 + 收藏去重 + 数据库索引和级联删除
...
- #7 : SSE events 接口校验 userId 房间成员身份,start() 加 try/catch
- #9 : Favorite 新增 restaurantId 字段做精确去重,不再用 JSON contains
- #10 : 补齐 Decision/Favorite/Room/BlindBoxIdea 缺失索引
- #11 : Decision/Favorite/BlindBoxMember/BlindBoxIdea 加 onDelete Cascade
2026-02-26 20:15:45 +08:00
kurihada
9c7f18e0fa
fix: 用户名唯一性竞态处理 + 密码长度上限 + JSON.parse 安全
...
- #6 : register/user PUT 捕获 P2002 返回 409,apiHandler 全局兜底
- #8 : GET /api/user 的 JSON.parse(preferences) 加 try/catch 防崩溃
- #12 : 密码校验加 128 字符上限防 DoS
- #29 : ApiError.name 设为 "ApiError" 便于调试
2026-02-26 20:14:02 +08:00
kurihada
6488c19172
fix: theme.ts 所有函数添加 SSR 守卫,校验 localStorage 合法值
...
- setStoredTheme/applyTheme/initTheme 添加 typeof window 检查
- getStoredTheme 校验存储值是否在白名单中,防止非法 theme 值
2026-02-26 20:11:21 +08:00
kurihada
c4d1a122b2
fix: fetch 后检查 res.ok 并校验数组类型,防止错误响应导致崩溃
...
- panic/page.tsx: suggestions fetch 检查 res.ok + Array.isArray
- profile/page.tsx: history/favorites fetch 检查 res.ok + Array.isArray
2026-02-26 20:10:59 +08:00
kurihada
5783d522b7
fix: SwipeDeck 检测他人重置后自动清空本地状态
...
当 server 端 swipeCount 归零而本地 currentIndex > 0 时
说明其他用户执行了重置,自动调用 clearLocalState()
2026-02-26 20:10:29 +08:00
kurihada
b9a07f84c0
fix: 盲盒抽取使用事务 + 乐观锁防止并发抽到同一想法
...
- 将 findMany + update 包裹在 prisma.$transaction 中
- 使用 updateMany({ where: { id, status: "in_pool" } }) 保证原子性
- count=0 时返回 409 提示用户重试
2026-02-26 20:10:04 +08:00
kurihada
90d3b35069
fix: 房间 swipe/undo/reset 接口添加成员身份校验
...
- swipe/undo:校验 userId 在 data.users 中,非成员返回 403
- reset:要求传 userId,校验为房间成员或创建者
- 客户端 handleReset/handleNarrow 传入 userId
2026-02-26 20:09:40 +08:00
kurihada
2a3cef890c
refactor: 拆分 MatchResult、ProfilePage、BlindboxRoomPage 大组件
...
- MatchResult: 提取 NoMatchResult、RunnerUpCard(635 → 513 行)
- ProfilePage: 提取 ProfileHistoryCard、ProfileFavoritesCard(692 → 526 行)
- BlindboxRoomPage: 提取 BlindboxMyIdeas、BlindboxDrawnHistory(855 → 668 行)
2026-02-26 19:59:35 +08:00
kurihada
423b94440d
refactor: 拆分 ShareCardModal(951 行 → 4 个模块)
...
- ShareCardModal.tsx (199 行): 模态框编排逻辑(图片生成、保存、分享)
- RestaurantShareCard.tsx: 餐厅分享卡片纯展示组件
- BlindboxShareCard.tsx: 盲盒分享卡片纯展示组件
- shareImage.ts: 图片工具函数(toPng 封装、dataUrl 转换、下载)
2026-02-26 19:54:12 +08:00
kurihada
07541ed686
refactor: 提取 useGeolocation hook 和 joinRoom 工具函数
...
- useGeolocation: 将 PanicPage 中 ~50 行 GPS 定位逻辑(requestGps + reverseGeocode + 状态管理)提取为独立 hook
- joinRoom: 统一 3 处重复的 POST /api/room/:id/join 调用(room、invite、panic 页面)
2026-02-26 19:49:05 +08:00
kurihada
0c5676493e
refactor: 提取 UserAvatar、Input、Card 三个可复用 UI 组件
...
- UserAvatar: 统一头像渲染(5 种尺寸),新增 resolveAvatar 工具函数,替换 SwipeDeck 和 RoomManageModal 中的重复逻辑
- Input: 统一表单输入样式(4 种尺寸 + default/purple 变体),替换 AuthModal、ProfilePage、BlindboxPage 共 12 处
- Card: 统一卡片容器样式 + 可选淡入动画和延迟,替换 ProfilePage 中 7 处重复的 motion.div
2026-02-26 19:43:07 +08:00
kurihada
9641acbcbd
refactor: 提取 buildNavUrl 工具函数,统一 room API 错误处理
...
- 将 MatchResult.tsx 和 profile/page.tsx 中重复的导航 URL 构建逻辑提取到 src/lib/navigation.ts
- 7 个 room API 路由从 return NextResponse.json({ error }, { status }) 统一改为 throw ApiError,由 apiHandler 统一捕获
2026-02-26 19:31:00 +08:00
kurihada
c9e20d4c95
refactor: 提取 useShare hook,统一分享和剪贴板逻辑
...
新增 useShare(Web Share API + clipboard fallback),
消除 QrInviteModal、BlindboxRoomPage、ShareCardModal 三处重复的分享代码。
2026-02-26 19:25:44 +08:00
kurihada
1229bb849b
refactor: 提取 validation.ts 和 amap.ts,统一 API 路由校验逻辑
...
新增 validation.ts(用户名/密码/邮箱/内容/房间名/必填字段校验)
和 amap.ts(AMAP API key 校验),消除 7 个路由中的重复验证代码。
2026-02-26 19:22:17 +08:00
kurihada
455b9e04d8
refactor: 提取 Button 组件,统一按钮变体、尺寸和加载状态
...
新增 Button.tsx 支持 5 种变体(primary/secondary/danger/ghost/purple)、
3 种尺寸(sm/md/lg)、pill/rounded 形状及内置 loading 状态,
替换 8 个文件中 16 处重复的按钮样板代码。
2026-02-26 18:39:14 +08:00
kurihada
19edcaeeb5
refactor: 提取 requireUserId/requireUser/requireMembership 校验工具
...
- 新增 requireUserId:统一 14 处 userId 非空校验,返回 401
- 新增 requireUser:统一 4 处用户存在性检查,返回 404
- validateMembership 升级为 requireMembership,直接抛 403
- 混合校验拆分为 auth(401) + 字段(400),状态码更准确
2026-02-26 18:17:17 +08:00
kurihada
0595887480
refactor: 引入 apiHandler + ApiError,消除 20 个路由的 try/catch 样板
...
- 新增 src/lib/api.ts:ApiError 错误类 + apiHandler 统一包装器
- 20 个 API 路由统一使用 apiHandler,删除重复的 try/catch 块
- 验证错误改用 throw new ApiError(),减少嵌套层级
- join/manage 路由的错误码映射改为直接抛出 ApiError
- 删除已无引用的 errorResponse 辅助函数
- 净减 273 行代码
2026-02-26 18:08:47 +08:00
kurihada
d4c6da57a1
refactor: Toast 升级为全局 Context,消除 onToast prop 透传
...
将 useToast 从独立 state hook 改为 Context-based,在 layout 中
挂载 ToastProvider 全局渲染 Toast。QrInviteModal、RoomManageModal、
ShareCardModal 不再需要 onToast prop,直接 useToast() 调用即可。
父组件 TopNav、MatchResult、profile、blindbox 移除了本地 Toast
渲染和 onToast 传递逻辑。
2026-02-26 17:57:34 +08:00
kurihada
b98920858c
refactor: 提取 useToast hook + Toast 组件,消除 4 处重复的通知逻辑
...
将 state + setTimeout 自动消失逻辑封装为 useToast hook,
Toast UI 统一为组件支持 top/bottom 两种位置,净减约 12 行。
2026-02-26 17:50:28 +08:00
kurihada
948274bcb9
refactor: 提取 Modal 基础组件,消除 4 个弹窗的重复样板代码
...
将 backdrop 遮罩、点击关闭、AnimatePresence 动画封装为 Modal 组件,
支持 sheet(底部弹出)和 dialog(居中缩放)两种变体,净减约 110 行。
2026-02-26 17:45:52 +08:00
kurihada
ac8cb8c635
feat: 盲盒想法支持编辑和删除,展示用户已投入的想法列表
2026-02-26 16:55:58 +08:00
kurihada
b1cbf0d589
fix: 修复页面过渡动画导致 fixed 定位失效和全局徽章被遮挡
2026-02-26 16:49:06 +08:00
kurihada
add9733bc9
ui: 页面切换过渡动画 — AnimatePresence 淡入滑出效果
2026-02-26 16:41:39 +08:00
kurihada
20f63c67cb
feat: 添加 PWA 支持 — 可安装到主屏幕、离线缓存、刘海屏适配
2026-02-26 16:37:40 +08:00
kurihada
31003110e1
fix: 滑卡退出距离自适应屏幕宽度,小屏设备体验更顺滑
2026-02-26 16:33:41 +08:00
kurihada
37eb7f07d7
ui: 滑卡互动增强 — like 徽章动画、分类标签可读性、进度数字区分
...
- RestaurantCard: like 徽章实时弹跳动画,首次出现滑入效果
- RestaurantCard: 分类标签改为白底黑字,图片上始终清晰
- SwipeDeck: 进度数字加背景色块包裹,与用户名视觉分离
2026-02-26 16:32:00 +08:00
kurihada
9759db54ca
fix: 修复浅色模式下 text-white 文字不可见,新增主题安全色规范
...
极速救场标题、个人中心导航和输入框改用语义色
2026-02-26 16:18:38 +08:00
kurihada
b2b18327cc
ui: 骨架屏替代全部页面级加载 spinner
...
- 新增 Skeleton 组件库:Skeleton、SkeletonCircle 基础元素 + 5 个业务骨架
(SwipeDeck、ProfileCard、RecordItem、BlindboxRoom、BlindboxList、RoomCard)
- 替换 room、profile、blindbox 列表、blindbox 房间、invite 5 个页面的加载态
- 替换 profile 历史记录 / 收藏列表的内联加载 spinner
- 更新 project-conventions.mdc:新增 Loading States 规范,
要求页面级和列表级加载必须使用骨架屏
2026-02-26 16:11:01 +08:00
kurihada
798b883250
ui: 房间页布局优化 — TopNav 重排、进度贴近卡片、按钮间距收紧
...
- TopNav: 退出按钮移到最左侧,房间号合并到邀请按钮,移除右侧内容避免与全局徽章重叠
- SwipeDeck: 移除绿色进度条,UserProgressBar 始终显示并贴在卡片正上方
- ActionButtons: 缩小与卡片的垂直间距
2026-02-26 15:50:51 +08:00
kurihada
4ce6ea469c
feat: 添加全局 Error Boundary 和餐厅图片加载失败 fallback
...
- error.tsx: 路由级错误边界,提供重试和返回首页操作
- global-error.tsx: 根布局级兜底,纯内联样式避免依赖加载
- RestaurantImage: 可复用图片组件,加载失败显示餐具占位图标
- 替换 RestaurantCard、MatchResult、profile 中所有餐厅图片
2026-02-26 15:22:29 +08:00
kurihada
e86f643c26
ui: 个人中心空状态插图优化,替换纯文字为图标动画 + CTA 按钮
...
提取可复用 EmptyState 组件,决策记录和收藏餐厅空状态
增加浮动图标、光晕动画和"去创建第一个房间"引导按钮
2026-02-26 15:18:22 +08:00
kurihada
12279117f3
feat: 全局主题切换(浅色/深色/跟随系统)
...
- CSS 变量驱动的主题系统,所有颜色响应 data-theme 属性
- 新增语义化色彩 heading/secondary/tertiary,替换硬编码 text-white/text-gray-*
- 右上角三态主题按钮(自动/浅色/深色),全局可用无需登录
- layout.tsx 内联脚本防闪烁
- 修复个人中心页面溢出无法滚动
2026-02-26 15:15:32 +08:00
kurihada
69dc78300e
feat: 盲盒房间支持删除(创建者)和退出(成员)
...
- DELETE /api/blindbox/room/[code] 根据身份区分行为
- 房间页底部两步确认按钮,防止误操作
- 更新 ROADMAP:该功能从 P3 提升至 P1,移除低价值项
2026-02-26 15:00:30 +08:00
kurihada
05e42ffe22
feat: 个人中心展示决策次数徽章「已拯救 X 次选择困难症」
2026-02-26 14:54:46 +08:00
kurihada
7aa6c7f792
feat: 全局用户头像徽章,所有页面右上角统一显示
...
- 新增 GlobalUserBadge 组件,固定在右上角,已登录显示头像+用户名,未登录显示登录按钮
- 通过 layout.tsx 全局挂载,仅在个人中心页隐藏
- userId.ts 登录/登出时派发 nowhatever_auth 事件,组件实时响应
- 移除各页面重复的用户指示器(首页、极速救场、周末契约大厅、个人中心顶栏退出按钮)
- TopNav 右侧留出空间避免与全局徽章重叠
- 头像徽章采用暗色主题风格(bg-surface/80)
2026-02-26 14:42:40 +08:00
kurihada
f851eed847
fix: 匹配结果页标题和副标题添加 text-center 确保居中
2026-02-26 14:26:42 +08:00
kurihada
d122ee7fb5
ui: 个人中心退出按钮提升可见度
...
- 顶部导航栏右侧新增退出按钮,无需滚到页面底部
- 底部退出按钮从灰色文字链接改为带边框的圆角按钮
2026-02-26 14:23:33 +08:00
kurihada
1e7851fdb5
feat: 首页添加用户登录状态指示器
...
- 已登录:右上角显示头像 + 用户名,点击进入个人中心
- 未登录:右上角显示"登录"按钮,点击弹出注册/登录弹窗
2026-02-26 14:22:13 +08:00
kurihada
26656f1e01
feat: 匹配成功页引导未注册用户注册,保存决策记录
...
- 未注册用户在匹配成功页看到注册引导卡片
- 注册后自动保存本次决策记录,收藏按钮同步出现
- 将 isRegistered() 调用改为 registered 响应式状态
- 更新 ROADMAP 标记已完成
2026-02-26 14:18:32 +08:00
kurihada
4e60dc3cde
fix: 单人场景体验优化 — 跳过等待 spinner,适配结果文案
...
- SwipeDeck: userCount === 1 时不再显示"等待其他人完成选择"
- MatchResult: 单人时标题改为"帮你选好了",副标题改为"你的首选"
- MatchResult: 单人时隐藏"默契度 100%"徽章(无意义)
- 更新 ROADMAP 将 Solo 模式改为单人体验修复
2026-02-26 14:15:14 +08:00
kurihada
f8a64b3281
docs: 重写 README,对齐决策引擎定位与双模式产品形态
2026-02-26 14:08:23 +08:00
kurihada
0f83e9c6ae
feat: 匹配成功页体验优化 — 浮动操作栏、收藏、决赛引导
...
- 底部操作改为固定浮动栏,"再来一轮"和"换一批店"始终可见
- 结果卡片右上角新增收藏按钮,复用已有收藏 API
- 非全员一致时"Top N 决赛"按钮上方增加引导文案
- 更新 ROADMAP 标记已完成项,移除低优先级条目
2026-02-26 14:03:38 +08:00
kurihada
afde70c98e
fix: 分享卡片关闭按钮定位到卡片右上角
2026-02-26 13:53:07 +08:00
kurihada
08eb55ca41
feat: 添加分享结果卡片功能,形成用户增长闭环
...
- 新增 ShareCardModal 组件,支持餐厅匹配和盲盒契约两种分享卡片
- 卡片包含品牌标识、匹配结果、餐厅/想法详情、二维码
- 使用 html-to-image 生成高清 PNG,支持保存图片和 Web Share API 分享
- 餐厅图片通过 canvas 转 data URL 处理跨域
- 集成到 MatchResult(极速救场)和 BlindBox reveal(周末契约)
2026-02-26 13:50:38 +08:00
kurihada
14b0aaece4
feat: 盲盒房间体系重构 — 强制登录、独立房间、用户归属
...
- 新增 BlindBoxRoom/BlindBoxMember 模型,BlindBoxIdea 增加 userId/drawnById
- 新增房间 API(创建/加入/列表/详情),所有盲盒 API 增加认证和成员校验
- 新建盲盒大厅页面(三层引导式设计:未登录氛围页/首次创建引导/房间列表)
- 新建盲盒房间页面(成员校验/邀请分享/用户归属展示/自动聚焦)
- 首页删除契约画廊和 localStorage 盲盒逻辑,周末契约跳转到 /blindbox
- 清理旧路由 /room/[id]/blindbox
- 提取共享工具 src/lib/blindbox.ts(错误响应/房间号生成/成员校验)
- AuthModal 支持 defaultTab 参数
- 更新项目规范:新项目原则、代码优雅和复用优先
2026-02-26 12:25:32 +08:00
kurihada
11d872e72a
chore: 添加 Cursor 设计系统和项目规范规则
...
- design-system.mdc: 暗色 token 映射表、禁止白色背景、按钮分层规则
- project-conventions.mdc: 技术栈声明、Tailwind v4 语法、组件和 API 编码规范
2026-02-26 11:27:23 +08:00
kurihada
e10e3c8230
ui: 全站统一暗色主题设计系统
...
- globals.css 定义语义化 token (background/surface/elevated/border/muted/dim/accent)
- 所有页面和组件迁移至暗色 token,移除硬编码 bg-white/text-zinc-*/bg-gray-*
- RestaurantCard 和 MatchResult 适配暗色卡片风格
- 按钮颜色分层:系统CTA(accent)/模式强调(橙/紫)/危险(rose)/次级(surface)
- 修复 room 页深色文字在深背景不可见的可访问性问题
2026-02-26 11:27:18 +08:00
kurihada
7d51f5200d
feat: 新增周末契约盲盒功能,首页重构为双模式入口
...
- 新增 BlindBoxIdea 数据模型及 migration
- 新增盲盒 API (提交想法/查询/抽取)
- 新增周末契约盲盒页面 (动效震动+彩带开奖)
- 原首页功能拆分至 /panic 路由
- 首页重构为极速救场 + 周末契约双卡片入口
2026-02-26 11:27:10 +08:00
kurihada
30d5ad5ff2
ui: 缩小房间页卡片和操作按钮,适配小屏手机
2026-02-25 14:51:12 +08:00
kurihada
4f164fecdf
fix: 修复数据目录权限,确保容器用户可写入数据库
2026-02-25 14:40:43 +08:00
kurihada
45b31e9319
ui: 压缩首页布局适配小屏手机
...
- Logo 与标题改为横排显示
- 缩小图标和间距,整体高度减少
- 确保创建房间按钮在小屏上可见
2026-02-25 14:37:00 +08:00
kurihada
77914672e0
feat: 注入高德地图 API Key 到 Docker 构建和运行环境
2026-02-25 14:30:24 +08:00
kurihada
6ceedddce9
feat: 加入 nginx 外部网络,支持反向代理
2026-02-25 14:25:19 +08:00
kurihada
d2e0b2a1f9
fix: 修正 template.db 构建路径
2026-02-25 14:14:30 +08:00
kurihada
20acf045f3
fix: 构建时生成数据库模板,运行时无需 prisma CLI
2026-02-25 14:12:29 +08:00
kurihada
76a3effb5e
fix: 修复容器内 prisma CLI 路径找不到的问题
2026-02-25 14:10:40 +08:00
kurihada
9f29fec453
fix: 修复容器内 Prisma 版本不匹配导致启动失败
...
- 复制项目的 prisma 二进制到 runner 阶段,避免 npx 下载最新版
- 移除已废弃的 --skip-generate 参数
2026-02-25 13:21:51 +08:00
kurihada
f564658508
fix: 切换到 Generic Webhook Trigger 解决 403 认证问题
2026-02-25 13:13:25 +08:00
kurihada
39213bb71e
fix: 修复 Restaurant 类型转换的 TypeScript 编译错误
2026-02-25 13:11:59 +08:00