Round6: 前台图片缩略图+下载/视频修复; 后台连接测试单次+自动消失; 导航重组; 存储中文化; 自动化去掉创建按钮; 短信验证码(注册/重置/充值通知)
This commit is contained in:
1 parent
ba09017884
commit
d179cc2f02
14 files changed
+806
-149
No files matched your search
@@ -1,4 +1,4 @@
|
||||
import React, { useState, useEffect, useCallback } from 'react';
|
||||
import React, { useState, useEffect, useCallback, useRef } from 'react';
|
||||
import { adminAPI } from '@/api';
|
||||
import type { ModelProvider, AIModel, ProtocolDef, FetchableModel } from '@/types';
|
||||
|
||||
@@ -28,6 +28,7 @@ const capabilityLabels: Record<string, string> = {
|
||||
|
||||
// Test result type
|
||||
interface TestResult {
|
||||
modelId: string;
|
||||
success: boolean;
|
||||
message: string;
|
||||
latency_ms?: number;
|
||||
@@ -70,6 +71,12 @@ const Models: React.FC = () => {
|
||||
// Model test state
|
||||
const [testingModelId, setTestingModelId] = useState<string | null>(null);
|
||||
const [testResult, setTestResult] = useState<TestResult | null>(null);
|
||||
const testTimer = useRef<number | null>(null);
|
||||
|
||||
// 测试反馈自动消失(6 秒后)
|
||||
useEffect(() => {
|
||||
return () => { if (testTimer.current) clearTimeout(testTimer.current); };
|
||||
}, []);
|
||||
|
||||
// Model editor state
|
||||
const [showModelEditor, setShowModelEditor] = useState(false);
|
||||
@@ -118,17 +125,21 @@ const Models: React.FC = () => {
|
||||
|
||||
useEffect(() => { loadData(); }, [loadData]);
|
||||
|
||||
// Test model connection
|
||||
// Test model connection (single model only)
|
||||
const handleTestConnection = async (modelId: string) => {
|
||||
setTestingModelId(modelId);
|
||||
setTestResult(null);
|
||||
if (testTimer.current) { clearTimeout(testTimer.current); testTimer.current = null; }
|
||||
try {
|
||||
const result = await adminAPI.testModelConnection(modelId) as any;
|
||||
setTestResult(result.success !== undefined ? result : (result.data || result as TestResult));
|
||||
const r = result.success !== undefined ? result : (result.data || result);
|
||||
setTestResult({ modelId, success: !!r.success, message: r.message || '', latency_ms: r.latency_ms });
|
||||
} catch (err: any) {
|
||||
setTestResult({ success: false, message: err.message || '测试失败' });
|
||||
setTestResult({ modelId, success: false, message: err.message || '测试失败' });
|
||||
} finally {
|
||||
setTestingModelId(null);
|
||||
// 6 秒后自动收起反馈
|
||||
testTimer.current = window.setTimeout(() => setTestResult(null), 6000);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -458,8 +469,8 @@ const Models: React.FC = () => {
|
||||
style={{ ...btnStyle(testingModelId === model.id ? '#9CA3AF' : '#059669', 'small') }}>
|
||||
{testingModelId === model.id ? '测试中...' : '连接测试'}
|
||||
</button>
|
||||
{/* Test Result Popover */}
|
||||
{testResult && (
|
||||
{/* Test Result Popover (only for the tested model) */}
|
||||
{testResult && testResult.modelId === model.id && (
|
||||
<div style={{ position: 'relative' }}>
|
||||
<span style={{ fontSize: '11px', padding: '4px 8px', background: testResult.success ? '#DCFCE7' : '#FEE2E2', color: testResult.success ? '#16A34A' : '#DC2626', borderRadius: '4px', display: 'inline-block' }}>
|
||||
{testResult.success ? '✓ 成功' : '✗ 失败'}
|
||||
|
||||
Reference in new issue
Block a user