通知消息完善

pull/1/head
李强 2021-03-09 00:34:38 +08:00
parent 70f8983d0a
commit 4697fe148e
11 changed files with 195 additions and 61 deletions

View File

@ -3,6 +3,7 @@ from rest_framework.validators import UniqueValidator
from apps.op_drf.serializers import CustomModelSerializer
from apps.permission.models import Menu, Dept, Post, Role, UserProfile
from apps.system.models import MessagePush
# ================================================= #
@ -212,7 +213,7 @@ class UserProfileSerializer(CustomModelSerializer):
admin = serializers.SerializerMethodField(read_only=True)
deptId = serializers.IntegerField(source='dept.id', read_only=True)
# 未读通知数量
# unread_msg_count = serializers.SerializerMethodField(read_only=True)
unread_msg_count = serializers.SerializerMethodField(read_only=True)
def get_admin(self, obj: UserProfile):
role_list = obj.role.all().values_list('admin', flat=True)
@ -220,12 +221,8 @@ class UserProfileSerializer(CustomModelSerializer):
return True
return False
# def get_unread_msg_count(self, obj: UserProfile):
# UserProfile.objects.all()
# role_list = obj.role.all().values_list('admin', flat=True)
# if True in list(set(role_list)):
# return True
# return False
def get_unread_msg_count(self, obj: UserProfile):
return MessagePush.objects.filter(status='2').exclude(user=obj,messagepushuser_message_push__is_read=True).count()
class Meta:
model = UserProfile

View File

