当前位置: 首页 > ops >正文

【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 实现消息的创建、列表查询、单条检索和批量删除功能。使用 MessageCenterSerializerMessageCenterTargetUserSerializer 两个序列化器,分别处理消息基本信息与用户阅读状态信息。模块支持发送时指定用户、部门、角色等维度,且在用户查看消息时可以更新为已读状态,满足实际业务中对内部通知及时性与准确性的要求。

模块职责说明
消息中心管理支持发布站内通知消息,关联多个用户、部门或角色
消息阅读状态管理记录用户是否已读每一条站内消息
序列化器定义标准化消息与关联用户数据格式
自定义查询集根据登录用户过滤消息列表,保障信息隔离性
支持批量更新状态可批量将多条未读消息标记为已读

在需要后台推送通知给指定用户群体,或需要记录用户是否阅读过特定消息的业务场景中使用 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 推送未封装统一接口,扩展新推送方式较麻烦。用户阅读状态更新与消息读取绑定过紧,存在一定数据一致性风险。重构时可引入领域事件或消息中间件提升健壮性。

http://www.xdnf.cn/news/13505.html

相关文章:

  • 与算法相关的一些数学物理理论知识
  • mysql DQL(javaweb第七天)
  • 2025年春季学期《算法分析与设计》练习15
  • Docker快速构建并启动Springboot程序,快速发布和上线/
  • OM6629 是一款针对蓝牙低功耗和专有 2.4GHz 系统级芯片(SoC)解决方案
  • 汉诺塔 (easy)
  • 根据 LiDAR 株高数据计算植被生物量
  • Koji构建系统宏定义注入与Tag体系解析
  • GEO行业中的STREAM框架解析:内容一致性得分(A)如何实现全渠道品牌信息的协同与统一
  • LangGraph基础知识(Reducer/MessageGraph)(二)
  • 机器学习赋能的智能光子学器件系统研究与应用
  • 开疆智能ModbusTCP转Canopen网关连接AGV地标传感器
  • HGAdmin无法连接本地数据库解决方式(APP)
  • Linux操作系统基线检查与安全加固概述
  • ZYNQ学习记录FPGA(三)状态机
  • 梯度范数的作用
  • P1186 玛丽卡
  • Python编程基石:整型、浮点、字符串与布尔值完全解读
  • linux学习第20天(进程间通信,管道)
  • MYSQL多表查询
  • HashMap 核心实现原理分析
  • 【翻译】图解deepseek-R1
  • 组织结构图软件:数据驱动的可视化架构管理工具
  • 洛谷P1093【NOIP2007 普及组】奖学金
  • 560. 和为K的子数组
  • Flink 系列之二十七 - Flink SQL - 中间算子:OVER聚合
  • 国内电商API接口平台排名与解析
  • 2025年深度学习+多目标优化最新创新思路
  • 学习笔记087——Java接口和抽象类的区别和使用
  • 对比**CMake** 和 **PlatformIO** 构建嵌入式项目方式