Files
EchoChat/backend/go-service/app/provider/provider.go
bujinyuan f1853f125d feat: Phase 2e-1 统一通知中心 + 我的 TabBar 聚合未读红点
后端(notify 模块)
- 新增 notify 模块:DAO/Service/Pusher 接口/Controller/Router/CleanupTask
- 数据库 DDL:notify_notifications 表 + 3 索引(user+created/user+is_read/user+category)
- 11 种 type 枚举(好友/群聊 9 种 + meeting_* 2 种预留)+ 4 种 category
- 跨模块集成:contact 3 处 Pusher(friend_request/accepted/rejected)
- 跨模块集成:group 6 处 Pusher(invite/join_request/approved/rejected/kicked/role_changed)
- WS handler 断线补偿:连接建立即推送 notify.unread.total
- 5 REST API(4 用户 + 1 管理员广播)+ 2 WS 事件(notify.new / notify.unread.total)
- 30 天已读通知定时清理(未读永久保留)
- Provider/Wire 依赖注入(NotifyPusher、NotifyConnectHook、UserInfoResolver 接口)

前端
- 新增 notify 模块:API/Pinia Store(5 分类分页缓存 + 未读数 + WS 事件)/NotifyItem/通知中心主页
- profile 入口:铃铛 badge + 菜单项 badge + 数字显示
- App.vue/login 初始化 notifyStore WS 监听;logout 调用 notifyStore.reset() 清缓存
- 清理 contact.js/group.js 中散落 toast 与冗余 notify.friend.request/group.join.request 处理
- CustomTabBar 新增 hasDot() 聚合指示器:我的 Tab 显示纯红点(无数字),
  当前聚合 notifyStore.unreadTotal,未来可扩展「资料待完善/安全提醒/新版本」等

文档
- 新增 Phase 2e 整体路线图 docs/plans/2026-04-20-phase2e-design.md
- 新增 Phase 2e-1 专用设计 docs/plans/2026-04-20-phase2e-1-design.md(§6.4 TabBar 聚合红点)
- 新增 Phase 2e-1 实施计划 docs/plans/2026-04-20-phase2e-1-implementation.plan.md
- 新增 E2E 验证报告 test-report-phase2e-1-notification.md(含 Playwright MCP 2 个现场 Bug 修复记录)
- 更新 docs/progress/CURRENT_STATUS.md、docs/api/README.md、docs/api/frontend/notify.md
- 更新 .cursor/rules/project-context.mdc、docs/plans/2026-02-27-echochat-system-design.md

其他
- .gitignore 排除 .playwright-mcp/ MCP 临时快照

架构决策
- 单端 WS 连接:沿用现有 ws.Hub,多端已读同步推迟到 Phase 2f/二期
- 跨模块依赖:contact/group → notify 严格单向(接口注入模式)
- 降级策略:Pusher 先入库后推送;WS 失败不回滚入库;入库失败仅 Warn 不影响业务

Playwright MCP 回归(4 类场景全通)
- 实时推送(admin 广播 → 1s 内前端自动插入 + 角标 +1)
- Deep-link 跳转(好友申请通知 → contact/request 页)
- 批量清零(全部已读按钮)
- TabBar 聚合红点(有未读亮/全部已读灭)与 notifyStore.unreadTotal 三层同步

Made-with: Cursor
2026-04-21 10:21:01 +08:00