@ -1,6 +1,6 @@
import django_filters
from apps.system.models import DictDetails, DictData, ConfigSettings, MessagePush
from apps.system.models import DictDetails, DictData, ConfigSettings, MessagePush, SaveFile
class DictDataFilter(django_filters.rest_framework.FilterSet):
@ -33,6 +33,17 @@ class ConfigSettingsFilter(django_filters.rest_framework.FilterSet):
model = ConfigSettings
fields = '__all__'
class SaveFileFilter(django_filters.rest_framework.FilterSet):
"""
文件管理 简单过滤器
"""
class Meta:
model = SaveFile
exclude = ('file',)
class MessagePushFilter(django_filters.rest_framework.FilterSet):
"""
消息通知 简单过滤器

View File

@ -25,5 +25,7 @@ urlpatterns = [
re_path('message/receive/', MessagePushModelViewSet.as_view({"get": "get_received_messages"})),
# 消息通知导出
re_path('message/export/', MessagePushModelViewSet.as_view({'get': 'export',})),
# 消息已读
re_path('message/export/', MessagePushModelViewSet.as_view({'get': 'export',})),
]
urlpatterns += router.urls

View File

@ -2,7 +2,8 @@ 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, MessagePushFilter
from apps.system.filters import DictDetailsFilter, DictDataFilter, ConfigSettingsFilter, MessagePushFilter, \
SaveFileFilter
from apps.system.models import DictData, DictDetails, ConfigSettings, SaveFile, MessagePush
from apps.system.serializers import DictDataSerializer, DictDataCreateUpdateSerializer, DictDetailsSerializer, \
DictDetailsCreateUpdateSerializer, DictDetailsListSerializer, ConfigSettingsSerializer, \
@ -131,13 +132,13 @@ class ConfigSettingsModelViewSet(CustomModelViewSet):
class SaveFileModelViewSet(CustomModelViewSet):
"""
参数设置 模型的CRUD视图
文件管理 模型的CRUD视图
"""
queryset = SaveFile.objects.all()
serializer_class = SaveFileSerializer
create_serializer_class = SaveFileCreateUpdateSerializer
update_serializer_class = SaveFileCreateUpdateSerializer
filter_class = ConfigSettingsFilter
filter_class = SaveFileFilter
extra_filter_backends = [DataLevelPermissionsFilter]
search_fields = ('configName',)
ordering = 'id' # 默认排序

View File

@ -0,0 +1,21 @@
<template>
<div>
<svg-icon icon-class="github" @click="goto"/>
</div>
</template>
<script>
export default {
name: 'RuoYiMsg',
data() {
return {
url: 'https://gitee.com/y_project/RuoYi-Vue'
}
},
methods: {
goto() {
window.open(this.url)
}
}
}
</script>

View File

@ -11,14 +11,14 @@
<div class="right-menu">
<template v-if="device !== 'mobile'">
<router-link to="/user/msg">
<el-badge :value="count" :max="99" class="badge-item">
<div class="right-menu-item hover-effect">
<router-link to="/user/msg">
<i class="el-icon-message-solid badge-item-icon"></i>
<el-badge :value="count" :max="99" style="margin-left: -4px;" v-if="count">
</el-badge>
</router-link>
</router-link>
</div>
<search id="header-search" class="right-menu-item" />
<el-tooltip content="源码地址" effect="dark" placement="bottom">
<ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />
</el-tooltip>
@ -67,6 +67,7 @@ import SizeSelect from "@/components/SizeSelect";
import Search from "@/components/HeaderSearch";
import RuoYiGit from "@/components/RuoYi/Git";
import RuoYiDoc from "@/components/RuoYi/Doc";
import store from "@/store";
export default {
components: {
@ -80,7 +81,7 @@ export default {
},
data() {
return {
count: 0,
count: store.getters.unread_msg_count,
};
},
computed: {

View File

@ -80,7 +80,7 @@ export const constantRoutes = [
},
{
path: 'msg',
component: (resolve) => require(['@/views/permission/user/msg/index'], resolve),
component: (resolve) => require(['@/views/system/message/Mymessage'], resolve),
name: 'msg',
meta: { title: '消息通知', icon: 'user' }
}

View File

@ -6,6 +6,7 @@ const getters = {
cachedViews: state => state.tagsView.cachedViews,
token: state => state.user.token,
avatar: state => state.user.avatar,
unread_msg_count: state => state.user.unread_msg_count,
name: state => state.user.name,
introduction: state => state.user.introduction,
roles: state => state.user.roles,

View File

@ -25,6 +25,9 @@ const user = {
},
SET_PERMISSIONS: (state, permissions) => {
state.permissions = permissions
},
SET_UNREAD_MSG_COUNT: (state, unread_msg_count) => {
state.unread_msg_count = unread_msg_count
}
},
@ -59,6 +62,7 @@ const user = {
commit('SET_ROLES', ['ROLE_DEFAULT'])
}
commit('SET_NAME', user.name)
commit('SET_UNREAD_MSG_COUNT', user.unread_msg_count)
commit('SET_AVATAR', avatar)
resolve(res.data)
}).catch(error => {

View File

@ -0,0 +1,79 @@
<template>
<div class="app-container">
<el-row>
<el-col :span="6" :xs="24">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>消息通知</span>
</div>
<div>
<ul class="list-group list-group-striped">
<li class="list-group-item">
<svg-icon icon-class="user"/>
用户名称
<div class="pull-right">{{ user.username }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="phone"/>
手机号码
<div class="pull-right">{{ user.mobile }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="email"/>
用户邮箱
<div class="pull-right">{{ user.email }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="tree"/>
所属部门
<div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="peoples"/>
所属角色
<div class="pull-right">{{ roleGroup }}</div>
</li>
<li class="list-group-item">
<svg-icon icon-class="date"/>
创建日期
<div class="pull-right">{{ user.create_datetime }}</div>
</li>
</ul>
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script>
import {getUserProfile} from "@/api/permission/user";
export default {
name: "Profile",
data() {
return {
user: {},
roleGroup: {},
postGroup: {},
activeTab: "userinfo"
};
},
created() {
this.getUser();
},
methods: {
getUser() {
getUserProfile().then(response => {
this.user = response.data;
this.roleGroup = response.data.role.map(val => {
return val.roleName
}).toString();
this.postGroup = response.data.post.map(val => {
return val.postName
}).toString();
});
}
}
};
</script>

View File

@ -31,12 +31,12 @@
/>
</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 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>
@ -99,7 +99,7 @@
<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="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">
@ -142,43 +142,56 @@
/>
<!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-dialog :title="title" :visible.sync="open" width="780px" 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-row>
<el-col :span="12">
<el-form-item label="消息标题" prop="title">
<el-input v-model="form.title" placeholder="请输入消息标题"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="跳转路径" prop="to_path">
<el-input v-model="form.to_path" placeholder="请输入跳转路径"/>
</el-form-item>
</el-col>
<el-col :span="12">
<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-col>
<el-col :span="12">
<el-form-item label="消息类型" prop="message_type">
<el-select v-model="form.message_type" placeholder="请选择">
<el-option
v-for="dict in MessagePushTypeOptions"
:key="dict.dictValue"
:label="dict.dictLabel"
:value="dict.dictValue"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="消息内容" prop="content">
<editor v-model="form.content" :min-height="192"/>
</el-form-item>
</el-col>
<!-- <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-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
@ -190,9 +203,13 @@
<script>
import {addMessage, delMessage, exportMessage, getMessage, listMessage, updateMessage} from "@/api/system/message";
import Editor from '@/components/Editor';
export default {
name: "message",
components: {
Editor
},
data() {
return {
//