- 更新时间:2026-02-08
- 代码分支:
dev(HEAD:d61d34b) - 评估范围:
IMChat/(iOS SwiftUI)+backend/(Go + Gin + GORM) - 当前结论:项目已进入“可持续迭代”阶段,课程演示/内部联调可用;若要生产上线,需先补齐配置治理、CORS、响应统一、测试与可观测性。
- 架构分层已落地
- 前端采用
App / Core / Features / Shared分层,核心依赖通过AppContainer装配。 - 后端采用
router -> handler -> service -> model主路径,WS 由独立Hub管理。
- HTTP/WS 鉴权链路已打通
- HTTP:
backend/internal/middleware/auth.go统一校验Authorization: Bearer <token>并注入userID。 - WS:
/ws复用同一鉴权中间件,不再信任 query 参数中的用户身份。
- 聊天主链路可用
- 历史消息分页:
/api/messages已支持page/pageSize。 - 实时消息确认:WS 支持
clientMessageId + messageId回执,前端可替换乐观消息。 - 弱网可用性:
WebSocketService支持重连、心跳、离线发送队列。
- 个人资料链路可用
- 头像更新已形成两段式闭环:
/api/upload->/api/user/avatar。 - 前端成功后会同步更新会话中的当前用户头像。
- 聊天页滚动留白优化
- 文件:
IMChat/IMChat/Features/Chat/Presentation/ChatRoomView.swift - 现状:根据消息数量动态调整顶部留白,减少“少量消息时被头部遮挡”和“消息多时顶部黑边过大”。
- 个人页统计卡片宽度微调
- 文件:
IMChat/IMChat/Features/Profile/Presentation/ProfileView.swift - 现状:统计卡容器
maxWidth从420调整为380,改善小屏展示。
- 文档文件调整
Architecture_Review_Frontend_Backend_2026-02-07.md已删除(工作区状态)。- 当前文档以
技术文档.md为主。
目录职责:
- 应用壳层:
IMChat/IMChat/App/ - 基础能力层:
IMChat/IMChat/Core/ - 业务模块层:
IMChat/IMChat/Features/ - 共享层:
IMChat/IMChat/Shared/
关键入口:
- 依赖装配:
IMChat/IMChat/Core/DI/AppContainer.swift - 路由切换:
IMChat/IMChat/App/ContentView.swift - 会话状态:
IMChat/IMChat/Core/Session/AppSessionStore.swift - 网络层:
IMChat/IMChat/Core/Networking/APIClient.swift - 实时层:
IMChat/IMChat/Core/Realtime/WebSocketService.swift
目录职责:
- 启动入口:
backend/cmd/server/main.go - 路由层:
backend/internal/router/router.go - 处理层:
backend/internal/handlers/ - 业务层:
backend/internal/service/ - 数据层:
backend/internal/models/ - 实时层:
backend/internal/ws/
关键入口:
- 配置加载:
backend/internal/config/config.go - 鉴权中间件:
backend/internal/middleware/auth.go - WS 主循环:
backend/internal/ws/hub.go - 统一响应:
backend/pkg/response/response.go
- 已对齐
- 鉴权:Bearer token(HTTP + WS)。
- 历史消息:
receiverId/page/pageSize。 - 消息确认:
clientMessageId/messageId。
- 未完全对齐
- 上传接口仍为 raw JSON(
{"url":"..."}),其他接口为code/msg/data包装。
- 登录/注册后前端保存 token 和 user,并立即建立 WS。
- 启动时
restoreSession()会恢复本地会话并尝试重连 WS。
对应文件:
IMChat/IMChat/Features/Auth/Presentation/AuthViewModel.swiftIMChat/IMChat/Core/Session/AppSessionStore.swiftIMChat/IMChat/Core/Session/SessionStorage.swift
- 首屏加载第 1 页历史。
- 顶部触发增量分页。
- 发送时先本地乐观插入,再由 WS 回执替换。
对应文件:
IMChat/IMChat/Features/Chat/Presentation/ChatViewModel.swiftIMChat/IMChat/Features/Chat/Data/ChatRepository.swiftbackend/internal/handlers/message.gobackend/internal/ws/hub.go
- 第一步:文件上传,返回可访问 URL。
- 第二步:写入用户头像字段并同步前端会话。
对应文件:
IMChat/IMChat/Features/Profile/Data/ProfileRepository.swiftbackend/internal/handlers/upload.gobackend/internal/handlers/user.go
- 配置治理未闭环
- 现状:
backend/.env、backend/config.yaml存在本地明文配置。 - 缺口:未提供可提交模板
backend/.env.example、backend/config.example.yaml。 - 风险:协作环境不一致、敏感信息误用或误传。
- CORS 配置冲突
- 文件:
backend/internal/router/router.go - 问题:
Access-Control-Allow-Origin: *与Allow-Credentials: true同时存在。 - 风险:浏览器行为不确定,生产跨域策略不可控。
- 响应风格不统一
- 文件:
backend/internal/handlers/upload.go - 问题:上传接口返回 raw JSON,其他接口返回统一包装体。
- 影响:前端网络层被迫维护
wrapped/raw双解析路径。
- 分层边界未完全收敛
- 文件:
backend/internal/handlers/user.go、backend/internal/handlers/user_list.go、backend/internal/ws/client.go - 问题:handler/WS 仍直接访问 model/DB。
- 影响:业务逻辑分散,测试与维护成本升高。
- 前端环境配置硬编码
- 文件:
IMChat/IMChat/App/Config/Constants.swift - 问题:
serverIP为固定值。 - 影响:切换网络环境需要改代码重编译,联调成本高。
- 自动化测试缺失
- 现状:未发现后端
_test.go;未发现前端*Tests.swift。 - 风险:重构回归无法快速发现。
- 可观测性不足
- 现状:缺 request_id/user_id/latency 等结构化日志字段和基础指标。
- 风险:线上问题定位慢。
- 补模板配置文件
- 新增:
backend/.env.example、backend/config.example.yaml。 - 验收标准:新机器仅按模板即可启动后端。
- 修复 CORS
- 改为按环境白名单 origin,不使用
* + credentials组合。 - 验收标准:浏览器跨域行为稳定,可明确限制来源。
- 统一上传接口响应
/api/upload改为response.Success(c, gin.H{"url": url})同风格返回。- 验收标准:前端
APIClient可移除 raw 分支(或显著收敛)。
- 细化业务错误码
- 针对鉴权、参数、资源冲突等常见错误补细粒度业务码。
- 验收标准:前端可按业务码做稳定提示与兜底逻辑。
- 增加基础测试
- 后端先覆盖
auth middleware、message pagination、upload handler。 - 前端先覆盖
AuthViewModel、ChatViewModel核心状态流。
- 增加关键日志字段
- 至少覆盖
request_id、user_id、latency_ms、path。
- 以“课程/演示/内部联调”为目标:当前版本已可稳定推进,且架构方向正确。
- 以“生产上线”为目标:先完成 P0 + P1,再评估灰度发布。
- 当前最值得优先做的两件事:配置治理模板化 + CORS/响应契约统一。
- 先读入口:
IMChat/IMChat/App/IMChatApp.swift、backend/cmd/server/main.go - 再读状态与通信骨架:
IMChat/IMChat/Core/DI/AppContainer.swift、IMChat/IMChat/Core/Realtime/WebSocketService.swift、backend/internal/ws/hub.go - 再读核心业务:
IMChat/IMChat/Features/Chat/Presentation/ChatViewModel.swift、backend/internal/handlers/message.go - 最后读风险点:
backend/internal/router/router.go、backend/internal/handlers/upload.go、IMChat/IMChat/App/Config/Constants.swift