feat: track designer downloads and notifications

This commit is contained in:
2026-03-08 23:42:18 +08:00
parent 5ff85debdc
commit 147fc58409
9 changed files with 119 additions and 37 deletions

View File

@@ -9,6 +9,7 @@ from app.models.work import Work
from app.models.order import Order, OrderStatus
from app.models.download import DownloadRecord
from app.schemas.order import OrderCreate, OrderResponse, PaymentResponse
from app.services.download_tracker import record_download
router = APIRouter(prefix="/orders", tags=["订单"])
@@ -148,17 +149,9 @@ def pay_order(
order.status = OrderStatus.PAID
order.paid_at = datetime.now()
# 创建下载记录
download_record = DownloadRecord(
user_id=current_user.id,
work_id=order.work_id,
order_id=order.id
)
db.add(download_record)
# 增加作品下载量
work = db.query(Work).filter(Work.id == order.work_id).first()
work.downloads += 1
if work:
record_download(db, order, work, current_user)
db.commit()

View File

@@ -17,6 +17,7 @@ from app.models.download import DownloadRecord
from app.ysm_sdk import create_payment, query_order, PaymentNotify
from app.api.orders import get_current_user
from app.models.user import User
from app.services.download_tracker import record_download
router = APIRouter(prefix="/payment", tags=["支付"])
@@ -138,19 +139,11 @@ async def payment_notify(
order.status = OrderStatus.PAID
order.payment_method = "ysm_wechat" # 易收米微信支付
order.paid_at = datetime.now()
# 创建下载记录
download_record = DownloadRecord(
user_id=order.user_id,
work_id=order.work_id,
order_id=order.id
)
db.add(download_record)
# 更新作品下载次数
work = db.query(Work).filter(Work.id == order.work_id).first()
if work:
work.downloads += 1
buyer = db.query(User).filter(User.id == order.user_id).first()
if work and buyer:
record_download(db, order, work, buyer)
db.commit()
@@ -203,19 +196,10 @@ async def query_order_status(
order.status = OrderStatus.PAID
order.payment_method = "ysm_wechat"
order.paid_at = datetime.now()
# 创建下载记录
download_record = DownloadRecord(
user_id=order.user_id,
work_id=order.work_id,
order_id=order.id
)
db.add(download_record)
# 更新作品下载次数
work = db.query(Work).filter(Work.id == order.work_id).first()
if work:
work.downloads += 1
record_download(db, order, work, current_user)
db.commit()

View File

@@ -119,6 +119,7 @@ async def upload_work(
description: Optional[str] = Form(None, description="作品描述"),
category: str = Form(..., description="作品分类"),
tags: Optional[str] = Form(None, description="标签,逗号分隔"),
designer_name: Optional[str] = Form(None, description="归属设计师"),
price: float = Form(..., ge=0, description="作品价格"),
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
@@ -189,6 +190,7 @@ async def upload_work(
tags_str = ",".join(tags_list) # 转成逗号分隔的字符串
else:
tags_str = None
resolved_designer = str(designer_name or "").strip() or current_user.nickname or current_user.phone
# 创建数据库记录 - 修复所有字段问题
work = Work(
@@ -197,7 +199,7 @@ async def upload_work(
category=category,
tags=tags_str, # 修复:使用字符串而不是列表
price=price,
designer=current_user.nickname or current_user.phone,
designer=resolved_designer,
original_image=f"/uploads/original/{timestamp}/{original_filename}",
thumbnail_image=f"/uploads/thumbnail/{timestamp}/{thumb_filename}",
watermarked_image=f"/uploads/watermarked/{timestamp}/{watermarked_filename}"

View File

@@ -1,4 +1,4 @@
from fastapi import APIRouter, Depends, HTTPException, status, Query, Header
from fastapi import APIRouter, Depends, HTTPException, status, Query, Header, BackgroundTasks
from fastapi.responses import FileResponse
from sqlalchemy.orm import Session
from sqlalchemy import desc
@@ -13,6 +13,7 @@ from app.models.user import User
from app.core.security import decode_access_token
from app.core.config import settings
from app.schemas.work import WorkResponse, WorkListResponse
from app.services.download_tracker import notify_download
router = APIRouter(prefix="/works", tags=["作品"])
@@ -126,6 +127,7 @@ def get_current_user(authorization: str = Header(None), db: Session = Depends(ge
@router.get("/{work_id}/download", summary="下载作品原图")
def download_work(
work_id: int,
background_tasks: BackgroundTasks,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
@@ -165,6 +167,8 @@ def download_work(
status_code=status.HTTP_404_NOT_FOUND,
detail="文件不存在"
)
background_tasks.add_task(notify_download, work, current_user, paid_order)
# 返回文件
filename = os.path.basename(full_path)