311 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			311 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<div class="messages-section">
 | 
						|
    <h2 class="section-title">我的消息</h2>
 | 
						|
    
 | 
						|
    <div class="message-tabs">
 | 
						|
        <div class="layui-tab layui-tab-brief" lay-filter="messageTabs">
 | 
						|
            <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>
 | 
						|
</div>
 | 
						|
 | 
						|
<style>
 | 
						|
.messages-section {
 | 
						|
    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;
 | 
						|
}
 | 
						|
 | 
						|
.message-tabs {
 | 
						|
    margin-top: 20px;
 | 
						|
}
 | 
						|
 | 
						|
.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) {
 | 
						|
    .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>
 |