mirror of
https://github.com/continew-org/continew-admin-ui.git
synced 2025-09-15 14:57:13 +08:00
refactor: 调整我的消息内容展示方式为弹窗
This commit is contained in:
@@ -52,7 +52,18 @@
|
|||||||
</a-button>
|
</a-button>
|
||||||
</template>
|
</template>
|
||||||
<template #title="{ record }">
|
<template #title="{ record }">
|
||||||
<a-tooltip :content="record.content"><span>{{ record.title }}</span></a-tooltip>
|
<a-link @click="showMessageDetail(record)">
|
||||||
|
<a-typography-paragraph
|
||||||
|
class="link-text"
|
||||||
|
:ellipsis="{
|
||||||
|
rows: 1,
|
||||||
|
showTooltip: true,
|
||||||
|
css: true,
|
||||||
|
}"
|
||||||
|
>
|
||||||
|
{{ record.title }}
|
||||||
|
</a-typography-paragraph>
|
||||||
|
</a-link>
|
||||||
</template>
|
</template>
|
||||||
<template #type="{ record }">
|
<template #type="{ record }">
|
||||||
<GiCellTag :value="record.type" :dict="message_type_enum" />
|
<GiCellTag :value="record.type" :dict="message_type_enum" />
|
||||||
@@ -63,18 +74,41 @@
|
|||||||
</a-tag>
|
</a-tag>
|
||||||
</template>
|
</template>
|
||||||
</GiTable>
|
</GiTable>
|
||||||
|
|
||||||
|
<!-- 消息详情弹窗 -->
|
||||||
|
<a-modal
|
||||||
|
v-model:visible="messageDetailVisible"
|
||||||
|
:width="width >= 500 ? 500 : '100%'"
|
||||||
|
:footer="false"
|
||||||
|
:mask-closable="true"
|
||||||
|
class="message-detail-modal"
|
||||||
|
>
|
||||||
|
<template #title>{{ currentMessage?.title }}</template>
|
||||||
|
<div class="message-detail-content">
|
||||||
|
<div class="message-content">{{ currentMessage?.content }}</div>
|
||||||
|
<div class="message-footer">
|
||||||
|
<div class="time-info">
|
||||||
|
<icon-clock-circle class="time-icon" />
|
||||||
|
<span class="time-label">发送时间:</span>
|
||||||
|
<span class="time-value">{{ currentMessage?.createTime }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a-modal>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import type { TableInstance } from '@arco-design/web-vue'
|
import type { TableInstance } from '@arco-design/web-vue'
|
||||||
import { Message, Modal } from '@arco-design/web-vue'
|
import { Message, Modal } from '@arco-design/web-vue'
|
||||||
|
import { useWindowSize } from '@vueuse/core'
|
||||||
import { type MessageQuery, deleteMessage, listMessage, readAllMessage, readMessage } from '@/apis'
|
import { type MessageQuery, deleteMessage, listMessage, readAllMessage, readMessage } from '@/apis'
|
||||||
import { useTable } from '@/hooks'
|
import { useTable } from '@/hooks'
|
||||||
import { useDict } from '@/hooks/app'
|
import { useDict } from '@/hooks/app'
|
||||||
import mittBus from '@/utils/mitt'
|
import mittBus from '@/utils/mitt'
|
||||||
|
|
||||||
defineOptions({ name: 'SystemMessage' })
|
defineOptions({ name: 'UserMyMessage' })
|
||||||
|
|
||||||
|
const { width } = useWindowSize()
|
||||||
const { message_type_enum } = useDict('message_type_enum')
|
const { message_type_enum } = useDict('message_type_enum')
|
||||||
|
|
||||||
const queryForm = reactive<MessageQuery>({
|
const queryForm = reactive<MessageQuery>({
|
||||||
@@ -148,6 +182,111 @@ const onReadAll = async () => {
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 消息详情弹窗相关
|
||||||
|
const messageDetailVisible = ref(false)
|
||||||
|
const currentMessage = ref()
|
||||||
|
|
||||||
|
// 标记单条消息为已读
|
||||||
|
const markAsRead = async (messageId: string) => {
|
||||||
|
try {
|
||||||
|
await readMessage([messageId])
|
||||||
|
search()
|
||||||
|
} catch (error) {
|
||||||
|
Message.error('操作失败')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示消息详情
|
||||||
|
const showMessageDetail = async (record: any) => {
|
||||||
|
currentMessage.value = record
|
||||||
|
messageDetailVisible.value = true
|
||||||
|
// 如果消息未读,自动标记为已读
|
||||||
|
if (!record.isRead) {
|
||||||
|
await markAsRead(record.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss"></style>
|
<style scoped lang="scss">
|
||||||
|
.link-text {
|
||||||
|
margin-bottom: 0;
|
||||||
|
font-weight: 500;
|
||||||
|
|
||||||
|
:deep(.arco-typography) {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.message-detail-modal) {
|
||||||
|
.arco-modal-header {
|
||||||
|
border-bottom: 1px solid var(--color-border-2);
|
||||||
|
padding: 20px 24px 16px;
|
||||||
|
|
||||||
|
.arco-modal-title {
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--color-text-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.arco-modal-body {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-detail-content {
|
||||||
|
.message-content {
|
||||||
|
margin-bottom: 24px;
|
||||||
|
line-height: 1.6;
|
||||||
|
color: var(--color-text-1);
|
||||||
|
font-size: 14px;
|
||||||
|
min-height: 80px;
|
||||||
|
word-wrap: break-word;
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.message-footer {
|
||||||
|
.time-info {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
|
||||||
|
.time-icon {
|
||||||
|
font-size: 14px;
|
||||||
|
color: var(--color-text-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.time-label {
|
||||||
|
font-size: 13px;
|
||||||
|
color: var(--color-text-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.time-value {
|
||||||
|
font-size: 13px;
|
||||||
|
color: var(--color-text-2);
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 12px;
|
||||||
|
padding: 16px 24px;
|
||||||
|
border-top: 1px solid var(--color-border-2);
|
||||||
|
background-color: var(--color-bg-1);
|
||||||
|
|
||||||
|
.arco-btn {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
|
||||||
|
.btn-icon {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@@ -55,7 +55,7 @@ import { type NoticeQuery, type NoticeResp, listUserNotice } from '@/apis/system
|
|||||||
import { useTable } from '@/hooks'
|
import { useTable } from '@/hooks'
|
||||||
import { useDict } from '@/hooks/app'
|
import { useDict } from '@/hooks/app'
|
||||||
|
|
||||||
defineOptions({ name: 'SystemMessage' })
|
defineOptions({ name: 'UserMyNotice' })
|
||||||
|
|
||||||
const { notice_type } = useDict('notice_type')
|
const { notice_type } = useDict('notice_type')
|
||||||
|
|
||||||
|
@@ -18,9 +18,7 @@
|
|||||||
</a-tab-pane>
|
</a-tab-pane>
|
||||||
</a-tabs>
|
</a-tabs>
|
||||||
</template>
|
</template>
|
||||||
<transition name="fade-slide" mode="out-in" appear>
|
<component :is="menuList.find((item) => item.key === activeKey)?.value"></component>
|
||||||
<component :is="menuList.find((item) => item.key === activeKey)?.value"></component>
|
|
||||||
</transition>
|
|
||||||
</GiPageLayout>
|
</GiPageLayout>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -58,8 +56,8 @@ const unreadMessageCount = ref(0)
|
|||||||
const unreadNoticeCount = ref(0)
|
const unreadNoticeCount = ref(0)
|
||||||
|
|
||||||
const tabItems = computed(() => [
|
const tabItems = computed(() => [
|
||||||
{ key: 'msg', title: '我的消息', count: unreadMessageCount },
|
{ key: 'msg', title: '我的消息', count: unreadMessageCount.value },
|
||||||
{ key: 'notice', title: '我的公告', count: unreadNoticeCount },
|
{ key: 'notice', title: '我的公告', count: unreadNoticeCount.value },
|
||||||
])
|
])
|
||||||
|
|
||||||
const getMessageData = async () => {
|
const getMessageData = async () => {
|
||||||
@@ -77,6 +75,7 @@ onMounted(() => {
|
|||||||
getNoticeData()
|
getNoticeData()
|
||||||
mittBus.on('count-refresh', () => {
|
mittBus.on('count-refresh', () => {
|
||||||
getMessageData()
|
getMessageData()
|
||||||
|
getNoticeData()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user