feat: track designer downloads and notifications
This commit is contained in:
@@ -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()
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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}"
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user