評論或文章里添加@用戶名,被@用戶可以收到通知的功能怎麼實現?

評論或文章里添加@用戶名,該用戶名自動加上一個用戶主頁地址的標籤,同時被@用戶可以收到通知,請問這個功能怎麼實現呢?


每一條評論和文章發完之後 會對@後面的內容匹配分組,比如到一個分隔符一類的規則,然後非同步壓入一個消息隊列。

這個隊列處理是否有存在用戶,對存在的用戶做消息廣播。

後端邏輯大概這樣子吧。編輯一類不會有處理,只在insert這一步做。

這裡可以抽象出來一個查找at用戶的介面,可以抽象出一個檢測at後面是否用戶合法的介面。

前端我也做過,web的話,直接對富文本里的change做變化,發現一個at之後,操作range選擇最近的一個到at或者分隔符的字元再去請求這個字元key列出當前用戶的好友或者全站的用戶like的提示,展現上就是個浮層加游標位置的定位計算。滑鼠選擇後 可能會對文本打標記。

這一步主要是增加後端匹配速度,發現標記就不用再對文本做正則了。可以把標記的通知用戶在前端就解析出來發給後端了。

這裡可能每個人實現邏輯都不一樣。大概的步驟應該就是以上。


來來來,我們一起研究一下知乎是怎麼做的。

首先明白一點,在答案中at某人的時候,顯示的是昵稱,而昵稱在知乎里是可以重複的,那麼,很明顯,是不能直接根據這個昵稱來判斷at的是哪個人的。

我們可以試著在答案里@某個人 ,首先我們能看到,@後面的用戶名部分字體顏色變了,和前後的文字樣式是不一樣的,說明at部分應該是用某個標籤包圍起來的,F12打開瀏覽器調試功能,定位到答案中@部分的html代碼,如下圖:

可見,知乎用一個a標籤把@和用戶名包圍了起來,注意紅色圈起來的data-hash的屬性和class=「member_mention」,class屬性可以改變樣式也可以表示這裡at了某個人,而data-hash屬性很可能就是用於識別被at用戶的唯一標識符,而這樣答案提交之後,知乎伺服器就可以根據這個member_mention和hash這兩個關鍵屬性準確快速識別出您at的用戶了(當然,我不是知乎員工, 這只是個人猜測,不一定是知乎的真正實現方式,但是這種方式是可行的),然後就可以給相應的用戶發送通知了,識別出用戶之後,至於顯示用戶名片的功能,只是給簡單的js和css問題而已。


解析出@後面的第一個合法用戶名,然後想怎麼發通知都可以。。。

也可以像知乎這樣,隨著你打字實時提示讓你選取


百度貼吧就是直接@某人 然後解析的。

知乎這種是輸入@ 之後選一個人,是確定的,不需要再去解析。直接把這個人的id提交給後台。

可能這個跟百度貼吧id唯一,知乎昵稱不唯一也有一定關係。


在應用層專門加一個解析邏輯,從用戶提交的內容里抓出at就行,考慮到知乎的編輯器還可以實時顯示,說明後台有個api把這個功能暴露出來了。


看情況。

如果內容不可再編輯,怎麼實現都行。

如果可以,那麼你的業務需求提得並不足夠明確。


正則匹配後看用戶名存在否

Discuz有這方面的源碼


推薦閱讀:

TAG:PHP | MySQL | 編程 | 產品需求 |