Music Bar Street · 音乐酒吧街Demo · UI · GitHub
下载完整资料包联系作者 / 讨论合作

系统设计

一期用一个 Spring Boot 应用。账号、资料、撮合、订单、媒体、消息和会员各自负责自己的数据与规则,跨模块调用明确的业务方法。先不拆微服务,也不单独建管理员服务。

系统架构图 · 部署图

已确定和建议采用的选择

前端可以采用跨端方案,接口不依赖 Flutter、React Native 或 UniApp 的某一种。

模块怎么分

模块 自己负责 对外提供
identity 登录、会话、身份、账号状态 当前操作者、身份与权限判断
profile 酒吧、艺人、审核、作品、档期说明 可公开资料、审核状态、档期检查
matching 需求、投递、邀约、洽谈与条件版本 建立洽谈、修改条件、双方确认
order 确认订单、档期占用、完成、取消和争议 订单详情、合法的状态变更、事件记录
media 资源所有者、上传状态、访问授权 上传凭证、可用资源、短期访问地址
messaging 会话、成员、文字消息、未读游标 发消息、按游标读消息
membership 套餐、权益、购买意向、有效期 当前权益、发布资格检查
reporting 需求、合作、取消、服务费等汇总 只读看板;不修改业务状态

控制器处理输入和 HTTP,业务方法处理规则,Repository 处理数据。账号、场地和艺人 ID 从登录身份与资源归属推导,不能只相信请求体传来的 ID。

模块之间的调用

双方确认时,matching 核对条件版本,order 创建订单并占用档期,整个关键写入在同一个 PG 事务内完成。成功提交后,再提醒双方。消息发送失败不能让一个已成功创建的订单消失。

媒体上传由 media 发授权,profile 只绑定属于当前操作者、用途正确且已可用的资源。会员模块只回答有没有某项权益,不改撮合或订单数据。

审核和违规下架放在所属模块的受控运营接口里。每次操作记录操作者、原因和时间。只读看板不直接开放给普通用户。

哪些扩展点现在留

媒体服务、登录验证、通知、支付和 IM 这些外部服务留适配接口。需求、订单等模块之间只在真正需要调用的地方定义接口,不给每个类都套一层抽象。

可靠通知任务可以使用 PG 中的任务记录和应用内重试,按需加入;一期不要求部署 MQ。搜索先用 PG 的筛选与索引,达到实际瓶颈再换。

金额规则、取消规则和权益配置由业务模块持有,不能散落在前端。变化会影响已确认订单时,要保存历史版本。

编码约定

提交前执行格式、静态检查和必要测试。命名用业务含义,公开接口写清输入、结果与错误;状态变更集中到业务方法,避免任意 setter。数据库迁移可从空库建立开发环境。

日志不打印验证码、服务商密钥、完整证件和私聊正文。接口返回业务错误码与 requestId,便于从一次请求定位问题。