149 lines
7.8 KiB
Go
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"
|
|
}
|