326 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			326 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <div class="basic-info">
 | |
|     <div class="layui-tab">
 | |
|         <ul class="layui-tab-title">
 | |
|             <li class="layui-this">全部消息</li>
 | |
|             <li>未读消息</li>
 | |
|             <li>已读消息</li>
 | |
|         </ul>
 | |
|         <div class="layui-tab-content">
 | |
|             <div class="layui-tab-item layui-show">
 | |
|                 <div class="message-list" id="allMessages">
 | |
|                     <!-- 消息列表将通过JavaScript动态加载 -->
 | |
|                 </div>
 | |
|             </div>
 | |
|             <div class="layui-tab-item">
 | |
|                 <div class="message-list" id="unreadMessages">
 | |
|                     <!-- 未读消息列表 -->
 | |
|                 </div>
 | |
|             </div>
 | |
|             <div class="layui-tab-item">
 | |
|                 <div class="message-list" id="readMessages">
 | |
|                     <!-- 已读消息列表 -->
 | |
|                 </div>
 | |
|             </div>
 | |
|         </div>
 | |
|     </div>
 | |
| </div>
 | |
| 
 | |
| <style>
 | |
|     .basic-info {
 | |
|         max-width: 800px;
 | |
|         margin: 0 auto;
 | |
|     }
 | |
| 
 | |
|     .section-title {
 | |
|         font-size: 20px;
 | |
|         font-weight: 600;
 | |
|         color: #333;
 | |
|         margin-bottom: 24px;
 | |
|         padding-bottom: 16px;
 | |
|         border-bottom: 1px solid #f0f0f0;
 | |
|     }
 | |
| 
 | |
|     .layui-form-label {
 | |
|         width: 100px;
 | |
|     }
 | |
| 
 | |
|     .layui-input-block {
 | |
|         margin-left: 130px;
 | |
|     }
 | |
| 
 | |
|     .layui-form-item {
 | |
|         margin-bottom: 24px;
 | |
|     }
 | |
| 
 | |
|     .layui-textarea {
 | |
|         min-height: 120px;
 | |
|     }
 | |
| 
 | |
|     .message-list {
 | |
|         margin-top: 20px;
 | |
|     }
 | |
| 
 | |
|     .message-item {
 | |
|         padding: 16px;
 | |
|         border-bottom: 1px solid #f0f0f0;
 | |
|         display: flex;
 | |
|         align-items: flex-start;
 | |
|         gap: 16px;
 | |
|         cursor: pointer;
 | |
|         transition: background-color 0.3s;
 | |
|     }
 | |
| 
 | |
|     .message-item:hover {
 | |
|         background-color: #f9f9f9;
 | |
|     }
 | |
| 
 | |
|     .message-item.unread {
 | |
|         background-color: #f0f7ff;
 | |
|     }
 | |
| 
 | |
|     .message-avatar {
 | |
|         width: 40px;
 | |
|         height: 40px;
 | |
|         border-radius: 50%;
 | |
|         object-fit: cover;
 | |
|     }
 | |
| 
 | |
|     .message-content {
 | |
|         flex: 1;
 | |
|     }
 | |
| 
 | |
|     .message-title {
 | |
|         font-weight: 500;
 | |
|         margin-bottom: 4px;
 | |
|         color: #333;
 | |
|     }
 | |
| 
 | |
|     .message-text {
 | |
|         color: #666;
 | |
|         font-size: 14px;
 | |
|         margin-bottom: 8px;
 | |
|     }
 | |
| 
 | |
|     .message-meta {
 | |
|         display: flex;
 | |
|         justify-content: space-between;
 | |
|         align-items: center;
 | |
|         font-size: 12px;
 | |
|         color: #999;
 | |
|     }
 | |
| 
 | |
|     .message-time {
 | |
|         color: #999;
 | |
|     }
 | |
| 
 | |
|     .message-actions {
 | |
|         display: flex;
 | |
|         gap: 8px;
 | |
|     }
 | |
