From 20e8cd7d8246a7a89d26aa6389521e9113f65adc Mon Sep 17 00:00:00 2001 From: liqi Date: Mon, 8 Dec 2025 14:18:00 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BE=A4=E8=81=8A=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/server/main.go | 2 + internal/api/room_handler.go | 140 ++++++++---- internal/model/types.go | 22 +- internal/service/room_service.go | 74 +++++++ nl_im_plus.sql | 359 ++++++++++++++++++------------- 5 files changed, 406 insertions(+), 191 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index 10d0125..6def122 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -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) // 附件管理 diff --git a/internal/api/room_handler.go b/internal/api/room_handler.go index 52ceafe..1230af6 100644 --- a/internal/api/room_handler.go +++ b/internal/api/room_handler.go @@ -244,18 +244,18 @@ func ListUserGroupsHandler(c *gin.Context) { } result = append(result, map[string]interface{}{ - "room_id": group.RoomID, - "room_type": group.RoomType, - "room_name": group.RoomName, - "room_avatar": group.RoomAvatar, - "owner_id": group.OwnerID, - "creator_id": group.CreatorID, - "category": category, - "role": int(member.Role), + "room_id": group.RoomID, + "room_type": group.RoomType, + "room_name": group.RoomName, + "room_avatar": group.RoomAvatar, + "owner_id": group.OwnerID, + "creator_id": group.CreatorID, + "category": category, + "role": int(member.Role), "last_message_time": lastMessageTime, - "last_message": group.LastMessage, - "created_at": group.CreatedAt.Format("2006-01-02T15:04:05Z07:00"), - "updated_at": group.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"), + "last_message": group.LastMessage, + "created_at": group.CreatedAt.Format("2006-01-02T15:04:05Z07:00"), + "updated_at": group.UpdatedAt.Format("2006-01-02T15:04:05Z07:00"), }) } @@ -379,12 +379,12 @@ func AddGroupMembersHandler(c *gin.Context) { } notifExtra := map[string]interface{}{ - "type": "member_invite", - "room_id": roomID, - "operator": userID.(string), + "type": "member_invite", + "room_id": roomID, + "operator": userID.(string), "operator_name": operator.Name, - "targets": req.MemberIDs, - "target_names": invitedNames, + "targets": req.MemberIDs, + "target_names": invitedNames, } notifExtraJSON, _ := json.Marshal(notifExtra) @@ -420,9 +420,9 @@ func AddGroupMembersHandler(c *gin.Context) { for _, memberID := range req.MemberIDs { systemContent := fmt.Sprintf("你被 %s 邀请加入群聊", operator.Name) systemExtra := map[string]interface{}{ - "type": "member_invited", - "room_id": roomID, - "operator": userID.(string), + "type": "member_invited", + "room_id": roomID, + "operator": userID.(string), "operator_name": operator.Name, } systemExtraJSON, _ := json.Marshal(systemExtra) @@ -490,7 +490,7 @@ func RemoveGroupMemberHandler(c *gin.Context) { // 获取操作者和被移除成员信息 operator, opErr := service.UserSvc.GetUserByID(operatorID.(string)) member, memErr := service.UserSvc.GetUserByID(memberID) - + if opErr == nil && memErr == nil { // 获取群成员列表 memberIDs, mErr := service.RoomSvc.GetRoomMembers(roomID) @@ -498,30 +498,30 @@ func RemoveGroupMemberHandler(c *gin.Context) { // 构建群通知消息 notifContent := fmt.Sprintf("%s 将 %s 移出了群聊", operator.Name, member.Name) notifExtra := map[string]interface{}{ - "type": "member_remove", - "room_id": roomID, - "operator": operatorID.(string), - "target": memberID, + "type": "member_remove", + "room_id": roomID, + "operator": operatorID.(string), + "target": memberID, "operator_name": operator.Name, "target_name": member.Name, } notifExtraJSON, _ := json.Marshal(notifExtra) - + // 构建系统消息 systemContent := fmt.Sprintf("你被 %s 移出了群聊", operator.Name) systemExtra := map[string]interface{}{ - "type": "member_removed", - "room_id": roomID, + "type": "member_removed", + "room_id": roomID, "operator": operatorID.(string), } systemExtraJSON, _ := json.Marshal(systemExtra) - + // 为所有成员发送群通知 for _, uid := range memberIDs { if uid == memberID { continue // 被移除的成员不接收群通知 } - + // 群通知消息 notifMsg := model.ChatMessage{ RoomID: roomID, @@ -531,13 +531,13 @@ func RemoveGroupMemberHandler(c *gin.Context) { Content: notifContent, Extra: string(notifExtraJSON), } - + if err := service.ChatSvc.DB.Create(¬ifMsg).Error; err == nil { // 更新会话 if service.ConversationSvc != nil { _ = service.ConversationSvc.UpsertConversationOnMessage(uid, roomID, roomID, notifMsg, false) } - + // 推送消息 pushMsg := model.WsPayload{ RequestType: "receive_message", @@ -547,7 +547,7 @@ func RemoveGroupMemberHandler(c *gin.Context) { service.ChatSvc.DispatchMessage(uid, msgBytes) } } - + // 为被移除的成员发送系统消息 systemMsg := model.ChatMessage{ RoomID: roomID, @@ -557,13 +557,13 @@ func RemoveGroupMemberHandler(c *gin.Context) { Content: systemContent, Extra: string(systemExtraJSON), } - + if err := service.ChatSvc.DB.Create(&systemMsg).Error; err == nil { // 更新会话 if service.ConversationSvc != nil { _ = service.ConversationSvc.UpsertConversationOnMessage(memberID, roomID, roomID, systemMsg, false) } - + // 推送消息 pushMsg := model.WsPayload{ RequestType: "receive_message", @@ -697,7 +697,7 @@ func QuitGroupHandler(c *gin.Context) { if service.ChatSvc != nil && service.UserSvc != nil { // 获取退出成员信息 member, memErr := service.UserSvc.GetUserByID(userID.(string)) - + if memErr == nil { // 获取群成员列表(退出后剩余的成员) memberIDs, mErr := service.RoomSvc.GetRoomMembers(roomID) @@ -711,7 +711,7 @@ func QuitGroupHandler(c *gin.Context) { "target_name": member.Name, } notifExtraJSON, _ := json.Marshal(notifExtra) - + // 为所有剩余成员发送群通知 for _, uid := range memberIDs { notifMsg := model.ChatMessage{ @@ -722,13 +722,13 @@ func QuitGroupHandler(c *gin.Context) { Content: notifContent, Extra: string(notifExtraJSON), } - + if err := service.ChatSvc.DB.Create(¬ifMsg).Error; err == nil { // 更新会话 if service.ConversationSvc != nil { _ = service.ConversationSvc.UpsertConversationOnMessage(uid, roomID, roomID, notifMsg, false) } - + // 推送消息 pushMsg := model.WsPayload{ RequestType: "receive_message", @@ -815,9 +815,9 @@ func GetGroupNotificationsHandler(c *gin.Context) { } utils.SuccessWithData(c, gin.H{ - "data": messages, - "total": total, - "page": page, + "data": messages, + "total": total, + "page": page, "page_size": pageSize, }, "获取成功") } @@ -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, + }, "获取成功") +} diff --git a/internal/model/types.go b/internal/model/types.go index 6ce7c1a..39149e8 100644 --- a/internal/model/types.go +++ b/internal/model/types.go @@ -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" @@ -700,8 +710,8 @@ type MomentNotification struct { // 创建时间 CreatedAt time.Time `gorm:"autoCreateTime;index;comment:创建时间" json:"created_at"` // 关联字段(不存储在数据库中) - FromUser *User `gorm:"-" json:"from_user,omitempty"` - Moment *Moment `gorm:"-" json:"moment,omitempty"` + FromUser *User `gorm:"-" json:"from_user,omitempty"` + Moment *Moment `gorm:"-" json:"moment,omitempty"` Comment *MomentComment `gorm:"-" json:"comment,omitempty"` } @@ -799,10 +809,10 @@ const ( ChanClusterBroadcast = "ws:cluster:broadcast" // 文件大小限制(字节) - MaxImageSize = 10 * 1024 * 1024 // 10MB - MaxVideoSize = 500 * 1024 * 1024 // 500MB - MaxAudioSize = 50 * 1024 * 1024 // 50MB - MaxFileSize = 100 * 1024 * 1024 // 100MB + MaxImageSize = 10 * 1024 * 1024 // 10MB + MaxVideoSize = 500 * 1024 * 1024 // 500MB + MaxAudioSize = 50 * 1024 * 1024 // 50MB + MaxFileSize = 100 * 1024 * 1024 // 100MB // 消息类型常量 MessageTypeText = 0 // 文本 diff --git a/internal/service/room_service.go b/internal/service/room_service.go index 2f39344..fda3fc7 100644 --- a/internal/service/room_service.go +++ b/internal/service/room_service.go @@ -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 +} diff --git a/nl_im_plus.sql b/nl_im_plus.sql index 7ae1b2d..c245ec9 100644 --- a/nl_im_plus.sql +++ b/nl_im_plus.sql @@ -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;