first commit
This commit is contained in:
@@ -0,0 +1,326 @@
|
||||
<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>
|
||||
Reference in New Issue
Block a user