通知消息完善

pull/1/head
李强 2021-03-08 22:13:53 +08:00
parent 1a27dbaac0
commit 70f8983d0a
8 changed files with 469 additions and 30 deletions

View File

@ -1,6 +1,6 @@
import django_filters import django_filters
from apps.system.models import DictDetails, DictData, ConfigSettings from apps.system.models import DictDetails, DictData, ConfigSettings, MessagePush
class DictDataFilter(django_filters.rest_framework.FilterSet): class DictDataFilter(django_filters.rest_framework.FilterSet):
@ -32,3 +32,12 @@ class ConfigSettingsFilter(django_filters.rest_framework.FilterSet):
class Meta: class Meta:
model = ConfigSettings model = ConfigSettings
fields = '__all__' fields = '__all__'
class MessagePushFilter(django_filters.rest_framework.FilterSet):
"""
消息通知 简单过滤器
"""
class Meta:
model = MessagePush
fields = '__all__'

View File

@ -4,4 +4,5 @@ from ..models.dict_details import DictDetails
from ..models.web_set import WebSet from ..models.web_set import WebSet
from ..models.save_file import SaveFile from ..models.save_file import SaveFile
from ..models.message_push import MessagePush from ..models.message_push import MessagePush
from ..models.message_push import MessagePushUser

View File

@ -11,11 +11,12 @@ from apps.permission.models import UserProfile
class MessagePush(CoreModel): class MessagePush(CoreModel):
title = CharField(max_length=128, verbose_name="通知标题") title = CharField(max_length=128, verbose_name="消息标题")
content = TextField(verbose_name="通知内容") content = TextField(verbose_name="消息内容")
message_type = CharField(max_length=8, verbose_name="消息类型") message_type = CharField(max_length=8, verbose_name="消息类型")
is_reviewed = BooleanField(default=True, verbose_name="是否审核") is_reviewed = BooleanField(default=True, verbose_name="是否审核")
status = CharField(max_length=8, verbose_name="消息状态") status = CharField(max_length=8, verbose_name="消息状态")
to_path = CharField(max_length=256, verbose_name="跳转路径", null=True, blank=True, )
user = ManyToManyField(to="permission.UserProfile", user = ManyToManyField(to="permission.UserProfile",
related_name="user", related_query_name="user_query", through='MessagePushUser', related_name="user", related_query_name="user_query", through='MessagePushUser',
through_fields=('message_push', 'user')) through_fields=('message_push', 'user'))

View File

@ -1,8 +1,7 @@
from rest_framework import serializers from rest_framework import serializers
from apps.op_drf.serializers import CustomModelSerializer from apps.op_drf.serializers import CustomModelSerializer
from apps.permission.serializers import UserProfileSerializer from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush, MessagePushUser
from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush
# ================================================= # # ================================================= #
@ -162,11 +161,6 @@ class MessagePushSerializer(CustomModelSerializer):
""" """
消息通知 简单序列化器 消息通知 简单序列化器
""" """
# users = UserProfileSerializer(read_only=True)
users = serializers.SerializerMethodField(read_only=True)
def get_users(self, obj):
return UserProfileSerializer(obj.user.all(), many=True).data
class Meta: class Meta:
model = MessagePush model = MessagePush
@ -198,5 +192,27 @@ class ExportMessagePushSerializer(CustomModelSerializer):
class Meta: class Meta:
model = MessagePush model = MessagePush
fields = ( fields = (
'id', 'title', 'content', 'message_type', 'is_reviewed', 'status', 'users', 'creator', 'modifier', 'id', 'title', 'content', 'message_type', 'is_reviewed', 'status', 'users', 'creator', 'modifier',
'update_datetime', 'create_datetime') 'update_datetime', 'create_datetime')
class MessagePushUserSerializer(CustomModelSerializer):
"""
消息通知 用户查询简单序列化器
"""
# users = UserProfileSerializer(read_only=True)
# users = serializers.SerializerMethodField(read_only=True)
is_read = serializers.SerializerMethodField(read_only=True)
# def get_users(self, obj):
# return UserProfileSerializer(obj.user.all(), many=True).data
# 返回这个消息是否已读
def get_is_read(self, obj):
object = MessagePushUser.objects.filter(message_push=obj,user=self.context.get('request').user).first()
return object.is_read if object else False
class Meta:
model = MessagePush
fields = "__all__"
def save(self, **kwargs):
return super().save(**kwargs)

