user.go 4.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package models
  2. import (
  3. "time"
  4. )
  5. type User struct {
  6. ID uint `json:"id" gorm:"primarykey"`
  7. Username string `json:"username" gorm:"unique"`
  8. Password string `json:"password"`
  9. Role string `json:"role"`
  10. // Permissions 功能权限(JSON 数组字符串)。admin 默认视为全权限。
  11. // 例:["chat","knowledge"]。为空时:agent 兼容默认仅 chat。
  12. Permissions string `json:"permissions" gorm:"type:text"`
  13. AvatarURL string `json:"avatar_url" gorm:"type:varchar(500)"` // 头像URL
  14. Nickname string `json:"nickname" gorm:"type:varchar(100)"` // 昵称
  15. Email string `json:"email" gorm:"type:varchar(255)"` // 邮箱
  16. // AI 对话接收设置
  17. ReceiveAIConversations bool `json:"receive_ai_conversations" gorm:"default:true"` // 是否接收 AI 对话(默认接收)
  18. CreatedAt time.Time `json:"created_at"` // 创建时间
  19. UpdatedAt time.Time `json:"updated_at"` // 更新时间
  20. }
  21. type Conversation struct {
  22. ID uint `json:"id" gorm:"primaryKey"`
  23. ConversationType string `json:"conversation_type" gorm:"type:varchar(20);default:'visitor';index:idx_conv_list,priority:1"` // visitor(访客对话)、internal(内部/知识库测试)
  24. VisitorID uint `json:"visitor_id"`
  25. AgentID uint `json:"agent_id"`
  26. Status string `json:"status" gorm:"index:idx_conv_list,priority:2"`
  27. CreatedAt time.Time `json:"created_at"`
  28. UpdatedAt time.Time `json:"updated_at" gorm:"index:idx_conv_list,priority:4"`
  29. // 访客信息字段(自动收集)
  30. Website string `json:"website" gorm:"type:varchar(500)"` // 网站(当前页面URL)
  31. Referrer string `json:"referrer" gorm:"type:varchar(500)"` // 来源(referrer)
  32. Browser string `json:"browser" gorm:"type:varchar(100)"` // 浏览器信息
  33. OS string `json:"os" gorm:"type:varchar(100)"` // 操作系统
  34. Language string `json:"language" gorm:"type:varchar(50)"` // 语言
  35. IPAddress string `json:"ip_address" gorm:"type:varchar(255)"` // IP地址(含 IPv6;经代理时仅存 X-Forwarded-For 首段)
  36. Location string `json:"location" gorm:"type:varchar(200)"` // 位置
  37. // 联系信息字段(客服手动添加)
  38. Email string `json:"email" gorm:"type:varchar(255)"` // 邮箱
  39. Phone string `json:"phone" gorm:"type:varchar(50)"` // 电话
  40. Notes string `json:"notes" gorm:"type:text"` // 备注
  41. // 在线状态
  42. LastSeenAt *time.Time `json:"last_seen_at"` // 最后活跃时间
  43. // AI 客服相关
  44. ChatMode string `json:"chat_mode" gorm:"type:varchar(20);default:'human';index:idx_conv_list,priority:3"` // 对话模式:human(人工客服)、ai(AI客服)
  45. AIConfigID *uint `json:"ai_config_id"` // AI 配置 ID(访客选择的模型配置)
  46. // AccessToken 访客访问会话/消息的密钥;仅 init 时下发给对应访客,不在客服 API 中返回。
  47. AccessToken string `json:"-" gorm:"type:varchar(64);index"`
  48. }
  49. type Message struct {
  50. ID uint `json:"id" gorm:"primarykey"`
  51. ConversationID uint `json:"conversation_id" gorm:"index:idx_msg_conv;index:idx_msg_conv_unread,priority:1;index:idx_msg_conv_sender,priority:1"`
  52. SenderID uint `json:"sender_id" gorm:"index:idx_msg_conv_sender,priority:3"`
  53. SenderIsAgent bool `json:"sender_is_agent" gorm:"index:idx_msg_conv_unread,priority:2;index:idx_msg_conv_sender,priority:2"`
  54. Content string `json:"content" gorm:"type:text"`
  55. MessageType string `json:"message_type" gorm:"type:varchar(20);default:'user_message'"` // 消息类型:user_message, system_message
  56. ChatMode string `json:"chat_mode" gorm:"type:varchar(20);default:'human'"` // 消息发送时的对话模式:human(人工客服)、ai(AI客服)
  57. IsRead bool `json:"is_read" gorm:"index:idx_msg_conv_unread,priority:3"`
  58. ReadAt *time.Time `json:"read_at"`
  59. CreatedAt time.Time `json:"created_at"`
  60. // 文件相关字段(可选)
  61. FileURL *string `json:"file_url" gorm:"type:varchar(500)"` // 文件URL(相对路径或完整URL)
  62. FileType *string `json:"file_type" gorm:"type:varchar(50)"` // 文件类型:image, document
  63. FileName *string `json:"file_name" gorm:"type:varchar(255)"` // 原始文件名
  64. FileSize *int64 `json:"file_size"` // 文件大小(字节)
  65. MimeType *string `json:"mime_type" gorm:"type:varchar(100)"` // MIME类型(如 image/jpeg)
  66. // AI 回复使用的数据源,用于前端展示「已使用知识库」等,逗号分隔:knowledge_base, llm, web
  67. SourcesUsed string `json:"sources_used" gorm:"type:varchar(100)"`
  68. // IsAIGenerationFailed 为 true 表示本次 AI 消息为生成失败后的兜底文案(用于统计失败率)
  69. IsAIGenerationFailed bool `json:"is_ai_generation_failed" gorm:"default:false"`
  70. }