最近需要做一个社区类的产品,类似于微博那种,在文章里 @某个用户,然后通知到相关用户有人 @你是怎么实现的,目前还没有好的想法,
1
RedBeanIce 2020-09-07 18:45:14 +08:00
|
2
taogen 2020-09-07 18:45:36 +08:00
未读消息存数据库
|
3
cmqwan 2020-09-07 19:01:37 +08:00
@RedBeanIce test
|
4
cmqwan 2020-09-07 19:02:42 +08:00
@RedBeanIce @taogen test2
|
5
AlbertChen 2020-09-07 19:08:22 +08:00
提交请求的时候后端解析文本里 @ 和空格之间的字符串, 发给对应的人啊
|
6
superheros OP 我在想 如果用户拷过来一段文字 直接提交了 里面有 @RedBeanIce 该怎么处理
|
7
superheros OP 我试了 V2EX 是会处理自己加个空格的 我考过来是没有空格的 不知道怎么处理的 在 @用户后面自己加了个空格,怎么正确区分 @后面的用户
|
8
superheros OP |
9
superheros OP RedBeanIce 这个昵称后面跟中文,是会自动加空格的 AlbertChen 这个昵称后面加英文就区分不了了 ,不会自己加空格,大概明白了
|
10
cassyfar 2020-09-07 19:20:37 +08:00
那个空格是为了中文美化的。
|
11
cassyfar 2020-09-07 19:22:57 +08:00
我比较好奇 @完之后出来的下拉菜单,这些用户名是从后端实时取的吗?
|
12
iConnect 2020-09-07 19:24:28 +08:00 via Android
不要学微博的 @用户做法,这个功能有 bug 微博一直不改。 @张三 之后,张三改昵称了,然后另外一个人又用了张三这个昵称,历史记录 @张三就全部是老张三。
|
13
superheros OP @cassyfar 是的
|
14
iConnect 2020-09-07 19:25:30 +08:00 via Android
推特的做法值得借鉴,是 @用户 ID,而不是昵称。
|
15
superheros OP @iConnect 谢谢提醒,我正准备用 @用户昵称
|
16
lshero 2020-09-07 19:30:11 +08:00 1
客户端提交给服务端的是 [@张三|123456] 这种形式 客户端自己渲染成 @张三 服务端根据后面你的 UID 给用户发 push 并且保存到数据库。
|
17
superheros OP @lshero 明白了 谢谢
|
18
iConnect 2020-09-07 21:02:25 +08:00 via Android
@lshero 你的这个方案如果考虑到允许用户修改用户 ID/用户名,以及允许用户编辑内容(微博允许编辑,推特不允许),实现的方案又大相径庭了。
|
19
no1xsyzy 2020-09-07 21:37:41 +08:00 9
@iConnect 你仍然说错了 Twitter 的情况,因为 Twitter 那个 @ 后面的名字也是可以改的
参见: https://help.twitter.com/en/managing-your-account/change-twitter-handle 实际上,Twitter 的做法比较复杂,并不是以文本方式存储的,而是以结构化存储的。 打个比方,比如本条回复,Twitter 会带上一段 metadata,表示从第一 (1) 个字符到第九 (9) 个字符是一个 user_mention,被 @ 到的这个人屏幕名称(即 @ 后面的 id )是 “iConnect”,全名是 “XXX”,数字编号是 “220171”(其中数字编号是不会改变的,显示一般是) 比如随便截了一个 API 的结果: 好处是不用每个平台重新 parse 一遍(可能 parse 的结果还会微妙地不一样?),直接取子串渲染就行。 |
20
ylsc633 2020-09-07 21:44:43 +08:00
目前我想到的做法有:
1. 解析 @ 符号 和后面第一个空格之间的 名称,然后与用户进行匹配! 匹配成功后给相关用户产生一条未读消息列表 2. 前端处理 @ 然后存到本地,然后在提交创建得时候,用另外一个参数带上本次回复内容+艾特用户等信息 后端处理一致 |
21
KevinBlandy 2020-09-07 22:51:12 +08:00
用正则解析,获得解析到的数据,然后拼接 a 标签,发送提醒。
你可以看看这个 [https://springboot.io/t/topic/684]( https://springboot.io/t/topic/684) |
23
victor 2020-09-07 23:16:19 +08:00
Java 怎么实现先不说,推荐一波前同事的 https://github.com/ichord/At.js
|
25
CoderGeek 2020-09-08 00:07:13 +08:00
几年前的方式 自定义标签内容 uid 昵称
|
26
jiangheng1990 2020-09-08 09:07:09 +08:00
@cassyfar 直接取一次缓存就行了
|
27
lonelymarried 2020-09-08 11:55:55 +08:00
@lshero 这个方法简单明了
|
28
thinkmore 2020-09-08 17:55:02 +08:00
如果是后端的话,比如 @thinkmore 你解析的时候发现 @了某个人,就在某张表生成一条消息,然后定时从某张表取就行了
|
29
zsdroid 2020-09-09 17:51:13 +08:00
\s*@[a-zA-Z]+\s+
|
30
ZSpirytus 2020-10-06 20:21:00 +08:00 via Android
我做 im 的时候,一般都是消息体内有一个扩展字段 Map<String, Any>,消息发出去前检查一下有没有 at 谁。
好处就是方便,不需要跟服务端对协议。 坏处就是拓展字段一多,浪费带宽。 |