序章 · 一个人把 TourMate 做成这样
外人看这个站,容易当成「又一套 DDD 笔记」。它不是。
这是一个真实在跑的搭子出行平台:活动报名 / 取消 / 退款、帖子推荐、用户画像、群聊私聊、再在现网上接出行助手。模型不能编造活动,卡片只能来自数据库。下面按时间把历程和真正硬的部分分开讲。
1. 搭骨架(2024-11 → 2025-12)
先把 Spring Boot 收成六边形:聚合根充血、Port 向外、Trigger 只做协议。活动取消被识别成 Saga,而不是一个超大 Service。
这一段博客里已经齐,适合当「入门课」,但还不是这个项目最硬的部分。
这一段的硬点:不是分层名词,而是后来一直没破的纪律——Domain 只认 Port,换支付 / 天气 / 模型 / 审核,都不许回流污染业务。
2. 把人和钱跑通(2026-05 → 06)
占位接口开始变真。订单不再是 Map,退款有自己的聚合和状态机,PartialRefundSaga 从全 TODO 变成「先执行 → 等审批 → 再退」。
博客里有早期 Saga 文。v0.6.1 这笔「薄订单 + 厚退款」已经改写成对外篇:
3. 事件差点全丢(2026-07-03)
五个聚合仓储在 save() 末尾「贴心」clearDomainEvents()。项目用的是 Transactional Outbox,publishAll 的语义是入库,不是发出去。clear 抢跑一步,粉丝通知、审核、推荐候选池全部不会发生;主流程还是 200。
这是外人最该先读的 DDD 高光:不是你写过 Outbox,是你被它阴过。
4. 做成内容平台(2026-07)
七月用大约两周,把「发帖」拉成一条完整链路:
点赞/收藏/评论
→ user_action_log
→ T+1 兴趣画像
→ 关注 / 兴趣 / 地理 / 热门 四路召回
→ 加权打分 + MMR 打散
→ 点赞后 Redis 补丁立刻影响首页同时补了内容双轨:用户自选 category 给 App 看,系统 system_tags 给画像和召回吃。人选「美食」、正文写新疆,不能再把 food 写进系统标签。
活动侧故意不做多路召回(量太小,ROI 为负),只做人口硬过滤 + 画像重排。同样的打分范式,两种体量两套设计——这才是懂推荐,而不是抄小红书架构图。
5. 接上 IM(2026-07 末)
消息走 WuKongIM 长连接,会话列表走自己的 /api/im。重进 Tab 未读被清空,不是重连清了消息,是 list 接口把 webhook 还没回写的空摘要整表盖掉了。
6. 自然语言接到真活动(2026-08)——已经在本站
八月的节奏是「学一篇、做一刀」:
- 模型只吐 intent JSON,Java 查库出卡片(评测 43 条,意图 100%)
- 天气 / 行程:查真实事实再生成;行程用
activityRef回填真实 id,结构上编不出引用 - 手写 Function Calling 双通道,默认关;Java 编排仍是主路
- 活动匹配复用七月的画像,不给助手另起一套召回
- 向量 RAG 落地:知识库定事实、模型管忠实;Java 硬拒 + 模型软拒;审计看链路健康,不看金标准
- 入口:TourMate · 智能助手
- 迷茫时先看:心智地图与验收标尺
- 先读:这是不是 AI 应用开发 → 幻觉与 grounding → Java 编排与 Function Calling
- RAG:向量检索新手科普 → 答案准不准是谁的责任
- 桥接 DDD:线上接入不影响 DDD
给外人的阅读顺序(只看精彩)
如果你只有一个晚上:
- Outbox 事故复盘 —— DDD 不是口号
- 幻觉与 grounding —— 模型为什么编不出活动
- Java 编排与 Function Calling —— 决策权可以交模型,执行权不行
- 多路召回从 0 到 1 + 内容双轨 —— 助手能「按你口味重排」,靠的是这条底座
完整课走 DDD。推荐与画像走 内容平台。助手机制走 智能助手。
以后怎么加新文档
你把主仓或学习仓的路径丢过来,说「加进来」或「更新这篇」即可。只改本博客:接该栏最大序号 + 1,title 带同样数字,源文件不动。
故意不放进博客的
迭代主线、占位接口清单、API 契约、ADR 原文、本地验证手册、开工指令、法律协议、环境与密钥、Web 后台联调日记。那些是给你和 AI 窗口用的施工图,不是对外叙事。