需求
最近項目需求需要模擬微信的朋友圈功能,實現(xiàn)可以發(fā)送圖文消息,好友可以查看,滿足添加新的好友之后,可以在朋友圈中刷新到好友的消息,看了許多文章,琢磨出來一套流程。這里只記錄一下我的實現(xiàn)思路,并不貼上實際的代碼。
數(shù)據(jù)庫設(shè)計
核心結(jié)構(gòu)有三張表:
#消息表
CREATE TABLE `t_friend_circle_message` (
`id` bigint(15) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`uid` bigint(15) DEFAULT NULL COMMENT '用戶id',
`content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`picture` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT '' COMMENT '圖片',
`location` varbinary(100) DEFAULT '' COMMENT '位置',
`create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建日期',
PRIMARY KEY (`id`)
)? ?
消息表很好理解,存儲用戶發(fā)送的內(nèi)容,圖片存地址。?utf8mb4格式可以存儲emoji表情,具體可以參照之前的一篇文章mysql支持emjoy
#時間軸表
CREATE TABLE `t_friend_circle_timeline` (
`id` bigint(15) NOT NULL AUTO_INCREMENT,
`uid` bigint(15) DEFAULT NULL COMMENT '用戶id',
`fcmid` bigint(15) DEFAULT NULL COMMENT '朋友圈信息id',
`is_own` int(1) DEFAULT '0' COMMENT '是否是自己的',
`create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建日期',
PRIMARY KEY (`id`)
)
時間軸表在朋友圈中是最關(guān)鍵的,存儲著所有用的時間軸信息,因為當(dāng)用戶去拉取好友圈的時候,查詢的就是本表,is_own字段用來區(qū)分當(dāng)前數(shù)據(jù)是自己的發(fā)布還是好友發(fā)布的消息。
#評論表
CREATE TABLE `t_friend_circle_comment` (
`id` bigint(15) NOT NULL AUTO_INCREMENT,
`fcmid` bigint(15) DEFAULT NULL COMMENT '朋友圈信息id',
`uid` bigint(15) DEFAULT NULL COMMENT '用戶id',
`content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`create_time` datetime DEFAULT NULL COMMENT '創(chuàng)建日期',
`like_count` int(10) DEFAULT '0' COMMENT '點贊數(shù)',
PRIMARY KEY (`id`)
)
評論表,沒有什么好解釋的。。 like_count字段在這里并沒有實現(xiàn)功能,參考點贊功能實現(xiàn)。
好友圈邏輯
發(fā)布朋友圈消息
當(dāng)用戶發(fā)布一條朋友圈消息的時候,后端邏輯的處理(A和B已經(jīng)是好友關(guān)系):
1.用戶A在朋友圈中發(fā)布一條消息,消息表t_friend_circle_message寫入一條數(shù)據(jù)。
2.時間軸表t_friend_circle_timeline中增加一條數(shù)據(jù),uid設(shè)置A,is_own設(shè)置為1,表示在A的時間軸中增加一條自己發(fā)布的消息。
3.查詢用戶A的好友,查到用戶B(如果有還有其他好友D、E等等同樣處理)
4.時間軸表t_friend_circle_timeline中增加一條數(shù)據(jù),uid設(shè)置B,is_own設(shè)置為0,表示在B的時間軸中增加一條好友發(fā)布的消息。
添加好友
當(dāng)用戶A,添加用戶C為好友之后,觸發(fā)同步好友時間軸的操作
INSERT INTO t_friend_circle_timeline (uid,fcmid,is_own,create_time) SELECT #{uid},`id`,0,create_time FROM t_friend_circle_message WHERE uid = #{fid};
· 把消息表t_friend_circle_message好友C發(fā)布的所有消息添加到自己的時間軸中。
·?再把消息表t_friend_circle_message自己發(fā)布的消息添加到好友C的時間軸中。
·?使用好is_own字段,因為都是互相添加好友的消息到自己的時間軸中,所以都應(yīng)該為false(0)。
總結(jié)
思路參照了微信朋友圈是怎么做的架構(gòu)?。?
做完之后發(fā)現(xiàn)這個應(yīng)該更像QQ空間的心情功能,因為沒有所謂的不是好友不可見評論功能,如果誰有這一塊的更好的思路請留言^_^。