【问题标题】:Best way to show an admin message to certain users?向某些用户显示管理消息的最佳方式?
【发布时间】:2011-01-04 16:20:45
【问题描述】:

我正在用 PHP/MySQL/jQuery 构建一个社交网站。一旦用户登录到我的网站,我想查询数据库并获得管理员通知(如果存在)。这将是一个向所有用户显示在页面上的消息框,但它会有一个 X 来单击它,并且在管理员发布新的公告消息之前不会再次显示它。因此,如果您从未单击 X 并且数据库中存在公告消息,它将始终在您的页面上显示此消息框,但是如果您确实单击 X 以关闭该框,那么您将返回该页面不在那里,除非发布了新的管理消息。

我知道有几种方法可以做到这一点,但我正在寻找最有效的方法。

我有一个想法,如果我在用户表“admin_message”中添加一个额外的 mysql 字段并将其标记为 0,那么当我发布一条新的管理消息时,如果管理消息,它会将每个用户的记录更改为 1设置为 1 然后它显示在用户的页面上。然后当用户单击 X 隐藏该框时,它将更新用户表行并将值更改回 0。

我的另一个想法是使用 cookie 来检查用户是否选择隐藏消息,我认为这会更快但可能效果不佳,因为用户可以使用不同的计算机登录并且是否显示新消息,他们可能不会马上看到。

所以我只是想知道使用额外的数据库字段是否是一个坏主意?如果我有 1,000,000 个用户,当我发布一条新的管理员消息时,我需要更新 1,000,000 行以确保每个人都能看到该消息。有没有更好的办法?此外,一旦用户登录到我的网站,我将使用会话来存储他们看到或隐藏消息的值,而不是在每次页面加载时查看数据库。



更新

抱歉,我认为我的帖子可能有点令人困惑或不清楚我的确切含义,因为大多数回复都迎合了一个消息系统,而这并不接近。

请忘记消息词,我将尝试用不同的词来解释。假设站点上有 1 个管理员,这是唯一可以向用户发布消息以查看的管理员。用户只会看到 1 条消息,如果在网站的生命周期内发布了 2352345234 条消息,那没关系,他们只会看到 1 条消息,即最新消息。

现在,一些登录并在页面上看到此消息“div”的用户可能会厌倦查看它,因此他们可以将其隐藏起来,不再显示。

在页面上显示此消息就像是或否一样简单。

但是,如果我决定需要发布一条新的管理员消息以供所有用户查看,那么即使选择隐藏而不显示管理员消息的用户仍会再次看到它,直到他们选择不再看到它为止。

