通知消息完善

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
from apps.system.models import DictDetails, DictData, ConfigSettings
from apps.system.models import DictDetails, DictData, ConfigSettings, MessagePush
class DictDataFilter(django_filters.rest_framework.FilterSet):
@ -32,3 +32,12 @@ class ConfigSettingsFilter(django_filters.rest_framework.FilterSet):
class Meta:
model = ConfigSettings
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.save_file import SaveFile
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):
title = CharField(max_length=128, verbose_name="通知标题")
content = TextField(verbose_name="通知内容")
title = CharField(max_length=128, verbose_name="消息标题")
content = TextField(verbose_name="消息内容")
message_type = CharField(max_length=8, verbose_name="消息类型")
is_reviewed = BooleanField(default=True, 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",
related_name="user", related_query_name="user_query", through='MessagePushUser',
through_fields=('message_push', 'user'))

View File

@ -1,8 +1,7 @@
from rest_framework import serializers
from apps.op_drf.serializers import CustomModelSerializer
from apps.permission.serializers import UserProfileSerializer
from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush
from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush, MessagePushUser
# ================================================= #
@ -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:
model = MessagePush
@ -198,5 +192,27 @@ class ExportMessagePushSerializer(CustomModelSerializer):
class Meta:
model = MessagePush
fields = (
'id', 'title', 'content', 'message_type', 'is_reviewed', 'status', 'users', 'creator', 'modifier',
'update_datetime', 'create_datetime')
'id', 'title', 'content', 'message_type', 'is_reviewed', 'status', 'users', 'creator', 'modifier',
'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.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.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \
DictDetailsCreateUpdateSerializer, DictDetailsListSerializer, ConfigSettingsSerializer, \
@ -137,7 +137,7 @@ class SaveFileModelViewSet(CustomModelViewSet):
serializer_class = SaveFileSerializer
create_serializer_class = SaveFileCreateUpdateSerializer
update_serializer_class = SaveFileCreateUpdateSerializer
# filter_class = ConfigSettingsFilter
filter_class = ConfigSettingsFilter
extra_filter_backends = [DataLevelPermissionsFilter]
search_fields = ('configName',)
ordering = 'id' # 默认排序
@ -152,6 +152,7 @@ class MessagePushModelViewSet(CustomModelViewSet):
create_serializer_class = MessagePushCreateUpdateSerializer
update_serializer_class = MessagePushCreateUpdateSerializer
extra_filter_backends = [DataLevelPermissionsFilter]
filter_class = MessagePushFilter
ordering = "-update_datetime" # 默认排序
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 (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 (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 (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 (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-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);

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>
<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>
<script>
export default {
name: "message",
data() {
return {}
},
created() {
},
mounted() {
},
methods: {}
import {addMessage, delMessage, exportMessage, getMessage, listMessage, updateMessage} from "@/api/system/message";
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>
<style scoped>
</style>