diff --git a/backend/services/galleryService/repository/gallery_repository.go b/backend/services/galleryService/repository/gallery_repository.go
index efe8f07..67300c2 100644
--- a/backend/services/galleryService/repository/gallery_repository.go
+++ b/backend/services/galleryService/repository/gallery_repository.go
@@ -32,6 +32,11 @@ type GalleryRepository interface {
// 资产注册表相关
UpdateAssetRegistryDisplayStatus(assetID int64, displayStatus int32) error
+ // 事务性操作:创建展品并更新展示状态(原子操作)
+ PlaceExhibitionTx(exhibition *models.Exhibition, displayStatus int32) error
+ // 事务性操作:删除展品并更新展示状态(原子操作)
+ RemoveExhibitionTx(exhibitionID int64, assetID int64) error
+
// ========== 我的作品相关 ==========
// GetMyExhibitedAssets 获取我展出的作品列表(只返回展出中且未过期的,含收益)
@@ -282,6 +287,59 @@ func (r *galleryRepository) UpdateAssetRegistryDisplayStatus(assetID int64, disp
Update("display_status", displayStatus).Error
}
+// PlaceExhibitionTx 事务性创建展品并更新展示状态(原子操作)
+func (r *galleryRepository) PlaceExhibitionTx(exhibition *models.Exhibition, displayStatus int32) error {
+ now := time.Now().UnixMilli()
+ exhibition.CreatedAt = now
+ exhibition.UpdatedAt = now
+ exhibition.DeletedAt = nil
+
+ return r.db.Transaction(func(tx *gorm.DB) error {
+ // 1. 物理删除已软删除的旧记录
+ if err := tx.Exec(`
+ DELETE FROM exhibitions
+ WHERE asset_id = ? AND deleted_at IS NOT NULL
+ `, exhibition.AssetID).Error; err != nil {
+ return err
+ }
+ // 2. 插入新记录
+ if err := tx.Create(exhibition).Error; err != nil {
+ return err
+ }
+ // 3. 更新展示状态(与展出操作在同一事务中)
+ if err := tx.Model(&models.AssetRegistry{}).
+ Where("asset_id = ?", exhibition.AssetID).
+ Update("display_status", displayStatus).Error; err != nil {
+ return err
+ }
+ return nil
+ })
+}
+
+// RemoveExhibitionTx 事务性删除展品并更新展示状态(原子操作)
+func (r *galleryRepository) RemoveExhibitionTx(exhibitionID int64, assetID int64) error {
+ now := time.Now().UnixMilli()
+
+ return r.db.Transaction(func(tx *gorm.DB) error {
+ // 1. 软删除展品记录
+ if err := tx.Model(&models.Exhibition{}).
+ Where("id = ?", exhibitionID).
+ Updates(map[string]interface{}{
+ "deleted_at": now,
+ "updated_at": now,
+ }).Error; err != nil {
+ return err
+ }
+ // 2. 更新展示状态为未展示(与删除操作在同一事务中)
+ if err := tx.Model(&models.AssetRegistry{}).
+ Where("asset_id = ?", assetID).
+ Update("display_status", int32(0)).Error; err != nil {
+ return err
+ }
+ return nil
+ })
+}
+
// ========== 我的作品相关实现 ==========
// GetMyExhibitedAssets 获取我展出的作品列表(只返回展出中且未过期的,含收益)
@@ -304,15 +362,16 @@ func (r *galleryRepository) GetMyExhibitedAssets(userID, starID int64, page, pag
err = r.db.Model(&models.Exhibition{}).
Raw(`
SELECT exhibitions.asset_id, a.name, a.cover_url, a.like_count,
- exhibitions.start_time as exhibited_at, exhibitions.expire_at,
+ exhibitions.start_time as exhibited_at, exhibitions.expire_at, bs.slot_index,
COALESCE(CAST(SUM(err.crystal_amount) / 10 AS bigint), 0) as earnings
FROM exhibitions
JOIN assets a ON a.id = exhibitions.asset_id
+ JOIN booth_slots bs ON bs.slot_id = exhibitions.slot_id
LEFT JOIN exhibition_revenue_records err ON err.asset_id = a.id AND err.status = 'claimable'
WHERE exhibitions.occupier_uid = ? AND exhibitions.occupier_star_id = ?
AND exhibitions.deleted_at IS NULL AND exhibitions.expire_at > ?
- GROUP BY exhibitions.asset_id, a.name, a.cover_url, a.like_count, exhibitions.start_time, exhibitions.expire_at
- ORDER BY exhibitions.start_time DESC
+ GROUP BY exhibitions.asset_id, a.name, a.cover_url, a.like_count, exhibitions.start_time, exhibitions.expire_at, bs.slot_index
+ ORDER BY bs.slot_index ASC
LIMIT ? OFFSET ?
`, userID, starID, now, pageSize, offset).Scan(&items).Error
@@ -343,15 +402,16 @@ func (r *galleryRepository) GetUserExhibitedAssets(userID, starID int64, page, p
err = r.db.Model(&models.Exhibition{}).
Raw(`
SELECT exhibitions.asset_id, a.name, a.cover_url, a.like_count,
- exhibitions.start_time as exhibited_at, exhibitions.expire_at,
+ exhibitions.start_time as exhibited_at, exhibitions.expire_at, bs.slot_index,
COALESCE(CAST(SUM(err.crystal_amount) / 10 AS bigint), 0) as earnings
FROM exhibitions
JOIN assets a ON a.id = exhibitions.asset_id
+ JOIN booth_slots bs ON bs.slot_id = exhibitions.slot_id
LEFT JOIN exhibition_revenue_records err ON err.asset_id = a.id AND err.status = 'claimable'
WHERE exhibitions.occupier_uid = ? AND exhibitions.occupier_star_id = ?
AND exhibitions.deleted_at IS NULL AND exhibitions.expire_at > ?
- GROUP BY exhibitions.asset_id, a.name, a.cover_url, a.like_count, exhibitions.start_time, exhibitions.expire_at
- ORDER BY exhibitions.start_time DESC
+ GROUP BY exhibitions.asset_id, a.name, a.cover_url, a.like_count, exhibitions.start_time, exhibitions.expire_at, bs.slot_index
+ ORDER BY bs.slot_index ASC
LIMIT ? OFFSET ?
`, userID, starID, now, pageSize, offset).Scan(&items).Error
diff --git a/backend/services/starbookService/service/starbook_service.go b/backend/services/starbookService/service/starbook_service.go
index d17ec5c..07d5849 100644
--- a/backend/services/starbookService/service/starbook_service.go
+++ b/backend/services/starbookService/service/starbook_service.go
@@ -276,6 +276,7 @@ func (s *starbookService) buildAssetItemsFromRegistries(registries []*models.Ass
var assetCoverMap map[int64]string // assetID -> coverURL
var assetNameMap map[int64]string // assetID -> name
var categoryMap map[int64]string // assetID -> category
+ var assetLikeCountMap map[int64]int32 // assetID -> likeCount
switch assetType {
case models.AssetTypeRegular:
@@ -283,9 +284,11 @@ func (s *starbookService) buildAssetItemsFromRegistries(registries []*models.Ass
if err == nil && len(assets) > 0 {
assetCoverMap = make(map[int64]string)
assetNameMap = make(map[int64]string)
+ assetLikeCountMap = make(map[int64]int32)
for _, asset := range assets {
assetCoverMap[asset.ID] = asset.CoverURL
assetNameMap[asset.ID] = asset.Name
+ assetLikeCountMap[asset.ID] = asset.LikeCount
}
}
case models.AssetTypeCollection:
@@ -345,6 +348,13 @@ func (s *starbookService) buildAssetItemsFromRegistries(registries []*models.Ass
item.Category = cat
}
+ // 从 assets 表获取点赞数(regular 类型)
+ if assetType == models.AssetTypeRegular {
+ if likeCount, ok := assetLikeCountMap[reg.AssetID]; ok {
+ item.LikeCount = likeCount
+ }
+ }
+
items = append(items, item)
}
diff --git a/frontend/pages/components/RankingListItem.vue b/frontend/pages/components/RankingListItem.vue
index 1f5e5a4..07101a0 100644
--- a/frontend/pages/components/RankingListItem.vue
+++ b/frontend/pages/components/RankingListItem.vue
@@ -55,11 +55,11 @@
>
- 拜访小屋
+ 点击拜访
@@ -71,8 +71,8 @@
class="menu-item"
@tap="handleMenuVisit"
>
-
-
+
+