|
|
|
@ -23,8 +23,8 @@ import ( |
|
|
|
) |
|
|
|
|
|
|
|
const ( |
|
|
|
defaultCertificateBackgroundURL = "https://popiart-public-1313913486.cos.ap-guangzhou.myqcloud.com/media/2026/0511/83034.png" |
|
|
|
defaultCertificateLogoURL = "https://popiart-public-1313913486.cos.ap-guangzhou.myqcloud.com/media/2026/0511/83035.png" |
|
|
|
defaultCertificateBackgroundURL = "https://popiart-public-1313913486.cos.ap-guangzhou.myqcloud.com/media/2026/0513/84426.png" |
|
|
|
defaultCertificateLogoURL = "https://popiart-public-1313913486.cos.ap-guangzhou.myqcloud.com/media/2026/0513/84428.png" |
|
|
|
defaultCertificateBucketBaseURL = "https://popi-certificate-1386008232.cos.ap-guangzhou.myqcloud.com" |
|
|
|
) |
|
|
|
|
|
|
|
@ -83,23 +83,33 @@ func GenerateHashCertificate(ctx context.Context, req HashCertificateRequest) (* |
|
|
|
if req.Title == "" { |
|
|
|
req.Title = "数字作品区块链存证证明" |
|
|
|
} |
|
|
|
if req.BackgroundURL == "" && len(req.BackgroundBytes) == 0 { |
|
|
|
req.BackgroundURL = defaultCertificateBackgroundURL |
|
|
|
} |
|
|
|
if req.LogoURL == "" && len(req.LogoBytes) == 0 { |
|
|
|
req.LogoURL = defaultCertificateLogoURL |
|
|
|
} |
|
|
|
if req.BucketBaseURL == "" { |
|
|
|
req.BucketBaseURL = defaultCertificateBucketBaseURL |
|
|
|
} |
|
|
|
|
|
|
|
background, err := loadCertificateImage(ctx, req.HTTPClient, req.BackgroundURL, req.BackgroundBytes) |
|
|
|
var err error |
|
|
|
backgroundURL := req.BackgroundURL |
|
|
|
if backgroundURL == "" && len(req.BackgroundBytes) == 0 { |
|
|
|
backgroundURL = defaultCertificateBackgroundURL |
|
|
|
} |
|
|
|
background, err := loadCertificateImage(ctx, req.HTTPClient, backgroundURL, req.BackgroundBytes) |
|
|
|
if err != nil { |
|
|
|
return nil, fmt.Errorf("load certificate background: %w", err) |
|
|
|
if req.BackgroundURL != "" || len(req.BackgroundBytes) > 0 { |
|
|
|
return nil, fmt.Errorf("load certificate background: %w", err) |
|
|
|
} |
|
|
|
background = defaultCertificateBackgroundImage() |
|
|
|
} |
|
|
|
|
|
|
|
logoURL := req.LogoURL |
|
|
|
if logoURL == "" && len(req.LogoBytes) == 0 { |
|
|
|
logoURL = defaultCertificateLogoURL |
|
|
|
} |
|
|
|
logo, err := loadCertificateImage(ctx, req.HTTPClient, req.LogoURL, req.LogoBytes) |
|
|
|
logo, err := loadCertificateImage(ctx, req.HTTPClient, logoURL, req.LogoBytes) |
|
|
|
if err != nil { |
|
|
|
return nil, fmt.Errorf("load certificate logo: %w", err) |
|
|
|
if req.LogoURL != "" || len(req.LogoBytes) > 0 { |
|
|
|
return nil, fmt.Errorf("load certificate logo: %w", err) |
|
|
|
} |
|
|
|
logo = defaultCertificateLogoImage() |
|
|
|
} |
|
|
|
|
|
|
|
var workPreview image.Image |
|
|
|
@ -266,6 +276,51 @@ func newQRCodeImage(content string, size int) (image.Image, error) { |
|
|
|
return qr.Image(size), nil |
|
|
|
} |
|
|
|
|
|
|
|
func defaultCertificateBackgroundImage() image.Image { |
|
|
|
dc := gg.NewContext(1369, 1920) |
|
|
|
dc.SetHexColor("#fffdf8") |
|
|
|
dc.Clear() |
|
|
|
|
|
|
|
gradient := gg.NewLinearGradient(0, 0, 1369, 1920) |
|
|
|
gradient.AddColorStop(0, mustHexColor("#ffffff")) |
|
|
|
gradient.AddColorStop(0.55, mustHexColor("#fff7e7")) |
|
|
|
gradient.AddColorStop(1, mustHexColor("#f4e4c5")) |
|
|
|
dc.SetFillStyle(gradient) |
|
|
|
dc.DrawRectangle(0, 0, 1369, 1920) |
|
|
|
dc.Fill() |
|
|
|
|
|
|
|
dc.SetHexColor("#d7b56d") |
|
|
|
dc.SetLineWidth(4) |
|
|
|
dc.DrawRectangle(60, 60, 1249, 1800) |
|
|
|
dc.Stroke() |
|
|
|
|
|
|
|
dc.SetHexColor("#eed594") |
|
|
|
dc.SetLineWidth(1) |
|
|
|
dc.DrawRectangle(82, 82, 1205, 1756) |
|
|
|
dc.Stroke() |
|
|
|
|
|
|
|
return dc.Image() |
|
|
|
} |
|
|
|
|
|
|
|
func defaultCertificateLogoImage() image.Image { |
|
|
|
dc := gg.NewContext(304, 60) |
|
|
|
dc.SetRGBA(0, 0, 0, 0) |
|
|
|
dc.Clear() |
|
|
|
dc.SetHexColor("#111111") |
|
|
|
dc.DrawCircle(32, 30, 24) |
|
|
|
dc.Fill() |
|
|
|
dc.SetHexColor("#eed594") |
|
|
|
dc.DrawCircle(32, 30, 13) |
|
|
|
dc.Fill() |
|
|
|
dc.SetHexColor("#111111") |
|
|
|
dc.DrawCircle(32, 30, 6) |
|
|
|
dc.Fill() |
|
|
|
dc.SetHexColor("#111111") |
|
|
|
dc.DrawRoundedRectangle(74, 16, 170, 28, 14) |
|
|
|
dc.Fill() |
|
|
|
return dc.Image() |
|
|
|
} |
|
|
|
|
|
|
|
func loadCertificateImage(ctx context.Context, client *http.Client, imageURL string, inline []byte) (image.Image, error) { |
|
|
|
var data []byte |
|
|
|
var err error |