209 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<div class="notifications-section">
 | 
						|
 | 
						|
    <div class="layui-tab layui-tab-brief" lay-filter="notificationTabs">
 | 
						|
        <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="notification-list" id="allNotifications"></div>
 | 
						|
            </div>
 | 
						|
            <div class="layui-tab-item">
 | 
						|
                <div class="notification-list" id="unreadNotifications"></div>
 | 
						|
            </div>
 | 
						|
            <div class="layui-tab-item">
 | 
						|
                <div class="notification-list" id="readNotifications"></div>
 | 
						|
            </div>
 | 
						|
        </div>
 | 
						|
    </div>
 | 
						|
</div>
 | 
						|
 | 
						|
<style>
 | 
						|
    .notifications-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;
 | 
						|
    }
 | 
						|
 | 
						|
    .notification-list {
 | 
						|
        min-height: 200px;
 | 
						|
    }
 | 
						|
 | 
						|
    .notification-item {
 | 
						|
        padding: 16px;
 | 
						|
        border-bottom: 1px solid #f0f0f0;
 | 
						|
        display: flex;
 | 
						|
        justify-content: space-between;
 | 
						|
        align-items: center;
 | 
						|
    }
 | 
						|
 | 
						|
    .notification-item:hover {
 | 
						|
        background-color: #f9f9f9;
 | 
						|
    }
 | 
						|
 | 
						|
    .notification-content {
 | 
						|
        flex: 1;
 | 
						|
    }
 | 
						|
 | 
						|
    .notification-title {
 | 
						|
        font-size: 16px;
 | 
						|
        color: #333;
 | 
						|
        margin-bottom: 8px;
 | 
						|
    }
 | 
						|
 | 
						|
    .notification-time {
 | 
						|
        font-size: 12px;
 | 
						|
        color: #999;
 | 
						|
    }
 | 
						|
 | 
						|
    .notification-actions {
 | 
						|
        display: flex;
 | 
						|
        gap: 8px;
 | 
						|
    }
 | 
						|
 | 
						|
    .notification-item.unread .notification-title {
 | 
						|
        font-weight: 600;
 | 
						|
    }
 | 
						|
 | 
						|
    .notification-item.unread::before {
 | 
						|
        content: '';
 | 
						|
        display: inline-block;
 | 
						|
        width: 8px;
 | 
						|
        height: 8px;
 | 
						|
        background-color: #1677ff;
 | 
						|
        border-radius: 50%;
 | 
						|
        margin-right: 8px;
 | 
						|
    }
 | 
						|
 | 
						|
    @media (max-width: 768px) {
 | 
						|
        .notification-actions {
 | 
						|
            flex-direction: column;
 | 
						|
        }
 | 
						|
    }
 | 
						|
</style>
 | 
						|
 | 
						|
