feat:修复BUG

This commit is contained in:
2026-01-09 17:28:20 +08:00
parent 67025a4865
commit 26e021ee44
4 changed files with 63 additions and 23 deletions

View File

@@ -1,18 +1,20 @@
from datetime import datetime, timedelta
import bcrypt
from jose import jwt, JWTError
from passlib.context import CryptContext
from ..core import get_settings
settings = get_settings()
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def hash_password(password: str) -> str:
return pwd_context.hash(password)
return bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt()).decode("utf-8")
def verify_password(plain: str, hashed: str) -> bool:
return pwd_context.verify(plain, hashed)
try:
return bcrypt.checkpw(plain.encode("utf-8"), hashed.encode("utf-8"))
except Exception:
return False
def create_token(data: dict) -> str:

View File

@@ -112,6 +112,7 @@ class LLMService:
"stream": True,
},
) as response:
response.raise_for_status()
async for line in response.aiter_lines():
if line.startswith("data: "):
data = line[6:]

View File

@@ -55,6 +55,7 @@ export default function ProvidersPage() {
latency_ms?: number
message?: string
} | null>(null)
const [testingId, setTestingId] = useState<number | null>(null)
const [form, setForm] = useState({
name: '',
@@ -234,6 +235,7 @@ export default function ProvidersPage() {
const testProvider = async (provider: Provider) => {
setTestResult(null)
setTestingId(provider.id)
setError('')
try {
@@ -249,6 +251,8 @@ export default function ProvidersPage() {
return
}
setTestResult({ ok: false, message: err?.message || '测试失败' })
} finally {
setTestingId(null)
}
}
@@ -278,6 +282,24 @@ export default function ProvidersPage() {
</div>
)}
{testResult && (
<div
className={
testResult.ok
? 'rounded-md border border-emerald-500/30 bg-emerald-500/10 px-3 py-2 text-sm text-emerald-700 dark:text-emerald-300'
: 'rounded-md border border-destructive/30 bg-destructive/10 px-3 py-2 text-sm text-destructive'
}
>
{testResult.ok ? (
<div>
{typeof testResult.latency_ms === 'number' ? `(延迟 ${testResult.latency_ms}ms` : ''}
</div>
) : (
<div>{testResult.message || '测试失败'}</div>
)}
</div>
)}
<div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
<div className="flex-1">
<Input
@@ -379,8 +401,8 @@ export default function ProvidersPage() {
<Pencil className="mr-2 h-4 w-4" />
</Button>
<Button size="sm" variant="outline" onClick={() => testProvider(p)}>
<Button size="sm" variant="outline" onClick={() => testProvider(p)} disabled={testingId === p.id}>
{testingId === p.id ? '测试中...' : '测试'}
</Button>
<Button size="sm" variant="destructive" onClick={() => handleDelete(p)}>
<Trash2 className="mr-2 h-4 w-4" />