Files
opsx-licence/backend/internal/dto/license.go
T
Logan.LiandCursor 8cc2c83f9d feat: 通用授权后台、离线证、Waffo 支付页与仪表盘加强
支持多产品计划展示、LICOFF 离线签发、支付独立配置与调试,以及分析看板;同步更新 README 与集成文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-12 20:25:46 +08:00

137 lines
5.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package dto
// LicenseCreate 创建 License 请求 // Logan.Li
type LicenseCreate struct {
CustomerID uint `json:"customer_id" binding:"required"`
ProductID uint `json:"product_id" binding:"required"`
Duration int `json:"duration"` // 30/90/180/365/…/0(永久);0 合法,勿用 binding:required
MaxActivations int `json:"max_activations"`
IsTrial bool `json:"is_trial"`
TrialDays int `json:"trial_days"`
Notes string `json:"notes"`
Count int `json:"count"` // 批量生成数量
}
// LicenseRenew 续期请求 // Logan.Li
type LicenseRenew struct {
Duration int `json:"duration" binding:"required"`
}
// LicenseRevoke 吊销请求 // Logan.Li
type LicenseRevoke struct {
Reason string `json:"reason"`
}
// LicenseResponse License 响应 // Logan.Li
type LicenseResponse struct {
ID uint `json:"id"`
LicenseKey string `json:"license_key"`
LicenseKeyShort string `json:"license_key_short"` // 列表展示用短码,避免 LICOFF 撑爆表格 // Logan.Li
Channel string `json:"channel"` // online | offline
IsOffline bool `json:"is_offline"`
DeviceID string `json:"device_id,omitempty"` // 离线证绑定设备
CustomerID uint `json:"customer_id"`
CustomerName string `json:"customer_name"`
ProductID uint `json:"product_id"`
ProductName string `json:"product_name"`
Status string `json:"status"`
StartDate string `json:"start_date"`
EndDate string `json:"end_date"`
Duration int `json:"duration"`
MaxActivations int `json:"max_activations"`
CurrentActivations int `json:"current_activations"`
IsTrial bool `json:"is_trial"`
DaysLeft int `json:"days_left"`
Notes string `json:"notes"`
CreatedAt string `json:"created_at"`
}
// ============ 客户端授权契约(无需认证) ============
// LicenseVerifyRequest 验证请求(客户端调用) // Logan.Li
type LicenseVerifyRequest struct {
LicenseKey string `json:"license_key" binding:"required"`
DeviceID string `json:"device_id"`
DeviceName string `json:"device_name"`
DeviceInfo string `json:"device_info"`
ProductID uint `json:"product_id"`
}
// LicenseVerifyResponse 验证响应 // Logan.Li
type LicenseVerifyResponse struct {
Valid bool `json:"valid"`
LicenseKey string `json:"license_key,omitempty"`
ProductID uint `json:"product_id,omitempty"`
ProductName string `json:"product_name,omitempty"`
ProductCode string `json:"product_code,omitempty"`
Features []string `json:"features,omitempty"`
Status string `json:"status,omitempty"`
ExpiresAt string `json:"expires_at,omitempty"`
DaysLeft int `json:"days_left,omitempty"`
MaxDevices int `json:"max_devices,omitempty"`
PlanType string `json:"plan_type,omitempty"`
Message string `json:"message,omitempty"`
}
// LicenseActivateRequest 激活请求(客户端调用) // Logan.Li
type LicenseActivateRequest struct {
LicenseKey string `json:"license_key" binding:"required"`
DeviceID string `json:"device_id" binding:"required"`
DeviceName string `json:"device_name"`
DeviceInfo string `json:"device_info"`
}
// LicenseDeactivateRequest 停用请求(客户端调用) // Logan.Li
type LicenseDeactivateRequest struct {
LicenseKey string `json:"license_key" binding:"required"`
DeviceID string `json:"device_id" binding:"required"`
}
// LicenseHeartbeatRequest 心跳请求(客户端调用) // Logan.Li
type LicenseHeartbeatRequest struct {
LicenseKey string `json:"license_key" binding:"required"`
DeviceID string `json:"device_id" binding:"required"`
}
// ActivationResponse 激活记录响应 // Logan.Li
type ActivationResponse struct {
ID uint `json:"id"`
LicenseID uint `json:"license_id"`
DeviceID string `json:"device_id"`
DeviceName string `json:"device_name"`
DeviceInfo string `json:"device_info"`
IP string `json:"ip"`
Status string `json:"status"`
IsOnline bool `json:"is_online"`
ActivatedAt string `json:"activated_at"`
LastSeenAt string `json:"last_seen_at"`
}
// OfflineLicenseCreate 管理端签发离线许可证请求 // Logan.Li
type OfflineLicenseCreate struct {
DeviceID string `json:"device_id" binding:"required"`
Email string `json:"email"`
CustomerID uint `json:"customer_id"`
CustomerName string `json:"customer_name"`
ProductCode string `json:"product_code"`
PlanType string `json:"plan_type"` // trial | yearly(禁止 perpetual)
DurationDays int `json:"duration_days"` // 1–365,默认 365;trial 上限 180
Notes string `json:"notes"`
}
// OfflineLicenseResponse 离线许可证签发结果 // Logan.Li
type OfflineLicenseResponse struct {
Serial string `json:"serial"`
DeviceID string `json:"device_id"`
Email string `json:"email,omitempty"`
PlanType string `json:"plan_type"`
ProductCode string `json:"product_code"`
IssuedAt string `json:"issued_at"`
ExpiresAt string `json:"expires_at"`
Duration int `json:"duration_days"`
MaxDevices int `json:"max_devices"`
LicenseID uint `json:"license_id"`
PublicKey string `json:"public_key_hex"`
}