diff --git a/dvadmin-backend/apps/op_drf/models.py b/dvadmin-backend/apps/op_drf/models.py index 1e35373..a8473e5 100644 --- a/dvadmin-backend/apps/op_drf/models.py +++ b/dvadmin-backend/apps/op_drf/models.py @@ -25,7 +25,7 @@ class CoreModel(models.Model): """ description = DescriptionField() # 描述 creator = models.ForeignKey(to='permission.UserProfile', related_query_name='creator_query', null=True, - verbose_name='创建者', on_delete=SET_NULL,db_constraint=False) # 创建者 + verbose_name='创建者', on_delete=SET_NULL, db_constraint=False) # 创建者 modifier = ModifierCharField() # 修改者 update_datetime = UpdateDateTimeField() # 修改时间 create_datetime = CreateDateTimeField() # 创建时间 diff --git a/dvadmin-backend/apps/system/models/__init__.py b/dvadmin-backend/apps/system/models/__init__.py index ee29d6a..69188a7 100644 --- a/dvadmin-backend/apps/system/models/__init__.py +++ b/dvadmin-backend/apps/system/models/__init__.py @@ -3,3 +3,5 @@ from ..models.dict_data import DictData from ..models.dict_details import DictDetails from ..models.web_set import WebSet from ..models.save_file import SaveFile +from ..models.message_push import MessagePush + diff --git a/dvadmin-backend/apps/system/models/message_push.py b/dvadmin-backend/apps/system/models/message_push.py new file mode 100644 index 0000000..d9f0c95 --- /dev/null +++ b/dvadmin-backend/apps/system/models/message_push.py @@ -0,0 +1,25 @@ +from django.db.models import * + +from apps.op_drf.models import CoreModel + +""" +消息通知模型 +""" + + +class MessagePush(CoreModel): + content = TextField(verbose_name="通知内容") + title = CharField(max_length=128, verbose_name="通知标题") + is_read = BooleanField(default=False, verbose_name="是否已读") + message_type = CharField(max_length=64, verbose_name="消息类型") + is_reviewed = BooleanField(default=False, verbose_name="是否审核") + is_send = BooleanField(default=False, verbose_name="是否已发送") + recipient_id = ManyToManyField(to="permission.UserProfile", db_constraint=False, null=True, blank=True, + related_name="recipient", related_query_name="recipient_query") + + class Meta: + verbose_name = '消息通知' + verbose_name_plural = verbose_name + + def __str__(self): + return f"{self.title}" diff --git a/dvadmin-backend/apps/system/serializers.py b/dvadmin-backend/apps/system/serializers.py index 4818c65..258d3b1 100644 --- a/dvadmin-backend/apps/system/serializers.py +++ b/dvadmin-backend/apps/system/serializers.py @@ -1,12 +1,13 @@ from rest_framework import serializers from apps.op_drf.serializers import CustomModelSerializer -from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile - +from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush # ================================================= # # ************** 字典管理 序列化器 ************** # # ================================================= # +from permission.serializers import UserProfileSerializer + class DictDataSerializer(CustomModelSerializer): """ @@ -105,7 +106,7 @@ class ExportConfigSettingsSerializer(CustomModelSerializer): class Meta: model = ConfigSettings fields = ( - 'id', 'configName', 'configKey', 'configValue', 'configType', 'status', 'creator', 'modifier', 'remark') + 'id', 'configName', 'configKey', 'configValue', 'configType', 'status', 'creator', 'modifier', 'remark') class ConfigSettingsCreateUpdateSerializer(CustomModelSerializer): @@ -152,3 +153,22 @@ class SaveFileCreateUpdateSerializer(CustomModelSerializer): class Meta: model = SaveFile fields = '__all__' + + +class MessagePushSerializer(CustomModelSerializer): + """消息通知 序列化器""" + + # recipient_id = UserProfileSerializer() + class Meta: + model = MessagePush + fields = "__all__" + depth = 1 + + def save(self, **kwargs): + return super().save(**kwargs) + + +class MessagePushCreateUpdateSerializer(CustomModelSerializer): + class Meta: + model = MessagePush + fields = "__all__" diff --git a/dvadmin-backend/apps/system/urls.py b/dvadmin-backend/apps/system/urls.py index edc1ab0..e678c6a 100644 --- a/dvadmin-backend/apps/system/urls.py +++ b/dvadmin-backend/apps/system/urls.py @@ -2,13 +2,14 @@ from django.urls import re_path from rest_framework.routers import DefaultRouter from apps.system.views import DictDataModelViewSet, DictDetailsModelViewSet, \ - ConfigSettingsModelViewSet, SaveFileModelViewSet + ConfigSettingsModelViewSet, SaveFileModelViewSet, MessagePushModelViewSet router = DefaultRouter() router.register(r'dict/type', DictDataModelViewSet) router.register(r'dict/data', DictDetailsModelViewSet) router.register(r'config', ConfigSettingsModelViewSet) router.register(r'savefile', SaveFileModelViewSet) +router.register(r'message', MessagePushModelViewSet) urlpatterns = [ re_path('dict/get/type/(?P.*)/', DictDetailsModelViewSet.as_view({'get': 'dict_details_list'})), re_path('config/configKey/(?P.*)/', ConfigSettingsModelViewSet.as_view({'get': 'get_config_key'})), @@ -18,5 +19,9 @@ urlpatterns = [ re_path('dict/type/export/', DictDataModelViewSet.as_view({'get': 'export'})), # 导出字典详情数据 re_path('dict/data/export/', DictDetailsModelViewSet.as_view({'get': 'export'})), + # 用户获取个人消息通知列表页 + re_path('message/list/(?P.*)/', MessagePushModelViewSet.as_view({"get": "get_message_list"})), + # 用户获取个人通知列表 + re_path('message/receive/', MessagePushModelViewSet.as_view({"get": "get_received_messages"})) ] urlpatterns += router.urls diff --git a/dvadmin-backend/apps/system/views.py b/dvadmin-backend/apps/system/views.py index 4302ad2..7547b8b 100644 --- a/dvadmin-backend/apps/system/views.py +++ b/dvadmin-backend/apps/system/views.py @@ -2,11 +2,12 @@ from rest_framework.request import Request from apps.op_drf.viewsets import CustomModelViewSet from apps.system.filters import DictDetailsFilter, DictDataFilter, ConfigSettingsFilter -from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile +from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush from apps.system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \ DictDetailsCreateUpdateSerializer, DictDetailsListSerializer, ConfigSettingsSerializer, \ ConfigSettingsCreateUpdateSerializer, SaveFileSerializer, SaveFileCreateUpdateSerializer, \ - ExportConfigSettingsSerializer, ExportDictDataSerializer, ExportDictDetailsSerializer + ExportConfigSettingsSerializer, ExportDictDataSerializer, ExportDictDetailsSerializer, \ + MessagePushSerializer, MessagePushCreateUpdateSerializer from apps.op_drf.filters import DataLevelPermissionsFilter from utils.export_excel import export_excel_save_model from utils.response import SuccessResponse @@ -123,7 +124,7 @@ class ConfigSettingsModelViewSet(CustomModelViewSet): :param kwargs: :return: """ - field_data = ['参数主键', '参数名称', '参数键名', '参数键值', '系统内置', '参数状态', '创建者', '修改者', '备注'] + field_data = ['参数主键', '参数名称', '参数键名', '参数键值', '系统内置', '参数状态', '创建者', '修改者', '备注'] data = ExportConfigSettingsSerializer(ConfigSettings.objects.all(), many=True).data return SuccessResponse(export_excel_save_model(request, field_data, data, '导出参数管理数据.xls')) @@ -140,3 +141,51 @@ class SaveFileModelViewSet(CustomModelViewSet): extra_filter_backends = [DataLevelPermissionsFilter] search_fields = ('configName',) ordering = 'id' # 默认排序 + + +class MessagePushModelViewSet(CustomModelViewSet): + """ + 消息推送模型的CRUD视图 + """ + queryset = MessagePush.objects.all() + serializer_class = MessagePushSerializer + create_serializer_class = MessagePushCreateUpdateSerializer + update_serializer_class = MessagePushCreateUpdateSerializer + + extra_filter_backends = [] + ordering = "id" # 默认排序 + + def get_message_list(self, request: Request, *args, **kwargs): + """ + 管理员获取自己的消息列表 + """ + messages = self.queryset.filter(**kwargs) + data = MessagePushSerializer(messages, many=True) + return SuccessResponse(msg="返回", data=data) + + def get_received_messages(self, request: Request, *args, **kwargs): + """ + 用户获取未读消息通知列表 + """ + + queryset = self.filter_queryset(self.get_queryset()) + queryset = queryset.filter(recipient_id=request.user.id, is_read=0) + page = self.paginate_queryset(queryset) + if hasattr(self, 'handle_logging'): + self.handle_logging(request, *args, **kwargs) + if page is not None: + if getattr(self, 'values_queryset', None): + return self.get_paginated_response(page) + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + if getattr(self, 'values_queryset', None): + return SuccessResponse(page) + serializer = self.get_serializer(queryset, many=True) + return SuccessResponse(serializer.data) + + def get_received_messages_count(self, request: Request, *args, **kwargs): + """ + 获取用户未读消息数量 + """ + + pass