Merge branch 'main' of https://gitee.com/wg123/video-gen
This commit is contained in:
@@ -1668,21 +1668,21 @@ async def get_stats(
|
||||
start_date: str = Query(None),
|
||||
end_date: str = Query(None),
|
||||
):
|
||||
today_start = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
|
||||
today_start = datetime.now(CST).replace(hour=0, minute=0, second=0, microsecond=0)
|
||||
|
||||
try:
|
||||
if start_date:
|
||||
date_start = datetime.strptime(start_date, "%Y-%m-%d")
|
||||
date_start = datetime.strptime(start_date, "%Y-%m-%d").replace(tzinfo=CST)
|
||||
else:
|
||||
date_start = today_start
|
||||
if end_date:
|
||||
date_end = datetime.strptime(end_date, "%Y-%m-%d")
|
||||
date_end = datetime.strptime(end_date, "%Y-%m-%d").replace(tzinfo=CST)
|
||||
date_end = date_end.replace(hour=23, minute=59, second=59, microsecond=999999)
|
||||
else:
|
||||
date_end = datetime.now()
|
||||
date_end = datetime.now(CST)
|
||||
except:
|
||||
date_start = today_start
|
||||
date_end = datetime.now()
|
||||
date_end = datetime.now(CST)
|
||||
|
||||
total_users = (await db.execute(
|
||||
select(func.count(User.id)).where(
|
||||
@@ -1983,7 +1983,7 @@ async def admin_update_generation_status(
|
||||
if body.get("image_url"):
|
||||
record.image_url = body["image_url"]
|
||||
if new_status == "completed":
|
||||
record.generated_at = datetime.now()
|
||||
record.generated_at = datetime.now(CST)
|
||||
await db.flush()
|
||||
await log_operation(
|
||||
db,
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone, timedelta
|
||||
|
||||
CST = timezone(timedelta(hours=8))
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, status
|
||||
from sqlalchemy import select
|
||||
@@ -15,6 +17,7 @@ from app.models.system_config import SystemConfig
|
||||
from app.models.user import User
|
||||
from app.schemas.auth import (
|
||||
ChangePasswordRequest,
|
||||
ChangeUsernameRequest,
|
||||
LoginRequest,
|
||||
RegisterRequest,
|
||||
SetPasswordRequest,
|
||||
@@ -116,8 +119,8 @@ async def _handle_daily_login_credits(db: AsyncSession, user: User) -> None:
|
||||
credits = int(credits_result.scalar_one_or_none() or "0")
|
||||
if credits <= 0:
|
||||
return
|
||||
|
||||
today = datetime.now().date()
|
||||
|
||||
today = datetime.now(CST).date()
|
||||
if user.last_login_at:
|
||||
last_login_date = user.last_login_at.date()
|
||||
if last_login_date >= today:
|
||||
@@ -159,7 +162,7 @@ async def login(req: LoginRequest, db: AsyncSession = Depends(get_db)):
|
||||
)
|
||||
|
||||
await _handle_daily_login_credits(db, user)
|
||||
user.last_login_at = datetime.now()
|
||||
user.last_login_at = datetime.now(CST)
|
||||
await db.flush()
|
||||
return _token_response(user, req.remember_me)
|
||||
|
||||
@@ -190,7 +193,7 @@ async def sms_login(req: SmsLoginRequest, db: AsyncSession = Depends(get_db)):
|
||||
)
|
||||
|
||||
await _handle_daily_login_credits(db, user)
|
||||
user.last_login_at = datetime.now()
|
||||
user.last_login_at = datetime.now(CST)
|
||||
await db.flush()
|
||||
return _token_response(user, req.remember_me)
|
||||
|
||||
@@ -222,7 +225,7 @@ async def register(req: RegisterRequest, db: AsyncSession = Depends(get_db)):
|
||||
username=req.phone,
|
||||
phone=req.phone,
|
||||
hashed_password=hash_password(req.password),
|
||||
password_set_at=datetime.now(),
|
||||
password_set_at=datetime.now(CST),
|
||||
credits=register_credits,
|
||||
is_admin=False,
|
||||
user_type="frontend",
|
||||
@@ -294,7 +297,7 @@ async def set_password(
|
||||
)
|
||||
|
||||
current_user.hashed_password = hash_password(req.new_password)
|
||||
current_user.password_set_at = datetime.now()
|
||||
current_user.password_set_at = datetime.now(CST)
|
||||
await db.flush()
|
||||
return {"message": "密码设置成功", "must_set_password": False}
|
||||
|
||||
@@ -318,11 +321,22 @@ async def change_password(
|
||||
)
|
||||
|
||||
current_user.hashed_password = hash_password(req.new_password)
|
||||
current_user.password_set_at = datetime.now()
|
||||
current_user.password_set_at = datetime.now(CST)
|
||||
await db.flush()
|
||||
return {"message": "密码修改成功"}
|
||||
|
||||
|
||||
@router.post("/change-username")
|
||||
async def change_username(
|
||||
req: ChangeUsernameRequest,
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
):
|
||||
current_user.username = req.new_username.strip()
|
||||
await db.flush()
|
||||
return {"message": "用户名修改成功"}
|
||||
|
||||
|
||||
@router.get("/site-info")
|
||||
async def get_site_info(db: AsyncSession = Depends(get_db)):
|
||||
"""Public endpoint returning site name, logo, agreement and copyright info."""
|
||||
@@ -370,7 +384,7 @@ async def admin_login(req: LoginRequest, db: AsyncSession = Depends(get_db)):
|
||||
detail="该账号不是管理员账号",
|
||||
)
|
||||
|
||||
user.last_login_at = datetime.now()
|
||||
user.last_login_at = datetime.now(CST)
|
||||
await db.flush()
|
||||
|
||||
token = create_access_token(user.id, req.remember_me)
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
import json
|
||||
import logging
|
||||
import os
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone, timedelta
|
||||
|
||||
CST = timezone(timedelta(hours=8))
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query, Request, UploadFile, File, status
|
||||
from fastapi.responses import RedirectResponse
|
||||
@@ -733,7 +735,7 @@ async def seedance_callback(request: Request, db: AsyncSession = Depends(get_db)
|
||||
record.video_url = remote_url
|
||||
else:
|
||||
record.video_url = remote_url
|
||||
record.generated_at = datetime.now()
|
||||
record.generated_at = datetime.now(CST)
|
||||
if record.video_url:
|
||||
await record_generation_record_generated_resource(
|
||||
db,
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone, timedelta
|
||||
|
||||
CST = timezone(timedelta(hours=8))
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Query
|
||||
from sqlalchemy import select
|
||||
@@ -405,7 +407,7 @@ async def export_team_credit_records(
|
||||
from urllib.parse import quote
|
||||
output.seek(0)
|
||||
safe_team_name = team.name or "team"
|
||||
filename = f"团队积分_{safe_team_name}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
|
||||
filename = f"团队积分_{safe_team_name}_{datetime.now(CST).strftime('%Y%m%d_%H%M%S')}.csv"
|
||||
encoded_filename = quote(filename)
|
||||
return StreamingResponse(
|
||||
iter([output.getvalue()]),
|
||||
|
||||
@@ -28,6 +28,10 @@ class ChangePasswordRequest(BaseModel):
|
||||
new_password: str = Field(..., min_length=6, description="新密码,至少6位")
|
||||
|
||||
|
||||
class ChangeUsernameRequest(BaseModel):
|
||||
new_username: str = Field(..., min_length=1, max_length=10, description="新用户名,1-10位")
|
||||
|
||||
|
||||
class TokenResponse(BaseModel):
|
||||
access_token: str
|
||||
token_type: str = "bearer"
|
||||
|
||||
Reference in New Issue
Block a user