Messages.vue 3.25 KB
<template>
  <div class="container mx-auto px-4 py-8">
    <h1 class="text-2xl font-bold mb-6">系统消息</h1>

    <!-- 消息列表 -->
    <div class="space-y-4">
      <div v-for="message in messages" :key="message.id"
           class="bg-white p-4 rounded-lg shadow hover:shadow-md transition-shadow cursor-pointer"
           :class="{'border-l-4 border-blue-500': !message.read_status}"
           @click="openMessageDetail(message)">
        <div class="flex justify-between items-start">
          <div class="flex-1">
            <p class="text-gray-900 font-medium">{{ message.content }}</p>
            <p class="text-sm text-gray-500 mt-1">{{ message.send_time }}</p>
          </div>
          <div class="ml-4">
            <span v-if="!message.read_status"
                  class="inline-block w-2 h-2 bg-blue-500 rounded-full"></span>
          </div>
        </div>
      </div>
    </div>

    <!-- 消息详情弹窗 -->
    <div v-if="showModal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center">
      <div class="bg-white rounded-lg p-6 max-w-lg w-full mx-4">
        <div class="flex justify-between items-start mb-4">
          <h2 class="text-xl font-semibold">消息详情</h2>
          <button @click="closeModal" class="text-gray-500 hover:text-gray-700">
            <svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
              <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
            </svg>
          </button>
        </div>

        <div class="mb-6">
          <p class="text-gray-900 mb-2">{{ selectedMessage?.content }}</p>
          <p class="text-sm text-gray-500">{{ selectedMessage?.send_time }}</p>
        </div>

        <!-- 回复框 -->
        <div class="mt-4">
          <textarea
            v-model="replyContent"
            rows="3"
            class="w-full border rounded-lg p-2 focus:outline-none focus:ring-2 focus:ring-blue-500"
            placeholder="输入回复内容..."
          ></textarea>
          <div class="flex justify-end mt-2">
            <button
              @click="sendReply"
              class="bg-blue-500 text-white px-4 py-2 rounded-lg hover:bg-blue-600 transition-colors"
            >
              发送回复
            </button>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import messagesData from '../data/messages.json'

const messages = ref([])
const showModal = ref(false)
const selectedMessage = ref(null)
const replyContent = ref('')

onMounted(() => {
  messages.value = messagesData.messages
})

const openMessageDetail = (message) => {
  selectedMessage.value = message
  showModal.value = true
  // 更新消息已读状态
  if (!message.read_status) {
    message.read_status = true
  }
}

const closeModal = () => {
  showModal.value = false
  selectedMessage.value = null
  replyContent.value = ''
}

const sendReply = () => {
  if (!replyContent.value.trim()) return

  // 这里可以添加发送回复的逻辑
  console.log('回复内容:', replyContent.value)
  console.log('回复给消息:', selectedMessage.value)

  // 清空回复内容并关闭弹窗
  replyContent.value = ''
  closeModal()
}
</script>