yunzerwebsiteallinone/platform/src/views/basicSettings/sitereminder/components/detail.vue
2026-06-17 23:07:39 +08:00

119 lines
2.8 KiB
Vue

<template>
<el-dialog
v-model="visible"
title="消息详情"
width="600px"
destroy-on-close
align-center
class="reminder-detail-dialog"
>
<div class="reminder-detail-container" v-loading="loading">
<h3 class="reminder-title">{{ reminder.title }}</h3>
<div class="reminder-meta">
<span class="meta-item">
<el-icon><User /></el-icon>
发送者:{{ getSenderName(reminder) }}
</span>
<span class="meta-item">
<el-icon><Calendar /></el-icon>
时间:{{ formatTime(reminder.create_time) }}
</span>
</div>
<el-divider />
<div class="reminder-content">{{ reminder.content }}</div>
</div>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { computed, ref, watch } from "vue";
import { User, Calendar } from "@element-plus/icons-vue";
import { readSiteReminder } from "@/api/sitereminder";
const props = defineProps({
modelValue: Boolean,
reminder: {
type: Object,
default: () => ({})
},
viewOnly: {
type: Boolean,
default: false
}
});
const emit = defineEmits(["update:modelValue", "read-success"]);
const visible = computed({
get: () => props.modelValue,
set: (val) => emit("update:modelValue", val)
});
const loading = ref(false);
const getSenderName = (item: any) => {
if (!item.sender_type) return "-";
if (item.sender_type === "system") return "系统";
if (item.sender_type === "platform") return `平台管理员 (ID: ${item.sender_id})`;
if (item.sender_type === "tenant") return `租户用户 (ID: ${item.sender_id})`;
return item.sender_type;
};
const formatTime = (timeStr: any) => {
if (!timeStr) return "-";
const date = new Date(timeStr);
return date.toLocaleString();
};
watch(() => props.modelValue, async (val) => {
if (val && props.reminder && !props.viewOnly && props.reminder.is_read === 0) {
loading.value = true;
try {
const res = await readSiteReminder(props.reminder.id);
if (res.code === 200) {
emit("read-success", props.reminder.id);
}
} catch (err) {
console.error(err);
} finally {
loading.value = false;
}
}
});
</script>
<style scoped>
.reminder-detail-container {
padding: 10px 20px;
}
.reminder-title {
font-size: 20px;
font-weight: 600;
margin: 0 0 12px 0;
color: var(--el-text-color-primary);
line-height: 1.4;
}
.reminder-meta {
display: flex;
gap: 20px;
color: var(--el-text-color-secondary);
font-size: 13px;
}
.meta-item {
display: inline-flex;
align-items: center;
gap: 4px;
}
.reminder-content {
font-size: 15px;
line-height: 1.6;
color: var(--el-text-color-regular);
white-space: pre-wrap;
word-break: break-all;
min-height: 120px;
}
</style>