【问题讨论】:

    标签: php jquery mysql


    【解决方案1】:

    我建议使用 admin_message_queue 表。它将有一个消息正文、一个用户 ID 和一个消息 ID。当您发布新的管理员消息时,它将为每个管理员用户添加一条记录到该表中。然后,当他们登录时,您只需选择用户 ID = 登录用户的所有 admin_message_queue 行。

    要删除消息,您只需让关闭按钮触发 AJAX 回调到服务器上获取消息 ID 的方法。该方法将从 admin_message_queue 中删除,其中消息 ID = 发布的消息 ID = 会话中的用户 ID。这样用户就无法删除其他人的消息。

    这样做可以使您不必保留已查看的消息行。为什么要切换一点来为某人隐藏它?您最终会保留大量不再使用的数据。

    问题更新后更新: 抱歉,我以为您只是想向管理员显示消息。您也可以保留相同的逻辑来向所有用户显示最新消息。只需有一个带有用户 ID 和消息文本的表。每当您发布消息时,它都会为所有仍然存在记录的人(没有隐藏消息的人)覆盖并覆盖消息文本,并为其他人添加行。当他们隐藏消息时,删除该用户的行。

    【讨论】:

    • 老实说这并不复杂。它将是网站上的 1 名管理员,它只会显示 1 条消息,最新消息将供每个用户查看,我只需要一种方法让用户隐藏消息框,如果他们选择在该页面上显示和如果我发布新消息,我可以强制隐藏框显示。所以我不需要存储任何类型的用户 ID,也不需要查询特殊 ID
    【解决方案2】:

    每个用户都可能有一个 last_message_seen,因此您必须为您的用户查询“新”消息 (message_id > last_message_seen)。如果您 [X] 关闭(或超时),那么您的 javascript 可以检查新消息等等...

    另一个想法是让 在 javascript 环境中看到的最后一条消息编号,但在这种情况下,当您刷新/放弃页面时它会被重置(重新计算),如果它没有打开您的用户可能会错过在上次页面加载和本次刷新之间插入的消息的数据库。

    或者... 它可以在会话中,所以你不会错过任何一个。当您登录时,该号码会重置为某个“正常”号码,例如:最后一条消息,或之后的消息(现在 - 1h),或其他任何...

    【讨论】:

      【解决方案3】:

      我会使用想法 #1。我不会使用布尔字段来检查用户是否已阅读消息,我会使用日期时间字段,并带有一些默认值。如果字段 == 默认,未读。读取时,设置字段 NOW()。

      这样您就可以大致了解用户阅读消息的速度。

      编辑:

      在您进行编辑后,我仍会使用相同的机制。该消息需要一个字段来确定是否已阅读。如果用户点击 X(关闭),更新数据库并将消息标记为已读。

      如果管理员发布新消息,则会弹出此消息。

      您还需要为您的消息设置一个创建日期时间,因为如果用户没有关闭上一条消息,而管理员发布了一条新消息,则只能显示最新消息。

      EDIT2: 回复此评论:

      即使用户错过了上午消息,也只有 应该显示最新的。也许我是 误解,但听起来像你 是说基本上标记一条消息 阅读 100,000 次是 100,000 个用户 单击X,我认为它应该是 更多关于用户表,显示或不显示 显示消息框,而不是个人 基础

      在你的理论中有些东西不是本地的。您想将“显示/不显示”保存为设置,但无论如何您都想显示消息。如果不记得系统是否向用户显示了消息,您如何知道何时否决用户设置以及何时否决? 即使您只想显示一次,您也需要数据库中的一个字段(在消息级别)来存储系统是否向用户显示消息。

      【讨论】:

      • 即使用户错过了上午消息,也应该只显示最新消息。也许我误解了,但听起来你是说基本上将一条消息标记为 100,000 次是 100,000 个用户单击 X,我认为它应该更多地出现在用户表上,显示或不显示消息框,而不是基于个人
      • 这不是消息级别的,可以让它更容易理解,让我们假设只有 1 条消息,我只是更新该消息/评论/通知,无论您喜欢如何称呼它。当我更新它时,每个用户都应该在页面上看到它,即使他们选择不看到这些。隐藏它的设置只是隐藏它,直到我更新/发布一个新的。我想我现在明白了,我将在数据库中添加一个设置字段以显示或不显示主页通知/消息
      • 感谢您尝试理解我的意思,我知道有时很难解释清楚
      【解决方案4】:

      您正在为用户保留登录时间,对吗?像 last_login 日期时间?

      所以获取 date_created >= last_login 的所有消息。显示它们,然后将 last_login 时间更新为 now()。

      【讨论】:

        【解决方案5】:

        两种简单的解决方案如下:

        Good:检查用户cookie,如果它包含指示消息已显示的标志,则不显示该消息,否则显示它。当用户关闭它时,更新 cookie。优点:绝对简单。缺点:用户可能会看到相同的消息两次,具体取决于他们是清除 cookie 还是从另一台机器登录。

        更好:在数据库中的某个位置存储一个标志(您现在可以将它存储在 admin user 表中,然后将其分解到另一个表中)。当用户登录时,1) 将此标志保存到用户的 cookie 或会话中,2) 更新数据库,3) 决定是否需要显示消息。当用户关闭消息时,更新 cookie/会话和数据库。优点:用户永远不会被显示两次消息。缺点:稍微多一些,因为您需要在数据库中维护标志。

        实现细节: 对于标志,您可以使用已经建议的消息 ID,或者您很可能已经保留了用户的上次登录时间戳并且可以使用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-24
          • 1970-01-01
          • 1970-01-01
          • 2012-12-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多