Practice Project / Course Work Turned Case Study
TravelShare
把独立完成的课程项目整理成一份适合给面试官阅读的工程案例: 不只展示“我做了什么”,也展示“我怎么把它组织成一个可讲清的系统”。
Project Snapshot
为什么它值得被放进个人主页
TravelShare 面向“行前规划、行中协作、行后分享”,覆盖用户认证、旅行行程、 社交广场、即时聊天、AI 助手和后台管理。我这次不是把 repo 直接贴出来,而是把它重写成一个结构化案例。
Product Loop
它最有价值的地方,是把旅行社交做成闭环
行前规划
Trip 聚合、活动安排和路线计算组成结构化计划。
行中协作
会话、消息和实时广播支撑多人同步而不是截图沟通。
行后分享
动态广场、评论与 AI 推荐把内容沉淀成可复用资产。
- 前端基于 React 19 + Vite,后端基于 Flask + SQLAlchemy。
- 聊天依赖 Socket.IO,AI 回复通过 SSE 流式返回。
- README、docs/、doc/、PlantUML 已经形成完整展示资产。
- 这让它从“能跑的课设”变成“可讲的作品案例”。
01 / Bounded Context
系统边界先被切开,后续扩展才不会打结
认证、社交、旅行、AI、后台管理分别建模,再由 shared 提供数据库、事件总线和存储能力,说明它不是“把功能堆在一起”的课设。
- 用户、行程、社交、AI 的职责边界足够清楚。
- 后续演进时不需要把业务规则全部揉进一个模块。
- 对于招聘场景,这张图先回答“系统是怎么分块的”。
02 / Layered Design
应用层、领域层、基础设施层各自承担不同责任
Travel 模块不是直接从路由打到数据库,而是通过 TripService、聚合、仓储接口和 SqlAlchemy 实现分层协作。
- TripController 处理请求编排,不吞业务规则。
- Trip 聚合和 ItineraryService 承担核心领域逻辑。
- 地图服务和持久化细节被压在外层实现里。
03 / Social Domain
社交域覆盖动态、会话和好友关系三条主线
Post、Conversation、Friendship 三个聚合根支撑出动态广场、即时聊天和关系管理,而不是把所有互动都放进单一表结构。
- 帖子、消息、评论和值对象的关系一目了然。
- 分享、评论、聊天都能在同一个上下文内持续演进。
- 它说明这个项目的社交能力是被认真建模过的。
04 / Travel Domain
行程域把计划、活动、成员和路线统一进 Trip 聚合
Trip、TripDay、Activity 与 Transit 形成旅行计划的主模型,ItineraryService 负责路线与交通信息的协同计算。
- 活动、时间段、金额、位置都拥有独立语义。
- 多成员协作与活动编排不只是前端页面拼出来的状态。
- 这张图能直接支撑“行前规划”模块的讲解。
05 / Real-time Chat
即时聊天同时照顾了真值持久化与实时广播
消息先进入服务层完成持久化,再由 Socket.IO Handler 广播到会话双方;它不是轮询列表,而是一条完整的实时链路。
- 连接、入房、发送、写库、广播的顺序被明确画出。
- 实时体验建立在明确的服务与数据库协作之上。
- 对面试官来说,这比一句“支持聊天”更有说服力。
06 / AI Domain
AI 助手被单独建模成 app_ai 上下文
AiConversation、AiMessage、RetrievedDocument 与 MessageAttachment 共同构成 AI 会话能力,避免把模型调用直接塞进控制器。
- 会话、消息、附件与检索文档都有独立角色。
- ILlmClient 与 IRetriever 接口把外部能力隔离出来。
- 这样更适合持续替换模型或调整检索策略。
07 / RAG Pipeline
RAG 链路把检索、拼装 Prompt 和流式输出串成闭环
前端请求进入 Flask View 后,应用服务负责会话编排,领域服务执行检索与模型调用,再通过 SSE 把回答分段回送前端。
- Trips、posts、activities 都能成为检索素材。
- 不是一句“接了大模型”,而是完整的增强生成流程。
- 这张图把 AI 能力接入的工程细节讲清楚了。
08 / Persistence
AI 会话的数据层同样做了接口与实现分离
仓储接口、DAO 接口、持久化对象和仓储实现被拆成不同层,说明这个项目并没有把 AI 部分当成临时脚本来写。
- AiConversationPO 与 AiMessagePO 对应实际存储对象。
- DAO 与 Repository 分离让持久化逻辑更稳定。
- 它补足了“AI 功能可用”之外的工程可信度。
Documentation
真正拉开差距的,是它已经有了可讲解资产
README 先讲清全貌
产品闭环、技术栈、启动方式和系统概览都集中在入口。
docs / doc 双层文档
课程材料与开发者导航并存,既能答辩也能协作。
PlantUML 把复杂结构图解
上下文、时序、数据层与领域模型都已有可视化材料。
- 这说明我不仅能实现功能,还会沉淀结构化表达。
- 对新成员和面试官来说,理解成本都更低。
- 它已经超过“课程项目做完即可”的最低线。
- 也适合直接嵌进个人主页,成为稳定可访问的项目案例。
Why It Matters
我想通过 TravelShare 传达的,不只是功能完成度
这份案例更像一个信号:我能把独立完成的练习项目,从“能跑”继续推进到 “边界清楚、图文齐备、适合沟通、适合作品集展示”的工程案例。