Files

450 lines
29 KiB
Go
Raw Permalink Normal View History

2026-06-26 14:31:24 +08:00
// Package models 定义数据库模型
// 包含用户、角色、权限、文档、工作簿、工作表、单元格等核心数据模型
// 所有模型结构必须与根目录 init.sql 保持一致
package models
import (
"time"
"gorm.io/gorm"
)
// ============================================================
// 用户相关模型
// ============================================================
// User 用户模型
// 存储系统用户信息,前期不强制登录
type User struct {
ID uint `json:"id" gorm:"primaryKey"` // 用户ID主键自增
Username string `json:"username" gorm:"size:64;uniqueIndex"` // 用户名(登录名)
Password string `json:"-" gorm:"size:255"` // 密码哈希JSON不输出
Nickname string `json:"nickname" gorm:"size:64"` // 昵称/显示名称
Email string `json:"email" gorm:"size:128"` // 邮箱
Phone string `json:"phone" gorm:"size:20"` // 手机号
Avatar string `json:"avatar" gorm:"size:512"` // 头像URL
Status int `json:"status" gorm:"default:1"` // 状态: 0=禁用 1=正常
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
Roles []Role `json:"roles,omitempty" gorm:"many2many:user_roles"` // 关联角色列表
}
// Role 角色模型
// 系统角色定义,区分前台角色和后台角色
type Role struct {
ID uint `json:"id" gorm:"primaryKey"` // 角色ID主键自增
Name string `json:"name" gorm:"size:64;not null"` // 角色名称
Code string `json:"code" gorm:"size:64;uniqueIndex"` // 角色编码(唯一标识)
Type string `json:"type" gorm:"size:16;default:'frontend'"` // 角色类型: frontend=前台 backend=后台
Description string `json:"description" gorm:"size:255"` // 角色描述
SortOrder int `json:"sortOrder" gorm:"default:0"` // 排序序号
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
Permissions []Permission `json:"permissions,omitempty" gorm:"many2many:role_permissions"` // 关联权限列表
}
// Permission 权限模型
// 系统权限定义,区分前台权限和后台权限
type Permission struct {
ID uint `json:"id" gorm:"primaryKey"` // 权限ID主键自增
Name string `json:"name" gorm:"size:64;not null"` // 权限名称
Code string `json:"code" gorm:"size:128;uniqueIndex"` // 权限编码(如 workbook:create
Type string `json:"type" gorm:"size:16;default:'frontend'"` // 权限类型: frontend=前台 backend=后台
Path string `json:"path" gorm:"size:255"` // 关联的API路径
Method string `json:"method" gorm:"size:10"` // HTTP方法: GET/POST/PUT/DELETE
Description string `json:"description" gorm:"size:255"` // 权限描述
SortOrder int `json:"sortOrder" gorm:"default:0"` // 排序序号
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
}
// RolePermission 角色-权限关联模型
type RolePermission struct {
ID uint `json:"id" gorm:"primaryKey"` // 主键ID
RoleID uint `json:"roleId" gorm:"uniqueIndex:uk_role_permission"` // 角色ID
PermissionID uint `json:"permissionId" gorm:"uniqueIndex:uk_role_permission"` // 权限ID
CreatedAt time.Time `json:"createdAt"` // 创建时间
}
// UserRole 用户-角色关联模型
type UserRole struct {
ID uint `json:"id" gorm:"primaryKey"` // 主键ID
UserID uint `json:"userId" gorm:"uniqueIndex:uk_user_role"` // 用户ID
RoleID uint `json:"roleId" gorm:"uniqueIndex:uk_user_role"` // 角色ID
CreatedAt time.Time `json:"createdAt"` // 创建时间
}
// ============================================================
// 文档相关模型
// ============================================================
// Document 文档模型
// 顶层文档表支持多种文档类型excel/word/pdf
type Document struct {
ID uint `json:"id" gorm:"primaryKey"` // 文档ID主键自增
Type string `json:"type" gorm:"size:16;not null;index"` // 文档类型: excel/word/pdf
Title string `json:"title" gorm:"size:255;not null"` // 文档标题
Description string `json:"description" gorm:"size:500"` // 文档描述
CreatorID uint `json:"creatorId" gorm:"index;not null"` // 创建者用户ID
Cover string `json:"cover" gorm:"size:512"` // 封面图URL
FileSize int64 `json:"fileSize" gorm:"default:0"` // 文件大小(字节)
SortOrder int `json:"sortOrder" gorm:"default:0"` // 排序序号
Status int `json:"status" gorm:"default:1"` // 状态: 0=草稿 1=正常 2=归档
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
}
// Workbook 工作簿模型
// Excel文档的工作簿数据通过 document_id 关联文档表
type Workbook struct {
ID uint `json:"id" gorm:"primaryKey"` // 工作簿ID主键自增
DocumentID uint `json:"documentId" gorm:"uniqueIndex;not null"` // 关联文档ID
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
Document Document `json:"document,omitempty" gorm:"foreignKey:DocumentID"` // 关联的文档
Sheets []Sheet `json:"sheets,omitempty" gorm:"foreignKey:WorkbookID"` // 关联的工作表列表
}
// Sheet 工作表/数据表模型
// 每个工作表属于一个工作簿,拥有独立的列配置和布局
type Sheet struct {
ID uint `json:"id" gorm:"primaryKey"` // 工作表ID主键自增
WorkbookID uint `json:"workbookId" gorm:"index;not null"` // 所属工作簿ID
Name string `json:"name" gorm:"size:255;not null"` // 工作表名称
Index int `json:"index" gorm:"default:0"` // 工作表排序索引
ColCount int `json:"colCount" gorm:"default:26"` // 列数量
RowCount int `json:"rowCount" gorm:"default:100"` // 行数量
ColWidths string `json:"colWidths" gorm:"type:text"` // 列宽配置JSON字符串
RowHeights string `json:"rowHeights" gorm:"type:text"` // 行高配置JSON字符串
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
}
// Cell 单元格模型
// 每个单元格属于一个工作表,通过行号和列号定位
type Cell struct {
ID uint `json:"id" gorm:"primaryKey"` // 单元格ID主键自增
SheetID uint `json:"sheetId" gorm:"index;not null"` // 所属工作表ID
Row int `json:"row" gorm:"index;not null"` // 行号0-based
Col int `json:"col" gorm:"index;not null"` // 列号0-based
CellType string `json:"cellType" gorm:"size:20;default:'text'"` // 单元格类型
Value string `json:"value" gorm:"type:text"` // 文本值或计算结果
Formula string `json:"formula" gorm:"type:text"` // 公式表达式仅formula类型
FileURL string `json:"fileUrl" gorm:"type:text"` // 文件URL
FileName string `json:"fileName" gorm:"size:255"` // 文件名
FileSize int64 `json:"fileSize" gorm:"default:0"` // 文件大小(字节)
MimeType string `json:"mimeType" gorm:"size:128"` // MIME类型
Style string `json:"style" gorm:"type:text"` // 单元格样式JSON字符串
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
}
// ============================================================
// 权限相关模型
// ============================================================
// DocumentRole 文档角色模型
// 定义用户对特定文档的角色(创建者/编辑者/访问者)
type DocumentRole struct {
ID uint `json:"id" gorm:"primaryKey"` // 主键ID
DocumentID uint `json:"documentId" gorm:"uniqueIndex:uk_document_user"` // 文档ID
UserID uint `json:"userId" gorm:"uniqueIndex:uk_document_user"` // 用户ID
RoleType string `json:"roleType" gorm:"size:16;not null"` // 角色类型: creator/editor/viewer
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
}
// UserDocument 用户-文档关联模型
// 记录用户访问/收藏/最近打开的文档关系
type UserDocument struct {
ID uint `json:"id" gorm:"primaryKey"` // 主键ID
UserID uint `json:"userId" gorm:"uniqueIndex:uk_user_document"` // 用户ID
DocumentID uint `json:"documentId" gorm:"uniqueIndex:uk_user_document"` // 文档ID
IsFavorite int `json:"isFavorite" gorm:"default:0"` // 是否收藏: 0=否 1=是
LastOpenAt *time.Time `json:"lastOpenAt"` // 最近打开时间
CreatedAt time.Time `json:"createdAt"` // 创建时间
}
// WorkbookPermission 工作簿权限模型
// 工作簿级别的细粒度权限控制
type WorkbookPermission struct {
ID uint `json:"id" gorm:"primaryKey"` // 主键ID
WorkbookID uint `json:"workbookId" gorm:"uniqueIndex:uk_workbook_user"` // 工作簿ID
UserID uint `json:"userId" gorm:"uniqueIndex:uk_workbook_user"` // 用户ID
CanCreate int `json:"canCreate" gorm:"default:0"` // 是否可创建工作表
CanEdit int `json:"canEdit" gorm:"default:0"` // 是否可编辑单元格
CanDelete int `json:"canDelete" gorm:"default:0"` // 是否可删除
CanShare int `json:"canShare" gorm:"default:0"` // 是否可分享
CanExport int `json:"canExport" gorm:"default:0"` // 是否可导出
CanPrint int `json:"canPrint" gorm:"default:0"` // 是否可打印
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
}
// ============================================================
// 操作历史模型
// ============================================================
// OperationLog 编辑历史模型
// 记录用户在工作表上的所有操作,用于撤销/重做和操作审计
type OperationLog struct {
ID uint `json:"id" gorm:"primaryKey"` // 操作ID主键自增
SheetID uint `json:"sheetId" gorm:"index;not null"` // 工作表ID
UserID uint `json:"userId" gorm:"default:0"` // 操作用户ID0=系统操作)
Operation string `json:"operation" gorm:"size:32;not null"` // 操作类型
TargetType string `json:"targetType" gorm:"size:32;default:'cell'"` // 操作目标类型: cell/row/col/sheet
TargetRange string `json:"targetRange" gorm:"size:128"` // 操作目标范围(如 A1:B5
BeforeData string `json:"beforeData" gorm:"type:json"` // 操作前的数据快照JSON
AfterData string `json:"afterData" gorm:"type:json"` // 操作后的数据快照JSON
Description string `json:"description" gorm:"size:512"` // 操作描述(人类可读)
IPAddress string `json:"ipAddress" gorm:"size:64"` // 操作者IP地址
CreatedAt time.Time `json:"createdAt"` // 操作时间
}
// ============================================================
// 分享链接模型
// ============================================================
// ShareLink 分享链接模型
// 支持生成公开分享链接,可设置密码、有效期、访问次数
type ShareLink struct {
ID uint `json:"id" gorm:"primaryKey"` // 主键ID
DocumentID uint `json:"documentId" gorm:"index;not null"` // 文档ID
UserID uint `json:"userId" gorm:"index;not null"` // 创建者用户ID
Token string `json:"token" gorm:"size:64;uniqueIndex"` // 分享令牌(唯一标识)
Title string `json:"title" gorm:"size:255"` // 分享标题(可自定义)
Password string `json:"password" gorm:"size:255"` // 访问密码(加密存储)
Permission string `json:"permission" gorm:"size:16;default:'view'"` // 访问权限: view/edit
ExpireAt *time.Time `json:"expireAt"` // 过期时间NULL=永不过期)
MaxAccess int `json:"maxAccess" gorm:"default:0"` // 最大访问次数0=不限)
AccessCount int `json:"accessCount" gorm:"default:0"` // 已访问次数
IsActive int `json:"isActive" gorm:"default:1"` // 是否启用
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
}
// ============================================================
// 评论模型
// ============================================================
// Comment 评论模型
// 支持单元格/文档级评论,支持回复和@提及
type Comment struct {
ID uint `json:"id" gorm:"primaryKey"` // 评论ID
DocumentID uint `json:"documentId" gorm:"index;not null"` // 文档ID
SheetID *uint `json:"sheetId" gorm:"index"` // 工作表IDNULL=文档级评论)
ParentID *uint `json:"parentId" gorm:"index"` // 父评论IDNULL=顶级评论)
UserID uint `json:"userId" gorm:"index;not null"` // 评论者用户ID
CellRange string `json:"cellRange" gorm:"size:128"` // 关联的单元格范围
Content string `json:"content" gorm:"type:text;not null"` // 评论内容
Mentions string `json:"mentions" gorm:"type:json"` // @提及的用户ID列表JSON
Status int `json:"status" gorm:"default:1"` // 状态: 0=已隐藏 1=正常 2=已解决
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
}
// ============================================================
// 通知模型
// ============================================================
// Notification 通知模型
// 系统通知:文档分享、评论、协作邀请等
type Notification struct {
ID uint `json:"id" gorm:"primaryKey"` // 通知ID
UserID uint `json:"userId" gorm:"index;not null"` // 接收者用户ID
SenderID *uint `json:"senderId"` // 发送者用户IDNULL=系统通知)
Type string `json:"type" gorm:"size:32;not null"` // 通知类型
Title string `json:"title" gorm:"size:255;not null"` // 通知标题
Content string `json:"content" gorm:"type:text"` // 通知内容
TargetType string `json:"targetType" gorm:"size:32"` // 关联目标类型
TargetID *uint `json:"targetId"` // 关联目标ID
IsRead int `json:"isRead" gorm:"default:0"` // 是否已读
CreatedAt time.Time `json:"createdAt"` // 创建时间
}
// ============================================================
// 标签模型
// ============================================================
// Tag 标签模型
type Tag struct {
ID uint `json:"id" gorm:"primaryKey"` // 标签ID
UserID uint `json:"userId" gorm:"not null"` // 创建者用户ID
Name string `json:"name" gorm:"size:64;not null"` // 标签名称
Color string `json:"color" gorm:"size:16;default:'#1890ff'"` // 标签颜色
SortOrder int `json:"sortOrder" gorm:"default:0"` // 排序序号
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
}
// DocumentTag 文档-标签关联模型
type DocumentTag struct {
ID uint `json:"id" gorm:"primaryKey"` // 主键ID
DocumentID uint `json:"documentId" gorm:"uniqueIndex:uk_document_tag"` // 文档ID
TagID uint `json:"tagId" gorm:"uniqueIndex:uk_document_tag"` // 标签ID
CreatedAt time.Time `json:"createdAt"` // 创建时间
}
// ============================================================
// 文件夹模型
// ============================================================
// Folder 文件夹模型
// 支持多层级文件夹组织结构
type Folder struct {
ID uint `json:"id" gorm:"primaryKey"` // 文件夹ID
ParentID *uint `json:"parentId"` // 父文件夹IDNULL=根目录)
UserID uint `json:"userId" gorm:"index;not null"` // 创建者用户ID
Name string `json:"name" gorm:"size:255;not null"` // 文件夹名称
Icon string `json:"icon" gorm:"size:64;default:'folder'"` // 图标名称
SortOrder int `json:"sortOrder" gorm:"default:0"` // 排序序号
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
}
// ============================================================
// 文件上传模型
// ============================================================
// FileUpload 文件上传记录模型
// 集中管理所有上传的文件,支持文件版本控制
type FileUpload struct {
ID uint `json:"id" gorm:"primaryKey"` // 文件ID
UserID uint `json:"userId" gorm:"index;not null"` // 上传者用户ID
DocumentID *uint `json:"documentId"` // 关联文档ID可选
OriginalName string `json:"originalName" gorm:"size:512;not null"` // 原始文件名
StorageName string `json:"storageName" gorm:"size:512;not null"` // 存储文件名
FilePath string `json:"filePath" gorm:"size:1024;not null"` // 文件存储路径
FileSize int64 `json:"fileSize" gorm:"default:0"` // 文件大小(字节)
MimeType string `json:"mimeType" gorm:"size:128"` // MIME类型
FileType string `json:"fileType" gorm:"size:32;default:'file'"` // 文件类型
MD5Hash string `json:"md5Hash" gorm:"size:64"` // 文件MD5哈希用于去重
Version int `json:"version" gorm:"default:1"` // 版本号
ParentID *uint `json:"parentId"` // 父版本ID
Status int `json:"status" gorm:"default:1"` // 状态: 0=已删除 1=正常
CreatedAt time.Time `json:"createdAt"` // 上传时间
}
// ============================================================
// 版本历史模型
// ============================================================
// Version 文档版本历史模型
// 支持版本对比和回滚
type Version struct {
ID uint `json:"id" gorm:"primaryKey"` // 版本ID
DocumentID uint `json:"documentId" gorm:"uniqueIndex:uk_doc_version;not null"` // 文档ID
UserID uint `json:"userId" gorm:"index;not null"` // 操作者用户ID
VersionNumber int `json:"versionNumber" gorm:"uniqueIndex:uk_doc_version;not null"` // 版本号
Title string `json:"title" gorm:"size:255"` // 版本标题
Description string `json:"description" gorm:"size:500"` // 版本描述
Snapshot string `json:"snapshot" gorm:"type:json;not null"` // 文档数据快照JSON
Diff string `json:"diff" gorm:"type:json"` // 与上一版本的差异JSON
IsAuto int `json:"isAuto" gorm:"default:0"` // 是否自动保存
CreatedAt time.Time `json:"createdAt"` // 创建时间
}
// ============================================================
// 协作会话模型
// ============================================================
// CollaborationSession 协作会话模型
// 记录实时协作的会话信息,跟踪在线用户状态
type CollaborationSession struct {
ID uint `json:"id" gorm:"primaryKey"` // 会话ID
DocumentID uint `json:"documentId" gorm:"index;not null"` // 文档ID
UserID uint `json:"userId" gorm:"index;not null"` // 用户ID
SessionID string `json:"sessionId" gorm:"size:64;index"` // WebSocket会话ID
CursorRow *int `json:"cursorRow"` // 当前光标行位置
CursorCol *int `json:"cursorCol"` // 当前光标列位置
Selection string `json:"selection" gorm:"size:128"` // 当前选区范围
IsActive int `json:"isActive" gorm:"default:1"` // 是否在线
JoinedAt time.Time `json:"joinedAt"` // 加入时间
LastActiveAt time.Time `json:"lastActiveAt"` // 最后活跃时间
}
// ============================================================
// 导出历史模型
// ============================================================
// ExportHistory 导出历史模型
type ExportHistory struct {
ID uint `json:"id" gorm:"primaryKey"` // 导出ID
DocumentID uint `json:"documentId" gorm:"index;not null"` // 文档ID
UserID uint `json:"userId" gorm:"index;not null"` // 导出者用户ID
Format string `json:"format" gorm:"size:16;not null"` // 导出格式: xlsx/csv/pdf
FilePath string `json:"filePath" gorm:"size:1024"` // 导出文件路径
FileSize int64 `json:"fileSize" gorm:"default:0"` // 导出文件大小
Status int `json:"status" gorm:"default:0"` // 状态: 0=处理中 1=完成 2=失败
ErrorMsg string `json:"errorMsg" gorm:"size:512"` // 错误信息
CreatedAt time.Time `json:"createdAt"` // 创建时间
}
// ============================================================
// 设置模型
// ============================================================
// Setting 设置模型
// 用户个人设置和系统全局配置
type Setting struct {
ID uint `json:"id" gorm:"primaryKey"` // 设置ID
UserID *uint `json:"userId"` // 用户IDNULL=系统设置)
Category string `json:"category" gorm:"size:32;not null"` // 设置分类
Key string `json:"key" gorm:"size:128;not null"` // 设置键名
Value string `json:"value" gorm:"type:text"` // 设置值
Description string `json:"description" gorm:"size:255"` // 设置描述
CreatedAt time.Time `json:"createdAt"` // 创建时间
UpdatedAt time.Time `json:"updatedAt"` // 更新时间
}
// ============================================================
// API密钥模型
// ============================================================
// ApiKey API密钥模型
type ApiKey struct {
ID uint `json:"id" gorm:"primaryKey"` // 密钥ID
UserID uint `json:"userId" gorm:"index;not null"` // 用户ID
Name string `json:"name" gorm:"size:128;not null"` // 密钥名称
KeyHash string `json:"keyHash" gorm:"size:255;index"` // 密钥哈希
KeyPrefix string `json:"keyPrefix" gorm:"size:16"` // 密钥前缀
Permissions string `json:"permissions" gorm:"type:json"` // 权限范围JSON
RateLimit int `json:"rateLimit" gorm:"default:1000"` // 速率限制
LastUsedAt *time.Time `json:"lastUsedAt"` // 最后使用时间
ExpireAt *time.Time `json:"expireAt"` // 过期时间
IsActive int `json:"isActive" gorm:"default:1"` // 是否启用
CreatedAt time.Time `json:"createdAt"` // 创建时间
DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` // 软删除时间戳
}
// ============================================================
// 审计日志模型
// ============================================================
// AuditLog 审计日志模型
type AuditLog struct {
ID uint `json:"id" gorm:"primaryKey"` // 日志ID
UserID *uint `json:"userId"` // 操作者用户ID
Action string `json:"action" gorm:"size:64;not null"` // 操作类型
ResourceType string `json:"resourceType" gorm:"size:32;not null"` // 资源类型
ResourceID *uint `json:"resourceId"` // 资源ID
OldValue string `json:"oldValue" gorm:"type:json"` // 操作前的值JSON
NewValue string `json:"newValue" gorm:"type:json"` // 操作后的值JSON
IPAddress string `json:"ipAddress" gorm:"size:64"` // 操作者IP地址
UserAgent string `json:"userAgent" gorm:"size:512"` // 浏览器User-Agent
Status int `json:"status" gorm:"default:1"` // 状态: 0=失败 1=成功
ErrorMsg string `json:"errorMsg" gorm:"size:512"` // 错误信息
CreatedAt time.Time `json:"createdAt"` // 操作时间
}