Files
excel-api/models/model.go
2026-06-26 14:31:24 +08:00

450 lines
29 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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"` // 操作时间
}