具体表结构
CREATE TABLE `chat_user` ( | |
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', | |
`username` varchar(64) DEFAULT NULL COMMENT '用户名', | |
`password` varchar(64) DEFAULT NULL COMMENT '用户密码', | |
`created_at` int(11) DEFAULT '0' COMMENT '创建时间', | |
PRIMARY KEY (`id`), | |
UNIQUE KEY `chat_user_username_IDX` (`username`) USING BTREE | |
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; | |
CREATE TABLE `chat_user_friend` ( | |
`friend_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', | |
`user_id_a` int(11) NOT NULL DEFAULT '0' COMMENT '用户a的id', | |
`user_id_b` int(11) NOT NULL DEFAULT '0' COMMENT '用户b的id', | |
`status` tinyint(3) unsigned DEFAULT '0' COMMENT '关系状态 1:a主动删除b, 2:b主动删除a, 4:ab已相互删除, 8:a主动拉黑b, 16:a主动拉黑b, 32:ab已相互拉黑', | |
`user_a_last_ack_seq` char(18) DEFAULT NULL COMMENT '用户a的客户端最后获得的消息id', | |
`user_b_last_ack_seq` char(18) DEFAULT NULL COMMENT '用户b的客户端最后获得的消息id', | |
PRIMARY KEY (`friend_id`), | |
UNIQUE KEY `chat_user_friend_user_id_ab_IDX` (`user_id_a`,`user_id_b`) USING BTREE, | |
KEY `chat_user_friend_user_id_b_IDX` (`user_id_b`) USING BTREE | |
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='好友关系表'; | |
CREATE TABLE `chat_friend_record` ( | |
`record_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', | |
`friend_id` int(11) NOT NULL DEFAULT '0' COMMENT '好友关系表id', | |
`sender` int(11) NOT NULL DEFAULT '0' COMMENT '发送方', | |
`receiver` int(11) NOT NULL DEFAULT '0' COMMENT '接受方', | |
`seq` char(18) DEFAULT NULL COMMENT '序列号', | |
`content` text COMMENT '消息内容', | |
`created_at` int(11) DEFAULT '0' COMMENT '创建时间', | |
PRIMARY KEY (`record_id`), | |
KEY `chat_friend_record_friend_id_IDX` (`friend_id`), | |
UNIQUE KEY `chat_friend_record_seq_IDX` (`seq`) | |
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='好友单聊天记录表'; | |
CREATE TABLE `chat_room` ( | |
`room_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', | |
`room_name` char(64) DEFAULT NULL COMMENT '群名字', | |
`user_id` int(11) NOT NULL DEFAULT '0' COMMENT '群主id', | |
`status` tinyint(3) DEFAULT '0' COMMENT '是否解散 0:正常 1:已解散', | |
`created_at` int(11) DEFAULT '0' COMMENT '创建时间', | |
PRIMARY KEY (`room_id`) | |
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='群表'; | |
CREATE TABLE `chat_room_member` ( | |
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', | |
`room_id` int(11) NOT NULL DEFAULT '0' COMMENT '群id', | |
`user_id` int(11) NOT NULL DEFAULT '0' COMMENT '用户id', | |
`status` tinyint(1) DEFAULT '0' COMMENT '在本群的状态 0:正常 1:已禁言 2:已踢出', | |
`created_at` int(11) DEFAULT '0' COMMENT '创建时间', | |
`last_ack_seq` char(18) DEFAULT NULL COMMENT '群成员的客户端最后获得的群消息id', | |
PRIMARY KEY (`id`), | |
UNIQUE KEY `chat_room_member_room_user_id_IDX` (`room_id`,`user_id`), | |
KEY `chat_room_member_user_id_IDX` (`user_id`) | |
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='群成员表'; | |
CREATE TABLE `chat_room_record` ( | |
`record_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键ID', | |
`room_id` int(11) NOT NULL DEFAULT '0' COMMENT '群表id', | |
`sender` int(11) NOT NULL DEFAULT '0' COMMENT '发送方', | |
`seq` char(18) DEFAULT NULL COMMENT '序列号', | |
`content` text COMMENT '消息内容', | |
`created_at` int(11) DEFAULT '0' COMMENT '创建时间', | |
PRIMARY KEY (`record_id`), | |
UNIQUE KEY `chat_room_record_room_id_IDX` (`room_id`), | |
UNIQUE KEY `chat_room_record_seq_IDX` (`seq`) | |
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='群聊天记录表'; |
拉取我没主动删除的好友的sql示例
(SELECT * from chat_user_friend force index(chat_user_friend_user_id_ab_IDX) where user_id_a = 1 and status & 4 != 4 and status & 1 = 0) UNION ALL (SELECT * from chat_user_friend force index(chat_user_friend_user_id_b_IDX) where user_id_b = 1 and status & 4 != 4 and status & 2 = 0)
收发消息流程
用户发消息流程:是否好友或群友,写入数据库,发送给在线人,客户端收到消息,发送ack消息给服务端,改写last_ack_seq
字段
刚登录用户收取消息流程:根据last_ack_seq
,去对应的群聊表、单聊查找大于last_ack_seq
的数据返回给客户端,客户端收到消息,发送ack消息给服务端,改写last_ack_seq
字段