智言发 IM 智言发 IMZHIYANFA

交付总览/源码实证

「全量源码」是可以当场核对的

这一页不放功能截图。放的是文件数、代码行数、目录分布、真实源码片段,以及全部业务表与接口的清单。统计口径写在下面,你拿到源码后可以用同一套口径复核。

业务表 132 张 业务接口 691 个 实时指令 85 个

01 / 代码量 ✓✓逐行统计 口径公开
源码实证

全量源码不是一句口号,是可以数的

下面的文件数与代码行数都按同一套口径统计:去掉空行、整行注释与块注释,排除依赖目录、构建产物与自动生成文件。你拿到源码后可以用同样的口径复核。

服务端 Go 76,271 行 335 个文件 cmd + internal + pkg,已剔除测试与自动生成代码

统计口径

下面这几条会影响你怎么读上面的数字,尤其是第一条。我们把它写出来,而不是只报一个总数。

  1. 两棵 Dart 树是同一个 App 的两份独立代码树,所以客户端的诚实说法是「约 19 万行」,相加得到的 38 万行是重复计数。
02 / 目录分布 服务端 internal 270 个文件

改哪里,一眼能定位

上表是服务端 internal 下剔除测试文件后的源码分布,合计 270 个文件。这一层是「能不能自己改」的关键:业务规则都在 service,接口注册都在 router,换存储只动 repository。

server/internal/service 76

业务规则实现:消息幂等与序号分配、撤回编辑已读漫游、群与频道权限、钱包红包、会员成长、语音房玩法、媒体转码投递、敏感词风控、推送下发

03 / 真实源码

这几段是从交付包里直接摘的

带文件路径和行号,你拿到源码可以翻到同一处对照。挑这四段是因为它们分别对应弱网不重复、少装中间件也能起、多端同时收到、内容能拦得住这四个最常被问到的问题。

消息幂等去重与会话内序号分配

server/internal/service/message.goL255-L276

弱网重发不会产生重复消息,靠的是这里先按客户端消息编号查一次幂等,再由服务端分配会话内单调序号。

	if s.redisStore != nil && msg.ClientID != "" {
		t1 := tracer.Mark()
04 / 数据库表 132 张 · 12 组 可直连自取
数据与接口

业务完整度用表和接口说话

功能截图可以摆拍,表结构和接口数量摆不了。下面是全部业务表按模块的分布,以及接口按分组的数量。

业务表 132 张 另有内部用途 6 张,未计入 建表合计 138 张

标注为内部用途的表没有计入上面的业务表统计。

01

消息与会话

13 张
messages

消息正文与元数据

conversation_states

会话状态:免打扰、置顶、已读位、清屏位

05 / 接口清单

691 个业务接口,按分组摊开

客户端 393 个,运营后台 298 个,共 49 个分组。已排除性能剖析、静态资源、健康检查与接口文档这类非业务路由。

客户端接口 393 个

语音房62

运营后台接口 298 个

会员体系管理42

消息为什么只有 7 个接口

「消息收发」只有 7 个 HTTP 接口不是漏数:消息的发送、已读、撤回、转发以及通话信令全部走 WebSocket 帧,不走 HTTP。所以衡量消息能力该看的是那 85 个 WebSocket 指令。

85 个 WebSocket 指令定义在协议编解码文件里,编号无重复。

后台开关 175 项

这 175 指键名带 enable 的功能开关,其中 117 项默认开、58 项默认关。

默认开 117 默认关 58 24 项与实现不对应 →

下一步

数字看完了,再看交付到哪一步

同一套较真的口径,我们也用来写开发进度:哪些已经交付、哪些还在排期上。两页一起看,才是完整的交付范围。