114 lines
10 KiB
PHP
114 lines
10 KiB
PHP
<x-layouts.admin>
|
||
<x-slot name="title">{{ $connection ? '修改数据库' : '添加数据库' }}</x-slot>
|
||
|
||
<x-slot name="content">
|
||
<div class="my-6">
|
||
@include('system_settings.partials.navigation')
|
||
|
||
@php($postgres = old('driver', $values['driver']) === 'pgsql')
|
||
<form id="cloud-database-form" method="POST" action="{{ $connection ? route('system-settings.databases.update', $connection->id) : route('system-settings.databases.store') }}" class="max-w-4xl rounded-xl border border-gray-200 bg-white p-6">
|
||
@csrf
|
||
@if ($connection) @method('PATCH') @endif
|
||
|
||
@if ($errors->any())
|
||
<div class="mb-5 rounded-lg bg-red-50 px-4 py-3 text-sm text-red-700" role="alert">
|
||
@foreach ($errors->all() as $error)<p>{{ $error }}</p>@endforeach
|
||
</div>
|
||
@endif
|
||
|
||
<div class="grid grid-cols-1 gap-5 sm:grid-cols-2">
|
||
<label class="block sm:col-span-2">
|
||
<span class="text-sm font-semibold text-gray-700">数据库类型 *</span>
|
||
<select name="driver" required class="mt-1 w-full rounded-lg border border-[#D8D2C7] px-3 py-2 text-sm focus:border-[#856632] focus:ring-[#856632]">
|
||
<option value="sqlsrv" @selected(! $postgres)>SQL Server</option>
|
||
<option value="pgsql" @selected($postgres)>PostgreSQL</option>
|
||
</select>
|
||
</label>
|
||
<p data-postgres-help class="text-sm text-gray-600 sm:col-span-2" style="{{ $postgres ? '' : 'display:none' }}" role="status">通过 SSL 加密连接(sslmode=require);仅执行只读测试,查询最长 15 秒。保存连接不会自动同步业务表。</p>
|
||
<label class="block sm:col-span-2">
|
||
<span class="text-sm font-semibold text-gray-700">配置名称 *</span>
|
||
<input name="name" value="{{ old('name', $values['name']) }}" required maxlength="191" placeholder="例如:JianSun 测试库" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm placeholder-gray-500 focus:border-[#856632] focus:ring-[#856632]">
|
||
</label>
|
||
<label class="block sm:col-span-2">
|
||
<span class="text-sm font-semibold text-gray-700">主机地址 *</span>
|
||
<input name="host" value="{{ old('host', $values['host']) }}" required maxlength="191" autocomplete="off" placeholder="只填写域名或 IP,不含端口" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm placeholder-gray-500 focus:border-[#856632] focus:ring-[#856632]">
|
||
</label>
|
||
<label class="block">
|
||
<span class="text-sm font-semibold text-gray-700">端口 *</span>
|
||
<input type="number" name="port" value="{{ old('port', $values['port']) }}" required min="1" max="65535" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-[#856632] focus:ring-[#856632]">
|
||
</label>
|
||
<label class="block">
|
||
<span class="text-sm font-semibold text-gray-700">数据库名称 *</span>
|
||
<input name="database_name" value="{{ old('database_name', $values['database_name']) }}" required maxlength="191" autocomplete="off" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-[#856632] focus:ring-[#856632]">
|
||
</label>
|
||
<label class="block">
|
||
<span class="text-sm font-semibold text-gray-700">只读账号 *</span>
|
||
<input name="username" value="{{ old('username', $values['username']) }}" required maxlength="191" autocomplete="off" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-[#856632] focus:ring-[#856632]">
|
||
</label>
|
||
<label class="block">
|
||
<span class="text-sm font-semibold text-gray-700">密码 {{ $connection ? '' : '*' }}</span>
|
||
<input type="password" name="password" @required(! $connection) maxlength="1000" autocomplete="new-password" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-[#856632] focus:ring-[#856632]">
|
||
<span class="mt-1 block text-xs text-gray-500">{{ $connection ? '留空表示保留原密码。' : '保存后不会回显。' }}</span>
|
||
</label>
|
||
<label data-sqlserver-only class="block sm:col-span-2" style="{{ $postgres ? 'display:none' : '' }}">
|
||
<span class="text-sm font-semibold text-gray-700">绑定业务来源(开发配置)</span>
|
||
<select name="source_key" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-[#856632] focus:ring-[#856632]">
|
||
<option value="">不绑定,仅保存和测试</option>
|
||
@foreach ($sourceLabels as $key => $label)
|
||
<option value="{{ $key }}" @selected(old('source_key', $values['source_key']) === $key)>{{ $label }}</option>
|
||
@endforeach
|
||
</select>
|
||
<span class="mt-1 block text-xs text-gray-500">用于关联现有业务查询;连接测试不需要选择。不要将新数据库绑定到其他业务库的来源。</span>
|
||
</label>
|
||
</div>
|
||
|
||
<details class="mt-6 rounded-lg border border-gray-200 px-4 py-3">
|
||
<summary class="cursor-pointer text-sm font-semibold text-gray-700">高级设置</summary>
|
||
<div class="mt-4 grid grid-cols-1 gap-5 sm:grid-cols-2">
|
||
<label data-sqlserver-only class="block" style="{{ $postgres ? 'display:none' : '' }}"><span class="text-sm font-semibold text-gray-700">ODBC 驱动</span><input name="odbc_driver" value="{{ old('odbc_driver', $values['odbc_driver'] ?: 'FreeTDS') }}" required @disabled($postgres) maxlength="128" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-[#856632] focus:ring-[#856632]"></label>
|
||
<label data-sqlserver-only class="block" style="{{ $postgres ? 'display:none' : '' }}"><span class="text-sm font-semibold text-gray-700">TDS 版本</span><input name="tds_version" value="{{ old('tds_version', $values['tds_version'] ?: '7.4') }}" required @disabled($postgres) maxlength="16" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-[#856632] focus:ring-[#856632]"></label>
|
||
<label class="block"><span class="text-sm font-semibold text-gray-700">连接超时(秒)</span><input type="number" name="connect_timeout" value="{{ old('connect_timeout', $values['connect_timeout']) }}" required min="1" max="30" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-[#856632] focus:ring-[#856632]"></label>
|
||
<label class="block"><span class="text-sm font-semibold text-gray-700">查询超时(秒)</span><input type="number" name="query_timeout" value="{{ old('query_timeout', $values['query_timeout']) }}" required min="1" max="120" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-[#856632] focus:ring-[#856632]"></label>
|
||
<label class="block sm:col-span-2"><span class="text-sm font-semibold text-gray-700">允许的数据范围</span><textarea name="allowed_scopes" rows="2" maxlength="4000" placeholder="绑定业务来源时填写,每行或逗号分隔" class="mt-1 w-full rounded-lg border border-gray-300 px-3 py-2 text-sm placeholder-gray-500 focus:border-[#856632] focus:ring-[#856632]">{{ old('allowed_scopes', $values['allowed_scopes']) }}</textarea></label>
|
||
</div>
|
||
</details>
|
||
|
||
<div class="mt-6 flex items-center justify-between border-t border-gray-100 pt-5">
|
||
<div>
|
||
<input type="hidden" name="enabled" value="0">
|
||
<label class="inline-flex items-center gap-2 text-sm font-semibold text-gray-700"><input type="checkbox" name="enabled" value="1" @checked((bool) old('enabled', $values['enabled'])) class="rounded border-gray-300 text-[#856632] focus:ring-[#856632]">启用</label>
|
||
</div>
|
||
<div class="flex gap-3">
|
||
<a href="{{ route('system-settings.databases.index') }}" class="rounded-lg px-5 py-2 text-sm font-semibold text-gray-600 hover:bg-gray-100">取消</a>
|
||
<button type="submit" class="rounded-lg bg-[#856632] px-5 py-2 text-sm font-semibold text-white hover:bg-[#6A5129]">保存</button>
|
||
</div>
|
||
</div>
|
||
</form>
|
||
</div>
|
||
@push('body_end')
|
||
<script>
|
||
(() => {
|
||
const form = document.getElementById('cloud-database-form');
|
||
const driver = form.elements.driver;
|
||
let previous = driver.value;
|
||
const update = (changePort) => {
|
||
const postgres = driver.value === 'pgsql';
|
||
if (changePort && form.elements.port.value === (previous === 'pgsql' ? '5432' : '1433')) {
|
||
form.elements.port.value = postgres ? '5432' : '1433';
|
||
}
|
||
form.querySelectorAll('[data-sqlserver-only]').forEach((group) => {
|
||
group.style.display = postgres ? 'none' : '';
|
||
group.querySelectorAll('input, select').forEach((field) => field.disabled = postgres);
|
||
});
|
||
form.querySelector('[data-postgres-help]').style.display = postgres ? '' : 'none';
|
||
form.elements.query_timeout.max = postgres ? '15' : '120';
|
||
previous = driver.value;
|
||
};
|
||
driver.addEventListener('change', () => update(true));
|
||
update(false);
|
||
})();
|
||
</script>
|
||
@endpush
|
||
</x-slot>
|
||
</x-layouts.admin>
|