【Dv3Admin】系统视图消息中心API文件解析
内部通知系统在管理后台应用中不可或缺,既要保证消息精准投递,又需兼顾阅读状态追踪。基于 Django 和 DRF 实现的消息中心模块,通过灵活的多对多关系,支撑部门、角色、用户维度的消息推送。
本文解析 dvadmin/system/views/message_center.py
模块,涵盖消息发布、用户关联、阅读状态更新及 WebSocket 实时推送机制。围绕源码结构,剖析模块设计思路及其支撑的实际业务场景。
文章目录
- message_center.py
- 项目源码解析
- 应用案例
- 总结
message_center.py
本系统是基于 Django 框架搭建的后台管理系统,支持站内消息推送与通知功能。dvadmin/system/views/message_center.py
文件负责管理消息中心模块,处理站内消息的创建、分发、阅读状态更新等操作。该模块通过标准的 ViewSet 形式封装消息管理逻辑,支持多角色、多部门、多用户的消息发送机制,确保系统内部通知精准触达目标对象。
项目特点 | 描述 |
---|---|
技术栈 | Django + DRF |
功能定位 | 管理站内消息推送、消息阅读状态 |
支持的发送范围 | 目标用户、目标部门、目标角色 |
扩展性设计 | 通过中间表关联,实现多对多灵活关联 |
dvadmin/system/views/message_center.py
文件定义了消息中心模块的视图层逻辑。模块通过 MessageCenterViewSet
实现消息的创建、列表查询、单条检索和批量删除功能。使用 MessageCenterSerializer
和 MessageCenterTargetUserSerializer
两个序列化器,分别处理消息基本信息与用户阅读状态信息。模块支持发送时指定用户、部门、角色等维度,且在用户查看消息时可以更新为已读状态,满足实际业务中对内部通知及时性与准确性的要求。
模块职责 | 说明 |
---|---|
消息中心管理 | 支持发布站内通知消息,关联多个用户、部门或角色 |
消息阅读状态管理 | 记录用户是否已读每一条站内消息 |
序列化器定义 | 标准化消息与关联用户数据格式 |
自定义查询集 | 根据登录用户过滤消息列表,保障信息隔离性 |
支持批量更新状态 | 可批量将多条未读消息标记为已读 |
在需要后台推送通知给指定用户群体,或需要记录用户是否阅读过特定消息的业务场景中使用 dvadmin/system/views/message_center.py
提供的功能。例如:系统异常警告通知、运营活动消息推送、账户变动提醒等。通过后台发送消息,可快速通知到指定部门或角色下的所有成员,并能查看哪些用户已读或未读,便于后续数据分析与反馈。
使用场景 | 说明 |
---|---|
后台推送重要公告 | 系统管理员发布系统更新通知,要求所有用户查阅 |
账户异常登录通知 | 账户异地登录时,向用户推送安全提醒 |
运营活动营销推送 | 面向特定部门或角色推送优惠信息或活动通告 |
部门内部沟通 | 部门经理推送内部通知,仅限本部门员工接收 |
消息阅读率分析 | 统计用户阅读情况,辅助评估通知的触达效果 |
项目源码解析
消息中心序列化器
用于将消息中心对象序列化为前端可识别的数据格式,支持动态解析角色、用户、部门信息,同时标记消息是否已读。依赖 MessageCenter
模型及其他序列化器,便于展示丰富的关联数据结构,且可以灵活扩展。
class MessageCenterSerializer(CustomModelSerializer):role_info = DynamicSerializerMethodField()user_info = DynamicSerializerMethodField()dept_info = DynamicSerializerMethodField()is_read = serializers.BooleanField(read_only=True, source='target_user__is_read')class Meta:model = MessageCenterfields = "__all__"read_only_fields = ["id"]
目标用户序列化器
主要用于序列化消息中心与用户关联的中间表数据。结构简单直白,只做基本字段映射,不做额外处理,方便后续进行批量生成与管理。
class MessageCenterTargetUserSerializer(CustomModelSerializer):class Meta:model = MessageCenterTargetUserfields = "__all__"read_only_fields = ["id"]
目标用户消息查看序列化器
专门为“用户接收消息列表”定制,增加了是否已读状态标记,同时动态附加角色、部门、用户信息。依赖当前请求用户上下文进行状态判断,是消息中心阅读状态管理的核心模块之一。
class MessageCenterTargetUserListSerializer(CustomModelSerializer):role_info = DynamicSerializerMethodField()user_info = DynamicSerializerMethodField()dept_info = DynamicSerializerMethodField()is_read = serializers.SerializerMethodField()def get_is_read(self, instance):user_id = self.request.user.idmessage_center_id = instance.idqueryset = MessageCenterTargetUser.objects.filter(messagecenter__id=message_center_id, users_id=user_id).first()if queryset:return queryset.is_readreturn Falseclass Meta:model = MessageCenterfields = "__all__"read_only_fields = ["id"]
封装了消息中心通过 WebSocket 向指定用户推送通知的功能,依赖 Django Channels,异步同步切换处理。对外接口统一,便于不同模块复用和二次开发。
def websocket_push(user_id, message):username = "user_" + str(user_id)channel_layer = get_channel_layer()async_to_sync(channel_layer.group_send)(username,{"type": "push.message","json": message})
消息新增逻辑序列化器
处理新增消息时,根据目标类型动态生成目标用户列表,并批量创建关联记录。支持按角色、部门、全体用户推送,同时发送实时 WebSocket 消息,保证数据一致性与实时性。
class MessageCenterCreateSerializer(CustomModelSerializer):def save(self, **kwargs):data = super().save(**kwargs)initial_data = self.initial_datatarget_type = initial_data.get('target_type')users = initial_data.get('target_user', [])if target_type in [1]:target_role = initial_data.get('target_role', [])users = Users.objects.filter(role__id__in=target_role).values_list('id', flat=True)if target_type in [2]:target_dept = initial_data.get('target_dept', [])users = Users.objects.filter(dept__id__in=target_dept).values_list('id', flat=True)if target_type in [3]:users = Users.objects.values_list('id', flat=True)targetuser_data = [{"messagecenter": data.id, "users": user} for user in users]targetuser_instance = MessageCenterTargetUserSerializer(data=targetuser_data, many=True, request=self.request)targetuser_instance.is_valid(raise_exception=True)targetuser_instance.save()for user in users:unread_count = MessageCenterTargetUser.objects.filter(users__id=user, is_read=False).count()websocket_push(user, message={"sender": 'system', "contentType": 'SYSTEM', "content": '您有一条新消息~', "unread": unread_count})return dataclass Meta:model = MessageCenterfields = "__all__"read_only_fields = ["id"]
消息中心接口管理类
统一管理消息中心的查询、新增、查看、删除等操作。根据不同接口动作,定制返回数据,并结合 WebSocket 推送未读消息数变化。与用户模型、中间表、消息实时推送系统协作紧密,是消息中心核心功能控制器。
class MessageCenterViewSet(CustomModelViewSet):queryset = MessageCenter.objects.order_by('create_datetime')serializer_class = MessageCenterSerializercreate_serializer_class = MessageCenterCreateSerializerextra_filter_backends = []def get_queryset(self):if self.action == 'list':return MessageCenter.objects.filter(creator=self.request.user.id).all()return MessageCenter.objects.all()
用户查看某条消息时,自动将阅读状态设置为已读,同时推送 WebSocket 通知更新前端未读数量。通过消息 ID 和当前用户 ID 精确筛选,确保数据安全与一致性。
def retrieve(self, request, *args, **kwargs):pk = kwargs.get('pk')user_id = self.request.user.idqueryset = MessageCenterTargetUser.objects.filter(users__id=user_id, messagecenter__id=pk).first()if queryset:queryset.is_read = Truequeryset.save()instance = self.get_object()serializer = self.get_serializer(instance)unread_count = MessageCenterTargetUser.objects.filter(users__id=user_id, is_read=False).count()websocket_push(user_id, message={"sender": 'system', "contentType": 'TEXT', "content": '您查看了一条消息~', "unread": unread_count})return DetailResponse(data=serializer.data, msg="获取成功")
查询当前登录用户收到的所有消息,支持分页返回,默认按时间排序。方便用户查看个人消息记录,优化数据加载体验。
@action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])def get_self_receive(self, request):self_user_id = self.request.user.idqueryset = MessageCenter.objects.filter(target_user__id=self_user_id)page = self.paginate_queryset(queryset)if page is not None:serializer = MessageCenterTargetUserListSerializer(page, many=True, request=request)return self.get_paginated_response(serializer.data)serializer = MessageCenterTargetUserListSerializer(queryset, many=True, request=request)return SuccessResponse(data=serializer.data, msg="获取成功")
拉取当前用户最新收到的一条消息,用于前端展示“新消息提醒”,提升系统交互体验。接口简单直观,返回最后一条未读或最近创建的消息记录。
@action(methods=['GET'], detail=False, permission_classes=[IsAuthenticated])def get_newest_msg(self, request):self_user_id = self.request.user.idqueryset = MessageCenterTargetUser.objects.filter(users__id=self_user_id).order_by('create_datetime').last()data = Noneif queryset:serializer = MessageCenterTargetUserListSerializer(queryset.messagecenter, many=False, request=request)data = serializer.datareturn DetailResponse(data=data, msg="获取成功")
应用案例
内部消息推送与阅读追踪机制在后台系统中的应用
在管理后台系统中,通知系统扮演着关键的信息流通角色。通过 dvadmin/system/views/message_center.py
模块,系统实现了从消息创建、发送、推送到阅读状态追踪的完整闭环。模块支持按角色、部门、用户进行精准推送,用户收到的每一条消息均可被记录和追踪阅读状态,管理员可在后台查看哪些消息已被阅读,哪些仍未读,从而提升通知的执行力与覆盖度。
功能点 | 内容描述 |
---|---|
场景需求 | 实现通知系统的信息流通闭环,确保消息精准推送与阅读状态追踪,提升通知的执行力与覆盖度。 |
核心模块 | dvadmin/system/views/message_center.py :实现消息创建、发送、推送与阅读状态追踪的完整闭环。 |
支持功能 | - 精准推送:支持按角色、部门、用户进行消息推送。 |
- 阅读状态追踪:记录每条消息的阅读状态,管理员可查看哪些消息已读或未读。 | |
- 新消息提醒:通过 WebSocket 实时推送新消息提醒。 | |
- 未读消息更新:用户点击阅读后,后端标记消息已读,并推送未读消息数量变化。 | |
消息管理 | - 中间表记录:消息创建后自动生成中间表记录,用于管理用户阅读状态。 |
- 分页查询与最近消息:提供接口支持分页查询接收消息及获取最新消息,便于前端构建消息中心视图。 | |
前端交互 | - WebSocket 实时展示新消息提醒。 - 用户点击消息后,前端同步更新未读消息数量与阅读状态。 |
应用场景 | - 系统公告推送。 - 部门或用户的任务通知。 - 精准消息推送支持个性化应用场景,如审批提醒或警告通知。 |
优势 | - 提升通知执行力与覆盖度。 - 实现用户消息的精准推送与全流程追踪,增强系统可靠性与易用性。 |
扩展能力 | - 支持消息模板配置,用于快速创建常用通知。 - 可结合定时任务实现延迟推送或周期性消息推送。 |
消息创建后,系统自动为目标用户生成中间表记录,便于管理个体阅读状态。用户接收到消息后,前端页面通过 WebSocket 展示新消息提醒;在用户点击阅读后,后端会标记该条消息为已读,并推送未读消息数量变化,前端同步更新展示。模块还提供分页查询用户接收消息、获取最近新消息等接口,方便前端构建消息中心视图。
业务流程中的实际接口调用与数据更新逻辑
系统管理员通过后台创建一条部门通知:
POST /api/system/message_center/{"title": "系统更新通知","content": "系统将在今晚12点升级维护","target_type": 2,"target_dept": [5],"contentType": "TEXT"
}
此请求由 MessageCenterCreateSerializer
处理,根据 target_type
自动查找部门 5 下的所有用户,并为每个用户创建一条关联记录:
users = Users.objects.filter(dept__id__in=[5]).values_list('id', flat=True)
targetuser_data = [{"messagecenter": data.id, "users": user} for user in users]
消息发布成功后,系统通过 websocket_push(user, ...)
实时向目标用户推送通知,前端页面立即收到新消息提醒。
用户登录系统后,前端调用以下接口获取其接收的全部消息:
GET /api/system/message_center/get_self_receive/
接口自动筛选当前用户为接收者的所有消息,通过分页返回已读/未读状态与详细内容,渲染至消息中心列表页。
当用户点击某条通知进入详情页时,系统调用:
GET /api/system/message_center/{id}/
该请求在后端触发 retrieve
方法,自动将对应 MessageCenterTargetUser
记录中的 is_read
字段更新为 True
,并再次通过 WebSocket 向用户推送未读数量变化消息,实现交互反馈闭环。
前端还可调用:
GET /api/system/message_center/get_newest_msg/
实时展示“您有一条新消息”提醒,提升系统的互动性和响应性。该机制被广泛应用于系统公告、账号风险提醒、审批流程通知等业务流程中,显著提升用户响应效率和系统触达率。
总结
模块通过 ViewSet 管理消息生命周期,结合序列化器灵活处理用户、角色、部门的关联关系。实时推送与阅读状态管理提升用户体验,支持批量操作与高效查询。整体架构清晰,扩展性好,符合中大型后台系统的需求。
模块内逻辑聚合度高,部分职责未有效分层,导致维护成本上升。WebSocket 推送未封装统一接口,扩展新推送方式较麻烦。用户阅读状态更新与消息读取绑定过紧,存在一定数据一致性风险。重构时可引入领域事件或消息中间件提升健壮性。