mirror of
https://github.com/wgh136/nysoure.git
synced 2025-12-16 15:51:14 +00:00
Compare commits
6 Commits
cacd936ab3
...
070b9c7656
| Author | SHA1 | Date | |
|---|---|---|---|
| 070b9c7656 | |||
| d118ad7d14 | |||
| b811ca25c4 | |||
| 43273fece2 | |||
| 5d1e43f88d | |||
| 27bda316df |
@@ -312,7 +312,7 @@ func handleUpdateCharacterImage(c fiber.Ctx) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return model.NewRequestError("Invalid character ID")
|
return model.NewRequestError("Invalid character ID")
|
||||||
}
|
}
|
||||||
|
|
||||||
var params struct {
|
var params struct {
|
||||||
ImageID uint `json:"image_id"`
|
ImageID uint `json:"image_id"`
|
||||||
}
|
}
|
||||||
@@ -321,17 +321,17 @@ func handleUpdateCharacterImage(c fiber.Ctx) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return model.NewRequestError("Invalid request body")
|
return model.NewRequestError("Invalid request body")
|
||||||
}
|
}
|
||||||
|
|
||||||
uid, ok := c.Locals("uid").(uint)
|
uid, ok := c.Locals("uid").(uint)
|
||||||
if !ok {
|
if !ok {
|
||||||
return model.NewUnAuthorizedError("You must be logged in to update a character")
|
return model.NewUnAuthorizedError("You must be logged in to update a character")
|
||||||
}
|
}
|
||||||
|
|
||||||
err = service.UpdateCharacterImage(uid, uint(resourceId), uint(characterId), params.ImageID)
|
err = service.UpdateCharacterImage(uid, uint(resourceId), uint(characterId), params.ImageID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.Status(fiber.StatusOK).JSON(model.Response[any]{
|
return c.Status(fiber.StatusOK).JSON(model.Response[any]{
|
||||||
Success: true,
|
Success: true,
|
||||||
Data: nil,
|
Data: nil,
|
||||||
@@ -339,6 +339,169 @@ func handleUpdateCharacterImage(c fiber.Ctx) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleGetLowResolutionCharacters(c fiber.Ctx) error {
|
||||||
|
pageStr := c.Query("page")
|
||||||
|
if pageStr == "" {
|
||||||
|
pageStr = "1"
|
||||||
|
}
|
||||||
|
page, err := strconv.Atoi(pageStr)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid page number")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 支持自定义页面大小,默认50,最大1000
|
||||||
|
pageSizeStr := c.Query("page_size")
|
||||||
|
if pageSizeStr == "" {
|
||||||
|
pageSizeStr = "50"
|
||||||
|
}
|
||||||
|
pageSize, err := strconv.Atoi(pageSizeStr)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid page_size parameter")
|
||||||
|
}
|
||||||
|
if pageSize > 1000 {
|
||||||
|
pageSize = 1000 // 限制最大页面大小
|
||||||
|
}
|
||||||
|
if pageSize < 1 {
|
||||||
|
pageSize = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
maxWidthStr := c.Query("max_width")
|
||||||
|
if maxWidthStr == "" {
|
||||||
|
maxWidthStr = "800" // 默认最大宽度800px
|
||||||
|
}
|
||||||
|
maxWidth, err := strconv.Atoi(maxWidthStr)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid max_width parameter")
|
||||||
|
}
|
||||||
|
|
||||||
|
maxHeightStr := c.Query("max_height")
|
||||||
|
if maxHeightStr == "" {
|
||||||
|
maxHeightStr = "800" // 默认最大高度800px
|
||||||
|
}
|
||||||
|
maxHeight, err := strconv.Atoi(maxHeightStr)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid max_height parameter")
|
||||||
|
}
|
||||||
|
|
||||||
|
characters, totalPages, err := service.GetLowResolutionCharacters(page, pageSize, maxWidth, maxHeight)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if characters == nil {
|
||||||
|
characters = []model.LowResCharacterView{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Status(fiber.StatusOK).JSON(model.PageResponse[model.LowResCharacterView]{
|
||||||
|
Success: true,
|
||||||
|
Data: characters,
|
||||||
|
TotalPages: totalPages,
|
||||||
|
Message: "Low resolution characters retrieved successfully",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleGetLowResolutionResourceImages(c fiber.Ctx) error {
|
||||||
|
pageStr := c.Query("page")
|
||||||
|
if pageStr == "" {
|
||||||
|
pageStr = "1"
|
||||||
|
}
|
||||||
|
page, err := strconv.Atoi(pageStr)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid page number")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 支持自定义页面大小,默认50,最大1000
|
||||||
|
pageSizeStr := c.Query("page_size")
|
||||||
|
if pageSizeStr == "" {
|
||||||
|
pageSizeStr = "50"
|
||||||
|
}
|
||||||
|
pageSize, err := strconv.Atoi(pageSizeStr)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid page_size parameter")
|
||||||
|
}
|
||||||
|
if pageSize > 1000 {
|
||||||
|
pageSize = 1000 // 限制最大页面大小
|
||||||
|
}
|
||||||
|
if pageSize < 1 {
|
||||||
|
pageSize = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
maxWidthStr := c.Query("max_width")
|
||||||
|
if maxWidthStr == "" {
|
||||||
|
maxWidthStr = "800" // 默认最大宽度800px
|
||||||
|
}
|
||||||
|
maxWidth, err := strconv.Atoi(maxWidthStr)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid max_width parameter")
|
||||||
|
}
|
||||||
|
|
||||||
|
maxHeightStr := c.Query("max_height")
|
||||||
|
if maxHeightStr == "" {
|
||||||
|
maxHeightStr = "800" // 默认最大高度800px
|
||||||
|
}
|
||||||
|
maxHeight, err := strconv.Atoi(maxHeightStr)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid max_height parameter")
|
||||||
|
}
|
||||||
|
|
||||||
|
images, totalPages, err := service.GetLowResolutionResourceImages(page, pageSize, maxWidth, maxHeight)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if images == nil {
|
||||||
|
images = []model.LowResResourceImageView{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Status(fiber.StatusOK).JSON(model.PageResponse[model.LowResResourceImageView]{
|
||||||
|
Success: true,
|
||||||
|
Data: images,
|
||||||
|
TotalPages: totalPages,
|
||||||
|
Message: "Low resolution resource images retrieved successfully",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleUpdateResourceImage(c fiber.Ctx) error {
|
||||||
|
resourceIdStr := c.Params("resourceId")
|
||||||
|
oldImageIdStr := c.Params("oldImageId")
|
||||||
|
if resourceIdStr == "" || oldImageIdStr == "" {
|
||||||
|
return model.NewRequestError("Resource ID and Old Image ID are required")
|
||||||
|
}
|
||||||
|
resourceId, err := strconv.Atoi(resourceIdStr)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid resource ID")
|
||||||
|
}
|
||||||
|
oldImageId, err := strconv.Atoi(oldImageIdStr)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid old image ID")
|
||||||
|
}
|
||||||
|
|
||||||
|
var params struct {
|
||||||
|
NewImageID uint `json:"new_image_id"`
|
||||||
|
}
|
||||||
|
body := c.Body()
|
||||||
|
err = json.Unmarshal(body, ¶ms)
|
||||||
|
if err != nil {
|
||||||
|
return model.NewRequestError("Invalid request body")
|
||||||
|
}
|
||||||
|
|
||||||
|
uid, ok := c.Locals("uid").(uint)
|
||||||
|
if !ok {
|
||||||
|
return model.NewUnAuthorizedError("You must be logged in to update a resource image")
|
||||||
|
}
|
||||||
|
|
||||||
|
err = service.UpdateResourceImage(uid, uint(resourceId), uint(oldImageId), params.NewImageID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Status(fiber.StatusOK).JSON(model.Response[any]{
|
||||||
|
Success: true,
|
||||||
|
Data: nil,
|
||||||
|
Message: "Resource image updated successfully",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func AddResourceRoutes(api fiber.Router) {
|
func AddResourceRoutes(api fiber.Router) {
|
||||||
resource := api.Group("/resource")
|
resource := api.Group("/resource")
|
||||||
{
|
{
|
||||||
@@ -348,11 +511,14 @@ func AddResourceRoutes(api fiber.Router) {
|
|||||||
resource.Get("/random", handleGetRandomResource)
|
resource.Get("/random", handleGetRandomResource)
|
||||||
resource.Get("/pinned", handleGetPinnedResources)
|
resource.Get("/pinned", handleGetPinnedResources)
|
||||||
resource.Get("/vndb/characters", handleGetCharactersFromVndb)
|
resource.Get("/vndb/characters", handleGetCharactersFromVndb)
|
||||||
|
resource.Get("/characters/low-resolution", handleGetLowResolutionCharacters)
|
||||||
|
resource.Get("/images/low-resolution", handleGetLowResolutionResourceImages)
|
||||||
resource.Get("/:id", handleGetResource)
|
resource.Get("/:id", handleGetResource)
|
||||||
resource.Delete("/:id", handleDeleteResource)
|
resource.Delete("/:id", handleDeleteResource)
|
||||||
resource.Get("/tag/:tag", handleListResourcesWithTag)
|
resource.Get("/tag/:tag", handleListResourcesWithTag)
|
||||||
resource.Get("/user/:username", handleGetResourcesWithUser)
|
resource.Get("/user/:username", handleGetResourcesWithUser)
|
||||||
resource.Post("/:id", handleUpdateResource)
|
resource.Post("/:id", handleUpdateResource)
|
||||||
resource.Put("/:resourceId/character/:characterId/image", handleUpdateCharacterImage)
|
resource.Put("/:resourceId/character/:characterId/image", handleUpdateCharacterImage)
|
||||||
|
resource.Put("/:resourceId/image/:oldImageId", handleUpdateResourceImage)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,10 @@ package dao
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"nysoure/server/model"
|
"nysoure/server/model"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
@@ -137,7 +139,7 @@ func UpdateResource(r model.Resource) error {
|
|||||||
for _, c := range oldCharacters {
|
for _, c := range oldCharacters {
|
||||||
shouldDelete := true
|
shouldDelete := true
|
||||||
for _, nc := range characters {
|
for _, nc := range characters {
|
||||||
if c.ID == nc.ID {
|
if c.Equal(&nc) {
|
||||||
shouldDelete = false
|
shouldDelete = false
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@@ -544,3 +546,150 @@ func UpdateCharacterImage(characterID, imageID uint) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetLowResolutionCharacters 获取低清晰度的角色图片
|
||||||
|
// maxWidth和maxHeight定义了低清晰度的阈值
|
||||||
|
func GetLowResolutionCharacters(maxWidth, maxHeight int, limit int, offset int) ([]model.LowResCharacterView, error) {
|
||||||
|
var results []model.LowResCharacterView
|
||||||
|
|
||||||
|
query := `
|
||||||
|
SELECT
|
||||||
|
c.id as character_id,
|
||||||
|
c.resource_id as resource_id,
|
||||||
|
c.name as name,
|
||||||
|
i.id as image_id,
|
||||||
|
i.width as image_width,
|
||||||
|
i.height as image_height
|
||||||
|
FROM characters c
|
||||||
|
INNER JOIN images i ON c.image_id = i.id
|
||||||
|
WHERE (i.width <= ? OR i.height <= ?)
|
||||||
|
AND c.image_id IS NOT NULL
|
||||||
|
ORDER BY c.id
|
||||||
|
LIMIT ? OFFSET ?
|
||||||
|
`
|
||||||
|
|
||||||
|
err := db.Raw(query, maxWidth, maxHeight, limit, offset).Scan(&results).Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return results, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLowResolutionCharactersCount 获取低清晰度角色的总数
|
||||||
|
func GetLowResolutionCharactersCount(maxWidth, maxHeight int) (int64, error) {
|
||||||
|
var count int64
|
||||||
|
|
||||||
|
query := `
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM characters c
|
||||||
|
INNER JOIN images i ON c.image_id = i.id
|
||||||
|
WHERE (i.width <= ? OR i.height <= ?)
|
||||||
|
AND c.image_id IS NOT NULL
|
||||||
|
`
|
||||||
|
|
||||||
|
err := db.Raw(query, maxWidth, maxHeight).Scan(&count).Error
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return count, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLowResolutionResourceImages 获取低清晰度的资源图片
|
||||||
|
// maxWidth和maxHeight定义了低清晰度的阈值
|
||||||
|
func GetLowResolutionResourceImages(maxWidth, maxHeight int, limit int, offset int) ([]model.LowResResourceImageView, error) {
|
||||||
|
var results []model.LowResResourceImageView
|
||||||
|
|
||||||
|
query := `
|
||||||
|
SELECT DISTINCT
|
||||||
|
r.id as resource_id,
|
||||||
|
r.title as title,
|
||||||
|
i.id as image_id,
|
||||||
|
i.width as image_width,
|
||||||
|
i.height as image_height
|
||||||
|
FROM resources r
|
||||||
|
INNER JOIN resource_images ri ON r.id = ri.resource_id
|
||||||
|
INNER JOIN images i ON ri.image_id = i.id
|
||||||
|
WHERE (i.width <= ? OR i.height <= ?)
|
||||||
|
ORDER BY r.id, i.id
|
||||||
|
LIMIT ? OFFSET ?
|
||||||
|
`
|
||||||
|
|
||||||
|
err := db.Raw(query, maxWidth, maxHeight, limit, offset).Scan(&results).Error
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return results, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLowResolutionResourceImagesCount 获取低清晰度资源图片的总数
|
||||||
|
func GetLowResolutionResourceImagesCount(maxWidth, maxHeight int) (int64, error) {
|
||||||
|
var count int64
|
||||||
|
|
||||||
|
query := `
|
||||||
|
SELECT COUNT(DISTINCT ri.resource_id, ri.image_id)
|
||||||
|
FROM resources r
|
||||||
|
INNER JOIN resource_images ri ON r.id = ri.resource_id
|
||||||
|
INNER JOIN images i ON ri.image_id = i.id
|
||||||
|
WHERE (i.width <= ? OR i.height <= ?)
|
||||||
|
`
|
||||||
|
|
||||||
|
err := db.Raw(query, maxWidth, maxHeight).Scan(&count).Error
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return count, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateResourceImage 更新资源中特定的图片ID
|
||||||
|
func UpdateResourceImage(resourceID, oldImageID, newImageID uint) error {
|
||||||
|
return db.Transaction(func(tx *gorm.DB) error {
|
||||||
|
// 首先检查关联是否存在
|
||||||
|
var exists bool
|
||||||
|
err := tx.Raw("SELECT EXISTS(SELECT 1 FROM resource_images WHERE resource_id = ? AND image_id = ?)",
|
||||||
|
resourceID, oldImageID).Scan(&exists).Error
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !exists {
|
||||||
|
return fmt.Errorf("resource %d does not have image %d", resourceID, oldImageID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新resource_images表中的image_id
|
||||||
|
result := tx.Exec("UPDATE resource_images SET image_id = ? WHERE resource_id = ? AND image_id = ?",
|
||||||
|
newImageID, resourceID, oldImageID)
|
||||||
|
if result.Error != nil {
|
||||||
|
return result.Error
|
||||||
|
}
|
||||||
|
|
||||||
|
if result.RowsAffected == 0 {
|
||||||
|
return fmt.Errorf("no resource image association updated")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新资源描述中的图片引用
|
||||||
|
var resource model.Resource
|
||||||
|
if err := tx.Select("article").Where("id = ?", resourceID).First(&resource).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 替换描述中的图片引用
|
||||||
|
oldImageRef := fmt.Sprintf("/api/image/%d)", oldImageID)
|
||||||
|
newImageRef := fmt.Sprintf("/api/image/%d)", newImageID)
|
||||||
|
|
||||||
|
// 使用字符串替换更新文章内容
|
||||||
|
updatedArticle := strings.ReplaceAll(resource.Article, oldImageRef, newImageRef)
|
||||||
|
|
||||||
|
// 如果文章内容有变化,更新数据库
|
||||||
|
if updatedArticle != resource.Article {
|
||||||
|
if err := tx.Model(&model.Resource{}).Where("id = ?", resourceID).Update("article", updatedArticle).Error; err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -20,6 +20,15 @@ type CharacterView struct {
|
|||||||
Image uint `json:"image"`
|
Image uint `json:"image"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type LowResCharacterView struct {
|
||||||
|
CharacterID uint `json:"character_id"`
|
||||||
|
ResourceID uint `json:"resource_id"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
ImageID uint `json:"image_id"`
|
||||||
|
ImageWidth int `json:"image_width"`
|
||||||
|
ImageHeight int `json:"image_height"`
|
||||||
|
}
|
||||||
|
|
||||||
func (c *Character) ToView() *CharacterView {
|
func (c *Character) ToView() *CharacterView {
|
||||||
var imageID uint
|
var imageID uint
|
||||||
if c.ImageID != nil {
|
if c.ImageID != nil {
|
||||||
|
|||||||
@@ -60,6 +60,14 @@ type ResourceDetailView struct {
|
|||||||
Characters []CharacterView `json:"characters"`
|
Characters []CharacterView `json:"characters"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type LowResResourceImageView struct {
|
||||||
|
ResourceID uint `json:"resource_id"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
ImageID uint `json:"image_id"`
|
||||||
|
ImageWidth int `json:"image_width"`
|
||||||
|
ImageHeight int `json:"image_height"`
|
||||||
|
}
|
||||||
|
|
||||||
func (r *Resource) ToView() ResourceView {
|
func (r *Resource) ToView() ResourceView {
|
||||||
tags := make([]TagView, len(r.Tags))
|
tags := make([]TagView, len(r.Tags))
|
||||||
for i, tag := range r.Tags {
|
for i, tag := range r.Tags {
|
||||||
|
|||||||
@@ -801,3 +801,86 @@ func UpdateCharacterImage(uid, resourceID, characterID, imageID uint) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetLowResolutionCharacters 获取低清晰度的角色图片
|
||||||
|
func GetLowResolutionCharacters(page int, pageSize int, maxWidth, maxHeight int) ([]model.LowResCharacterView, int, error) {
|
||||||
|
if page <= 0 {
|
||||||
|
page = 1
|
||||||
|
}
|
||||||
|
if pageSize <= 0 {
|
||||||
|
pageSize = 50 // 默认每页50个角色
|
||||||
|
}
|
||||||
|
if pageSize > 1000 {
|
||||||
|
pageSize = 1000 // 限制最大页面大小
|
||||||
|
}
|
||||||
|
|
||||||
|
offset := (page - 1) * pageSize
|
||||||
|
|
||||||
|
// 获取角色列表
|
||||||
|
characters, err := dao.GetLowResolutionCharacters(maxWidth, maxHeight, pageSize, offset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取总数
|
||||||
|
totalCount, err := dao.GetLowResolutionCharactersCount(maxWidth, maxHeight)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
totalPages := int((totalCount + int64(pageSize) - 1) / int64(pageSize))
|
||||||
|
|
||||||
|
return characters, totalPages, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetLowResolutionResourceImages 获取低清晰度的资源图片
|
||||||
|
func GetLowResolutionResourceImages(page int, pageSize int, maxWidth, maxHeight int) ([]model.LowResResourceImageView, int, error) {
|
||||||
|
if page <= 0 {
|
||||||
|
page = 1
|
||||||
|
}
|
||||||
|
if pageSize <= 0 {
|
||||||
|
pageSize = 50 // 默认每页50个图片
|
||||||
|
}
|
||||||
|
if pageSize > 1000 {
|
||||||
|
pageSize = 1000 // 限制最大页面大小
|
||||||
|
}
|
||||||
|
|
||||||
|
offset := (page - 1) * pageSize
|
||||||
|
|
||||||
|
// 获取资源图片列表
|
||||||
|
images, err := dao.GetLowResolutionResourceImages(maxWidth, maxHeight, pageSize, offset)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取总数
|
||||||
|
totalCount, err := dao.GetLowResolutionResourceImagesCount(maxWidth, maxHeight)
|
||||||
|
if err != nil {
|
||||||
|
return nil, 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
totalPages := int((totalCount + int64(pageSize) - 1) / int64(pageSize))
|
||||||
|
|
||||||
|
return images, totalPages, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateResourceImage 更新资源图片
|
||||||
|
func UpdateResourceImage(uid, resourceID, oldImageID, newImageID uint) error {
|
||||||
|
// 首先检查用户权限 - 确保用户是资源的所有者或管理员
|
||||||
|
resource, err := dao.GetResourceByID(resourceID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
isAdmin, err := CheckUserIsAdmin(uid)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if resource.UserID != uid && !isAdmin {
|
||||||
|
return model.NewUnAuthorizedError("You don't have permission to update this resource")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新资源图片
|
||||||
|
return dao.UpdateResourceImage(resourceID, oldImageID, newImageID)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user