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> |