VIBEMATE · AI HACKATHON MVP

数据库设计与核心业务链路

基于最新“搭子”设计稿逐页收敛后的 MVP 数据模型。只持久化真实协作数据;固定文案、探索演示内容和创建前 AI 临时会话由前端或外部接口承担。

最新设计稿
6 张核心表Authing 无状态鉴权登录后才可进入应用AI 读取完整群聊暂不含投票与事件确认

MVP 数据边界

优先支撑“登录—创建行程—邀请—群聊—搭搭推荐 POI—更新正式行程”的闭环。

数据库持久化

  • 用户、头像及 Authing 身份映射
  • 行程、封面、成员与邀请
  • 群聊消息和 AI POI 推荐卡片
  • 最终采纳的正式行程事件

前端或临时状态

  • 创建前 AI 对话及推荐草稿
  • 首页固定标签、插画和提示词
  • “行程有更新”等演示状态
  • 探索页内容和搜索演示数据

本期明确不做

  • 多人投票与待决策模型
  • 事件确认及“想去”真实统计
  • 群聊已读游标和已读回执
  • 社区发布、点赞、收藏、评论

逐页覆盖结论

“前端承担”表示符合当前 MVP 取舍,不代表未来不能服务端化。

页面处理方式数据库落点本轮调整
01 首页 · 我的行程后端数据outings、outing_members、vibemate_users新增成员头像、行程封面
02 邀请 · 快速加入后端数据outing_invitations、outing_members统一随机 invite_code;未登录先跳登录
03 已有行程 · 详情后端数据outings、outing_eventsPOI 展示快照保存在 poi_json
04 AI 简单聊前端临时创建后仅保存 raw_intent不引入草稿行程或 AI 会话表
05 AI 推荐 · 创建行程创建时落库outings、outing_members、outing_events事件时间允许暂未确定
06 多人群聊后端数据outing_messages、outing_events不增加 last_read_message_id
07 搭搭推荐 POI消息卡片outing_messages.payload_json暂不做投票和确认
09 探索前端 / 外部接口采纳后才进入 outing_events不建设社区内容域
本轮数据模型调整新增 vibemate_users.avatar_url、outings.cover_url;统一 outing_invitations.invite_code;删除 MVP 不使用的 event_confirmations。核心表由 7 张收敛为 6 张。

核心数据关系

点击表可高亮相关关系;再次点击同一张表或点击画布空白即可取消。连线说明统一放在图下,避免遮挡关系线。

PK主键UK唯一约束FK外键引用

Authing 登录与业务鉴权

未登录用户不能进入任何应用页面。打开邀请链接也先登录,成功后返回原邀请地址。

Expo / H5
Authing
Flask 业务服务
MySQL
1未登录访问应用或邀请地址,记录目标地址并跳转手机号登录。redirect_uri
2Authing 完成短信验证并签发 Access Token;其中 sub 是 Authing 用户唯一标识。Authing JWT
3客户端请求业务接口时携带 Access Token。Bearer Token
4Flask 使用缓存的 Authing JWKS 公钥本地校验签名、签发方、受众和有效期。JWT verify
5后端用 sub 查询 vibemate_users.authing_user_id,得到本地用户。SELECT user
6鉴权成功后再执行邀请、行程和群聊权限校验。business API

Token 保存

  • Expo:Refresh Token 进入安全存储,Access Token 仅放运行内存。
  • H5:优先由安全 Cookie/Authing SDK 管理刷新凭证。
  • Access Token 不写入业务数据库;刷新失败返回登录页。

为什么没有 auth_sessions

Authing 负责签发和刷新 Token,业务服务本地验证 JWT,所以当前不需要服务器会话表。设备管理、强制下线以后再按需求补充。

核心事务

只保留 MVP 真正执行的链路。

创建行程

接收最终 AI 结果创建前聊天在客户端
→
创建 outings
→
写入 owner 成员
→
批量写正式事件

处理 direct 邀请

锁定邀请记录校验 pending、接收人和有效期
→
接受或拒绝
→
接受时幂等写成员

搭搭推荐并更新行程

读取完整 Feed
→
推荐 POI 卡片写 payload_json
→
继续讨论
→
采纳后写事件

状态约定

行程 outingsplanning

正在讨论和安排。

ongoing

行程正在进行。

completed

行程已经结束。

cancelled

行程被取消。

成员 outing_membersactive

当前有效成员。

left

主动退出。

removed

被组织者移出。

拒绝邀请属于邀请状态,不创建成员记录。

邀请 outing_invitationsdirect

pending → accepted / rejected,也可 revoked / expired。

share_link

active → revoked / expired;单个用户加入不会使共享链接失效。

关键一致性规则

成员幂等

UNIQUE(outing_id, user_id),重复加入不会产生重复成员。

邀请安全

invite_code 随机且唯一;后端仍校验登录、邀请类型、接收人和有效期。

消息幂等

UNIQUE(outing_id, client_message_id),发送重试不会重复写入。

AI 串行更新

同一行程使用应用锁或 MySQL GET_LOCK,避免两次更新互相覆盖。

六张核心表的字段与约束

选择表查看完整字段、约束及索引用途。