diff --git a/api/v1/site.go b/api/v1/site.go index a9ef5f1..0cddcb5 100644 --- a/api/v1/site.go +++ b/api/v1/site.go @@ -64,11 +64,11 @@ type ( type ( SiteUpdateReq struct { Id int `json:"id" uri:"id"` // ID - Icon *string `json:"thumb" form:"thumb"` // 网站 logo - Title *string `json:"title" form:"title"` // 名称简介 - Url *string `json:"url" form:"url"` // 链接 - CategoryId *int `json:"category_id" form:"category_id"` // 分类id - Description *string `json:"description" form:"description"` // 描述 + Icon string `json:"thumb" form:"thumb"` // 网站 logo + Title string `json:"title" form:"title"` // 名称简介 + Url string `json:"url" form:"url"` // 链接 + CategoryId int `json:"category_id" form:"category_id"` // 分类id + Description string `json:"description" form:"description"` // 描述 IsUsed *bool `json:"is_used" form:"is_used"` // 是否启用 File *multipart.FileHeader `json:"file"` // 上传 logo 图片 } diff --git a/internal/service/site/batchcreate.go b/internal/service/site/batchcreate.go index f4dd1f7..1cc6301 100644 --- a/internal/service/site/batchcreate.go +++ b/internal/service/site/batchcreate.go @@ -38,7 +38,7 @@ func (s *service) BatchCreate(ctx context.Context, req *v1.SiteCreateReq) (*v1.S return nil }) g.Go(func() error { - icon = getWebLogoIcon(url) + icon = getWebLogoIconBase64(url) return nil }) g.Go(func() error { diff --git a/internal/service/site/service.go b/internal/service/site/service.go index 0ce3df6..dc35afe 100644 --- a/internal/service/site/service.go +++ b/internal/service/site/service.go @@ -56,7 +56,7 @@ func (s *service) i() {} // default icon base64 const defaultIcon = "iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAA+VBMVEUAAAC6sWUzNjZCQkIsLi8sLjAsLi//tSs6Oj8tLzAsLi/9sycsLi/9sycsLi/9tCctLi/8tSj/tSguMTEuMzQzMzMwMzb/ujP9tCcsLi8uLzEtLy8sLi8sLi8tLi8sLi8tLi8sLi8tLjAsLi8sLy8sLi8sLjAsLjAtLy8tLzAtLzAuMDAuMDL/tyn9tCf8tCctLi/8tCf8tCf8tCf9sycsLjD9tCgsLjD9tSf9tCgtLzAtMDAuLzAvLzEvLzL/ty0tLy/+tij9tCj9tCj9syf9syj9tCf9tCj9tCf9tCn8tSj/tCj/tikwMDT/vzP/v0AsLy/8sycsLi+FeN01AAAAUXRSTlMAAg8F/uOqIwv7+Pjp6dLQdWM/KSIcFg3v7Uv18tzZzce5ta+ej4eBb2lUQT0x+8jBvrWvqpqLiollZGBcNjAck1T039fNo5h7cFpHOB8UCKLRW+BFAAACmElEQVRYw82VaVPyMBSFW5aC7FulgMiqICIIIiq4gPvum/7/H/NOe+00xwZL+OTzhZkm5wz35txE+eOo2ZExyqob63NpZpHObSaPTJjDJCIvL57HmUv8vChbfJIhyawqVzwg2YrICRNzEpEoHpBohXoBxXtIXqhSxUu0QlS8ZCuK0zhbj/i0KFu8fyuO0kyO9BHqDSaLAQ5jJs+YNzCYPAZvMGTyDHmDVybPq8KTjUvK41kFuZlI6Sc3gjl4WFv+kPO7hpD1L6fidOArH8AgeIiM/eITWSUtdIP279v9L/L7N3tPsFv4KY/ux8xwj1rxYqzK3gsV3wubsf0o6AN10+L4WrH4fBqIin/6tFevj+299QBv0DaJ0Ok2TefIox/R9G2fhkyizRuETYfSdyuWdyC/W34XXzIdwrzBrumyW7Y/fT3fMofb5y/7Wxn28QZnJk8zT+l+ZMQj5TbfhF1nvEFQg7WtPerQ+9Aa23fq894W7NGCCjBPwHJiplKwlhQcdfZjfa6IksBT63OL/RqsuSkACi0T0D4U4kPDhRaXQ+QwBRsrnYBVfKcCX1OHv72tByW0aC1aKC8dqCuniZq9wGYjW4uAuxfp10JtinG+sVLfyFOc2yGnxZiknQydba8qlFd7lJnMDuTIJuPsKbt7ANe97LhneIOU4F+CXFBfijdIeGN8Vef09StvnBO8gSY6qcuwM7iXojPWeAO9KspKtBOzctuJilJW1RVwEKdV7/7r6uKc6z4xhnmBSYM4Y4ydVkLl0A0iIYgzNBl7T+eBxyRCdGuFmrPyrBny3ndi4N4E4Mb1AWIsirMv9HYA+Or4Q68XQu+eBL0wqunllSEKN2GF4iyHrkFuN6FfwxdCHnXeKDXmqvKn+Q+oeE3vIQF62QAAAABJRU5ErkJggg==" -func getWebLogoIcon(url string) string { +func getWebLogoIconBase64(url string) string { client := &http.Client{ Transport: &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, diff --git a/internal/service/site/sync.go b/internal/service/site/sync.go index aeb5b0f..ab16a8e 100644 --- a/internal/service/site/sync.go +++ b/internal/service/site/sync.go @@ -20,7 +20,7 @@ func (s *service) Sync(ctx *gin.Context, req *v1.SiteSyncReq) (resp *v1.SiteSync _, err = s.siteRepository.WithContext(ctx).Update(&model.StSite{ Title: getWebTitle(site.URL), - Icon: getWebLogoIcon(site.URL), + Icon: getWebLogoIconBase64(site.URL), Description: getWebDescription(site.URL), IsUsed: false, }, diff --git a/internal/service/site/update.go b/internal/service/site/update.go index 0403450..69b55c3 100644 --- a/internal/service/site/update.go +++ b/internal/service/site/update.go @@ -6,51 +6,71 @@ package site import ( - "path/filepath" + "crypto/tls" + "encoding/base64" + "io" + "net/http" "github.com/gin-gonic/gin" v1 "github.com/ch3nnn/webstack-go/api/v1" ) -func IconPath(ctx *gin.Context, req *v1.SiteUpdateReq) string { - // 修改操作是否手动上传 logo 图片 - if req.File != nil { - return getWebLogoIconUrlByUploadImg(ctx) +func getIconBase64ByFormFile(req *v1.SiteUpdateReq) string { + file, err := req.File.Open() + if err != nil { + return defaultIcon } + defer file.Close() - if req.Icon == nil { - return "" + imgData, err := io.ReadAll(file) + if err != nil { + return defaultIcon } - return *req.Icon + return base64.StdEncoding.EncodeToString(imgData) } -func getWebLogoIconUrlByUploadImg(ctx *gin.Context) string { - file, _ := ctx.FormFile("file") - dst := filepath.Join("upload", file.Filename) // 上传静态文件 url - if err := ctx.SaveUploadedFile(file, filepath.Join("web", dst)); err != nil { - return "" +func getIconBase64ByURL(req *v1.SiteUpdateReq) string { + client := &http.Client{ + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + }, + } + + resp, err := client.Get(req.Icon) + if err != nil { + return defaultIcon + } + defer resp.Body.Close() + + imgData, err := io.ReadAll(resp.Body) + if err != nil { + return defaultIcon } - return filepath.Join("/", dst) + + return base64.StdEncoding.EncodeToString(imgData) } func (s *service) Update(ctx *gin.Context, req *v1.SiteUpdateReq) (resp *v1.SiteUpdateResp, err error) { update := make(map[string]any) - if req.CategoryId != nil { + if req.CategoryId != 0 { update["CategoryID"] = req.CategoryId } - if req.Title != nil { + if req.Title != "" { update["Title"] = req.Title } - if req.Icon != nil { - update["Icon"] = IconPath(ctx, req) + if req.Icon != "" { + update["Icon"] = getIconBase64ByURL(req) + } + if req.File != nil { + update["Icon"] = getIconBase64ByFormFile(req) } - if req.Description != nil { + if req.Description != "" { update["Description"] = req.Description } - if req.Url != nil { + if req.Url != "" { update["Url"] = req.Url } if req.IsUsed != nil { diff --git a/web/templates/site/site_list.html b/web/templates/site/site_list.html index bc3259c..01cd60f 100755 --- a/web/templates/site/site_list.html +++ b/web/templates/site/site_list.html @@ -399,8 +399,8 @@ '' + '' + '
' + - '' + - '' + + '' + + '' + '
' + '' + '
' + @@ -422,7 +422,7 @@ showPreview: false, // 显示预览 maxFileSize: 2500, // 最大文件大小 initialPreviewAsData: true, - initialPreview: [thumb], // 初始预览数据 + initialPreview: [], // 初始预览数据 allowedFileExtensions: ["jpg", "png"], // 允许的文件扩展名 browseLabel: '选择文件', // 自定义浏览按钮标签 removeLabel: '删除', // 自定义删除按钮标签 @@ -461,20 +461,9 @@ btnClass: 'btn-orange', action: function () { - const file = $("#file").val(); const thumb = $("#thumb").val(); - - if (thumb === "" && file === "") { - $.alert({ - title: '温馨提示', - icon: 'mdi mdi-alert', - type: 'orange', - content: '请输入网站 logo 或者上传 logo 图片', - }); - return false; - } - const title = $("#title").val(); + if (title === "") { $.alert({ title: '温馨提示',