148 lines
6.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package provider 提供全局依赖注入配置
// 使用 Wire 编译时依赖注入,集中管理所有模块的 Provider Set
package provider
import (
adminController "github.com/echochat/backend/app/admin/controller"
authController "github.com/echochat/backend/app/auth/controller"
"github.com/echochat/backend/app/auth/service"
contactController "github.com/echochat/backend/app/contact/controller"
fileController "github.com/echochat/backend/app/file/controller"
groupController "github.com/echochat/backend/app/group/controller"
imController "github.com/echochat/backend/app/im/controller"
imHandler "github.com/echochat/backend/app/im/handler"
notifyController "github.com/echochat/backend/app/notify/controller"
notifyService "github.com/echochat/backend/app/notify/service"
notifyTask "github.com/echochat/backend/app/notify/task"
wsApp "github.com/echochat/backend/app/ws"
"github.com/echochat/backend/config"
"github.com/echochat/backend/pkg/db"
"github.com/echochat/backend/pkg/storage"
"github.com/echochat/backend/pkg/ws"
"github.com/google/wire"
"github.com/minio/minio-go/v7"
"github.com/redis/go-redis/v9"
"gorm.io/gorm"
)
// App 应用根容器,持有基础设施组件和各模块的 Controller/Service
type App struct {
Config *config.Config
DB *gorm.DB
Redis *redis.Client
MinioClient *minio.Client // MinIO 对象存储客户端
AuthService *service.AuthService // Auth 认证服务
AuthController *authController.AuthController // 前台认证控制器
AdminAuthController *authController.AdminAuthController // 后台认证控制器
UserManageController *adminController.UserManageController // 管理端用户管理控制器
OnlineController *adminController.OnlineController // 管理端在线监控控制器
ContactManageController *adminController.ContactManageController // 管理端好友关系管理控制器
GroupManageController *adminController.GroupManageController // 管理端群组管理控制器
MessageManageController *adminController.MessageManageController // 管理端消息管理控制器
WSHandler *wsApp.Handler // WebSocket 连接处理器
Hub *ws.Hub // WebSocket Hub 连接管理
PubSub *ws.PubSub // Redis Pub/Sub 消息路由
OnlineService *wsApp.OnlineService // 在线状态管理服务
ContactController *contactController.ContactController // 联系人控制器
IMController *imController.IMController // IM 即时通讯控制器
IMEventHandler *imHandler.EventHandler // IM WS 事件处理器
OfflinePusher *imHandler.OfflinePusher // 离线消息推送器
FileController *fileController.FileController // 文件上传控制器
GroupController *groupController.GroupController // 群聊管理控制器
NotifyService *notifyService.NotifyService // 通知业务服务(兼 Pusher、ConnectHook
NotifyController *notifyController.NotificationController // 通知控制器
NotifyCleanupTask *notifyTask.CleanupTask // 通知清理定时任务
}
// NewApp 创建应用实例
func NewApp(
cfg *config.Config,
gormDB *gorm.DB,
redisClient *redis.Client,
minioClient *minio.Client,
authService *service.AuthService,
authCtrl *authController.AuthController,
adminAuthCtrl *authController.AdminAuthController,
userManageCtrl *adminController.UserManageController,
onlineCtrl *adminController.OnlineController,
contactManageCtrl *adminController.ContactManageController,
groupManageCtrl *adminController.GroupManageController,
msgManageCtrl *adminController.MessageManageController,
wsHandler *wsApp.Handler,
hub *ws.Hub,
pubsub *ws.PubSub,
onlineService *wsApp.OnlineService,
contactCtrl *contactController.ContactController,
imCtrl *imController.IMController,
imEventHandler *imHandler.EventHandler,
offlinePusher *imHandler.OfflinePusher,
fileCtrl *fileController.FileController,
groupCtrl *groupController.GroupController,
notifySvc *notifyService.NotifyService,
notifyCtrl *notifyController.NotificationController,
notifyCleanup *notifyTask.CleanupTask,
) *App {
wsHandler.SetOfflinePusher(offlinePusher)
wsHandler.SetNotifyConnectHook(notifySvc)
return &App{
Config: cfg,
DB: gormDB,
Redis: redisClient,
MinioClient: minioClient,
AuthService: authService,
AuthController: authCtrl,
AdminAuthController: adminAuthCtrl,
UserManageController: userManageCtrl,
OnlineController: onlineCtrl,
ContactManageController: contactManageCtrl,
GroupManageController: groupManageCtrl,
MessageManageController: msgManageCtrl,
WSHandler: wsHandler,
Hub: hub,
PubSub: pubsub,
OnlineService: onlineService,
ContactController: contactCtrl,
IMController: imCtrl,
IMEventHandler: imEventHandler,
OfflinePusher: offlinePusher,
FileController: fileCtrl,
GroupController: groupCtrl,
NotifyService: notifySvc,
NotifyController: notifyCtrl,
NotifyCleanupTask: notifyCleanup,
}
}
// provideDBConfig 从全局 Config 中提取 DatabaseConfig
func provideDBConfig(cfg *config.Config) *config.DatabaseConfig {
return &cfg.Database
}
// provideRedisConfig 从全局 Config 中提取 RedisConfig
func provideRedisConfig(cfg *config.Config) *config.RedisConfig {
return &cfg.Redis
}
// provideJWTConfig 从全局 Config 中提取 JWTConfig
func provideJWTConfig(cfg *config.Config) *config.JWTConfig {
return &cfg.JWT
}
// provideMinioConfig 从全局 Config 中提取 MinioConfig
func provideMinioConfig(cfg *config.Config) *config.MinioConfig {
return &cfg.Minio
}
// InfraSet 基础设施层 Provider Set
var InfraSet = wire.NewSet(
provideDBConfig,
provideRedisConfig,
provideJWTConfig,
provideMinioConfig,
db.NewPostgres,
db.NewRedis,
storage.NewMinioClient,
NewApp,
)