Files
huobao-drama/domain/models/drama.go
Connor 9600fc542c init
2026-01-12 13:17:11 +08:00

149 lines
7.8 KiB
Go

package models
import (
"time"
"gorm.io/datatypes"
"gorm.io/gorm"
)
type Drama struct {
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
Title string `gorm:"type:varchar(200);not null" json:"title"`
Description *string `gorm:"type:text" json:"description"`
Genre *string `gorm:"type:varchar(50)" json:"genre"`
Style string `gorm:"type:varchar(50);default:'realistic'" json:"style"`
TotalEpisodes int `gorm:"default:1" json:"total_episodes"`
TotalDuration int `gorm:"default:0" json:"total_duration"`
Status string `gorm:"type:varchar(20);default:'draft';not null" json:"status"`
Thumbnail *string `gorm:"type:varchar(500)" json:"thumbnail"`
Tags datatypes.JSON `gorm:"type:json" json:"tags"`
Metadata datatypes.JSON `gorm:"type:json" json:"metadata"`
CreatedAt time.Time `gorm:"not null;autoCreateTime" json:"created_at"`
UpdatedAt time.Time `gorm:"not null;autoUpdateTime" json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
Episodes []Episode `gorm:"foreignKey:DramaID" json:"episodes,omitempty"`
Characters []Character `gorm:"foreignKey:DramaID" json:"characters,omitempty"`
Scenes []Scene `gorm:"foreignKey:DramaID" json:"scenes,omitempty"`
}
func (d *Drama) TableName() string {
return "dramas"
}
type Character struct {
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
DramaID uint `gorm:"not null;index" json:"drama_id"`
Name string `gorm:"type:varchar(100);not null" json:"name"`
Role *string `gorm:"type:varchar(50)" json:"role"`
Description *string `gorm:"type:text" json:"description"`
Appearance *string `gorm:"type:text" json:"appearance"`
Personality *string `gorm:"type:text" json:"personality"`
VoiceStyle *string `gorm:"type:varchar(200)" json:"voice_style"`
ImageURL *string `gorm:"type:varchar(500)" json:"image_url"`
ReferenceImages datatypes.JSON `gorm:"type:json" json:"reference_images"`
SeedValue *string `gorm:"type:varchar(100)" json:"seed_value"`
SortOrder int `gorm:"default:0" json:"sort_order"`
CreatedAt time.Time `gorm:"not null;autoCreateTime" json:"created_at"`
UpdatedAt time.Time `gorm:"not null;autoUpdateTime" json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
// 多对多关系:角色可以属于多个章节
Episodes []Episode `gorm:"many2many:episode_characters;" json:"episodes,omitempty"`
// 运行时字段(不存储到数据库)
ImageGenerationStatus *string `gorm:"-" json:"image_generation_status,omitempty"`
ImageGenerationError *string `gorm:"-" json:"image_generation_error,omitempty"`
}
func (c *Character) TableName() string {
return "characters"
}
type Episode struct {
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
DramaID uint `gorm:"not null;index" json:"drama_id"`
EpisodeNum int `gorm:"column:episode_number;not null" json:"episode_number"`
Title string `gorm:"type:varchar(200);not null" json:"title"`
ScriptContent *string `gorm:"type:longtext" json:"script_content"`
Description *string `gorm:"type:text" json:"description"`
Duration int `gorm:"default:0" json:"duration"` // 总时长(秒)
Status string `gorm:"type:varchar(20);default:'draft'" json:"status"`
VideoURL *string `gorm:"type:varchar(500)" json:"video_url"`
Thumbnail *string `gorm:"type:varchar(500)" json:"thumbnail"`
CreatedAt time.Time `gorm:"not null;autoCreateTime" json:"created_at"`
UpdatedAt time.Time `gorm:"not null;autoUpdateTime" json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
// 关联
Drama Drama `gorm:"foreignKey:DramaID" json:"drama,omitempty"`
Storyboards []Storyboard `gorm:"foreignKey:EpisodeID" json:"storyboards,omitempty"`
Characters []Character `gorm:"many2many:episode_characters;" json:"characters,omitempty"`
Scenes []Scene `gorm:"foreignKey:EpisodeID" json:"scenes,omitempty"`
}
func (e *Episode) TableName() string {
return "episodes"
}
type Storyboard struct {
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
EpisodeID uint `gorm:"not null;index:idx_storyboards_episode_id" json:"episode_id"`
SceneID *uint `gorm:"index:idx_storyboards_scene_id;column:scene_id" json:"scene_id"`
StoryboardNumber int `gorm:"not null;column:storyboard_number" json:"storyboard_number"`
Title *string `gorm:"size:255" json:"title"`
Location *string `gorm:"size:255" json:"location"`
Time *string `gorm:"size:255" json:"time"`
ShotType *string `gorm:"size:100" json:"shot_type"`
Angle *string `gorm:"size:100" json:"angle"`
Movement *string `gorm:"size:100" json:"movement"`
Action *string `gorm:"type:text" json:"action"`
Result *string `gorm:"type:text" json:"result"`
Atmosphere *string `gorm:"type:text" json:"atmosphere"`
ImagePrompt *string `gorm:"type:text" json:"image_prompt"`
VideoPrompt *string `gorm:"type:text" json:"video_prompt"`
BgmPrompt *string `gorm:"type:text" json:"bgm_prompt"`
SoundEffect *string `gorm:"size:255" json:"sound_effect"`
Dialogue *string `gorm:"type:text" json:"dialogue"`
Description *string `gorm:"type:text" json:"description"`
Duration int `gorm:"default:5" json:"duration"`
ComposedImage *string `gorm:"type:text" json:"composed_image"`
VideoURL *string `gorm:"type:text" json:"video_url"`
Status string `gorm:"type:varchar(20);default:'pending'" json:"status"`
CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"`
UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
Episode Episode `gorm:"foreignKey:EpisodeID;constraint:OnDelete:CASCADE" json:"episode,omitempty"`
Background *Scene `gorm:"foreignKey:SceneID" json:"background,omitempty"`
Characters []Character `gorm:"many2many:storyboard_characters;" json:"characters,omitempty"`
}
func (s *Storyboard) TableName() string {
return "storyboards"
}
type Scene struct {
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
DramaID uint `gorm:"not null;index:idx_scenes_drama_id" json:"drama_id"`
EpisodeID *uint `gorm:"index:idx_scenes_episode_id" json:"episode_id"` // 场景所属章节
Location string `gorm:"type:varchar(200);not null" json:"location"`
Time string `gorm:"type:varchar(100);not null" json:"time"`
Prompt string `gorm:"type:text;not null" json:"prompt"`
StoryboardCount int `gorm:"default:1" json:"storyboard_count"`
ImageURL *string `gorm:"type:varchar(500)" json:"image_url"`
Status string `gorm:"type:varchar(20);default:'pending'" json:"status"` // pending, generated, failed
CreatedAt time.Time `gorm:"not null;autoCreateTime" json:"created_at"`
UpdatedAt time.Time `gorm:"not null;autoUpdateTime" json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
// 运行时字段(不存储到数据库)
ImageGenerationStatus *string `gorm:"-" json:"image_generation_status,omitempty"`
ImageGenerationError *string `gorm:"-" json:"image_generation_error,omitempty"`
}
func (s *Scene) TableName() string {
return "scenes"
}