1. 需求分析
明确站内信功能的需求:
- 用户可以接收和发送站内信
- 站内信可以包含文本、图片、链接等内容
- 支持已读/未读状态
- 支持消息通知
- 支持消息的删除
2. 数据库设计
为了实现站内信功能,需要设计相关的数据表。主要包括用户表、消息表和用户消息状态表。
用户表(Users Table)
存储用户的基本信息。
CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, email VARCHAR(100) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
消息表(Messages Table)
存储所有的站内信信息。
CREATE TABLE messages ( message_id INT AUTO_INCREMENT PRIMARY KEY, sender_id INT NOT NULL, receiver_id INT NOT NULL, subject VARCHAR(255), body TEXT, sent_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (sender_id) REFERENCES users(user_id), FOREIGN KEY (receiver_id) REFERENCES users(user_id) );
用户消息状态表(User Message Status Table)
记录每个用户的消息阅读状态。
CREATE TABLE user_message_status ( user_message_status_id INT AUTO_INCREMENT PRIMARY KEY, message_id INT NOT NULL, user_id INT NOT NULL, is_read BOOLEAN DEFAULT FALSE, deleted BOOLEAN DEFAULT FALSE, read_at TIMESTAMP, FOREIGN KEY (message_id) REFERENCES messages(message_id), FOREIGN KEY (user_id) REFERENCES users(user_id) );
3. 功能实现
发送站内信
用户可以通过前端界面发送站内信。
前端部分
创建一个发送消息的表单:
<form id="sendMessageForm"> <input type="text" id="receiver" placeholder="Receiver username" required> <input type="text" id="subject" placeholder="Subject" required> <textarea id="body" placeholder="Message body" required></textarea> <button type="submit">Send</button> </form>
后端部分
实现发送消息的API接口:
app.post('/send-message', (req, res) => { const { sender_id, receiver_username, subject, body } = req.body; // 查找接收者ID const receiver = db.query('SELECT user_id FROM users WHERE username = ?', [receiver_username]); if (!receiver) { return res.status(404).json({ error: 'Receiver not found' }); } // 插入消息 const message = db.query('INSERT INTO messages (sender_id, receiver_id, subject, body) VALUES (?, ?, ?, ?)', [sender_id, receiver.user_id, subject, body]); // 插入消息状态 db.query('INSERT INTO user_message_status (message_id, user_id) VALUES (?, ?)', [message.insertId, receiver.user_id]); res.status(201).json({ message: 'Message sent successfully' }); });
接收站内信
用户可以查看收到的站内信。
前端部分
展示收到的消息列表:
<ul id="messageList"> <!-- 动态加载消息 --> </ul>
后端部分
实现获取消息列表的API接口:
app.get('/messages', (req, res) => { const { user_id } = req.query; const messages = db.query('SELECT m.message_id, m.subject, m.body, m.sent_at, u.username as sender, ums.is_read FROM messages m JOIN user_message_status ums ON m.message_id = ums.message_id JOIN users u ON m.sender_id = u.user_id WHERE ums.user_id = ? AND ums.deleted = FALSE', [user_id]); res.status(200).json(messages); });
阅读站内信
用户可以标记消息为已读。
前端部分
展示消息详情并标记为已读:
<div id="messageDetail"> <h2 id="messageSubject"></h2> <p id="messageBody"></p> <p id="messageSender"></p> <button id="markAsReadButton">Mark as Read</button> </div>
后端部分
实现标记为已读的API接口:
app.post('/read-message', (req, res) => { const { user_id, message_id } = req.body; db.query('UPDATE user_message_status SET is_read = TRUE, read_at = NOW() WHERE user_id = ? AND message_id = ?', [user_id, message_id]); res.status(200).json({ message: 'Message marked as read' }); });
删除站内信
用户可以删除收到的站内信。
前端部分
删除消息按钮:
<button id="deleteMessageButton">Delete</button>
后端部分
实现删除消息的API接口:
app.post('/delete-message', (req, res) => { const { user_id, message_id } = req.body; db.query('UPDATE user_message_status SET deleted = TRUE WHERE user_id = ? AND message_id = ?', [user_id, message_id]); res.status(200).json({ message: 'Message deleted successfully' }); });
4. 消息通知
用户在收到新消息时可以接收到通知。
实现消息通知功能
使用WebSocket或第三方推送服务(如信鸽、极光推送)来实现实时消息通知。
示例:使用WebSocket
前端部分:
const socket = new WebSocket('ws://yourserver.com'); socket.onmessage = function(event) { const data = JSON.parse(event.data); if (data.type === 'new_message') { alert('You have a new message!'); // 重新加载消息列表 loadMessages(); } };
后端部分:
const WebSocket = require('ws'); const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { ws.on('message', (message) => { const data = JSON.parse(message); if (data.type === 'new_message') { // 通知接收者 const receiverWs = getWebSocketByUserId(data.receiver_id); if (receiverWs) { receiverWs.send(JSON.stringify({ type: 'new_message' })); } } }); }); function getWebSocketByUserId(user_id) { // 根据user_id获取对应的WebSocket连接 // 实现方法根据实际情况定义 }
5. 安全性考虑
确保站内信功能的安全性,防止恶意攻击和数据泄露。
输入验证和输出编码
对所有用户输入进行验证和清理,防止SQL注入和XSS攻击。
身份验证和授权
确保只有授权用户才能访问和操作站内信功能。
数据加密
对敏感信息进行加密存储和传输。
6. 性能优化
优化数据库查询和消息推送的性能,确保系统的响应速度和可扩展性。
数据库优化
使用索引和查询优化技术,提高数据库查询性能。
异步处理
使用异步处理和消息队列,确保高并发下的系统性能。
7. 用户体验
提供良好的用户体验,确保站内信功能的易用性和美观性。
友好的界面设计
设计简洁、直观的用户界面,让用户方便地发送和接收站内信。
消息提醒和反馈
提供及时的消息提醒和操作反馈,提升用户体验。
通过以上步骤和细节设计,可以实现一个功能完备、安全可靠的站内信系统,为用户提供良好的消息交流体验。