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,避免两次更新互相覆盖。

六张核心表的字段与约束

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