View File

@ -2,7 +2,7 @@ from rest_framework.request import Request
from apps.op_drf.filters import DataLevelPermissionsFilter from apps.op_drf.filters import DataLevelPermissionsFilter
from apps.op_drf.viewsets import CustomModelViewSet from apps.op_drf.viewsets import CustomModelViewSet
from apps.system.filters import DictDetailsFilter, DictDataFilter, ConfigSettingsFilter from apps.system.filters import DictDetailsFilter, DictDataFilter, ConfigSettingsFilter, MessagePushFilter
from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush
from apps.system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \ from apps.system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \
DictDetailsCreateUpdateSerializer, DictDetailsListSerializer, ConfigSettingsSerializer, \ DictDetailsCreateUpdateSerializer, DictDetailsListSerializer, ConfigSettingsSerializer, \
@ -137,7 +137,7 @@ class SaveFileModelViewSet(CustomModelViewSet):
serializer_class = SaveFileSerializer serializer_class = SaveFileSerializer
create_serializer_class = SaveFileCreateUpdateSerializer create_serializer_class = SaveFileCreateUpdateSerializer
update_serializer_class = SaveFileCreateUpdateSerializer update_serializer_class = SaveFileCreateUpdateSerializer
# filter_class = ConfigSettingsFilter filter_class = ConfigSettingsFilter
extra_filter_backends = [DataLevelPermissionsFilter] extra_filter_backends = [DataLevelPermissionsFilter]
search_fields = ('configName',) search_fields = ('configName',)
ordering = 'id' # 默认排序 ordering = 'id' # 默认排序
@ -152,6 +152,7 @@ class MessagePushModelViewSet(CustomModelViewSet):
create_serializer_class = MessagePushCreateUpdateSerializer create_serializer_class = MessagePushCreateUpdateSerializer
update_serializer_class = MessagePushCreateUpdateSerializer update_serializer_class = MessagePushCreateUpdateSerializer
extra_filter_backends = [DataLevelPermissionsFilter] extra_filter_backends = [DataLevelPermissionsFilter]
filter_class = MessagePushFilter
ordering = "-update_datetime" # 默认排序 ordering = "-update_datetime" # 默认排序
def get_message_list(self, request: Request, *args, **kwargs): def get_message_list(self, request: Request, *args, **kwargs):

View File

