ly0303521

给“动感视界”增加点赞功能,并且该点赞数也会触发增加视频生成的次数

@@ -260,11 +260,13 @@ async def toggle_like(item_id: str, user_id: str = Query(..., alias="userId")): @@ -260,11 +260,13 @@ async def toggle_like(item_id: str, user_id: str = Query(..., alias="userId")):
260 return updated_item 260 return updated_item
261 261
262 updated_item = video_store.toggle_like(item_id, user_id) 262 updated_item = video_store.toggle_like(item_id, user_id)
263 - if updated_item: return updated_item  
264 - raise HTTPException(status_code=404, detail="Item not found")  
265 -  
266 - updated_item = video_store.toggle_like(item_id, user_id)  
267 - if updated_item: return updated_item 263 + if updated_item:
  264 + is_liked_after = user_id in updated_item.get("likedBy", [])
  265 + if is_liked_after and not is_liked_before:
  266 + usage_store.update_bonus(user_id, 1)
  267 + elif not is_liked_after and is_liked_before:
  268 + usage_store.update_bonus(user_id, -1)
  269 + return updated_item
268 raise HTTPException(status_code=404, detail="Item not found") 270 raise HTTPException(status_code=404, detail="Item not found")
269 271
270 @app.get("/usage/{user_id}") 272 @app.get("/usage/{user_id}")
@@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
6 }, 6 },
7 "11110000": { 7 "11110000": {
8 "daily_used": 2, 8 "daily_used": 2,
9 - "bonus_count": 0, 9 + "bonus_count": 2,
10 "last_reset": "2026-01-20" 10 "last_reset": "2026-01-20"
11 } 11 }
12 } 12 }
@@ -16,7 +16,6 @@ const ImageCard: React.FC<ImageCardProps> = ({ image, onClick, onLike, currentUs @@ -16,7 +16,6 @@ const ImageCard: React.FC<ImageCardProps> = ({ image, onClick, onLike, currentUs
16 16
17 const handleLike = (e: React.MouseEvent) => { 17 const handleLike = (e: React.MouseEvent) => {
18 e.stopPropagation(); 18 e.stopPropagation();
19 - if (isVideo) return; // Liking is disabled for videos for now  
20 onLike(image); 19 onLike(image);
21 }; 20 };
22 21
@@ -123,7 +122,7 @@ const ImageCard: React.FC<ImageCardProps> = ({ image, onClick, onLike, currentUs @@ -123,7 +122,7 @@ const ImageCard: React.FC<ImageCardProps> = ({ image, onClick, onLike, currentUs
123 <button 122 <button
124 onClick={handleLike} 123 onClick={handleLike}
125 className={`flex items-center gap-1.5 px-3 py-1.5 rounded-full backdrop-blur-md transition-all duration-200 ${image.isLikedByCurrentUser ? 'bg-red-500/80 text-white' : 'bg-white/20 text-white hover:bg-white/30'}`} 124 className={`flex items-center gap-1.5 px-3 py-1.5 rounded-full backdrop-blur-md transition-all duration-200 ${image.isLikedByCurrentUser ? 'bg-red-500/80 text-white' : 'bg-white/20 text-white hover:bg-white/30'}`}
126 - title={currentUser ? "Like this image" : "Login to like"} 125 + title={currentUser ? "Like this" : "Login to like"}
127 > 126 >
128 <Heart size={14} fill={image.isLikedByCurrentUser ? "currentColor" : "none"} /> 127 <Heart size={14} fill={image.isLikedByCurrentUser ? "currentColor" : "none"} />
129 <span className="text-xs font-bold">{image.likes}</span> 128 <span className="text-xs font-bold">{image.likes}</span>
@@ -133,13 +132,19 @@ const ImageCard: React.FC<ImageCardProps> = ({ image, onClick, onLike, currentUs @@ -133,13 +132,19 @@ const ImageCard: React.FC<ImageCardProps> = ({ image, onClick, onLike, currentUs
133 <div className="flex justify-between items-end"> 132 <div className="flex justify-between items-end">
134 <div className="text-xs text-gray-300 font-mono flex flex-col gap-1"> 133 <div className="text-xs text-gray-300 font-mono flex flex-col gap-1">
135 <span className="opacity-75">ID: {image.authorId || 'UNKNOWN'}</span> 134 <span className="opacity-75">ID: {image.authorId || 'UNKNOWN'}</span>
  135 + {image.generationTime && (
  136 + <span className="bg-white/10 px-1.5 py-0.5 rounded w-fit flex items-center gap-1"><Hourglass size={10} />{image.generationTime.toFixed(1)}s</span>
  137 + )}
136 </div> 138 </div>
137 - {image.generationTime && (  
138 - <div className="flex items-center gap-1.5 px-3 py-1.5 rounded-full bg-white/10 backdrop-blur-md text-white">  
139 - <Hourglass size={12} />  
140 - <span className="text-xs font-bold">{image.generationTime.toFixed(1)}s</span>  
141 - </div>  
142 - )} 139 +
  140 + <button
  141 + onClick={handleLike}
  142 + className={`flex items-center gap-1.5 px-3 py-1.5 rounded-full backdrop-blur-md transition-all duration-200 ${image.isLikedByCurrentUser ? 'bg-red-500/80 text-white' : 'bg-white/20 text-white hover:bg-white/30'}`}
  143 + title={currentUser ? "Like this video" : "Login to like"}
  144 + >
  145 + <Heart size={14} fill={image.isLikedByCurrentUser ? "currentColor" : "none"} />
  146 + <span className="text-xs font-bold">{image.likes}</span>
  147 + </button>
143 </div> 148 </div>
144 )} 149 )}
145 </div> 150 </div>