# 用户模型 ## GORM 模型定义 ```go package model import ( "time" "gorm.io/gorm" ) type User struct { ID int64 `gorm:"primaryKey" json:"id"` UserType string `gorm:"default:'casdoor'" json:"user_type"` // casdoor/local Username string `gorm:"uniqueIndex;size:64" json:"username"` Password string `gorm:"size:128" json:"-"` // Casdoor 用户为空 Email string `gorm:"size:128" json:"email"` Avatar string `gorm:"size:256" json:"avatar"` Role string `gorm:"default:'member'" json:"role"` Status int `gorm:"default:1" json:"status"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` } ``` ## 混合用户模式 如果需要支持本地管理员 + Casdoor 用户,可以扩展模型: ```go type User struct { ID int64 `gorm:"primaryKey" json:"id"` UserType string `gorm:"default:'casdoor'" json:"user_type"` // casdoor/local/federation CasdoorID string `gorm:"size:64" json:"casdoor_id,omitempty"` // Casdoor 用户 ID ExternalID string `gorm:"size:64" json:"external_id,omitempty"` // 外部系统 ID Source string `gorm:"size:64" json:"source,omitempty"` // 来源系统 Username string `gorm:"uniqueIndex;size:64" json:"username"` Password string `gorm:"size:128" json:"-"` Email string `gorm:"size:128" json:"email"` Avatar string `gorm:"size:256" json:"avatar"` Role string `gorm:"default:'member'" json:"role"` Status int `gorm:"default:1" json:"status"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` } ``` ## 用户类型说明 | UserType | 说明 | 密码存储 | |---------|------|---------| | `local` | 本地管理员,在数据库中管理 | 本地加密存储 | | `casdoor` | Casdoor 用户,SSO 登录 | 空(Casdoor 管理) | | `federation` | 联邦用户,来自第三方系统 | 空(源系统管理) | ## 自动迁移 ```go func NewServiceContext(c config.Config) *ServiceContext { dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=true", c.MySQL.Username, c.MySQL.Password, c.MySQL.Host, c.MySQL.Port, c.MySQL.Database) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic(err) } // 自动创建表 db.AutoMigrate(&model.User{}) return &ServiceContext{DB: db} } ```