// Package dto 持有 HTTP 入参与返回 DTO。 // // 与 model 的区别: // - model 反映数据库一行;DTO 反映一次 HTTP 请求/响应 // - DTO 字段做基础校验(必填 / 范围) // - 字段命名贴近用户语言(中文含义在 JSON tag 上保持英文) package dto import "time" // VehicleCreate 新建车辆请求。 type VehicleCreate struct { Name string `json:"name" binding:"required,max=64"` Brand string `json:"brand" binding:"max=64"` Model string `json:"model" binding:"max=64"` PlateNumber string `json:"plate_number" binding:"max=32"` FuelType string `json:"fuel_type" binding:"required,max=32"` TankCapacity float64 `json:"tank_capacity" binding:"gte=0,lte=9999"` CurrentOdometer float64 `json:"current_odometer" binding:"gte=0"` DefaultVehicle bool `json:"default_vehicle"` } // VehicleUpdate 更新车辆请求。所有字段可选(零值表示"不改")。 // 这里采用 patch 语义:仅传了的字段会被更新。 type VehicleUpdate struct { Name *string `json:"name"` Brand *string `json:"brand"` Model *string `json:"model"` PlateNumber *string `json:"plate_number"` FuelType *string `json:"fuel_type"` TankCapacity *float64 `json:"tank_capacity"` CurrentOdometer *float64 `json:"current_odometer"` DefaultVehicle *bool `json:"default_vehicle"` } // RefuelCreate 新建加油记录请求。 // 实际油价(price_per_liter)由服务端实时计算,不入参。 type RefuelCreate struct { VehicleID uint64 `json:"vehicle_id" binding:"required"` RefuelTime time.Time `json:"refuel_time" binding:"required"` Odometer float64 `json:"odometer" binding:"required,gte=0"` FuelType string `json:"fuel_type" binding:"required,max=32"` Liters float64 `json:"liters" binding:"required,gt=0"` TotalAmount float64 `json:"total_amount" binding:"gte=0"` StationName string `json:"station_name" binding:"max=128"` IsFull bool `json:"is_full"` Remark string `json:"remark" binding:"max=512"` } // RefuelUpdate 更新加油记录请求。 // 同 VehicleUpdate,patch 语义;Liters / TotalAmount 任一变化都触发 price 重新计算。 type RefuelUpdate struct { RefuelTime *time.Time `json:"refuel_time"` Odometer *float64 `json:"odometer"` FuelType *string `json:"fuel_type"` Liters *float64 `json:"liters"` TotalAmount *float64 `json:"total_amount"` StationName *string `json:"station_name"` IsFull *bool `json:"is_full"` Remark *string `json:"remark"` }