迁移AI厂商后台事件
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user