CREATE TABLE chat_mysql.users (
    username VARCHAR(50) PRIMARY KEY,
    password VARCHAR(255) NOT NULL
);
SET SQL_SAFE_UPDATES = 0;
DELETE FROM chat_mysql.users;
SET SQL_SAFE_UPDATES = 1;
INSERT INTO chat_mysql.users (username, password)
VALUES
('admin', '123'),
('query', '123'),
('tom', '123'),
('jack', '123'),
('lucy', '123')，
('lily', '123');
select * from chat_mysql.users;


CREATE TABLE chat_mysql.contacts (
    user_name VARCHAR(50) NOT NULL,
    contact_name VARCHAR(50) NOT NULL,

    PRIMARY KEY (user_name, contact_name),

    FOREIGN KEY (user_name)
        REFERENCES chat_mysql.users(username),

    FOREIGN KEY (contact_name)
        REFERENCES chat_mysql.users(username)
);
INSERT INTO chat_mysql.contacts (user_name, contact_name)
VALUES
('admin', 'query'),
('admin', 'tom'),
('admin', 'jack'),
('admin', 'lucy'),
('query', 'admin'),
('query', 'tom'),
('tom', 'admin'),
('tom', 'query')，
('admin', 'lily'),
('lily', 'admin');
select * from chat_mysql.contacts;

CREATE TABLE chat_mysql.messages (
    id INT PRIMARY KEY AUTO_INCREMENT,
    sender_name VARCHAR(50) NOT NULL,
    receiver_name VARCHAR(50) NOT NULL,
    content VARCHAR(1000) NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,

    FOREIGN KEY (sender_name)
        REFERENCES chat_mysql.users(username),

    FOREIGN KEY (receiver_name)
        REFERENCES chat_mysql.users(username)
);
INSERT INTO chat_mysql.messages
(sender_name, receiver_name, content, created_at)
VALUES
-- admin ↔ query
('admin', 'query', '你好，最近怎么样？', '2026-09-20 10:00:00'),
('query', 'admin', '挺好的，你呢？', '2026-09-20 10:01:00'),
('admin', 'query', '我也不错，最近在做聊天项目。', '2026-09-20 10:02:00'),
('query', 'admin', '听起来不错，是用 Vue 做的吗？', '2026-09-20 10:03:00'),
('admin', 'query', '对，前端使用 Vue2，后端使用 Node.js。', '2026-09-20 10:04:00'),
('query', 'admin', '那数据库使用 MySQL？', '2026-09-20 10:05:00'),
('admin', 'query', '对，目前正在完善聊天功能。', '2026-09-20 10:06:00'),

-- admin ↔ tom
('admin', 'tom', '你今天有空吗？', '2026-09-20 11:00:00'),
('tom', 'admin', '有啊，怎么了？', '2026-09-20 11:01:00'),
('admin', 'tom', '想和你讨论一下项目。', '2026-09-20 11:02:00'),
('tom', 'admin', '可以，什么时间方便？', '2026-09-20 11:03:00'),
('admin', 'tom', '下午三点怎么样？', '2026-09-20 11:04:00'),
('tom', 'admin', '没问题。', '2026-09-20 11:05:00'),

-- admin ↔ jack
('jack', 'admin', '周末一起吃饭吗？', '2026-09-20 12:00:00'),
('admin', 'jack', '可以啊，去哪吃？', '2026-09-20 12:01:00'),
('jack', 'admin', '附近找一家餐厅吧。', '2026-09-20 12:02:00'),
('admin', 'jack', '好的，晚上六点怎么样？', '2026-09-20 12:03:00'),
('jack', 'admin', '可以，到时候联系。', '2026-09-20 12:04:00'),

-- admin ↔ lucy
('admin', 'lucy', '最近项目进展怎么样？', '2026-09-20 13:00:00'),
('lucy', 'admin', '目前进展还不错。', '2026-09-20 13:01:00'),
('admin', 'lucy', '还有哪些功能没有完成？', '2026-09-20 13:02:00'),
('lucy', 'admin', '主要是消息通知和联系人功能。', '2026-09-20 13:03:00'),
('admin', 'lucy', '好的，我这边也在做消息功能。', '2026-09-20 13:04:00'),

-- query ↔ tom
('query', 'tom', '你知道聊天项目怎么做 WebSocket 吗？', '2026-09-20 14:00:00'),
('tom', 'query', '知道一些，可以用来做实时消息。', '2026-09-20 14:01:00'),
('query', 'tom', '我也准备把项目改成 WebSocket。', '2026-09-20 14:02:00'),
('tom', 'query', '这样聊天消息可以实时推送。', '2026-09-20 14:03:00'),

-- tom ↔ query
('tom', 'query', '联系人比较多的时候怎么办？', '2026-09-20 15:00:00'),
('query', 'tom', '不需要每个联系人都创建一个 WebSocket。', '2026-09-20 15:01:00'),
('tom', 'query', '一个用户维护一个 WebSocket 连接就可以了。', '2026-09-20 15:02:00');
select * from chat_mysql.messages;

