1、修改联系我们后台接口程序和界面

2、修改提示词优化使用模型规则,改为按照后台设置排序倒序使用对应模型,如果失败使用下一个
This commit is contained in:
2026-07-20 10:28:17 +08:00
parent 46b59ff76c
commit 53e01f6f74
7 changed files with 104 additions and 135 deletions
+2
View File
@@ -9,6 +9,7 @@ from app.api.admin.private_portrait import router as private_portrait_router
from app.api.admin.recharge_package import router as recharge_package_router
from app.api.admin.menu_config import router as menu_config_router
from app.api.admin.upload import router as admin_upload_router
from app.api.admin.contact import router as admin_contact_router
router = APIRouter()
router.include_router(video_prompt_schema_config_router)
@@ -20,3 +21,4 @@ router.include_router(private_portrait_router)
router.include_router(recharge_package_router)
router.include_router(menu_config_router)
router.include_router(admin_upload_router)
router.include_router(admin_contact_router)
+75
View File
@@ -0,0 +1,75 @@
from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import func, select
from sqlalchemy.ext.asyncio import AsyncSession
from app.dependencies import get_admin_user, get_db
from app.models.contact_request import ContactRequest
from app.models.user import User
from app.schemas.contact import ContactRequestListOut, ContactRequestOut
router = APIRouter(prefix="/admin/contact-requests", tags=["admin-contact-requests"])
@router.get("", response_model=ContactRequestListOut)
async def list_contact_requests(
page: int = Query(1, ge=1),
page_size: int = Query(20, ge=1, le=200),
is_handled: bool | None = Query(None),
admin: User = Depends(get_admin_user),
db: AsyncSession = Depends(get_db),
):
query = select(ContactRequest)
count_query = select(func.count(ContactRequest.id))
if is_handled is not None:
query = query.where(ContactRequest.is_handled == is_handled)
count_query = count_query.where(ContactRequest.is_handled == is_handled)
query = query.order_by(ContactRequest.created_at.desc())
offset = (page - 1) * page_size
result = await db.execute(query.offset(offset).limit(page_size))
items = result.scalars().all()
total = (await db.execute(count_query)).scalar_one()
return {"items": items, "total": total}
@router.get("/{request_id}", response_model=ContactRequestOut)
async def get_contact_request(
request_id: str,
admin: User = Depends(get_admin_user),
db: AsyncSession = Depends(get_db),
):
result = await db.execute(select(ContactRequest).where(ContactRequest.id == request_id))
item = result.scalar_one_or_none()
if not item:
raise HTTPException(status_code=404, detail="记录不存在")
return item
@router.put("/{request_id}/handle")
async def mark_contact_handled(
request_id: str,
admin: User = Depends(get_admin_user),
db: AsyncSession = Depends(get_db),
):
result = await db.execute(select(ContactRequest).where(ContactRequest.id == request_id))
item = result.scalar_one_or_none()
if not item:
raise HTTPException(status_code=404, detail="记录不存在")
item.is_handled = True
await db.commit()
await db.refresh(item)
return {"message": "已标记为处理"}
@router.delete("/{request_id}")
async def delete_contact_request(
request_id: str,
admin: User = Depends(get_admin_user),
db: AsyncSession = Depends(get_db),
):
result = await db.execute(select(ContactRequest).where(ContactRequest.id == request_id))
item = result.scalar_one_or_none()
if not item:
raise HTTPException(status_code=404, detail="记录不存在")
await db.delete(item)
await db.commit()
return {"message": "删除成功"}
+3 -93
View File
@@ -1,14 +1,14 @@
from datetime import datetime, timezone, timedelta
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy import func, select
from sqlalchemy import select
from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession
from app.dependencies import get_db, get_current_user
from app.models.contact_request import ContactRequest
from app.models.user import User
from app.schemas.contact import ContactRequestCreate, ContactRequestListOut, ContactRequestOut
from app.schemas.contact import ContactRequestCreate
from app.utils.id_gen import generate_id
router = APIRouter(prefix="/contact", tags=["contact"])
@@ -62,94 +62,4 @@ async def create_contact_request(
detail="每个账号每天只能提交一次联系我们"
)
return {"message": "提交成功,我们会尽快与您联系"}
@router.get("/requests", summary="获取联系请求列表", response_model=ContactRequestListOut)
async def get_contact_requests(
page: int = 1,
page_size: int = 20,
is_handled: bool | None = None,
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user),
):
if not user.is_admin:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="无权限")
query = select(ContactRequest)
count_query = select(func.count(ContactRequest.id))
if is_handled is not None:
query = query.where(ContactRequest.is_handled == is_handled)
count_query = count_query.where(ContactRequest.is_handled == is_handled)
query = query.order_by(ContactRequest.created_at.desc())
offset = (page - 1) * page_size
result = await db.execute(query.offset(offset).limit(page_size))
items = result.scalars().all()
total = (await db.execute(count_query)).scalar_one()
return {"items": items, "total": total}
@router.get("/requests/{request_id}", summary="获取联系请求详情", response_model=ContactRequestOut)
async def get_contact_request(
request_id: str,
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user),
):
if not user.is_admin:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="无权限")
result = await db.execute(select(ContactRequest).where(ContactRequest.id == request_id))
contact_request = result.scalar_one_or_none()
if not contact_request:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="记录不存在")
return contact_request
@router.put("/requests/{request_id}/handle", summary="标记为已处理")
async def mark_as_handled(
request_id: str,
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user),
):
if not user.is_admin:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="无权限")
result = await db.execute(select(ContactRequest).where(ContactRequest.id == request_id))
contact_request = result.scalar_one_or_none()
if not contact_request:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="记录不存在")
contact_request.is_handled = True
await db.commit()
await db.refresh(contact_request)
return {"message": "已标记为处理"}
@router.delete("/requests/{request_id}", summary="删除联系请求")
async def delete_contact_request(
request_id: str,
db: AsyncSession = Depends(get_db),
user: User = Depends(get_current_user),
):
if not user.is_admin:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="无权限")
result = await db.execute(select(ContactRequest).where(ContactRequest.id == request_id))
contact_request = result.scalar_one_or_none()
if not contact_request:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="记录不存在")
await db.delete(contact_request)
await db.commit()
return {"message": "删除成功"}
return {"message": "提交成功,我们会尽快与您联系"}
+19 -37
View File
@@ -2,7 +2,6 @@ import base64
import json
import mimetypes
import os
import random
from datetime import datetime
import httpx
@@ -109,44 +108,27 @@ async def optimize_prompt(
configs = list(result.scalars().all())
if configs:
total_weight = sum(c.weight for c in configs)
r = random.uniform(0, total_weight)
cumulative = 0
selected = configs[0]
for c in configs:
cumulative += c.weight
if r <= cumulative:
selected = c
break
# 按 priority 从大到小依次尝试,跳过 mock,失败则用下一个
for selected in configs:
if selected.provider == "mock":
continue
if selected.provider in ("openai_compatible", "sdk"):
try:
return await _call_openai_compatible(
selected, original_prompt, db, user_id, industry_key, duration,
references=references,
gen_type=gen_type,
image_size=image_size,
image_proportion=image_proportion,
image_px=image_px,
)
except Exception:
continue
if selected.provider == "mock":
# 所有真实模型都失败,降级到 mock
mock_cfg = next((c for c in configs if c.provider == "mock"), None)
if mock_cfg:
return _mock_optimize(original_prompt, gen_type)
elif selected.provider in ("openai_compatible", "sdk"):
try:
return await _call_openai_compatible(
selected, original_prompt, db, user_id, industry_key, duration,
references=references,
gen_type=gen_type,
image_size=image_size,
image_proportion=image_proportion,
image_px=image_px,
)
except Exception:
for c in configs:
if c.id == selected.id or c.provider == "mock":
continue
try:
return await _call_openai_compatible(
c, original_prompt, db, user_id, industry_key, duration,
references=references,
gen_type=gen_type,
image_size=image_size,
image_proportion=image_proportion,
image_px=image_px,
)
except Exception:
continue
raise
if settings.LLM_MOCK:
return _mock_optimize(original_prompt, gen_type)