处理发送消息重复的问题
This commit is contained in:
@@ -42,7 +42,7 @@ const storage = multer.diskStorage({
|
||||
});
|
||||
const upload = multer({
|
||||
storage,
|
||||
limits: { fileSize: 5 * 1024 * 1024 }, // 5MB
|
||||
limits: { fileSize: 5 * 1024 * 1024 },
|
||||
fileFilter: (req, file, cb) => {
|
||||
const allowed = ['image/jpeg','image/png','image/gif'];
|
||||
cb(null, allowed.includes(file.mimetype));
|
||||
@@ -80,7 +80,6 @@ app.get('/api/user', auth, (req, res) => {
|
||||
res.json({ username: req.user.username, isAdmin: req.user.isAdmin });
|
||||
});
|
||||
|
||||
// 群聊列表(带最后消息)
|
||||
app.get('/api/rooms', auth, (req, res) => {
|
||||
const rooms = db.prepare('SELECT * FROM rooms').all();
|
||||
const result = rooms.map(room => {
|
||||
@@ -126,19 +125,26 @@ app.post('/api/rooms/:roomId/messages', auth, (req, res) => {
|
||||
attachments: attachments || [],
|
||||
timestamp
|
||||
};
|
||||
|
||||
// 房间最后消息预览
|
||||
const lastMsg = db.prepare('SELECT text, timestamp FROM messages WHERE room_id = ? ORDER BY timestamp DESC LIMIT 1').get(roomId);
|
||||
broadcastToRoom(roomId, {
|
||||
const preview = {
|
||||
room_id: roomId,
|
||||
last_message: lastMsg ? lastMsg.text : '',
|
||||
last_time: lastMsg ? lastMsg.timestamp : ''
|
||||
};
|
||||
|
||||
// 广播给房间内其他成员,但不包括发送者自己
|
||||
broadcastToRoomExcludeSelf(roomId, username, {
|
||||
type: 'new_message',
|
||||
message: msg,
|
||||
room_preview: {
|
||||
room_id: roomId,
|
||||
last_message: lastMsg ? lastMsg.text : '',
|
||||
last_time: lastMsg ? lastMsg.timestamp : ''
|
||||
}
|
||||
room_preview: preview
|
||||
});
|
||||
|
||||
// 加入对话历史
|
||||
addToHistory(roomId, 'user', `${username}: ${text || '图片'}`);
|
||||
|
||||
// 返回消息给发送者
|
||||
res.json(msg);
|
||||
});
|
||||
|
||||
@@ -186,7 +192,8 @@ app.get('/api/rooms/:roomId/purchases/export', auth, (req, res) => {
|
||||
});
|
||||
|
||||
// WebSocket 管理
|
||||
const clients = new Map();
|
||||
const clients = new Map(); // ws -> { username, roomId }
|
||||
|
||||
wss.on('connection', (ws, req) => {
|
||||
console.log('✅ WebSocket 客户端已连接');
|
||||
const url = new URL(req.url, 'http://localhost');
|
||||
@@ -220,6 +227,17 @@ wss.on('connection', (ws, req) => {
|
||||
});
|
||||
});
|
||||
|
||||
// 广播给房间内所有成员,排除指定用户
|
||||
function broadcastToRoomExcludeSelf(roomId, excludeUsername, data) {
|
||||
const message = JSON.stringify(data);
|
||||
clients.forEach((info, ws) => {
|
||||
if (info.roomId === roomId && info.username !== excludeUsername && ws.readyState === 1) {
|
||||
ws.send(message);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 广播给房间内所有人
|
||||
function broadcastToRoom(roomId, data) {
|
||||
const message = JSON.stringify(data);
|
||||
clients.forEach((info, ws) => {
|
||||
@@ -229,6 +247,7 @@ function broadcastToRoom(roomId, data) {
|
||||
});
|
||||
}
|
||||
|
||||
// 全局广播
|
||||
function broadcast(data) {
|
||||
const message = JSON.stringify(data);
|
||||
clients.forEach((ws) => {
|
||||
@@ -236,7 +255,7 @@ function broadcast(data) {
|
||||
});
|
||||
}
|
||||
|
||||
// 文本消息存储并广播(用于 AI 回复等内部消息)
|
||||
// 内部消息存储并广播(用于 AI 回复等)
|
||||
function storeAndBroadcastText(roomId, user, text) {
|
||||
const timestamp = new Date().toLocaleString('zh-CN', { hour12: false });
|
||||
const result = db.prepare('INSERT INTO messages (room_id, user, text, timestamp) VALUES (?,?,?,?)').run(roomId, user, text, timestamp);
|
||||
@@ -266,7 +285,7 @@ function addToHistory(roomId, role, content) {
|
||||
if (history.length > 60) conversationHistory.set(roomId, history.slice(-40));
|
||||
}
|
||||
|
||||
// AI 处理相关函数(保持不变)
|
||||
// AI 处理(保持原逻辑)
|
||||
async function analyzeWithDeepSeek(text, historyMessages, username) {
|
||||
const systemPrompt = `你是智能财务助手“小财”。结合对话历史理解用户意图。只返回JSON。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user