179 lines
4.7 KiB
Vue
179 lines
4.7 KiB
Vue
<template>
|
||
<div :class="prefixCls">
|
||
<Popover title="" trigger="click" :overlayClassName="`${prefixCls}__overlay`">
|
||
<Badge :count="count" dot :numberStyle="numberStyle">
|
||
<BellOutlined />
|
||
</Badge>
|
||
<template #content>
|
||
<Tabs>
|
||
<template v-for="item in listData" :key="item.key">
|
||
<Tabs.TabPane>
|
||
<template #tab>
|
||
{{ item.name }}
|
||
<span v-if="item.list.length !== 0">({{ item.list.length }})</span>
|
||
</template>
|
||
<!-- 绑定title-click事件的通知列表中标题是“可点击”的-->
|
||
<NoticeList :list="item.list" v-if="item.key === '1'" @title-click="onNoticeClick" />
|
||
<NoticeList :list="item.list" v-else />
|
||
</Tabs.TabPane>
|
||
</template>
|
||
</Tabs>
|
||
</template>
|
||
</Popover>
|
||
<a-modal
|
||
width="100%"
|
||
wrap-class-name="full-modal"
|
||
v-model:open="auditOpen"
|
||
title="详情"
|
||
:destroyOnClose="true"
|
||
>
|
||
<template #footer> </template>
|
||
<Look ref="posRef" :processId="processId" />
|
||
</a-modal>
|
||
<Message @register="register" />
|
||
</div>
|
||
</template>
|
||
<script lang="ts" setup>
|
||
import { computed, onMounted, ref } from 'vue';
|
||
import { Popover, Tabs, Badge } from 'ant-design-vue';
|
||
import { BellOutlined } from '@ant-design/icons-vue';
|
||
import { tabListData } from './data';
|
||
import { useDesign } from '@/hooks/web/useDesign';
|
||
import { useMessage } from '@/hooks/web/useMessage';
|
||
import { getLastList, loadSysImMsgList, readMsg } from '@/api/demo/message';
|
||
import { useUserStore } from '@/store/modules/user';
|
||
import { Look } from '@/views/demo/workflow/task/process/page';
|
||
import { useModal } from '@/components/Modal';
|
||
import NoticeList from './NoticeList.vue';
|
||
import Message from './message.vue';
|
||
import { signal } from '@/utils/signalR';
|
||
|
||
const [register, { openModal }] = useModal();
|
||
|
||
const userStore = useUserStore();
|
||
const userInfo: any = userStore.getUserInfo;
|
||
|
||
const { prefixCls } = useDesign('header-notify');
|
||
const { createMessage } = useMessage();
|
||
const listData = ref(tabListData);
|
||
const numberStyle = {};
|
||
const auditOpen = ref(false);
|
||
const processId = ref('');
|
||
const count = computed(() => {
|
||
let count = 0;
|
||
for (let i = 0; i < listData.value.length; i++) {
|
||
count += listData.value[i].list.length;
|
||
}
|
||
return count;
|
||
});
|
||
|
||
async function onNoticeClick(record) {
|
||
console.log(record);
|
||
// createMessage.success('你点击了通知,ID=' + record.id);
|
||
// // 可以直接将其标记为已读(为标题添加删除线),此处演示的代码会切换删除线状态
|
||
// record.titleDelete = !record.titleDelete;
|
||
const index = listData.value[0].list.findIndex((item: any) => item.id === record.id);
|
||
if (index !== -1) {
|
||
listData.value[0].list.splice(index, 1);
|
||
}
|
||
if (record.contentId) {
|
||
auditOpen.value = true;
|
||
processId.value = record.contentId;
|
||
}
|
||
const data = await readMsg({
|
||
id: record.msgId,
|
||
});
|
||
}
|
||
async function getList() {
|
||
const data = await getLastList({
|
||
userId: userInfo.id,
|
||
});
|
||
// const data = await loadSysImMsgList({
|
||
// page: 1,
|
||
// limit: 10,
|
||
// });
|
||
console.log(data);
|
||
let arr: any = [];
|
||
if (data.items && data.items.length > 0) {
|
||
data.items.forEach((item: any) => {
|
||
arr.push({
|
||
id: item.msgId,
|
||
title: item.content,
|
||
datetime: item.createDate,
|
||
contentId: item.contentId,
|
||
});
|
||
});
|
||
listData.value[0].list = arr;
|
||
}
|
||
}
|
||
|
||
// 连接
|
||
async function start() {
|
||
try {
|
||
await signal.start();
|
||
console.log('SignalR Connected.连接成功');
|
||
} catch (err) {
|
||
console.log(err);
|
||
// setTimeout(start, 5000);
|
||
}
|
||
}
|
||
signal.onclose(async () => {
|
||
await start();
|
||
});
|
||
onMounted(() => {
|
||
getList();
|
||
start();
|
||
});
|
||
//接口推送
|
||
signal.on('RevMsg', (user, message) => {
|
||
console.log('报警', user, message); //拿到后台推送的数据
|
||
openModal(true, {
|
||
user: user,
|
||
message: message,
|
||
});
|
||
});
|
||
</script>
|
||
<style lang="less">
|
||
@prefix-cls: ~'@{namespace}-header-notify';
|
||
|
||
.@{prefix-cls} {
|
||
padding-bottom: 1px;
|
||
|
||
&__overlay {
|
||
max-width: 360px;
|
||
}
|
||
|
||
.ant-tabs-content {
|
||
width: 300px;
|
||
}
|
||
|
||
.ant-badge {
|
||
display: flex;
|
||
align-items: center;
|
||
font-size: 18px;
|
||
|
||
.ant-badge-multiple-words {
|
||
padding: 0 4px;
|
||
}
|
||
|
||
svg {
|
||
width: 0.9em;
|
||
}
|
||
}
|
||
}
|
||
.full-modal {
|
||
.ant-modal {
|
||
max-width: 100%;
|
||
top: 0;
|
||
}
|
||
|
||
.ant-modal-content {
|
||
height: calc(100vh);
|
||
}
|
||
|
||
.ant-modal-body {
|
||
height: 85%;
|
||
}
|
||
}
|
||
</style>
|