详细实现计划:Colleen Chat Room App Bug修复与功能增强

第一部分:Bug修复

Bug 1: 点击右上角退出后很快又会重新连接

根因分析: disconnect() 方法(chat.js:165-180)先调用 this.ws.close(),然后立即将 this.ws = null。但 ws.close() 是异步的 — 关闭操作触发 onclose 事件,而 onclose 处理器绑定的是 onDisconnected() 方法(chat.js:153-163),该方法会尝试自动重连。因此:用户点击退出 → disconnect() 调用 ws.close() → 触发 oncloseonDisconnected() 执行自动重连逻辑。

修复方案:

涉及文件: src/main/resources/static/js/chat.js

Bug 2: 其他用户进入房间后,当前用户列表不会刷新

根因分析:user_joineduser_left 事件到达时,handleUserJoined()handleUserLeft() 调用 this.loadUsersList()(chat.js:310-320)。但 loadUsersList() 方法体是空的(只有一行注释),所以实际上不会刷新用户列表。服务端确实广播了 UserJoined 事件(ChatService.kt:65),但客户端没有利用该数据。

修复方案(方案A - 直接利用事件数据,更高效):

涉及文件: src/main/resources/static/js/chat.js

Bug 3: 上传文件时,如果文件名太长则会溢出

根因分析: CSS 中 .file-name(style.css:594-598)没有设置文本溢出处理。.message-file 容器有 max-width: 400px,但 .file-name 内容可以超出容器宽度。

修复方案:

涉及文件: src/main/resources/static/css/style.css

第二部分:新功能实现

Feature 1: Private Messages(私信功能)

后端变更:

前端变更:

Feature 2: User Mentions(@提及功能)

后端变更:

前端变更:

Feature 3: Message Editing/Deletion(消息编辑/删除)

后端变更:

前端变更:

Feature 4: Rich Text(富文本 — Markdown/代码块支持)

后端变更: 无需后端变更 — Markdown 渲染在客户端完成,后端原样存储文本内容。

前端变更:

Feature 5: Search(搜索消息历史)

后端变更:

前端变更:

Feature 6: User Profiles(用户档案 — 头像、简介、状态消息)

后端变更:

前端变更:

Feature 7: Room Permissions(房间权限 — 管理员/版主角色)

后端变更:

前端变更:

Feature 8: Message Threading(消息线程 — 回复特定消息)

后端变更:

前端变更:

第三部分:功能增强

Enhancement 1: 移除100条消息限制,实现滚动加载历史消息

后端变更:

前端变更:

实施顺序建议

Phase 1 — Bug修复(优先):

  1. Bug 1: 退出后重连问题

  2. Bug 2: 用户列表不刷新

  3. Bug 3: 文件名溢出

Phase 2 — 数据库迁移与基础设施: 4. 创建 V2 migration 脚本(一次性添加所有新列/表) 5. 更新 Models.kt 添加所有新字段

Phase 3 — 核心功能增强: 6. Enhancement 1: 历史消息滚动加载 7. Feature 4: Rich Text (Markdown) 8. Feature 5: Search 9. Feature 3: Message Editing/Deletion

Phase 4 — 社交功能: 10. Feature 2: User Mentions 11. Feature 8: Message Threading 12. Feature 1: Private Messages

Phase 5 — 用户管理: 13. Feature 6: User Profiles 14. Feature 7: Room Permissions

数据库 V2 Migration 脚本概要

SQL

-- V2__Add_features.sql

-- Message editing/deletion
ALTER TABLE messages ADD COLUMN edited_at TIMESTAMP;
ALTER TABLE messages ADD COLUMN is_deleted INTEGER DEFAULT 0;

-- Message threading
ALTER TABLE messages ADD COLUMN reply_to_id INTEGER REFERENCES messages(id);

-- User profiles
ALTER TABLE users ADD COLUMN bio TEXT;
ALTER TABLE users ADD COLUMN status TEXT;

-- Room permissions
ALTER TABLE room_members ADD COLUMN role TEXT DEFAULT 'member' CHECK(role IN ('owner', 'admin', 'moderator', 'member'));

-- Private messages
CREATE TABLE private_messages (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    sender_id INTEGER NOT NULL,
    receiver_id INTEGER NOT NULL,
    message_type TEXT NOT NULL CHECK(message_type IN ('text', 'image', 'file')),
    content TEXT,
    file_url TEXT,
    file_name TEXT,
    file_size INTEGER,
    mime_type TEXT,
    thumbnail_url TEXT,
    is_read INTEGER DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (sender_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (receiver_id) REFERENCES users(id) ON DELETE CASCADE
);

CREATE INDEX idx_private_messages_participants ON private_messages(sender_id, receiver_id, created_at);
CREATE INDEX idx_private_messages_receiver ON private_messages(receiver_id, is_read);
CREATE INDEX idx_messages_reply_to ON messages(reply_to_id);

新增 WebSocket 消息类型总览