群聊优化

This commit is contained in:
2025-12-08 14:18:00 +08:00
parent 537017aea5
commit 20e8cd7d82
5 changed files with 406 additions and 191 deletions

View File

@@ -375,6 +375,8 @@ func main() {
authGroup.POST("/groups/:room_id/dissolve", api.DissolveGroupHandler)
authGroup.GET("/groups/:room_id/announcement", api.GetGroupAnnouncementHandler)
authGroup.POST("/groups/:room_id/announcement", api.UpdateGroupAnnouncementHandler)
authGroup.POST("/groups/:room_id/members/:user_id/mute", api.MuteGroupMemberHandler)
authGroup.GET("/groups/:room_id/members/:user_id/mute", api.GetMemberMuteStatusHandler)
authGroup.GET("/group-notifications", api.GetGroupNotificationsHandler)
// 附件管理

View File

@@ -870,3 +870,61 @@ func UpdateGroupAnnouncementHandler(c *gin.Context) {
utils.Success(c, "更新成功")
}
/**
* MuteGroupMemberHandler
* 功能:禁言群成员
* 路径POST /api/groups/:room_id/members/:user_id/mute
*/
func MuteGroupMemberHandler(c *gin.Context) {
operatorID, _ := c.Get("user_id")
roomID := c.Param("room_id")
memberID := c.Param("user_id")
var req struct {
Duration int64 `json:"duration"` // 禁言时长0=永久,-1=解除禁言
}
if err := c.ShouldBindJSON(&req); err != nil {
utils.BadRequest(c, "参数错误: "+err.Error())
return
}
if err := service.RoomSvc.MuteGroupMember(roomID, operatorID.(string), memberID, req.Duration); err != nil {
utils.BadRequest(c, err.Error())
return
}
if req.Duration == -1 {
utils.Success(c, "已解除禁言")
} else if req.Duration == 0 {
utils.Success(c, "已永久禁言")
} else {
utils.Success(c, "禁言成功")
}
}
/**
* GetMemberMuteStatusHandler
* 功能:获取成员禁言状态
* 路径GET /api/groups/:room_id/members/:user_id/mute
*/
func GetMemberMuteStatusHandler(c *gin.Context) {
roomID := c.Param("room_id")
memberID := c.Param("user_id")
isMuted, mutedUntil, err := service.RoomSvc.IsGroupMemberMuted(roomID, memberID)
if err != nil {
if err == gorm.ErrRecordNotFound {
utils.NotFound(c, "成员不存在")
return
}
utils.InternalError(c, "查询失败")
return
}
utils.SuccessWithData(c, gin.H{
"is_muted": isMuted,
"muted_until": mutedUntil,
}, "获取成功")
}

View File

@@ -280,12 +280,22 @@ type RoomMember struct {
Role int8 `gorm:"type:tinyint(1);default:0;comment:成员角色(0=成员,1=管理员,2=群主)" json:"role"`
// 加入时间
JoinedAt time.Time `gorm:"type:datetime;autoCreateTime;comment:加入时间" json:"joined_at"`
// 禁言到期时间null或过期时间之前表示未禁言
MutedUntil *time.Time `gorm:"type:datetime;comment:禁言到期时间" json:"muted_until,omitempty"`
// 用户信息(关联查询,不存储在数据库中)
User *User `gorm:"foreignKey:UserID;references:ID" json:"user,omitempty"`
// 群名片(可选,用于群聊中显示的自定义昵称)
Nickname string `gorm:"-" json:"nickname,omitempty"`
}
// IsMuted 判断成员是否被禁言
func (m *RoomMember) IsMuted() bool {
if m.MutedUntil == nil {
return false
}
return m.MutedUntil.After(time.Now())
}
// TableName 指定表名和注释
func (RoomMember) TableName() string {
return "room_members"

View File

@@ -579,3 +579,77 @@ func (s *RoomService) UpdateGroupAnnouncement(roomID, userID, announcement strin
Where("room_id = ? AND room_type = ?", roomID, "group").
Update("announcement", announcement).Error
}
/**
* MuteGroupMember
* 功能:禁言群成员(仅群主或管理员可操作)
* @param roomID 房间ID
* @param operatorID 操作者ID
* @param memberID 被禁言的成员ID
* @param duration 禁言时长0表示永久禁言-1表示解除禁言
*/
func (s *RoomService) MuteGroupMember(roomID, operatorID, memberID string, duration int64) error {
// 权限校验:必须是群主或管理员
isAdmin, err := s.isGroupAdminOrOwner(roomID, operatorID)
if err != nil {
return err
}
if !isAdmin {
return fmt.Errorf("无权限禁言成员")
}
// 检查被禁言的成员是否存在
var member model.RoomMember
err = s.DB.Where("room_id = ? AND user_id = ?", roomID, memberID).First(&member).Error
if err != nil {
if err == gorm.ErrRecordNotFound {
return fmt.Errorf("成员不存在")
}
return err
}
// 不能禁言群主
if member.Role == 2 {
return fmt.Errorf("不能禁言群主")
}
// 管理员不能禁言其他管理员
var operator model.RoomMember
s.DB.Where("room_id = ? AND user_id = ?", roomID, operatorID).First(&operator)
if operator.Role == 1 && member.Role == 1 {
return fmt.Errorf("管理员不能禁言其他管理员")
}
// 计算禁言到期时间
var mutedUntil *time.Time
if duration == -1 {
// 解除禁言
mutedUntil = nil
} else if duration == 0 {
// 永久禁言设置为100年后
t := time.Now().AddDate(100, 0, 0)
mutedUntil = &t
} else {
// 指定时长禁言
t := time.Now().Add(time.Duration(duration) * time.Second)
mutedUntil = &t
}
// 更新禁言状态
return s.DB.Model(&model.RoomMember{}).
Where("room_id = ? AND user_id = ?", roomID, memberID).
Update("muted_until", mutedUntil).Error
}
/**
* IsGroupMemberMuted
* 功能:检查成员是否被禁言
*/
func (s *RoomService) IsGroupMemberMuted(roomID, userID string) (bool, *time.Time, error) {
var member model.RoomMember
err := s.DB.Where("room_id = ? AND user_id = ?", roomID, userID).First(&member).Error
if err != nil {
return false, nil, err
}
return member.IsMuted(), member.MutedUntil, nil
}

View File

@@ -11,7 +11,7 @@
Target Server Version : 80407 (8.4.7)
File Encoding : 65001
Date: 03/12/2025 11:02:20
Date: 08/12/2025 14:10:48
*/
SET NAMES utf8mb4;
@@ -39,7 +39,7 @@ CREATE TABLE `api_request_logs` (
INDEX `idx_api_request_logs_user_id`(`user_id` ASC) USING BTREE,
INDEX `idx_api_request_logs_response_code`(`response_code` ASC) USING BTREE,
INDEX `idx_api_request_logs_request_time`(`request_time` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '接口请求日志表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '接口请求日志表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of api_request_logs
@@ -65,11 +65,51 @@ CREATE TABLE `attachments` (
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_attachments_uploader_id`(`uploader_id` ASC) USING BTREE,
INDEX `idx_attachments_file_type`(`file_type` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '附件表,记录上传的文件信息' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '附件表,记录上传的文件信息' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of attachments
-- ----------------------------
INSERT INTO `attachments` VALUES (1, '10001', 'app-logo.png', 'image', 50300, 'uploads\\images\\1765155994172139000_139000.png', '/uploads/images/1765155994172139000_139000.png', 'image/png', 0, 0, 0, '2025-12-08 09:06:34.394');
INSERT INTO `attachments` VALUES (2, '10002', 'acf44708-e9f2-45c3-8399-16237ff619b4.jpg', 'image', 80342, 'uploads\\images\\1765159407925763500_763500.jpg', '/uploads/images/1765159407925763500_763500.jpg', 'image/jpeg', 0, 0, 0, '2025-12-08 10:03:27.937');
INSERT INTO `attachments` VALUES (3, '10002', 'acf44708-e9f2-45c3-8399-16237ff619b4.png', 'image', 1106410, 'uploads\\images\\1765159407978118500_118500.png', '/uploads/images/1765159407978118500_118500.png', 'image/png', 0, 0, 0, '2025-12-08 10:03:27.991');
INSERT INTO `attachments` VALUES (4, '10002', 'app-logo.png', 'image', 50300, 'uploads\\images\\1765159408031331600_331600.png', '/uploads/images/1765159408031331600_331600.png', 'image/png', 0, 0, 0, '2025-12-08 10:03:28.045');
INSERT INTO `attachments` VALUES (5, '10002', 'qd.png', 'image', 83764, 'uploads\\images\\1765159408083277400_277400.png', '/uploads/images/1765159408083277400_277400.png', 'image/png', 0, 0, 0, '2025-12-08 10:03:28.094');
INSERT INTO `attachments` VALUES (6, '10002', 'weibo_login.mp4', 'video', 20268266, 'uploads\\videos\\1765159423732615800_615800.mp4', '/uploads/videos/1765159423732615800_615800.mp4', 'video/mp4', 0, 0, 0, '2025-12-08 10:03:43.753');
INSERT INTO `attachments` VALUES (7, '10001', 'app-logo.png', 'image', 50300, 'uploads\\images\\1765170659549540900_540900.png', '/uploads/images/1765170659549540900_540900.png', 'image/png', 0, 0, 0, '2025-12-08 13:10:59.734');
-- ----------------------------
-- Table structure for chat_conversations
-- ----------------------------
DROP TABLE IF EXISTS `chat_conversations`;
CREATE TABLE `chat_conversations` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户ID',
`target_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '目标ID(好友或群)',
`room_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '房间ID',
`type` bigint NULL DEFAULT NULL COMMENT '会话类型(1=私聊,2=群聊)',
`is_top` tinyint(1) NULL DEFAULT 0 COMMENT '是否置顶',
`is_muted` tinyint(1) NULL DEFAULT 0 COMMENT '是否免打扰',
`is_special_care` tinyint(1) NULL DEFAULT 0 COMMENT '是否特别关心',
`unread_count` int NULL DEFAULT 0 COMMENT '未读消息数',
`last_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '最后一条消息内容',
`last_time` datetime NULL DEFAULT NULL COMMENT '最后消息时间',
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime(3) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_chat_conversations_user_id`(`user_id` ASC) USING BTREE,
INDEX `idx_chat_conversations_target_id`(`target_id` ASC) USING BTREE,
INDEX `idx_chat_conversations_room_id`(`room_id` ASC) USING BTREE,
INDEX `idx_chat_conversations_last_time`(`last_time` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户会话表,记录每个用户的最近会话列表和未读信息' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of chat_conversations
-- ----------------------------
INSERT INTO `chat_conversations` VALUES (1, '10002', '10001', '256224828233748480', 1, 0, 0, 0, 0, '我已经通过了你的好友申请,开始和我聊天吧~', '2025-12-08 09:06:00', '2025-12-08 09:05:59.742', '2025-12-08 11:30:28.569');
INSERT INTO `chat_conversations` VALUES (2, '10001', '10002', '256224828233748480', 1, 0, 0, 0, 0, '我已经通过了你的好友申请,开始和我聊天吧~', '2025-12-08 09:06:00', '2025-12-08 09:05:59.813', '2025-12-08 09:06:00.018');
INSERT INTO `chat_conversations` VALUES (3, '10001', 'group_256244427461365760', 'group_256244427461365760', 2, 0, 0, 0, 0, '李四222', '2025-12-08 13:54:45', '2025-12-08 10:23:52.545', '2025-12-08 13:54:47.473');
INSERT INTO `chat_conversations` VALUES (4, '10002', 'group_256244427461365760', 'group_256244427461365760', 2, 0, 0, 0, 0, '李四222', '2025-12-08 13:54:45', '2025-12-08 10:23:52.545', '2025-12-08 13:54:44.991');
-- ----------------------------
-- Table structure for chat_messages
@@ -92,11 +132,17 @@ CREATE TABLE `chat_messages` (
INDEX `idx_chat_messages_sender_user_id`(`sender_user_id` ASC) USING BTREE,
INDEX `idx_chat_messages_receiver_user_id`(`receiver_user_id` ASC) USING BTREE,
INDEX `idx_chat_messages_call_id`(`call_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天消息表,持久化存储聊天记录,包括文本、多媒体和信令状态' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天消息表,持久化存储聊天记录,包括文本、多媒体和信令状态' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of chat_messages
-- ----------------------------
INSERT INTO `chat_messages` VALUES (1, '256224828233748480', '10001', '10002', 0, '我已经通过了你的好友申请,开始和我聊天吧~', '', 0, '', '', '2025-12-08 09:05:59.882');
INSERT INTO `chat_messages` VALUES (2, 'group_256244427461365760', '10001', 'group_256244427461365760', 4, '张三 邀请你加入了群聊', '{\"creator\":\"10001\",\"room_id\":\"group_256244427461365760\",\"type\":\"group_created\"}', 0, '', '', '2025-12-08 10:23:52.740');
INSERT INTO `chat_messages` VALUES (3, 'group_256244427461365760', '10001', 'group_256244427461365760', 0, '@李四 你好', '{\"mention_user_ids\":[\"10002\"]}', 0, '', '', '2025-12-08 11:27:32.014');
INSERT INTO `chat_messages` VALUES (4, 'group_256244427461365760', '10002', 'group_256244427461365760', 0, '.', '{}', 0, '', '', '2025-12-08 13:54:30.347');
INSERT INTO `chat_messages` VALUES (5, 'group_256244427461365760', '10002', 'group_256244427461365760', 0, '123', '{}', 0, '', '', '2025-12-08 13:54:35.594');
INSERT INTO `chat_messages` VALUES (6, 'group_256244427461365760', '10002', 'group_256244427461365760', 0, '222', '{}', 0, '', '', '2025-12-08 13:54:44.646');
-- ----------------------------
-- Table structure for chat_rooms
@@ -120,62 +166,13 @@ CREATE TABLE `chat_rooms` (
INDEX `idx_chat_rooms_owner_id`(`owner_id` ASC) USING BTREE,
INDEX `idx_chat_rooms_creator_id`(`creator_id` ASC) USING BTREE,
INDEX `idx_chat_rooms_last_message_time`(`last_message_time` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天房间表,支持点对点和群聊' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of chat_rooms
-- ----------------------------
-- ----------------------------
-- Table structure for room_members
-- ----------------------------
DROP TABLE IF EXISTS `room_members`;
CREATE TABLE `room_members` (
`room_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '房间ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户ID',
`role` tinyint(1) NOT NULL DEFAULT 0 COMMENT '成员角色(0=成员,1=管理员,2=群主)',
`joined_at` datetime(3) NULL DEFAULT NULL COMMENT '加入时间',
PRIMARY KEY (`room_id`, `user_id`) USING BTREE,
INDEX `idx_room_members_user_id`(`user_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '房间成员表,存储房间与用户的关联关系' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of room_members
-- ----------------------------
-- ----------------------------
-- Table structure for chat_conversations
-- ----------------------------
DROP TABLE IF EXISTS `chat_conversations`;
CREATE TABLE `chat_conversations` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户ID',
`target_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '目标ID(好友或群)',
`room_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '房间ID',
`type` int NULL DEFAULT 1 COMMENT '会话类型(1=私聊,2=群聊)',
`is_top` tinyint(1) NULL DEFAULT 0 COMMENT '是否置顶',
`is_muted` tinyint(1) NULL DEFAULT 0 COMMENT '是否免打扰',
`is_special_care` tinyint(1) NULL DEFAULT 0 COMMENT '是否特别关心',
`unread_count` int NULL DEFAULT 0 COMMENT '未读消息数',
`last_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '最后一条消息内容',
`last_time` datetime NULL DEFAULT NULL COMMENT '最后消息时间',
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime(3) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_chat_conversations_user_id`(`user_id` ASC) USING BTREE,
INDEX `idx_chat_conversations_target_id`(`target_id` ASC) USING BTREE,
INDEX `idx_chat_conversations_room_id`(`room_id` ASC) USING BTREE,
INDEX `idx_chat_conversations_last_time`(`last_time` ASC) USING BTREE
-- 注意:不添加外键约束,因为 target_id 可能是用户ID私聊或群ID群聊
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户会话表,记录每个用户的最近会话列表和未读信息' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of chat_conversations
-- ----------------------------
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '聊天房间表,支持点对点和群聊' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of chat_rooms
-- ----------------------------
INSERT INTO `chat_rooms` VALUES ('256224828233748480', 'p2p', '', '', '0', '', '10001', NULL, '', '', '2025-12-08 09:05:59.479', '2025-12-08 09:05:59.479');
INSERT INTO `chat_rooms` VALUES ('group_256244427461365760', 'group', '1', '1', '10001', '', '10001', NULL, '', '你好', '2025-12-08 10:23:52.329', '2025-12-08 13:54:08.971');
-- ----------------------------
-- Table structure for contact_groups
@@ -189,7 +186,7 @@ CREATE TABLE `contact_groups` (
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_contact_groups_user_id`(`user_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '联系人分组表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '联系人分组表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of contact_groups
@@ -211,11 +208,12 @@ CREATE TABLE `friend_requests` (
INDEX `idx_friend_requests_from_user_id`(`from_user_id` ASC) USING BTREE,
INDEX `idx_friend_requests_to_user_id`(`to_user_id` ASC) USING BTREE,
INDEX `idx_friend_requests_status`(`status` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '好友申请表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '好友申请表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of friend_requests
-- ----------------------------
INSERT INTO `friend_requests` VALUES (1, '10002', '10001', '你好,我是张三', 'accepted', '2025-12-08 09:05:54.580', '2025-12-08 09:05:59.446');
-- ----------------------------
-- Table structure for login_logs
@@ -235,11 +233,163 @@ CREATE TABLE `login_logs` (
INDEX `idx_login_logs_ip`(`ip` ASC) USING BTREE,
INDEX `idx_login_logs_success`(`success` ASC) USING BTREE,
INDEX `idx_login_logs_login_time`(`login_time` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '登录日志表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '登录日志表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of login_logs
-- ----------------------------
INSERT INTO `login_logs` VALUES (1, 'user002@example.com', '10002', '本地', '::1', 1, '2025-12-08 13:10:40');
INSERT INTO `login_logs` VALUES (2, 'workerqi@163.com', '10001', '本地', '::1', 1, '2025-12-08 13:10:48');
-- ----------------------------
-- Table structure for moment_comments
-- ----------------------------
DROP TABLE IF EXISTS `moment_comments`;
CREATE TABLE `moment_comments` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '评论ID',
`moment_id` bigint NULL DEFAULT NULL COMMENT '动态ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '评论者ID',
`reply_to_comment_id` bigint NULL DEFAULT NULL COMMENT '回复的评论ID',
`reply_to_user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '回复的用户ID',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '评论内容',
`is_deleted` tinyint(1) NULL DEFAULT 0 COMMENT '是否已删除',
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_moment_comments_moment_id`(`moment_id` ASC) USING BTREE,
INDEX `idx_moment_comments_user_id`(`user_id` ASC) USING BTREE,
INDEX `idx_moment_comments_reply_to`(`reply_to_comment_id` ASC) USING BTREE,
INDEX `idx_moment_comments_reply_to_comment_id`(`reply_to_comment_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '动态评论表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of moment_comments
-- ----------------------------
INSERT INTO `moment_comments` VALUES (1, 1, '10002', NULL, '', '', 0, '2025-12-08 09:51:33.512');
INSERT INTO `moment_comments` VALUES (2, 2, '10001', NULL, '', '你好', 0, '2025-12-08 09:52:13.529');
INSERT INTO `moment_comments` VALUES (3, 5, '10001', NULL, '', '确实不错', 0, '2025-12-08 11:31:23.850');
INSERT INTO `moment_comments` VALUES (4, 2, '10002', 2, '10001', '嗯嗯', 0, '2025-12-08 12:53:31.946');
-- ----------------------------
-- Table structure for moment_likes
-- ----------------------------
DROP TABLE IF EXISTS `moment_likes`;
CREATE TABLE `moment_likes` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`moment_id` bigint NULL DEFAULT NULL COMMENT '动态ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '点赞用户ID',
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_moment_user`(`moment_id` ASC, `user_id` ASC) USING BTREE,
INDEX `idx_moment_likes_moment_id`(`moment_id` ASC) USING BTREE,
INDEX `idx_moment_likes_user_id`(`user_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '动态点赞表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of moment_likes
-- ----------------------------
INSERT INTO `moment_likes` VALUES (1, 1, '10002', '2025-12-08 09:06:47.565');
INSERT INTO `moment_likes` VALUES (2, 2, '10001', '2025-12-08 09:52:07.061');
INSERT INTO `moment_likes` VALUES (3, 4, '10002', '2025-12-08 10:03:53.559');
INSERT INTO `moment_likes` VALUES (4, 4, '10001', '2025-12-08 10:04:06.564');
INSERT INTO `moment_likes` VALUES (5, 5, '10001', '2025-12-08 11:31:16.553');
INSERT INTO `moment_likes` VALUES (6, 2, '10002', '2025-12-08 13:10:29.289');
INSERT INTO `moment_likes` VALUES (7, 7, '10002', '2025-12-08 13:45:53.852');
-- ----------------------------
-- Table structure for moment_notifications
-- ----------------------------
DROP TABLE IF EXISTS `moment_notifications`;
CREATE TABLE `moment_notifications` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '通知ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '接收通知的用户ID',
`from_user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '触发通知的用户ID',
`moment_id` bigint NULL DEFAULT NULL COMMENT '关联的动态ID',
`type` tinyint NULL DEFAULT NULL COMMENT '通知类型',
`comment_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '关联的评论ID',
`is_read` tinyint(1) NULL DEFAULT 0 COMMENT '是否已读',
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_moment_notifications_user_id`(`user_id` ASC) USING BTREE,
INDEX `idx_moment_notifications_is_read`(`is_read` ASC) USING BTREE,
INDEX `idx_moment_notifications_created_at`(`created_at` ASC) USING BTREE,
INDEX `idx_moment_notifications_moment_id`(`moment_id` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '朋友圈通知表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of moment_notifications
-- ----------------------------
INSERT INTO `moment_notifications` VALUES (1, '10001', '10002', 1, 1, NULL, 0, '2025-12-08 09:06:47.673');
INSERT INTO `moment_notifications` VALUES (2, '10001', '10002', 1, 2, 1, 0, '2025-12-08 09:51:33.620');
INSERT INTO `moment_notifications` VALUES (3, '10002', '10001', 2, 1, NULL, 1, '2025-12-08 09:52:07.164');
INSERT INTO `moment_notifications` VALUES (4, '10002', '10001', 2, 2, 2, 1, '2025-12-08 09:52:13.624');
INSERT INTO `moment_notifications` VALUES (5, '10002', '10001', 4, 1, NULL, 1, '2025-12-08 10:04:06.659');
INSERT INTO `moment_notifications` VALUES (6, '10001', '10002', 5, 4, NULL, 0, '2025-12-08 11:31:11.609');
INSERT INTO `moment_notifications` VALUES (7, '10002', '10001', 5, 1, NULL, 1, '2025-12-08 11:31:16.642');
INSERT INTO `moment_notifications` VALUES (8, '10002', '10001', 5, 2, 3, 1, '2025-12-08 11:31:23.936');
INSERT INTO `moment_notifications` VALUES (9, '10001', '10002', 2, 3, 4, 0, '2025-12-08 12:53:32.069');
INSERT INTO `moment_notifications` VALUES (10, '10002', '10001', 6, 4, NULL, 0, '2025-12-08 13:45:09.606');
INSERT INTO `moment_notifications` VALUES (11, '10002', '10001', 7, 4, NULL, 0, '2025-12-08 13:45:33.703');
INSERT INTO `moment_notifications` VALUES (12, '10001', '10002', 7, 1, NULL, 0, '2025-12-08 13:45:53.961');
-- ----------------------------
-- Table structure for moments
-- ----------------------------
DROP TABLE IF EXISTS `moments`;
CREATE TABLE `moments` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '动态ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '发布者ID',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '文字内容',
`media_type` tinyint NULL DEFAULT 0 COMMENT '媒体类型',
`media_urls` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '媒体URL列表',
`location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '位置信息',
`visibility` tinyint NULL DEFAULT 0 COMMENT '可见性',
`visible_user_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '可见用户ID列表',
`mention_user_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '@的用户ID列表',
`topic_tags` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '话题标签',
`like_count` int NULL DEFAULT 0 COMMENT '点赞数',
`comment_count` int NULL DEFAULT 0 COMMENT '评论数',
`is_deleted` tinyint(1) NULL DEFAULT 0 COMMENT '是否已删除',
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime(3) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_moments_user_id`(`user_id` ASC) USING BTREE,
INDEX `idx_moments_created_at`(`created_at` ASC) USING BTREE,
INDEX `idx_moments_visibility`(`visibility` ASC) USING BTREE,
INDEX `idx_moments_is_deleted`(`is_deleted` ASC) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '朋友圈动态表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of moments
-- ----------------------------
INSERT INTO `moments` VALUES (1, '10001', '大家好,这个是我第一条动态~', 1, '[\"/uploads/images/1765155994172139000_139000.png\"]', '', 0, 'null', 'null', 'null', 1, 1, 0, '2025-12-08 09:06:34.699', '2025-12-08 09:06:34.699');
INSERT INTO `moments` VALUES (2, '10002', '这个是我第一个朋友圈~', 0, '[]', '', 0, 'null', 'null', 'null', 2, 2, 0, '2025-12-08 09:52:02.097', '2025-12-08 09:52:02.097');
INSERT INTO `moments` VALUES (3, '10002', '很开心', 1, '[\"/uploads/images/1765159407925763500_763500.jpg\",\"/uploads/images/1765159407978118500_118500.png\",\"/uploads/images/1765159408031331600_331600.png\",\"/uploads/images/1765159408083277400_277400.png\"]', '', 0, 'null', 'null', 'null', 0, 0, 0, '2025-12-08 10:03:28.142', '2025-12-08 10:03:28.142');
INSERT INTO `moments` VALUES (4, '10002', '哦豁', 2, '[\"/uploads/videos/1765159423732615800_615800.mp4\"]', '', 0, 'null', 'null', 'null', 2, 0, 0, '2025-12-08 10:03:43.810', '2025-12-08 10:03:43.810');
INSERT INTO `moments` VALUES (5, '10002', '今天天气真好 @张三 ', 0, '[]', '', 0, 'null', '[\"10001\"]', 'null', 1, 1, 0, '2025-12-08 11:31:11.549', '2025-12-08 11:31:11.549');
INSERT INTO `moments` VALUES (6, '10001', '... @李四 ', 0, '[]', '', 0, 'null', '[\"10002\"]', 'null', 0, 0, 0, '2025-12-08 13:45:09.525', '2025-12-08 13:45:09.525');
INSERT INTO `moments` VALUES (7, '10001', '@李四 ', 0, '[]', '', 0, 'null', '[\"10002\"]', 'null', 1, 0, 0, '2025-12-08 13:45:33.502', '2025-12-08 13:45:33.502');
-- ----------------------------
-- Table structure for room_members
-- ----------------------------
DROP TABLE IF EXISTS `room_members`;
CREATE TABLE `room_members` (
`room_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '房间ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户ID',
`role` tinyint(1) NOT NULL DEFAULT 0 COMMENT '成员角色(0=成员,1=管理员,2=群主)',
`joined_at` datetime(3) NULL DEFAULT NULL COMMENT '加入时间',
`muted_until` datetime NULL DEFAULT NULL COMMENT '禁言到期时间',
PRIMARY KEY (`room_id`, `user_id`) USING BTREE,
INDEX `idx_room_members_user_id`(`user_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '房间成员表,存储房间与用户的关联关系' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of room_members
-- ----------------------------
INSERT INTO `room_members` VALUES ('256224828233748480', '10001', 0, '2025-12-08 09:05:59.562', NULL);
INSERT INTO `room_members` VALUES ('256224828233748480', '10002', 0, '2025-12-08 09:05:59.523', NULL);
INSERT INTO `room_members` VALUES ('group_256244427461365760', '10001', 2, '2025-12-08 10:23:52.375', NULL);
INSERT INTO `room_members` VALUES ('group_256244427461365760', '10002', 1, '2025-12-08 10:23:52.351', NULL);
-- ----------------------------
-- Table structure for user_contacts
@@ -266,11 +416,13 @@ CREATE TABLE `user_contacts` (
INDEX `idx_user_contacts_contact_id`(`contact_id` ASC) USING BTREE,
INDEX `idx_user_contacts_room_id`(`room_id` ASC) USING BTREE,
INDEX `idx_user_contacts_group_id`(`group_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户联系人表,存储好友关系、分组、备注等信息' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户联系人表,存储好友关系、分组、备注等信息' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of user_contacts
-- ----------------------------
INSERT INTO `user_contacts` VALUES (1, '10002', '10001', '256224828233748480', '', 0, 0, 0, 0, 0, NULL, '', 0, '2025-12-08 09:05:59.632', '2025-12-08 09:05:59.632');
INSERT INTO `user_contacts` VALUES (2, '10001', '10002', '256224828233748480', '', 0, 0, 0, 0, 0, NULL, '', 0, '2025-12-08 09:05:59.662', '2025-12-08 09:05:59.662');
-- ----------------------------
-- Table structure for users
@@ -290,12 +442,12 @@ CREATE TABLE `users` (
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `idx_users_email`(`email` ASC) USING BTREE,
UNIQUE INDEX `idx_users_phone`(`phone` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户基本信息表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户基本信息表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES ('10001', 'workerqi@163.com', '13800138001', '$2a$10$OsVRHKowu.mVT4GNxzZ3/eo8xEABkWsUGAt4nV5nalzOXW47vtBmC', '张三', '', 'Golang 开发工程师', '北京', '2025-12-03 09:53:49.000', '2025-12-03 09:53:49.000');
INSERT INTO `users` VALUES ('10001', 'workerqi@163.com', '13800138001', '$2a$10$OsVRHKowu.mVT4GNxzZ3/eo8xEABkWsUGAt4nV5nalzOXW47vtBmC', '张三', '/uploads/images/1765170659549540900_540900.png', 'Golang 开发工程师', '北京', '2025-12-03 09:53:49.000', '2025-12-08 13:10:59.809');
INSERT INTO `users` VALUES ('10002', 'user002@example.com', '13800138002', '$2a$10$OsVRHKowu.mVT4GNxzZ3/eo8xEABkWsUGAt4nV5nalzOXW47vtBmC', '李四', '', '前端开发工程师', '上海', '2025-12-03 09:53:49.000', '2025-12-03 09:53:49.000');
INSERT INTO `users` VALUES ('10003', 'user003@example.com', '13800138003', '$2a$10$OsVRHKowu.mVT4GNxzZ3/eo8xEABkWsUGAt4nV5nalzOXW47vtBmC', '王五', '', '产品经理', '深圳', '2025-12-03 09:53:49.000', '2025-12-03 09:53:49.000');
INSERT INTO `users` VALUES ('10004', 'user004@example.com', '13800138004', '$2a$10$OsVRHKowu.mVT4GNxzZ3/eo8xEABkWsUGAt4nV5nalzOXW47vtBmC', '赵六', '', 'UI设计师', '广州', '2025-12-03 09:53:49.000', '2025-12-03 09:53:49.000');
@@ -330,91 +482,10 @@ CREATE TABLE `verification_codes` (
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_verification_codes_target`(`target` ASC) USING BTREE,
INDEX `idx_verification_codes_expires_at`(`expires_at` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '验证码表' ROW_FORMAT = Dynamic;
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '验证码表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of verification_codes
-- ----------------------------
-- ----------------------------
-- Table structure for moments (朋友圈动态表)
-- ----------------------------
DROP TABLE IF EXISTS `moments`;
CREATE TABLE `moments` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '动态ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '发布者ID',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '文字内容',
`media_type` tinyint NULL DEFAULT 0 COMMENT '媒体类型: 0=纯文字 1=图片 2=视频',
`media_urls` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '媒体URL列表(JSON数组)',
`location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '位置信息',
`visibility` tinyint NULL DEFAULT 0 COMMENT '可见性: 0=公开 1=仅好友 2=部分好友可见 3=部分好友不可见',
`visible_user_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '可见/不可见用户ID列表(JSON数组)',
`mention_user_ids` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '@的用户ID列表(JSON数组)',
`topic_tags` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '话题标签(JSON数组)',
`like_count` int NULL DEFAULT 0 COMMENT '点赞数',
`comment_count` int NULL DEFAULT 0 COMMENT '评论数',
`is_deleted` tinyint(1) NULL DEFAULT 0 COMMENT '是否已删除',
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime(3) NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_moments_user_id`(`user_id` ASC) USING BTREE,
INDEX `idx_moments_created_at`(`created_at` ASC) USING BTREE,
INDEX `idx_moments_visibility`(`visibility` ASC) USING BTREE,
INDEX `idx_moments_is_deleted`(`is_deleted` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '朋友圈动态表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for moment_likes (动态点赞表)
-- ----------------------------
DROP TABLE IF EXISTS `moment_likes`;
CREATE TABLE `moment_likes` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`moment_id` bigint UNSIGNED NOT NULL COMMENT '动态ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '点赞用户ID',
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_moment_user`(`moment_id` ASC, `user_id` ASC) USING BTREE,
INDEX `idx_moment_likes_moment_id`(`moment_id` ASC) USING BTREE,
INDEX `idx_moment_likes_user_id`(`user_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '动态点赞表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for moment_comments (动态评论表)
-- ----------------------------
DROP TABLE IF EXISTS `moment_comments`;
CREATE TABLE `moment_comments` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '评论ID',
`moment_id` bigint UNSIGNED NOT NULL COMMENT '动态ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '评论者ID',
`reply_to_comment_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '回复的评论ID(NULL为直接评论)',
`reply_to_user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '回复的用户ID',
`content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '评论内容',
`is_deleted` tinyint(1) NULL DEFAULT 0 COMMENT '是否已删除',
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_moment_comments_moment_id`(`moment_id` ASC) USING BTREE,
INDEX `idx_moment_comments_user_id`(`user_id` ASC) USING BTREE,
INDEX `idx_moment_comments_reply_to`(`reply_to_comment_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '动态评论表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for moment_notifications (朋友圈通知表)
-- ----------------------------
DROP TABLE IF EXISTS `moment_notifications`;
CREATE TABLE `moment_notifications` (
`id` bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '通知ID',
`user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '接收通知的用户ID',
`from_user_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '触发通知的用户ID',
`moment_id` bigint UNSIGNED NOT NULL COMMENT '关联的动态ID',
`type` tinyint NOT NULL COMMENT '通知类型: 1=点赞 2=评论 3=回复 4=@提及',
`comment_id` bigint UNSIGNED NULL DEFAULT NULL COMMENT '关联的评论ID',
`is_read` tinyint(1) NULL DEFAULT 0 COMMENT '是否已读',
`created_at` datetime(3) NULL DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_moment_notifications_user_id`(`user_id` ASC) USING BTREE,
INDEX `idx_moment_notifications_is_read`(`is_read` ASC) USING BTREE,
INDEX `idx_moment_notifications_created_at`(`created_at` ASC) USING BTREE,
INDEX `idx_moment_notifications_moment_id`(`moment_id` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '朋友圈通知表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;