@ -79,6 +79,6 @@ INSERT INTO `permission_menu` VALUES (45, '', 'admin', '2021-03-03 15:25:15.2249
INSERT INTO `permission_menu` VALUES (46, '', 'admin', '2021-03-03 15:28:30.061632', '2021-03-03 15:27:19.945663', '2', NULL, '文件下载', 4, '1', NULL, NULL, NULL, 'GET', 'system:clearsavefile:download:post', '1', '1', '1', 1, 11); INSERT INTO `permission_menu` VALUES (46, '', 'admin', '2021-03-03 15:28:30.061632', '2021-03-03 15:27:19.945663', '2', NULL, '文件下载', 4, '1', NULL, NULL, NULL, 'GET', 'system:clearsavefile:download:post', '1', '1', '1', 1, 11);
INSERT INTO `permission_menu` VALUES (47, '', 'admin', '2021-03-07 14:35:34.237127', '2021-03-07 14:32:06.754815', '1', 'message', '消息通知', 4, '1', 'system/message', 'system/message/index', '/system/message/', 'GET', 'system:message:get', '1', '1', '1', 1, 1); INSERT INTO `permission_menu` VALUES (47, '', 'admin', '2021-03-07 14:35:34.237127', '2021-03-07 14:32:06.754815', '1', 'message', '消息通知', 4, '1', 'system/message', 'system/message/index', '/system/message/', 'GET', 'system:message:get', '1', '1', '1', 1, 1);
INSERT INTO `permission_menu` VALUES (48, '', 'admin', '2021-03-07 14:35:06.718432', '2021-03-07 14:35:06.718463', '2', NULL, '发布通知', 1, '1', NULL, NULL, '/system/message/', 'POST', 'system:message:post', '1', '1', '1', 1, 47); INSERT INTO `permission_menu` VALUES (48, '', 'admin', '2021-03-07 14:35:06.718432', '2021-03-07 14:35:06.718463', '2', NULL, '发布通知', 1, '1', NULL, NULL, '/system/message/', 'POST', 'system:message:post', '1', '1', '1', 1, 47);
INSERT INTO `permission_menu` VALUES (49, '', 'admin', '2021-03-07 14:36:47.675806', '2021-03-07 14:36:47.675837', '2', NULL, '修改通知', 2, '1', NULL, NULL, '/system/message/', 'PUT', 'system:message:put', '1', '1', '1', 1, 47); INSERT INTO `permission_menu` VALUES (49, '', 'admin', '2021-03-08 13:04:32.158707', '2021-03-07 14:36:47.675837', '2', NULL, '修改通知', 2, '1', NULL, NULL, '/system/message/{id}/', 'PUT', 'system:message:{id}:put', '1', '1', '1', 1, 47);
INSERT INTO `permission_menu` VALUES (50, '', 'admin', '2021-03-07 14:37:52.130536', '2021-03-07 14:37:52.130567', '2', NULL, '删除通知', 3, '1', NULL, NULL, '/permission/menu/', 'DELETE', 'permission:menu:delete', '1', '1', '1', 1, 47); INSERT INTO `permission_menu` VALUES (50, '', 'admin', '2021-03-08 13:04:58.206693', '2021-03-07 14:37:52.130567', '2', NULL, '删除通知', 3, '1', NULL, NULL, '/permission/menu/{id}/', 'DELETE', 'permission:menu:{id}:delete', '1', '1', '1', 1, 47);
INSERT INTO `permission_menu` VALUES (51, '', 'admin', '2021-03-07 14:42:37.410336', '2021-03-07 14:42:37.410366', '2', NULL, '通知导出', 4, '1', NULL, NULL, '/system/message/export/', 'GET', 'system:message:export:get', '1', '1', '1', 1, 47); INSERT INTO `permission_menu` VALUES (51, '', 'admin', '2021-03-07 14:42:37.410336', '2021-03-07 14:42:37.410366', '2', NULL, '通知导出', 4, '1', NULL, NULL, '/system/message/export/', 'GET', 'system:message:export:get', '1', '1', '1', 1, 47);

View File

@ -0,0 +1,54 @@
import request from '@/utils/request'
// 查询参数列表
export function listMessage(query) {
return request({
url: '/system/message/',
method: 'get',
params: query
})
}
// 查询参数详细
export function getMessage(messageId) {
return request({
url: '/system/message/' + messageId + '/',
method: 'get'
})
}
// 新增参数配置
export function addMessage(data) {
return request({
url: '/system/message/',
method: 'post',
data: data
})
}
// 修改参数配置
export function updateMessage(data) {
return request({
url: '/system/message/' + data.id + '/',
method: 'put',
data: data
})
}
// 删除参数配置
export function delMessage(messageId) {
return request({
url: '/system/message/' + messageId + '/',
method: 'delete'
})
}
// 导出参数
export function exportMessage(query) {
return request({
url: '/system/message/export/',
method: 'get',
params: query
})
}

View File

@ -1,22 +1,379 @@
<template> <template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="消息标题" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入消息标题"
clearable
size="small"
style="width: 240px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="消息类型" prop="message_type">
<el-select v-model="queryParams.message_type" placeholder="消息类型" clearable size="small">
<el-option
v-for="dict in MessagePushTypeOptions"
:key="dict.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item label="消息状态" prop="status">
<el-select v-model="queryParams.status" placeholder="消息状态" clearable size="small">
<el-option
v-for="dict in MessagePushStatusOptions"
:key="dict.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
/>
</el-select>
</el-form-item>
<!-- <el-form-item label="是否审核" prop="is_reviewed">-->
<!-- <el-select v-model="queryParams.is_reviewed" placeholder="是否审核" clearable size="small">-->
<!-- <el-option :key="true" label="是" :value="true"/>-->
<!-- <el-option :key="false" label="否" :value="false"/>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:message:post']"
>发布通知
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:message:{id}:put']"
>修改通知
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['permission:menu:{id}:delete']"
>删除通知
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:message:export:get']"
>导出
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="configList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="消息主键" align="center" prop="id"/>
<el-table-column label="消息标题" align="center" prop="title" :show-overflow-tooltip="true"/>
<el-table-column label="消息内容" align="center" prop="content" :show-overflow-tooltip="true"/>
<el-table-column label="消息类型" align="center" prop="message_type" :formatter="typeFormat"/>
<!-- <el-table-column label="是否审核通过" align="center" prop="is_reviewed" :formatter="isReviewedFormat"/>-->
<el-table-column label="消息状态" align="center" prop="status" :formatter="statusFormat"/>
<el-table-column label="跳转路径" align="center" prop="to_path" :show-overflow-tooltip="true"/>
<el-table-column label="创建时间" align="center" prop="create_datetime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.create_datetime) }}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
v-if="hasPermi(['system:message:{id}:put','permission:menu:{id}:delete'])">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:message:{id}:put']"
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['permission:menu:{id}:delete']"
>删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="消息标题" prop="title">
<el-input v-model="form.title" placeholder="请输入消息标题"/>
</el-form-item>
<el-form-item label="消息内容" prop="content">
<el-input v-model="form.content" placeholder="请输入消息内容"/>
</el-form-item>
<el-form-item label="跳转路径" prop="to_path">
<el-input v-model="form.to_path" placeholder="请输入跳转路径"/>
</el-form-item>
<el-form-item label="消息类型" prop="message_type">
<el-radio-group v-model="form.message_type">
<el-radio
v-for="dict in MessagePushTypeOptions"
:key="dict.dictValue"
:label="dict.dictValue"
>{{dict.dictLabel}}
</el-radio>
</el-radio-group>
</el-form-item>
<!-- <el-form-item label="是否审核" prop="is_reviewed">-->
<!-- <el-radio-group v-model="form.is_reviewed">-->
<!-- <el-radio :label="true"></el-radio>-->
<!-- <el-radio :label="false"></el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item label="状态" prop="status">
<el-radio-group v-model="form.status">
<el-radio
v-for="dict in MessagePushStatusOptions"
:key="dict.dictValue"
:label="dict.dictValue"
>{{dict.dictLabel}}
</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template> </template>
<script> <script>
export default { import {addMessage, delMessage, exportMessage, getMessage, listMessage, updateMessage} from "@/api/system/message";
name: "message",
data() {
return {}
},
created() {
},
mounted() {
},
methods: {}
export default {
name: "message",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
configList: [],
//
title: "",
//
open: false,
//
MessagePushTypeOptions: [],
//
StatusOptions: [],
//
MessagePushStatusOptions: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
title: undefined,
content: undefined,
message_type: undefined,
is_reviewed: undefined,
status: undefined
},
//
form: {},
//
rules: {
title: [
{required: true, message: "消息标题不能为空", trigger: "blur"}
],
content: [
{required: true, message: "消息内容不能为空", trigger: "blur"}
],
to_path: [
{required: false, message: "跳转路径不能为空", trigger: "blur"}
]
}
};
},
created() {
this.getList();
this.getDicts("sys_message_push_type").then(response => {
this.MessagePushTypeOptions = response.data;
});
this.getDicts("sys_message_push_status").then(response => {
this.MessagePushStatusOptions = response.data;
});
},
methods: {
/** 查询参数列表 */
getList() {
this.loading = true;
listMessage(this.addDateRange(this.queryParams)).then(response => {
this.configList = response.data.results;
this.total = response.data.count;
this.loading = false;
}
);
},
//
typeFormat(row, column) {
return this.selectDictLabel(this.MessagePushTypeOptions, row.message_type);
},
//
statusFormat(row, column) {
return this.selectDictLabel(this.MessagePushStatusOptions, row.status);
},
//
isReviewedFormat(row, column) {
return row.is_reviewed === true ? '是' : '否'
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: undefined,
title: undefined,
content: undefined,
to_path: undefined,
is_reviewed: true,
message_type: "1",
status: '1',
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "发布通知";
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length != 1
this.multiple = !selection.length
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getMessage(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改参数";
});
},
/** 提交按钮 */
submitForm: function () {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != undefined) {
updateMessage(this.form).then(response => {
this.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addMessage(this.form).then(response => {
this.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const configIds = row.id || this.ids;
this.$confirm('是否确认删除参数编号为"' + configIds + '"的数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function () {
return delMessage(configIds);
}).then(() => {
this.getList();
this.msgSuccess("删除成功");
})
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$confirm('是否确认导出所有数据项?', "警告", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(function () {
return exportMessage(queryParams);
}).then(response => {
this.download(response.data.file_url, response.data.name);
})
},
} }
};
</script> </script>
<style scoped>
</style>