package app import ( "gorm.io/driver/sqlite" "gorm.io/gorm" "math" "strings" "time" ) // DB 用户数据操作 var DB *gorm.DB func ConfigGormDB() { var err error DB, err = gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{}) if err != nil { panic(err) } if err = DB.AutoMigrate(&User{}, &UserToken{}, &Goods{}, &Price{}); err != nil { panic(err) } hash, err := HashPassword("123456") if err != nil { panic(err) } admin := User{ ID: 1, Name: "超级管理员", PhoneNumber: "18982052224", Password: hash, Admin: true, } err = DB.Save(&admin).Error if err != nil { panic(err) } } // User 用户 type User struct { ID uint `json:"id" gorm:"primarykey"` Name string `json:"name"` // 用户名称 PhoneNumber string `json:"phone_number"` // 用户手机 Password string `json:"-"` // 登录密码 Admin bool `json:"admin"` // 是不是管理员 CreatedAt time.Time `json:"-"` UpdatedAt time.Time `json:"-"` DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } // UserToken 用户令牌 type UserToken struct { Code string `json:"code" gorm:"primarykey"` // 主键 UserID uint `json:"user_id"` // 用户ID User *User `json:"user,omitempty"` // 关联用户 AccessToken string `json:"access_token"` // 授权令牌 RefreshToken string `json:"refresh_token"` // 刷新令牌 CreatedAt time.Time `json:"-"` // 创建时间 } // Goods 商品 type Goods struct { ID uint `json:"id" gorm:"primarykey"` Name string `json:"name"` // 商品名称 Price float32 `json:"price"` // 商品当前价格 Prices []Price `json:"prices,omitempty"` // 商品价格列表 CreatedBy uint `json:"created_by"` // 商品创建者ID Creator *User `json:"creator,omitempty" gorm:"foreignKey:CreatedBy"` // 商品创建者 UpdatedBy uint `json:"updated_by"` // 商品更新者ID Updater *User `json:"updater,omitempty" gorm:"foreignKey:UpdatedBy"` // 商品更新者 CreatedAt time.Time `json:"-"` UpdatedAt time.Time `json:"-"` DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } // Price 商品价格 type Price struct { ID uint `json:"id" gorm:"primarykey"` GoodsID uint `json:"goods_id"` // 管理商品 Price float32 `json:"price"` // 商品价格 CreatedBy uint `json:"created_by"` // 价格创建者ID Creator *User `json:"creator,omitempty" gorm:"foreignKey:CreatedBy"` // 价格创建者 CreatedAt time.Time `json:"-"` DeletedAt gorm.DeletedAt `json:"-" gorm:"index"` } // Paginate 分页查询作用域 func Paginate(r *Request) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { page := r.Int("page", 1, func(p int) int { return int(math.Max(float64(p), 1)) }) perPage := r.Int("per_page", 30, func(i int) int { return int(math.Max(float64(i), 1)) }) offset := (page - 1) * perPage return db.Offset(offset).Limit(perPage) } } // Search 搜索作用域 func Search(r *Request, key, query string) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { if keyword, ok := r.Get(key); ok { return db.Where(query, "%"+keyword+"%") } else { return db } } } // TimeRange 时间范围作用域 func TimeRange(r *Request, column string) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { var queries []string var args []any if val, ok := r.Get("start_time"); ok { queries = append(queries, column+" >= ?") args = append(args, val) } if val, ok := r.Get("end_time"); ok { queries = append(queries, column+" <= ?") args = append(args, val) } return db.Where(strings.Join(queries, " AND "), args...) } }