INSERT INTO chat_mysql.messages
(sender_name, receiver_name, content, created_at)
VALUES
-- admin ↔ lily
('admin', 'lily', '你好，最近怎么样？', '2026-09-20 10:00:00'),
('lily', 'admin', '挺好的，你呢？', '2026-09-20 10:01:00'),
('admin', 'lily', '我也不错，最近在做聊天项目。', '2026-09-20 10:02:00'),
('lily', 'admin', '听起来不错，是用 Vue 做的吗？', '2026-09-20 10:03:00'),
('admin', 'lily', '对，前端使用 Vue2，后端使用 Node.js。', '2026-09-20 10:04:00'),
('lily', 'admin', '那数据库使用 MySQL？', '2026-09-20 10:05:00'),
('admin', 'lily', '对，目前正在完善聊天功能。', '2026-09-20 10:06:00'),
('lily', 'admin', '聊天记录是怎么保存的？', '2026-09-20 10:07:00'),
('admin', 'lily', '目前是保存在 messages 表里面。', '2026-09-20 10:08:00'),
('lily', 'admin', '一个消息对应一条数据吗？', '2026-09-20 10:09:00'),
('admin', 'lily', '对，每条消息都有自己的 id。', '2026-09-20 10:10:00'),
('lily', 'admin', '那发送人和接收人怎么区分？', '2026-09-20 10:11:00'),
('admin', 'lily', '通过 sender_name 和 receiver_name 两个字段区分。', '2026-09-20 10:12:00'),
('lily', 'admin', '这样查询两个人的聊天记录应该比较方便。', '2026-09-20 10:13:00'),
('admin', 'lily', '对，只需要判断双方的用户名即可。', '2026-09-20 10:14:00'),
('lily', 'admin', '比如查询 admin 和 lily 之间的消息？', '2026-09-20 10:15:00'),
('admin', 'lily', '没错，可以使用 OR 和 AND 组合条件。', '2026-09-20 10:16:00'),
('lily', 'admin', '那如果消息很多怎么办？', '2026-09-20 10:17:00'),
('admin', 'lily', '不能一次把所有消息都返回给前端。', '2026-09-20 10:18:00'),
('lily', 'admin', '应该使用分页查询吧？', '2026-09-20 10:19:00'),
('admin', 'lily', '对，比如一次只查询 10 条或者 20 条。', '2026-09-20 10:20:00'),
('lily', 'admin', '这样可以减少接口返回的数据量。', '2026-09-20 10:21:00'),
('admin', 'lily', '也可以提高页面加载速度。', '2026-09-20 10:22:00'),
('lily', 'admin', '最近聊天列表也是单独查询吗？', '2026-09-20 10:23:00'),
('admin', 'lily', '对，最近聊天只需要获取每个联系人的最新消息。', '2026-09-20 10:24:00'),
('lily', 'admin', '这样左边就不用加载完整聊天记录了。', '2026-09-20 10:25:00'),
('admin', 'lily', '对，点击联系人之后再加载具体的聊天记录。', '2026-09-20 10:26:00'),
('lily', 'admin', '这个设计比较合理。', '2026-09-20 10:27:00'),
('admin', 'lily', '我现在就是准备按照这个思路修改。', '2026-09-20 10:28:00'),
('lily', 'admin', '那 Vue 里面是不是也不用保存所有消息？', '2026-09-20 10:29:00'),
('admin', 'lily', '是的，只需要保存当前联系人的消息数组。', '2026-09-20 10:30:00'),
('lily', 'admin', '分页的时候再把历史消息添加进去？', '2026-09-20 10:31:00'),
('admin', 'lily', '对，可以把下一页的数据添加到数组前面。', '2026-09-20 10:32:00'),
('lily', 'admin', '那新发送的消息就添加到数组最后面？', '2026-09-20 10:33:00'),
('admin', 'lily', '没错，因为新消息的时间是最新的。', '2026-09-20 10:34:00'),
('lily', 'admin', '左边的最近聊天还需要移动到最上面。', '2026-09-20 10:35:00'),
('admin', 'lily', '对，可以使用 unshift 把它移动到第一位。', '2026-09-20 10:36:00'),
('lily', 'admin', '同时更新左边显示的最后一条消息。', '2026-09-20 10:37:00'),
('admin', 'lily', '这样聊天列表就会实时更新了。', '2026-09-20 10:38:00'),
('lily', 'admin', '如果切换联系人，消息数组怎么办？', '2026-09-20 10:39:00'),
('admin', 'lily', '可以按照联系人 id 分别保存。', '2026-09-20 10:40:00'),
('lily', 'admin', '比如 contactMessages[18] 保存 lily 的消息？', '2026-09-20 10:41:00'),
('admin', 'lily', '对，contactMessages[20] 就可以保存另一个人的消息。', '2026-09-20 10:42:00'),
('lily', 'admin', 'Vue2 动态增加这个属性需要注意响应式问题吧？', '2026-09-20 10:43:00'),
('admin', 'lily', '对，可以使用 this.$set 来创建新的消息数组。', '2026-09-20 10:44:00'),
('lily', 'admin', '这样切换联系人就比较方便了。', '2026-09-20 10:45:00'),
('admin', 'lily', '对，聊天页面的数据结构基本就确定了。', '2026-09-20 10:46:00'),
('lily', 'admin', '那接下来就可以测试分页加载了。', '2026-09-20 10:47:00'),
('admin', 'lily', '嗯，先测试一次查询 10 条消息。', '2026-09-20 10:48:00'),
('lily', 'admin', '然后再查询下一页历史消息。', '2026-09-20 10:49:00');