| 
 | |
|     .message-actions button {
 | |
|         padding: 4px 8px;
 | |
|         font-size: 12px;
 | |
|         border-radius: 4px;
 | |
|         background: none;
 | |
|         border: 1px solid #d9d9d9;
 | |
|         color: #666;
 | |
|         cursor: pointer;
 | |
|         transition: all 0.3s;
 | |
|     }
 | |
| 
 | |
|     .message-actions button:hover {
 | |
|         border-color: #1677ff;
 | |
|         color: #1677ff;
 | |
|     }
 | |
| 
 | |
|     .empty-message {
 | |
|         text-align: center;
 | |
|         padding: 40px 0;
 | |
|         color: #999;
 | |
|     }
 | |
| 
 | |
|     @media (max-width: 768px) {
 | |
|         .layui-form-label {
 | |
|             width: 80px;
 | |
|         }
 | |
| 
 | |
|         .layui-input-block {
 | |
|             margin-left: 110px;
 | |
|         }
 | |
| 
 | |
|         .message-item {
 | |
|             padding: 12px;
 | |
|         }
 | |
| 
 | |
|         .message-avatar {
 | |
|             width: 32px;
 | |
|             height: 32px;
 | |
|         }
 | |
|     }
 | |
| </style>
 | |
| 
 | |
| <script>
 | |
