近來用mpvue做了一個小程式,當初選擇mpvue的時候,類似vue的語法,吸引了我。現在在讓我選,就不會在選mpvue了(可以在github上看相關的坑),所幸專案不太複雜,mpvue還是滿足需求的,不滿足的就以曲線救國的方式解決了。
這個小程式,有個互聊的模組和分享的模組可以分享下,方便後人
聊天模組
- 可遮蔽。遮蔽者,可主動取消遮蔽。
- 在遮蔽期間,被遮蔽一方可傳送資訊,但遮蔽者收不到,被遮蔽一方,在資訊流中,可看到被遮蔽資訊。
- 遮蔽情況下,可相互舉報,記錄舉報內容
- 顯示未讀訊息數量
假設不考慮遮蔽,只是記錄兩個人的聊天記錄,資料庫,結構可以這樣設計就可以滿足需求
messages
table
- id
- user_id
- to_user_id
- content
現在要對聊天記錄做一個限制
message_state
table
- id
- user_id
- to_user_id
- state (0 正常1 遮蔽2舉報)
- operate_screen_id (記錄遮蔽者的id)
- operate_report_id (記錄舉報者id,可選)
相應的messages
table被 message_state
table 管理messages
table
- id
- user_id
- to_user_id
- content
- message_state_id
相應的需要一個舉報表,和messages 資料表結構類似,只不過記錄的是兩個人的遮蔽及舉報記錄
report
table
- id
- user_id
- to_user_id
- content
- state (1 或2 )
- message_state_id
遮蔽後遮蔽者看不到被遮蔽者傳送的資訊,解決辦法是在messages
table新增記錄遮蔽狀態下 screen_user_id欄位,查詢的時候,where('screen_user_id ','<>','遮蔽者id')
messages
table
-
id
-
user_id
-
to_user_id
-
content
-
message_state_id
-
screen_user_id
對方遮蔽後,被遮蔽者,在資訊流中顯示“對方已遮蔽了你的字樣”,並按時間順序和正常資訊,一起顯示。
這樣的資訊,其實和就像兩個人的聊天資訊一樣,在messages 表中,加個欄位狀態判斷是遮蔽傳送的資訊即可
最終表結構messages
table -
id
-
user_id
-
to_user_id
-
content
-
message_state_id
-
screen_user_id
-
if_screen (是否是遮蔽時建立的資訊,根據此可對該資訊顯示時做特殊處理,比如加紅)
-
if_see (0 未讀,1已讀)
message_state
table
- id
- user_id
- to_user_id
- state (0 正常1 遮蔽2舉報)
- operate_screen_id (記錄遮蔽者的id)
- operate_report_id (記錄舉報者id,可選)
report
table
- id
- user_id
- to_user_id
- content
- state (1 或2 )
分享模組
兩種場景
- 自己分享自己 自己獎勵+1 不能重複+1
- 他人分享自己 他人獎勵+1 不能重複+1
自己分享他人和他人分享自己是一種情況,只不過是參照物不同,上面是以自己為參照物。
users
table
- share_key
- 其他欄位
需要一個分享記錄表,儲存已經點選過的使用者
share_record
table
- id
- share_base
- share_click
-
share_plus
share_base
表示參照物的share_keyshare_click
表示點選者的share_keyshare_plus
表示要獎勵的share_key(可能是自己,也可能是他人)
每當使用者點選進來後,去查詢是否已經點選過,然後去給相應的獎勵。
tips:未讀訊息數量,可在messages
table加個冗餘欄位,每次傳送資訊的時候,在最新的資訊中,更新此冗餘欄位的值。當然,也可不需要此欄位,但這樣有一個問題,就是和不同的人來聊天的未讀數量,資料庫查詢會成線性增長。用冗餘欄位,相當於用空間換取時間,而空間的佔用可以忽略不計,時一個比較好的方法
end
本作品採用《CC 協議》,轉載必須註明作者和本文連結