- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在我们的应用程序中构建一个聊天功能。基本的聊天工作,我们有一个查询来获取属于用户的对话,获取对话,消息等。
现在,我们想要添加一个功能,对话的参与者(对话可以有多个参与者)可以在他们的一端删除聊天,但是这个 不会删除 服务器中的对话。相反,我们会将对话标记为从该用户的 X 点删除。在这种情况下,当删除对话的参与者再次在我们的 API 中请求对话时,他将看不到删除之前的消息。
为了清楚地理解这个概念,WhatsApp、Telegram 或当今大多数聊天应用程序的工作方式都是一样的。当用户 A 和 B 进行交互时,如果用户 B 选择从他的手机中删除对话,用户 A 仍然会看到整个对话。如果用户 B(或 A)在对话中再次发短信,用户 B 只会看到新的短信。
我不完全确定这对他们来说是如何工作的,但似乎对我们有用的结构如下:
CREATE TABLE `conversations` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`starter_id` bigint(20) unsigned NOT NULL,
`last_message_id` bigint(20) unsigned DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `conversations_starter_id_index` (`starter_id`),
KEY `conversations_last_message_id_index` (`last_message_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `conversation_participants` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`conversation_id` bigint(20) unsigned NOT NULL,
`participant_id` bigint(20) unsigned NOT NULL,
`deleted_from_id` bigint(20) unsigned DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `conversation_participants_conversation_id_index` (`conversation_id`),
KEY `conversation_participants_participant_id_index` (`participant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `conversation_messages` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`conversation_id` bigint(20) unsigned NOT NULL,
`sender_id` bigint(20) unsigned NOT NULL,
`message` text COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `conversation_messages_conversation_id_index` (`conversation_id`),
KEY `conversation_messages_sender_id_index` (`sender_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
conversation_participants
中看到的那样我们添加了一个
deleted_from_id
.此
deleted_from_id
当用户 B 向服务器发送删除 session 的请求时,将得到更新。它将发送他看到的conversation_id 和最新的conversation_message_id 并相应地更新。
lựa chọn
`conversations`.*,
`conversation_participants`.`participant_id` as `pivot_participant_id`,
`conversation_participants`.`conversation_id` as `pivot_conversation_id`,
`conversation_participants`.`created_at` as `pivot_created_at`,
`conversation_participants`.`updated_at` as `pivot_updated_at`
từ
`conversations`
inner join `conversation_participants` on `conversations`.`id` = `conversation_participants`.`conversation_id`
Ở đâu
`conversation_participants`.`participant_id` = 1
and exists (
lựa chọn
*
từ
`conversation_messages`
Ở đâu
`conversations`.`id` = `conversation_messages`.`conversation_id`
)
order by
`id` desc
Conversation::with('messages')...
,它允许我们轻松过滤包含消息的对话(我们不希望返回空的对话)。
exists()
限制
conversation_messages.id
, 喜欢:
lựa chọn
`conversations`.*,
`conversation_participants`.`participant_id` as `pivot_participant_id`,
`conversation_participants`.`conversation_id` as `pivot_conversation_id`,
`conversation_participants`.`deleted_from_id` as `pivot_deleted_from_id`,
`conversation_participants`.`created_at` as `pivot_created_at`,
`conversation_participants`.`updated_at` as `pivot_updated_at`
từ
`conversations`
inner join `conversation_participants` on `conversations`.`id` = `conversation_participants`.`conversation_id`
Ở đâu
`conversation_participants`.`participant_id` = 1
and exists (
lựa chọn
*
từ
`conversation_messages`
Ở đâu
`conversations`.`id` = `conversation_messages`.`conversation_id`
and `id` > conversation_participants.deleted_from_id
)
order by
`id` desc
Và
身份证
> conversation_participants.deleted_from_id
,不会返回其他 session 。这是错误的,因为它会阻止显示任何其他对话,即使它们有消息并且属于参与者。
exists()
中使用了一些连接。尝试阻止“已删除的对话”显示在列表中:
lựa chọn
`conversations`.*,
`conversation_participants`.`participant_id` as `pivot_participant_id`,
`conversation_participants`.`conversation_id` as `pivot_conversation_id`,
`conversation_participants`.`deleted_from_id` as `pivot_deleted_from_id`,
`conversation_participants`.`created_at` as `pivot_created_at`,
`conversation_participants`.`updated_at` as `pivot_updated_at`
từ
`conversations`
inner join `conversation_participants` on `conversations`.`id` = `conversation_participants`.`conversation_id`
Ở đâu
`conversation_participants`.`participant_id` = 1
and exists (
lựa chọn
`conversation_messages`.*
từ
`conversation_messages`
tham gia
`conversations` on `conversations`.`id` = `conversation_messages`.`conversation_id`
tham gia
`conversation_participants` on `conversations`.`id` = `conversation_participants`.`conversation_id`
Ở đâu
`conversations`.`id` = `conversation_messages`.`conversation_id`
and `conversation_participants`.`participant_id` = 1
and `conversation_messages`.`id` > `conversation_participants`.`deleted_from_id`
)
order by
`id` desc
(55,28,1,82,'2020-01-31 10:01:08','2020-01-31 10:01:08'),
( fiddle 中的第 166 行)。消息82是conversation_id=28中的最后一条消息,因此应该
没有出现在查询中,因为它没有消息。
conversations.last_message_id
将有助于防止对话出现......但我们也不确定这一点,因为我们找不到解决方案。我决定将它留在 SQL 中,以防它有助于找到解决方案。
1 Câu trả lời
这就是我要做的。
对话包含消息
消息包含参与者。
我不会保留在您的案例中看到的“Conversation_Participants”。
相反,我会保留“Message_Participants”。
这将是我的表结构
CREATE TABLE `conversations` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`starter_id` bigint(20) unsigned NOT NULL,
`last_message_id` bigint(20) unsigned DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `conversations_starter_id_index` (`starter_id`),
KEY `conversations_last_message_id_index` (`last_message_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `conversation_messages` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`conversation_id` bigint(20) unsigned NOT NULL,
`sender_id` bigint(20) unsigned NOT NULL,
`message` text COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `conversation_messages_conversation_id_index` (`conversation_id`),
KEY `conversation_messages_sender_id_index` (`sender_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `message_participants` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`message_id` bigint(20) unsigned NOT NULL,
`participant_id` bigint(20) unsigned NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
)
关于mysql - 对话属于多个用户,但用户 A 删除而用户 B 不删除。我们如何防止它被退回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60034603/
Tôi có một ứng dụng trong đó nhiều đối tượng của tôi mở rộng một lớp trừu tượng định nghĩa các phương thức như create() edit() retrieve() và delete(). Vì mỗi lớp con sử dụng cùng một logic cho các hàm này, nên lớp trừu tượng định nghĩa mặc định
Tôi đang sử dụng $anchorScroll để cuộn đến đầu trang nơi phần tử html có ID #brand. Mã AngularJS: $location.hash(
Tôi muốn hủy kích hoạt chức năng nhấp chuột phải trong ứng dụng của mình, chức năng này cung cấp tùy chọn cài đặt ứng dụng trên màn hình nền. Tôi có thể làm điều gì đó như thế này bằng cách nào? Câu trả lời hay nhất Nhấp chuột phải vào dự án trong Visual Studio và chọn Thuộc tính. Có một hộp kiểm "Kích hoạt hoạt động của trình duyệt
Tôi đang nhắm mục tiêu vào một div bằng cách sử dụng jquery và trong CSS của tôi, tôi có div.right-sm:hover{background-color: blue} Tôi muốn dừng việc di chuột bằng cách sử dụng jquery: $(this
Vì vậy, tôi đang cố gắng sao chép chức năng thuộc tính "giữ chỗ" của html5. Một điều tôi hiện đang gặp khó khăn là làm sao để dấu nháy xuất hiện ngay ở đầu phần tử khi bạn bắt đầu nhập dữ liệu. Theo như hiện tại, dấu mũ xuất hiện ở nơi người dùng nhấp vào, và sau đó khi tôi sử dụng jQuery
Khi biểu mẫu đã được điền và gửi, nếu bạn làm mới trang, sẽ có thông báo biểu mẫu sẽ được gửi lại. (Nộp lại mẫu). Có cách nào tốt để ngăn chặn điều này xảy ra không? Hoặc kết thúc phiên này? Có hướng dẫn nào về vấn đề này không? Cảm ơn câu trả lời hay nhất. Đã xử lý xong thư POST.
Tôi muốn ngăn không cho nhập @ vào mục nhập. Nhưng nó không có tác dụng, bạn có biết tại sao không? $(function() { $(document).on('keyup', '[placeholder="x"]', vui vẻ
Tôi đang tạo một ứng dụng bằng PHP và liên quan đến MySQL. Nếu xảy ra lỗi trong quá trình yêu cầu, tôi sẽ "nhóm các truy vấn lại với nhau" như thế nào, kiểm tra xem nó có thành công hay không và sau đó thực sự ảnh hưởng đến bảng thực tế như thế nào. Nếu bản cập nhật thực tế cho bảng không thành công, hãy khôi phục về trạng thái trước khi cập nhật
Câu hỏi này đã có câu trả lời ở đây: Đã đóng cách đây 11 năm. Có thể trùng lặp: Trình obfuscator Java tốt nhất? Đối với ví dụ của tôi, tôi biết rằng eclipse cung cấp một plugin dịch ngược. Và
Đây là một ví dụ minh họa cho vấn đề của tôi: JSFiddle Tôi đang tạo một menu thả xuống tùy chỉnh (thực ra tôi đang sử dụng biểu tượng icomoon thay vì chữ V)... trông có vẻ ổn, nhưng ::after của phần tử cha đang ngăn không cho chọn :(
Bất cứ khi nào tôi viết mã yêu cầu nhiều điều kiện, tôi thực hiện như sau: if foo: if bar: if foobar: if barfoo: if foobarfoo:
Tôi không chắc thuật ngữ này có đúng không, bạn có thể sử dụng những thủ thuật mã nào để khiến người khác khó có thể sửa đổi tệp nhị phân/lắp ráp để bỏ qua các lần kiểm tra: Ví dụ như trong mã nguồn. bool verificationResult = verify(); nếu (xác minh
Tôi đang tìm cách dễ dàng để kiểm tra nhiều bảng bộ phận để xác định xem số bộ phận nhất định đã tồn tại hay chưa trước khi thêm nó vào một bảng nhất định. Ý tưởng tốt nhất hiện tại của tôi là một bảng phụ chỉ liệt kê mỗi PN từ tất cả các bảng trong một cột, với một khóa duy nhất; nhưng tôi
Câu hỏi này đã có câu trả lời tại đây: jquery stop child triggering parent event (7 câu trả lời) Đã đóng 8 năm trước. Tôi không chắc liệu điều này có thực sự nổi bọt không, tôi sẽ giải thích. Tôi có điều này:
Tôi có một ứng dụng web Spring MVC (không chắc thông tin này có quan trọng không, nhưng có thể là có) sử dụng ModelAndView để truyền giá trị chuỗi vào các tệp JSP. Giá trị chuỗi có dạng: d@.
Tôi đang cố gắng sử dụng phương pháp khóa biểu mẫu để bảo vệ csrf tại đây http://net.tutsplus.com/tutorials/php/secure-your-forms-with-form-keys/
Htmlentities có phải là giải pháp tốt nhất để ngăn ngừa XSS trong PHP không? Tôi cũng muốn cho phép các thẻ đơn giản như b, i, a và img. Giải pháp tốt nhất để đạt được điều này là gì? Tôi đã cân nhắc bbcode, nhưng thấy rằng không có
Tôi có một dịch vụ JAX-RS rất cơ bản (lớp BookService bên dưới) cho phép tạo các thực thể kiểu Book (cũng bên dưới). Tải trọng POST { "acquisitionDate": 14188
Tôi đang sử dụng Polymer 1.5 và tôi thực sự cần biến "this" không bị ánh xạ ra bên ngoài. Tôi biết TypeScript sẽ thực hiện điều này vì một số lý do chính đáng. khai báo var Polymer:
Câu hỏi này đã có câu trả lời tại đây: Thuộc tính chỉ đọc ở cấp độ lớp trong Python (3 câu trả lời) Đã đóng 6 năm trước. Có cách nào để ghi đè __set của một biến thể hiện không?
Tôi là một lập trình viên xuất sắc, rất giỏi!