Spaces:
Running
Running
支持退款功能
Browse files- models.py +2 -0
- router_items.py +2 -0
- router_wallet.py +11 -1
models.py
CHANGED
|
@@ -66,6 +66,7 @@ class ItemCreate(BaseModel):
|
|
| 66 |
netdisk_password: Optional[str] = None # ☁️ 网盘提取码(加密存储,购买后解密)
|
| 67 |
is_netdisk: Optional[bool] = False # ☁️ 是否为网盘资源
|
| 68 |
is_original: Optional[bool] = False # 🎨 是否为原创作品
|
|
|
|
| 69 |
|
| 70 |
class ItemUpdate(BaseModel):
|
| 71 |
title: Optional[str] = None
|
|
@@ -79,6 +80,7 @@ class ItemUpdate(BaseModel):
|
|
| 79 |
netdisk_password: Optional[str] = None # ☁️ 网盘提取码
|
| 80 |
is_netdisk: Optional[bool] = None # ☁️ 是否为网盘资源
|
| 81 |
is_original: Optional[bool] = None # 🎨 是否为原创作品
|
|
|
|
| 82 |
|
| 83 |
class FollowToggle(BaseModel):
|
| 84 |
user_id: str
|
|
|
|
| 66 |
netdisk_password: Optional[str] = None # ☁️ 网盘提取码(加密存储,购买后解密)
|
| 67 |
is_netdisk: Optional[bool] = False # ☁️ 是否为网盘资源
|
| 68 |
is_original: Optional[bool] = False # 🎨 是否为原创作品
|
| 69 |
+
allow_refund: Optional[bool] = True # 💸 是否支持退款(默认支持)
|
| 70 |
|
| 71 |
class ItemUpdate(BaseModel):
|
| 72 |
title: Optional[str] = None
|
|
|
|
| 80 |
netdisk_password: Optional[str] = None # ☁️ 网盘提取码
|
| 81 |
is_netdisk: Optional[bool] = None # ☁️ 是否为网盘资源
|
| 82 |
is_original: Optional[bool] = None # 🎨 是否为原创作品
|
| 83 |
+
allow_refund: Optional[bool] = None # 💸 是否支持退款
|
| 84 |
|
| 85 |
class FollowToggle(BaseModel):
|
| 86 |
user_id: str
|
router_items.py
CHANGED
|
@@ -215,6 +215,7 @@ async def create_item(item: ItemCreate):
|
|
| 215 |
"netdisk_password": item.netdisk_password, # ☁️ 网盘密码
|
| 216 |
"is_netdisk": item.is_netdisk, # ☁️ 是否网盘资源
|
| 217 |
"is_original": item.is_original, # 🎨 是否为原创作品
|
|
|
|
| 218 |
"likes": 0, "favorites": 0, "comments": 0, "uses": 0, "use_history": {}, "created_at": int(time.time()), "liked_by": [], "favorited_by": [],
|
| 219 |
"views": 0,
|
| 220 |
"daily_views": 0,
|
|
@@ -285,6 +286,7 @@ async def update_item(item_id: str, update_data: ItemUpdate, current_user: str =
|
|
| 285 |
if update_data.netdisk_password is not None: item["netdisk_password"] = update_data.netdisk_password # ☁️
|
| 286 |
if update_data.is_netdisk is not None: item["is_netdisk"] = update_data.is_netdisk # ☁️
|
| 287 |
if update_data.is_original is not None: item["is_original"] = update_data.is_original # 🎨
|
|
|
|
| 288 |
|
| 289 |
result_holder["success"] = True
|
| 290 |
result_holder["price_change_info"] = price_change_info
|
|
|
|
| 215 |
"netdisk_password": item.netdisk_password, # ☁️ 网盘密码
|
| 216 |
"is_netdisk": item.is_netdisk, # ☁️ 是否网盘资源
|
| 217 |
"is_original": item.is_original, # 🎨 是否为原创作品
|
| 218 |
+
"allow_refund": item.allow_refund, # 💸 是否支持退款
|
| 219 |
"likes": 0, "favorites": 0, "comments": 0, "uses": 0, "use_history": {}, "created_at": int(time.time()), "liked_by": [], "favorited_by": [],
|
| 220 |
"views": 0,
|
| 221 |
"daily_views": 0,
|
|
|
|
| 286 |
if update_data.netdisk_password is not None: item["netdisk_password"] = update_data.netdisk_password # ☁️
|
| 287 |
if update_data.is_netdisk is not None: item["is_netdisk"] = update_data.is_netdisk # ☁️
|
| 288 |
if update_data.is_original is not None: item["is_original"] = update_data.is_original # 🎨
|
| 289 |
+
if update_data.allow_refund is not None: item["allow_refund"] = update_data.allow_refund # 💸
|
| 290 |
|
| 291 |
result_holder["success"] = True
|
| 292 |
result_holder["price_change_info"] = price_change_info
|
router_wallet.py
CHANGED
|
@@ -866,6 +866,11 @@ async def get_purchase_status(account: str, item_id: str, db: Session = Depends(
|
|
| 866 |
if not ownership:
|
| 867 |
return {"status": "success", "owned": False}
|
| 868 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 869 |
# 计算是否在退款窗口内
|
| 870 |
purchased_at = ownership.purchased_at
|
| 871 |
now = datetime.datetime.utcnow()
|
|
@@ -879,7 +884,8 @@ async def get_purchase_status(account: str, item_id: str, db: Session = Depends(
|
|
| 879 |
"purchased_at": purchased_at.isoformat(),
|
| 880 |
"price_paid": ownership.price_paid,
|
| 881 |
"can_refund": can_refund,
|
| 882 |
-
"refund_hours_left": round(hours_left, 1)
|
|
|
|
| 883 |
}
|
| 884 |
|
| 885 |
@router.post("/api/wallet/refund")
|
|
@@ -897,6 +903,10 @@ async def refund_purchase(request: Request, account: str, item_id: str, db: Sess
|
|
| 897 |
if not item:
|
| 898 |
raise HTTPException(status_code=404, detail="商品不存在")
|
| 899 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 900 |
# 查找购买记录
|
| 901 |
ownership = db.query(Ownership).filter(
|
| 902 |
Ownership.account == account,
|
|
|
|
| 866 |
if not ownership:
|
| 867 |
return {"status": "success", "owned": False}
|
| 868 |
|
| 869 |
+
# 读取商品,获取 allow_refund(旧数据默认 True)
|
| 870 |
+
items_db = json_db.load_data("items.json", default_data=[])
|
| 871 |
+
item = next((i for i in items_db if i.get("id") == item_id), None)
|
| 872 |
+
allow_refund = item.get("allow_refund", True) if item else True
|
| 873 |
+
|
| 874 |
# 计算是否在退款窗口内
|
| 875 |
purchased_at = ownership.purchased_at
|
| 876 |
now = datetime.datetime.utcnow()
|
|
|
|
| 884 |
"purchased_at": purchased_at.isoformat(),
|
| 885 |
"price_paid": ownership.price_paid,
|
| 886 |
"can_refund": can_refund,
|
| 887 |
+
"refund_hours_left": round(hours_left, 1),
|
| 888 |
+
"allow_refund": allow_refund
|
| 889 |
}
|
| 890 |
|
| 891 |
@router.post("/api/wallet/refund")
|
|
|
|
| 903 |
if not item:
|
| 904 |
raise HTTPException(status_code=404, detail="商品不存在")
|
| 905 |
|
| 906 |
+
# 检查资源是否支持退款
|
| 907 |
+
if not item.get("allow_refund", True): # 默认支持退款(向后兼容)
|
| 908 |
+
raise HTTPException(status_code=400, detail="该资源不支持退款")
|
| 909 |
+
|
| 910 |
# 查找购买记录
|
| 911 |
ownership = db.query(Ownership).filter(
|
| 912 |
Ownership.account == account,
|