package models import ( "time" ) type User struct { ID uint `json:"id" gorm:"primarykey"` Username string `json:"username" gorm:"unique"` Password string `json:"password"` Role string `json:"role"` // Permissions 功能权限(JSON 数组字符串)。admin 默认视为全权限。 // 例:["chat","knowledge"]。为空时:agent 兼容默认仅 chat。 Permissions string `json:"permissions" gorm:"type:text"` AvatarURL string `json:"avatar_url" gorm:"type:varchar(500)"` // 头像URL Nickname string `json:"nickname" gorm:"type:varchar(100)"` // 昵称 Email string `json:"email" gorm:"type:varchar(255)"` // 邮箱 // AI 对话接收设置 ReceiveAIConversations bool `json:"receive_ai_conversations" gorm:"default:true"` // 是否接收 AI 对话(默认接收) CreatedAt time.Time `json:"created_at"` // 创建时间 UpdatedAt time.Time `json:"updated_at"` // 更新时间 } type Conversation struct { ID uint `json:"id" gorm:"primaryKey"` ConversationType string `json:"conversation_type" gorm:"type:varchar(20);default:'visitor'"` // visitor(访客对话)、internal(内部/知识库测试) VisitorID uint `json:"visitor_id"` AgentID uint `json:"agent_id"` Status string `json:"status"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` // 访客信息字段(自动收集) Website string `json:"website" gorm:"type:varchar(500)"` // 网站(当前页面URL) Referrer string `json:"referrer" gorm:"type:varchar(500)"` // 来源(referrer) Browser string `json:"browser" gorm:"type:varchar(100)"` // 浏览器信息 OS string `json:"os" gorm:"type:varchar(100)"` // 操作系统 Language string `json:"language" gorm:"type:varchar(50)"` // 语言 IPAddress string `json:"ip_address" gorm:"type:varchar(255)"` // IP地址(含 IPv6;经代理时仅存 X-Forwarded-For 首段) Location string `json:"location" gorm:"type:varchar(200)"` // 位置 // 联系信息字段(客服手动添加) Email string `json:"email" gorm:"type:varchar(255)"` // 邮箱 Phone string `json:"phone" gorm:"type:varchar(50)"` // 电话 Notes string `json:"notes" gorm:"type:text"` // 备注 // 在线状态 LastSeenAt *time.Time `json:"last_seen_at"` // 最后活跃时间 // AI 客服相关 ChatMode string `json:"chat_mode" gorm:"type:varchar(20);default:'human'"` // 对话模式:human(人工客服)、ai(AI客服) AIConfigID *uint `json:"ai_config_id"` // AI 配置 ID(访客选择的模型配置) } type Message struct { ID uint `json:"id" gorm:"primarykey"` ConversationID uint `json:"conversation_id"` SenderID uint `json:"sender_id"` SenderIsAgent bool `json:"sender_is_agent"` Content string `json:"content" gorm:"type:text"` MessageType string `json:"message_type" gorm:"type:varchar(20);default:'user_message'"` // 消息类型:user_message, system_message ChatMode string `json:"chat_mode" gorm:"type:varchar(20);default:'human'"` // 消息发送时的对话模式:human(人工客服)、ai(AI客服) IsRead bool `json:"is_read"` ReadAt *time.Time `json:"read_at"` CreatedAt time.Time `json:"created_at"` // 文件相关字段(可选) FileURL *string `json:"file_url" gorm:"type:varchar(500)"` // 文件URL(相对路径或完整URL) FileType *string `json:"file_type" gorm:"type:varchar(50)"` // 文件类型:image, document FileName *string `json:"file_name" gorm:"type:varchar(255)"` // 原始文件名 FileSize *int64 `json:"file_size"` // 文件大小(字节) MimeType *string `json:"mime_type" gorm:"type:varchar(100)"` // MIME类型(如 image/jpeg) // AI 回复使用的数据源,用于前端展示「已使用知识库」等,逗号分隔:knowledge_base, llm, web SourcesUsed string `json:"sources_used" gorm:"type:varchar(100)"` // IsAIGenerationFailed 为 true 表示本次 AI 消息为生成失败后的兜底文案(用于统计失败率) IsAIGenerationFailed bool `json:"is_ai_generation_failed" gorm:"default:false"` }