迁移AI厂商后台事件

This commit is contained in:
2026-04-25 13:35:20 +08:00
parent 7900145ba9
commit cedc787586
3 changed files with 206 additions and 119 deletions
@@ -76,7 +76,7 @@
<h2 class="text-lg font-bold text-gray-800">🤖 AI 聊天机器人配置</h2>
<div class="flex items-center gap-2">
<span class="text-sm text-gray-500">大厅状态:</span>
<button id="chatbot-toggle-btn" onclick="toggleChatBot()"
<button id="chatbot-toggle-btn" data-ai-chatbot-toggle-url="{{ route('admin.ai-providers.toggle-chatbot') }}"
class="relative inline-flex h-6 w-11 items-center rounded-full transition-colors {{ $chatbotEnabled ? 'bg-emerald-500' : 'bg-gray-300' }}">
<span
class="inline-block h-4 w-4 transform rounded-full bg-white transition-transform {{ $chatbotEnabled ? 'translate-x-6' : 'translate-x-1' }}"></span>
@@ -182,7 +182,7 @@
{{ $provider->sort_order }}
</td>
<td class="px-6 py-4 text-center">
<button onclick="toggleProvider({{ $provider->id }}, this)"
<button data-ai-provider-toggle-url="{{ route('admin.ai-providers.toggle', $provider->id) }}"
class="px-3 py-1 rounded-full text-xs font-bold {{ $provider->is_enabled ? 'bg-emerald-100 text-emerald-700' : 'bg-gray-100 text-gray-500' }}">
{{ $provider->is_enabled ? '已启用' : '已禁用' }}
</button>
@@ -192,7 +192,7 @@
<span class="px-3 py-1 rounded-full text-xs font-bold bg-amber-100 text-amber-700">
默认</span>
@else
<button onclick="setDefault({{ $provider->id }})"
<button data-ai-provider-default-url="{{ route('admin.ai-providers.default', $provider->id) }}"
class="px-3 py-1 rounded-full text-xs text-gray-400 hover:text-amber-600 hover:bg-amber-50 transition">
设为默认
</button>
@@ -200,13 +200,13 @@
</td>
<td class="px-6 py-4 text-center">
<div class="flex items-center justify-center gap-2">
<button
onclick="testConnection({{ $provider->id }}, '{{ addslashes($provider->name) }}')"
<button data-ai-provider-test-url="{{ route('admin.ai-providers.test', $provider->id) }}"
data-ai-provider-name="{{ $provider->name }}"
class="text-teal-600 hover:text-teal-800 text-xs font-bold"> 测试</button>
<button x-on:click="openEdit({{ $provider->toJson() }})"
class="text-indigo-600 hover:text-indigo-800 text-xs font-bold">编辑</button>
<form action="{{ route('admin.ai-providers.destroy', $provider->id) }}" method="POST"
onsubmit="return confirm('确定要删除 {{ $provider->name }} 吗?')">
data-admin-confirm="确定要删除 {{ $provider->name }} 吗?">
@csrf
@method('DELETE')
<button type="submit"
@@ -328,117 +328,4 @@
</div>
</div>
</div>
<script>
/**
* 切换全局聊天机器人开关
*/
async function toggleChatBot() {
try {
const res = await fetch('{{ route('admin.ai-providers.toggle-chatbot') }}', {
method: 'POST',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}',
'Accept': 'application/json',
},
});
const data = await res.json();
if (data.status === 'success') {
// 更新按钮样式
const btn = document.getElementById('chatbot-toggle-btn');
const text = document.getElementById('chatbot-status-text');
if (data.enabled) {
btn.className = btn.className.replace('bg-gray-300', 'bg-emerald-500');
btn.firstElementChild.className = btn.firstElementChild.className.replace('translate-x-1',
'translate-x-6');
text.textContent = '已开启';
text.className = text.className.replace('text-gray-400', 'text-emerald-600');
} else {
btn.className = btn.className.replace('bg-emerald-500', 'bg-gray-300');
btn.firstElementChild.className = btn.firstElementChild.className.replace('translate-x-6',
'translate-x-1');
text.textContent = '已关闭';
text.className = text.className.replace('text-emerald-600', 'text-gray-400');
}
alert(data.message);
}
} catch (e) {
alert('操作失败:' + e.message);
}
}
/**
* 切换厂商启用/禁用状态
*/
async function toggleProvider(id, btn) {
try {
const res = await fetch('/admin/ai-providers/' + id + '/toggle', {
method: 'POST',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}',
'Accept': 'application/json',
},
});
const data = await res.json();
if (data.status === 'success') {
location.reload();
}
} catch (e) {
alert('操作失败:' + e.message);
}
}
/**
* 测试 AI 接口连通性
*/
async function testConnection(id, name) {
const btn = event.target;
const origText = btn.textContent;
btn.textContent = '测试中…';
btn.disabled = true;
try {
const res = await fetch('/admin/ai-providers/' + id + '/test', {
method: 'POST',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}',
'Accept': 'application/json',
},
});
const data = await res.json();
if (data.ok) {
alert(`✅ 「${name}」 连通成功!\n⤵ 响应耗时:${data.ms}ms(包含冷启动)\n🤖 模型回复:${data.message}`);
} else {
alert(`❌ 「${name}」 连通失败!\n耗时:${data.ms}ms\n错误:${data.message}`);
}
} catch (e) {
alert('请求异常:' + e.message);
} finally {
btn.textContent = origText;
btn.disabled = false;
}
}
/**
* 设为默认 AI 厂商
*/
async function setDefault(id) {
try {
const res = await fetch('/admin/ai-providers/' + id + '/default', {
method: 'POST',
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}',
'Accept': 'application/json',
},
});
const data = await res.json();
if (data.status === 'success') {
location.reload();
}
} catch (e) {
alert('操作失败:' + e.message);
}
}
</script>
@endsection