|     layui.use(['element', 'layer'], function () {
 | |
|         var element = layui.element;
 | |
|         var layer = layui.layer;
 | |
| 
 | |
|         // 加载消息列表
 | |
|         function loadMessages(type) {
 | |
|             var container = document.getElementById(type + 'Messages');
 | |
|             var loadIndex = layer.load(2);
 | |
| 
 | |
|             fetch('/index/user/getMessages?type=' + type)
 | |
|                 .then(response => response.json())
 | |
|                 .then(data => {
 | |
|                     layer.close(loadIndex);
 | |
|                     if (data.code === 0) {
 | |
|                         renderMessages(container, data.data);
 | |
|                     } else {
 | |
|                         layer.msg(data.msg || '加载失败', { icon: 2 });
 | |
|                     }
 | |
|                 })
 | |
|                 .catch(error => {
 | |
|                     layer.close(loadIndex);
 | |
|                     layer.msg('加载失败,请重试', { icon: 2 });
 | |
|                 });
 | |
|         }
 | |
| 
 | |
|         // 渲染消息列表
 | |
|         function renderMessages(container, messages) {
 | |
|             if (!messages || messages.length === 0) {
 | |
|                 container.innerHTML = '<div class="empty-message">暂无消息</div>';
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             var html = '';
 | |
|             messages.forEach(function (message) {
 | |
|                 html += `
 | |
|                 <div class="message-item ${message.is_read ? '' : 'unread'}" data-id="${message.id}">
 | |
|                     <img src="${message.avatar || '/static/images/avatar.png'}" class="message-avatar" alt="头像">
 | |
|                     <div class="message-content">
 | |
|                         <div class="message-title">${message.title}</div>
 | |
|                         <div class="message-text">${message.content}</div>
 | |
|                         <div class="message-meta">
 | |
|                             <span class="message-time">${message.create_time}</span>
 | |
|                             <div class="message-actions">
 | |
|                                 ${!message.is_read ? '<button class="mark-read">标记已读</button>' : ''}
 | |
|                                 <button class="delete-message">删除</button>
 | |
|                             </div>
 | |
|                         </div>
 | |
|                     </div>
 | |
|                 </div>
 | |
|             `;
 | |
|             });
 | |
| 
 | |
|             container.innerHTML = html;
 | |
| 
 | |
|             // 绑定事件
 | |
|             bindMessageEvents(container);
 | |
|         }
 | |
| 
 | |
|         // 绑定消息事件
 | |
|         function bindMessageEvents(container) {
 | |
|             // 标记已读
 | |
|             container.querySelectorAll('.mark-read').forEach(btn => {
 | |
|                 btn.addEventListener('click', function (e) {
 | |
|                     e.stopPropagation();
 | |
|                     var messageId = this.closest('.message-item').dataset.id;
 | |
|                     markAsRead(messageId);
 | |
|                 });
 | |
|             });
 | |
| 
 | |
|             // 删除消息
 | |
|             container.querySelectorAll('.delete-message').forEach(btn => {
 | |
|                 btn.addEventListener('click', function (e) {
 | |
|                     e.stopPropagation();
 | |
|                     var messageId = this.closest('.message-item').dataset.id;
 | |
|                     deleteMessage(messageId);
 | |
|                 });
 | |
|             });
 | |
| 
 | |
|             // 点击消息
 | |
|             container.querySelectorAll('.message-item').forEach(item => {
 | |
|                 item.addEventListener('click', function () {
 | |
|                     var messageId = this.dataset.id;
 | |
|                     viewMessage(messageId);
 | |
|                 });
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         // 标记已读
 | |
|         function markAsRead(messageId) {
 | |
|             fetch('/index/user/markMessageRead', {
 | |
|                 method: 'POST',
 | |
|                 headers: {
 | |
|                     'Content-Type': 'application/json'
 | |
|                 },
 | |
|                 body: JSON.stringify({ id: messageId })
 | |
|             })
 | |
|                 .then(response => response.json())
 | |
|                 .then(data => {
 | |
|                     if (data.code === 0) {
 | |
|                         layer.msg('已标记为已读', { icon: 1 });
 | |
|                         // 重新加载消息列表
 | |
|                         loadMessages('all');
 | |
|                         loadMessages('unread');
 | |
|                         loadMessages('read');
 | |
|                     } else {
 | |
|                         layer.msg(data.msg || '操作失败', { icon: 2 });
 | |
|                     }
 | |
|                 })
 | |
|                 .catch(error => {
 | |
|                     layer.msg('操作失败,请重试', { icon: 2 });
 | |
|                 });
 | |
|         }
 | |
| 
 | |
|         // 删除消息
 | |
|         function deleteMessage(messageId) {
 | |
|             layer.confirm('确定要删除这条消息吗?', {
 | |
|                 btn: ['确定', '取消']
 | |
|             }, function () {
 | |
|                 fetch('/index/user/deleteMessage', {
 | |
|                     method: 'POST',
 | |
|                     headers: {
 | |
|                         'Content-Type': 'application/json'
 | |
|                     },
 | |
|                     body: JSON.stringify({ id: messageId })
 | |
|                 })
 | |
|                     .then(response => response.json())
 | |
|                     .then(data => {
 | |
|                         if (data.code === 0) {
 | |
|                             layer.msg('删除成功', { icon: 1 });
 | |
|                             // 重新加载消息列表
 | |
|                             loadMessages('all');
 | |
|                             loadMessages('unread');
 | |
|                             loadMessages('read');
 | |
|                         } else {
 | |
|                             layer.msg(data.msg || '删除失败', { icon: 2 });
 | |
|                         }
 | |
|                     })
 | |
|                     .catch(error => {
 | |
|                         layer.msg('删除失败,请重试', { icon: 2 });
 | |
|                     });
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         // 查看消息详情
 | |
|         function viewMessage(messageId) {
 | |
|             layer.open({
 | |
|                 type: 2,
 | |
|                 title: '消息详情',
 | |
|                 area: ['500px', '400px'],
 | |
|                 content: '/index/user/messageDetail?id=' + messageId
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         // 监听标签切换
 | |
|         element.on('tab(messageTabs)', function (data) {
 | |
|             var type = ['all', 'unread', 'read'][data.index];
 | |
|             loadMessages(type);
 | |
|         });
 | |
| 
 | |
|         // 初始加载全部消息
 | |
|         loadMessages('all');
 | |
|     });
 | |
| </script> |