V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
superheros
V2EX  ›  Java

大佬们, 发帖 @人就通知相关被 @的人员, Java 怎么实现

  •  
  •   superheros · 2020-09-07 18:39:59 +08:00 · 4764 次点击
    这是一个创建于 1537 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近需要做一个社区类的产品,类似于微博那种,在文章里 @某个用户,然后通知到相关用户有人 @你是怎么实现的,目前还没有好的想法,

    30 条回复    2020-10-06 20:21:00 +08:00
    RedBeanIce
        1
    RedBeanIce  
       2020-09-07 18:45:14 +08:00
    。。。前端调接口啊。。。。

    @xxx 那么在提交回复请求的时候,告诉这个人,这个文章里面有人 @你
    至于前端展示的时候,,这个就是前端你的锅了,。。后台表示无所谓,就是个接口的事情。
    taogen
        2
    taogen  
       2020-09-07 18:45:36 +08:00
    未读消息存数据库
    cmqwan
        3
    cmqwan  
       2020-09-07 19:01:37 +08:00
    cmqwan
        4
    cmqwan  
       2020-09-07 19:02:42 +08:00
    AlbertChen
        5
    AlbertChen  
       2020-09-07 19:08:22 +08:00
    提交请求的时候后端解析文本里 @ 和空格之间的字符串, 发给对应的人啊
    superheros
        6
    superheros  
    OP
       2020-09-07 19:10:48 +08:00
    我在想 如果用户拷过来一段文字 直接提交了 里面有 @RedBeanIce 该怎么处理
    superheros
        7
    superheros  
    OP
       2020-09-07 19:13:46 +08:00
    我试了 V2EX 是会处理自己加个空格的 我考过来是没有空格的 不知道怎么处理的 在 @用户后面自己加了个空格,怎么正确区分 @后面的用户
    superheros
        8
    superheros  
    OP
       2020-09-07 19:15:35 +08:00
    superheros
        9
    superheros  
    OP
       2020-09-07 19:17:24 +08:00
    RedBeanIce 这个昵称后面跟中文,是会自动加空格的 AlbertChen 这个昵称后面加英文就区分不了了 ,不会自己加空格,大概明白了
    cassyfar
        10
    cassyfar  
       2020-09-07 19:20:37 +08:00
    那个空格是为了中文美化的。
    cassyfar
        11
    cassyfar  
       2020-09-07 19:22:57 +08:00
    我比较好奇 @完之后出来的下拉菜单,这些用户名是从后端实时取的吗?
    iConnect
        12
    iConnect  
       2020-09-07 19:24:28 +08:00 via Android
    不要学微博的 @用户做法,这个功能有 bug 微博一直不改。 @张三 之后,张三改昵称了,然后另外一个人又用了张三这个昵称,历史记录 @张三就全部是老张三。
    superheros
        13
    superheros  
    OP
       2020-09-07 19:24:29 +08:00
    @cassyfar 是的
    iConnect
        14
    iConnect  
       2020-09-07 19:25:30 +08:00 via Android
    推特的做法值得借鉴,是 @用户 ID,而不是昵称。
    superheros
        15
    superheros  
    OP
       2020-09-07 19:30:10 +08:00
    @iConnect 谢谢提醒,我正准备用 @用户昵称
    lshero
        16
    lshero  
       2020-09-07 19:30:11 +08:00   ❤️ 1
    客户端提交给服务端的是 [@张三|123456] 这种形式 客户端自己渲染成 @张三 服务端根据后面你的 UID 给用户发 push 并且保存到数据库。
    superheros
        17
    superheros  
    OP
       2020-09-07 19:35:49 +08:00
    @lshero 明白了 谢谢
    iConnect
        18
    iConnect  
       2020-09-07 21:02:25 +08:00 via Android
    @lshero 你的这个方案如果考虑到允许用户修改用户 ID/用户名,以及允许用户编辑内容(微博允许编辑,推特不允许),实现的方案又大相径庭了。
    no1xsyzy
        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 的结果还会微妙地不一样?),直接取子串渲染就行。
    ylsc633
        20
    ylsc633  
       2020-09-07 21:44:43 +08:00
    目前我想到的做法有:
    1. 解析 @ 符号 和后面第一个空格之间的 名称,然后与用户进行匹配! 匹配成功后给相关用户产生一条未读消息列表
    2. 前端处理 @ 然后存到本地,然后在提交创建得时候,用另外一个参数带上本次回复内容+艾特用户等信息 后端处理一致
    KevinBlandy
        21
    KevinBlandy  
       2020-09-07 22:51:12 +08:00
    用正则解析,获得解析到的数据,然后拼接 a 标签,发送提醒。
    你可以看看这个
    [https://springboot.io/t/topic/684]( https://springboot.io/t/topic/684)
    gz911122
        22
    gz911122  
       2020-09-07 22:55:35 +08:00
    @no1xsyzy 学到了 666
    victor
        23
    victor  
       2020-09-07 23:16:19 +08:00
    Java 怎么实现先不说,推荐一波前同事的 https://github.com/ichord/At.js
    autoxbc
        24
    autoxbc  
       2020-09-07 23:24:34 +08:00
    @cassyfar #11 前端实现的,页面源码里有本页全部用户名数组
    CoderGeek
        25
    CoderGeek  
       2020-09-08 00:07:13 +08:00
    几年前的方式 自定义标签内容 uid 昵称
    jiangheng1990
        26
    jiangheng1990  
       2020-09-08 09:07:09 +08:00
    @cassyfar 直接取一次缓存就行了
    lonelymarried
        27
    lonelymarried  
       2020-09-08 11:55:55 +08:00
    @lshero 这个方法简单明了
    thinkmore
        28
    thinkmore  
       2020-09-08 17:55:02 +08:00
    如果是后端的话,比如 @thinkmore 你解析的时候发现 @了某个人,就在某张表生成一条消息,然后定时从某张表取就行了
    zsdroid
        29
    zsdroid  
       2020-09-09 17:51:13 +08:00
    \s*@[a-zA-Z]+\s+
    ZSpirytus
        30
    ZSpirytus  
       2020-10-06 20:21:00 +08:00 via Android
    我做 im 的时候,一般都是消息体内有一个扩展字段 Map<String, Any>,消息发出去前检查一下有没有 at 谁。
    好处就是方便,不需要跟服务端对协议。
    坏处就是拓展字段一多,浪费带宽。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2759 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:12 · PVG 10:12 · LAX 18:12 · JFK 21:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.