<script>
 | 
						|
    layui.use(['element', 'layer'], function () {
 | 
						|
        var element = layui.element;
 | 
						|
        var layer = layui.layer;
 | 
						|
 | 
						|
        // 加载通知列表
 | 
						|
        function loadNotifications(type) {
 | 
						|
            var container = document.getElementById(type + 'Notifications');
 | 
						|
            container.innerHTML = '<div class="layui-anim layui-anim-upbit layui-anim-loop layui-anim-shrink" style="text-align: center; padding: 20px;"><i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i></div>';
 | 
						|
 | 
						|
            fetch('/index/user/getNotifications?type=' + type)
 | 
						|
                .then(response => response.json())
 | 
						|
                .then(data => {
 | 
						|
                    if (data.code === 0) {
 | 
						|
                        if (data.data.length === 0) {
 | 
						|
                            container.innerHTML = '<div class="layui-none">暂无通知</div>';
 | 
						|
                            return;
 | 
						|
                        }
 | 
						|
 | 
						|
                        var html = '';
 | 
						|
                        data.data.forEach(function (notification) {
 | 
						|
                            html += `
 | 
						|
                            <div class="notification-item ${notification.is_read ? '' : 'unread'}" data-id="${notification.id}">
 | 
						|
                                <div class="notification-content">
 | 
						|
                                    <div class="notification-title">${notification.title}</div>
 | 
						|
                                    <div class="notification-time">${notification.create_time}</div>
 | 
						|
                                </div>
 | 
						|
                                <div class="notification-actions">
 | 
						|
                                    <button class="layui-btn layui-btn-xs" onclick="viewNotification(${notification.id})">查看</button>
 | 
						|
                                    <button class="layui-btn layui-btn-xs layui-btn-danger" onclick="deleteNotification(${notification.id})">删除</button>
 | 
						|
                                </div>
 | 
						|
                            </div>
 | 
						|
                        `;
 | 
						|
                        });
 | 
						|
                        container.innerHTML = html;
 | 
						|
                    } else {
 | 
						|
                        layer.msg(data.msg || '加载失败', { icon: 2 });
 | 
						|
                    }
 | 
						|
                })
 | 
						|
                .catch(error => {
 | 
						|
                    layer.msg('加载失败,请重试', { icon: 2 });
 | 
						|
                });
 | 
						|
        }
 | 
						|
 | 
						|
        // 查看通知
 | 
						|
        window.viewNotification = function (notificationId) {
 | 
						|
            fetch('/index/user/readNotification', {
 | 
						|
                method: 'POST',
 | 
						|
                headers: {
 | 
						|
                    'Content-Type': 'application/json'
 | 
						|
                },
 | 
						|
                body: JSON.stringify({ id: notificationId })
 | 
						|
            })
 | 
						|
                .then(response => response.json())
 | 
						|
                .then(data => {
 | 
						|
                    if (data.code === 0) {
 | 
						|
                        layer.open({
 | 
						|
                            type: 2,
 | 
						|
                            title: '通知详情',
 | 
						|
                            area: ['500px', '400px'],
 | 
						|
                            content: '/index/user/notificationDetail?id=' + notificationId
 | 
						|
                        });
 | 
						|
                        // 重新加载通知列表
 | 
						|
                        loadNotifications('all');
 | 
						|
                        loadNotifications('unread');
 | 
						|
                        loadNotifications('read');
 | 
						|
                    } else {
 | 
						|
                        layer.msg(data.msg || '操作失败', { icon: 2 });
 | 
						|
                    }
 | 
						|
                })
 | 
						|
                .catch(error => {
 | 
						|
                    layer.msg('操作失败,请重试', { icon: 2 });
 | 
						|
                });
 | 
						|
        }
 | 
						|
 | 
						|
        // 删除通知
 | 
						|
        window.deleteNotification = function (notificationId) {
 | 
						|
            layer.confirm('确定要删除这条通知吗?', {
 | 
						|
                btn: ['确定', '取消']
 | 
						|
            }, function () {
 | 
						|
                fetch('/index/user/deleteNotification', {
 | 
						|
                    method: 'POST',
 | 
						|
                    headers: {
 | 
						|
                        'Content-Type': 'application/json'
 | 
						|
                    },
 | 
						|
                    body: JSON.stringify({ id: notificationId })
 | 
						|
                })
 | 
						|
                    .then(response => response.json())
 | 
						|
                    .then(data => {
 | 
						|
                        if (data.code === 0) {
 | 
						|
                            layer.msg('删除成功', { icon: 1 });
 | 
						|
                            // 重新加载通知列表
 | 
						|
                            loadNotifications('all');
 | 
						|
                            loadNotifications('unread');
 | 
						|
                            loadNotifications('read');
 | 
						|
                        } else {
 | 
						|
                            layer.msg(data.msg || '删除失败', { icon: 2 });
 | 
						|
                        }
 | 
						|
                    })
 | 
						|
                    .catch(error => {
 | 
						|
                        layer.msg('删除失败,请重试', { icon: 2 });
 | 
						|
                    });
 | 
						|
            });
 | 
						|
        }
 | 
						|
 | 
						|
        // 监听标签切换
 | 
						|
        element.on('tab(notificationTabs)', function (data) {
 | 
						|
            var type = ['all', 'unread', 'read'][data.index];
 | 
						|
            loadNotifications(type);
 | 
						|
        });
 | 
						|
 | 
						|
        // 初始加载全部通知
 | 
						|
        loadNotifications('all');
 | 
						|
    });
 | 
						|
</script> |