package panel import ( "encoding/json" "fmt" "net/url" "os" "path" "strings" "sun-panel/api/api_v1/common/apiData/commonApiStructs" "sun-panel/api/api_v1/common/apiData/panelApiStructs" "sun-panel/api/api_v1/common/apiReturn" "sun-panel/api/api_v1/common/base" "sun-panel/global" "sun-panel/lib/cmn" "sun-panel/lib/siteFavicon" "sun-panel/models" "time" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "gorm.io/gorm" ) type ItemIcon struct { } func (a *ItemIcon) Edit(c *gin.Context) { userInfo, _ := base.GetCurrentUserInfo(c) req := models.ItemIcon{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { apiReturn.ErrorParamFomat(c, err.Error()) return } if req.ItemIconGroupId == 0 { // apiReturn.Error(c, "Group is mandatory") apiReturn.ErrorParamFomat(c, "Group is mandatory") return } req.UserId = userInfo.ID // json转字符串 if j, err := json.Marshal(req.Icon); err == nil { req.IconJson = string(j) } if req.ID != 0 { // 修改 updateField := []string{"IconJson", "Icon", "Title", "Url", "LanUrl", "Description", "OpenMethod", "GroupId", "UserId", "ItemIconGroupId"} if req.Sort != 0 { updateField = append(updateField, "Sort") } global.Db.Model(&models.ItemIcon{}). Select(updateField). Where("id=?", req.ID).Updates(&req) } else { req.Sort = 9999 // 创建 global.Db.Create(&req) } apiReturn.SuccessData(c, req) } // 添加多个图标 func (a *ItemIcon) AddMultiple(c *gin.Context) { userInfo, _ := base.GetCurrentUserInfo(c) // type Request req := []models.ItemIcon{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { apiReturn.ErrorParamFomat(c, err.Error()) return } for i := 0; i < len(req); i++ { if req[i].ItemIconGroupId == 0 { apiReturn.ErrorParamFomat(c, "Group is mandatory") return } req[i].UserId = userInfo.ID // json转字符串 if j, err := json.Marshal(req[i].Icon); err == nil { req[i].IconJson = string(j) } } global.Db.Create(&req) apiReturn.SuccessData(c, req) } // // 获取详情 // func (a *ItemIcon) GetInfo(c *gin.Context) { // req := systemApiStructs.AiDrawGetInfoReq{} // if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { // apiReturn.ErrorParamFomat(c, err.Error()) // return // } // userInfo, _ := base.GetCurrentUserInfo(c) // aiDraw := models.AiDraw{} // aiDraw.ID = req.ID // if err := aiDraw.GetInfo(global.Db); err != nil { // if err == gorm.ErrRecordNotFound { // apiReturn.Error(c, "不存在记录") // return // } // apiReturn.ErrorDatabase(c, err.Error()) // return // } // if userInfo.ID != aiDraw.UserID { // apiReturn.ErrorNoAccess(c) // return // } // apiReturn.SuccessData(c, aiDraw) // } func (a *ItemIcon) GetListByGroupId(c *gin.Context) { req := models.ItemIcon{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { apiReturn.ErrorParamFomat(c, err.Error()) return } userInfo, _ := base.GetCurrentUserInfo(c) itemIcons := []models.ItemIcon{} if err := global.Db.Order("sort ,created_at").Find(&itemIcons, "item_icon_group_id = ? AND user_id=?", req.ItemIconGroupId, userInfo.ID).Error; err != nil { apiReturn.ErrorDatabase(c, err.Error()) return } for k, v := range itemIcons { json.Unmarshal([]byte(v.IconJson), &itemIcons[k].Icon) } apiReturn.SuccessListData(c, itemIcons, 0) } func (a *ItemIcon) Deletes(c *gin.Context) { req := commonApiStructs.RequestDeleteIds[uint]{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { apiReturn.ErrorParamFomat(c, err.Error()) return } userInfo, _ := base.GetCurrentUserInfo(c) if err := global.Db.Delete(&models.ItemIcon{}, "id in ? AND user_id=?", req.Ids, userInfo.ID).Error; err != nil { apiReturn.ErrorDatabase(c, err.Error()) return } apiReturn.Success(c) } // 保存排序 func (a *ItemIcon) SaveSort(c *gin.Context) { req := panelApiStructs.ItemIconSaveSortRequest{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { apiReturn.ErrorParamFomat(c, err.Error()) return } userInfo, _ := base.GetCurrentUserInfo(c) transactionErr := global.Db.Transaction(func(tx *gorm.DB) error { // 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db') for _, v := range req.SortItems { if err := tx.Model(&models.ItemIcon{}).Where("user_id=? AND id=? AND item_icon_group_id=?", userInfo.ID, v.Id, req.ItemIconGroupId).Update("sort", v.Sort).Error; err != nil { // 返回任何错误都会回滚事务 return err } } // 返回 nil 提交事务 return nil }) if transactionErr != nil { apiReturn.ErrorDatabase(c, transactionErr.Error()) return } apiReturn.Success(c) } // 支持获取并直接下载对方网站图标到服务器 func (a *ItemIcon) GetSiteFavicon(c *gin.Context) { userInfo, _ := base.GetCurrentUserInfo(c) req := panelApiStructs.ItemIconGetSiteFaviconReq{} if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil { apiReturn.ErrorParamFomat(c, err.Error()) return } resp := panelApiStructs.ItemIconGetSiteFaviconResp{} fullUrl := "" if iconUrl, err := siteFavicon.GetOneFaviconURL(req.Url); err != nil { apiReturn.Error(c, "acquisition failed: get ico error:"+err.Error()) return } else { fullUrl = iconUrl } parsedURL, err := url.Parse(req.Url) if err != nil { apiReturn.Error(c, "acquisition failed:"+err.Error()) return } protocol := parsedURL.Scheme global.Logger.Debug("protocol:", protocol) global.Logger.Debug("fullUrl:", fullUrl) // 如果URL以双斜杠(//)开头,则使用当前页面协议 if strings.HasPrefix(fullUrl, "//") { fullUrl = protocol + "://" + fullUrl[2:] } else if !strings.HasPrefix(fullUrl, "http://") && !strings.HasPrefix(fullUrl, "https://") { // 如果URL既不以http://开头也不以https://开头,则默认为http协议 fullUrl = "http://" + fullUrl } global.Logger.Debug("fullUrl:", fullUrl) // 去除图标的get参数 { parsedIcoURL, err := url.Parse(fullUrl) if err != nil { apiReturn.Error(c, "acquisition failed: parsed ico URL :"+err.Error()) return } fullUrl = parsedIcoURL.Scheme + "://" + parsedIcoURL.Host + parsedIcoURL.Path } global.Logger.Debug("fullUrl:", fullUrl) // 生成保存目录 configUpload := global.Config.GetValueString("base", "source_path") savePath := fmt.Sprintf("%s/%d/%d/%d/", configUpload, time.Now().Year(), time.Now().Month(), time.Now().Day()) isExist, _ := cmn.PathExists(savePath) if !isExist { os.MkdirAll(savePath, os.ModePerm) } // 下载 var imgInfo *os.File { var err error if imgInfo, err = siteFavicon.DownloadImage(fullUrl, savePath, 1024*1024); err != nil { apiReturn.Error(c, "acquisition failed: download"+err.Error()) return } } // 保存到数据库 ext := path.Ext(fullUrl) mFile := models.File{} if _, err := mFile.AddFile(userInfo.ID, parsedURL.Host, ext, imgInfo.Name()); err != nil { apiReturn.ErrorDatabase(c, err.Error()) return } resp.IconUrl = imgInfo.Name()[1:] apiReturn.SuccessData(c, resp) }