Учёт DEPO в мастере: поле базы, логин и пароль bj на экране, скрипт показывается на странице

База DEPO — видимое поле (необязательно: пусто — найдётся по учётным таблицам), порт заполнен
по умолчанию. «Отдать скрипт администратору»: логин и пароль bj видны и меняются, «Показать
скрипт» выводит его на странице с кнопкой «Скопировать». В начале скрипта — блок «Проверьте
перед запуском»: @db и @pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-06 13:35:01 +03:00
parent 46cbebaff7
commit be83b86747
6 changed files with 155 additions and 35 deletions
@@ -132,27 +132,36 @@
{{else}}
{{$sub := .Sub}}
{{if eq $sub "setup"}}
<p style="margin:2px 0 0">bj сверяет каждый перевод с учётом DEPO и сам создаёт в нём поручения. Нужен только адрес сервера — базу DEPO bj найдёт сам.</p>
<p>bj сверяет каждый перевод с учётом DEPO и сам создаёт в нём поручения. Укажите сервер DEPO; имя базы можно не писать — bj найдёт её по учётным таблицам.</p>
{{$mode := .Settings.Fancy.DepoJobMode}}
<form method="post" action="/admin/setup/wizard-depo/setup" id="wiz-depo" style="display:grid;gap:12px">
<div style="display:grid;grid-template-columns:2.2fr .8fr 1.1fr;gap:8px">
<label style="margin:0">Сервер DEPO<input type="text" name="server" value="{{.Settings.Fancy.Server}}" placeholder="адрес или имя\экземпляр" required autofocus style="width:100%;margin-top:4px"></label>
<label style="margin:0">Порт<input type="text" name="port" value="{{if .Settings.Fancy.Port}}{{.Settings.Fancy.Port}}{{end}}" placeholder="1433" style="width:100%;margin-top:4px"></label>
<label style="margin:0">Порт<input type="text" name="port" value="{{if .Settings.Fancy.Port}}{{.Settings.Fancy.Port}}{{else if eq .Settings.Fancy.DBType "postgres"}}5432{{else}}1433{{end}}" inputmode="numeric" style="width:100%;margin-top:4px"></label>
<label style="margin:0">СУБД<select name="db_type" onchange="wizDepo()" style="width:100%;margin-top:4px"><option value="mssql" {{if ne .Settings.Fancy.DBType "postgres"}}selected{{end}}>SQL Server</option><option value="postgres" {{if eq .Settings.Fancy.DBType "postgres"}}selected{{end}}>PostgreSQL</option></select></label>
</div>
{{if .DepoCands}}<label style="margin:0">На сервере несколько баз DEPO — выберите нужную<select name="depo_database" style="width:100%;margin-top:4px">{{range .DepoCands}}<option>{{.}}</option>{{end}}</select></label>{{end}}
<div id="wiz-depo-pgdb" style="display:none"><label style="margin:0">База DEPO <span class="muted" style="font-weight:400">(для PostgreSQL указывается вручную)</span><input type="text" name="depo_database" value="{{.Settings.Fancy.DepoDatabase}}" pattern="[A-Za-z][A-Za-z0-9_]*" style="width:100%;margin-top:4px"></label></div>
{{if .DepoCands}}<label style="margin:0">База DEPO <span class="muted" style="font-weight:400">— на сервере их несколько, выберите нужную</span><select name="depo_database" style="width:100%;max-width:420px;display:block;margin-top:4px">{{range .DepoCands}}<option>{{.}}</option>{{end}}</select></label>
{{else}}<label style="margin:0">База DEPO <span class="muted" style="font-weight:400" id="wiz-depo-dbhint">— необязательно</span><input type="text" name="depo_database" value="{{.Settings.Fancy.DepoDatabase}}" placeholder="bj найдёт сам" pattern="[A-Za-z][A-Za-z0-9_]*" title="латинские буквы, цифры и _, начинается с буквы" style="width:100%;max-width:420px;display:block;margin-top:4px"></label>{{end}}
<div style="border-top:1px solid var(--border);padding-top:10px"><div style="font-weight:600;margin-bottom:6px">Как подготовить базу</div>
<label class="wiz-opt"><input type="radio" name="mode" value="auto" checked onchange="wizDepo()"> <span><b>bj сделает всё сам</b> <span class="muted">— нужен логин администратора SQL на один раз, bj его не сохраняет</span></span></label>
<label class="wiz-opt"><input type="radio" name="mode" value="auto" {{if ne .DepoMode "script"}}checked{{end}} onchange="wizDepo()"> <span><b>bj сделает всё сам</b> <span class="muted">— нужен логин администратора SQL на один раз, bj его не сохраняет</span></span></label>
<div id="wiz-depo-auto" style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:0 0 8px 26px">
<input type="text" name="admin_user" autocomplete="off" placeholder="логин администратора, например sa" style="width:100%">
<input type="password" name="admin_password" autocomplete="new-password" placeholder="пароль" style="width:100%">
</div>
<label class="wiz-opt"><input type="radio" name="mode" value="script" onchange="wizDepo()"> <span><b>Отдать скрипт администратору</b> <span class="muted">— если логин администратора не дают: один файл сделает то же самое</span></span></label>
<label class="wiz-opt"><input type="radio" name="mode" value="script" {{if eq .DepoMode "script"}}checked{{end}} onchange="wizDepo()"> <span><b>Отдать скрипт администратору</b> <span class="muted">— если логин администратора не дают: один скрипт сделает то же самое</span></span></label>
<div id="wiz-depo-script" style="display:none;margin:0 0 8px 26px">
<button type="submit" class="btn" formaction="/admin/setup/wizard-depo/script.sql" style="background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Скачать скрипт</button>
<span class="muted" style="font-size:12.5px">Пароль для bj уже вписан в скрипт. Администратор выполняет файл в SSMS — потом нажмите «Проверить».</span>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:8px">
<label style="margin:0">Логин bj<input type="text" name="bj_user" value="{{.DepoUser}}" autocomplete="off" spellcheck="false" style="width:100%;margin-top:4px"></label>
<label style="margin:0">Пароль bj<input type="text" name="bj_password" value="{{.DepoPass}}" autocomplete="off" spellcheck="false" style="width:100%;margin-top:4px;font-family:var(--mono)"></label>
</div>
<p class="muted" style="font-size:12.5px;margin:6px 0 10px">Скрипт создаст этот логин на сервере DEPO — bj будет входить с ним. Пароль bj придумал сам, можно вписать свой. База DEPO и пароль стоят в начале скрипта — администратор может их поправить.</p>
<div style="display:flex;gap:8px;flex-wrap:wrap">
<button type="button" class="btn" id="wiz-depo-show">Показать скрипт</button>
<button type="submit" class="btn" formaction="/admin/setup/wizard-depo/script.sql" style="background:var(--card);color:var(--text);border:1px solid var(--border-strong,#c9cdd8)">Скачать файлом</button>
</div>
<div id="wiz-depo-sqlbox" hidden style="margin-top:10px"><pre class="copyable" id="wiz-depo-sql" style="max-height:380px;font-size:12px"></pre></div>
<p class="muted" style="font-size:12.5px;margin:8px 0 0">Администратор выполняет скрипт в SSMS под логином с правами sysadmin — потом нажмите «Проверить подключение».</p>
{{template "letterCard" (letter "dba")}}
</div>
<label class="wiz-opt"><input type="radio" name="mode" value="existing" onchange="wizDepo()"> <span><b>Логин для bj уже есть</b> <span class="muted">— база подготовлена раньше, только проверить</span></span></label>
@@ -165,21 +174,28 @@
<label class="wiz-opt"><input type="radio" name="depo_job" value="agent" {{if ne $mode "bj"}}checked{{end}}> <span><b>SQL Server Agent</b> <span class="muted">— рекомендуется: работает, даже когда bj выключен</span></span></label>
<label class="wiz-opt"><input type="radio" name="depo_job" value="bj" {{if eq $mode "bj"}}checked{{end}}> <span><b>Сервер bj</b> <span class="muted">— если Agent нет (например, SQL Server Express)</span></span></label>
</div>
{{if not .DepoCands}}<details style="font-size:13px"><summary style="cursor:pointer;color:var(--accent)">Указать базу DEPO вручную (обычно не нужно)</summary>
<input type="text" name="depo_database" id="wiz-depo-dbman" value="" placeholder="имя базы DEPO на сервере" pattern="[A-Za-z][A-Za-z0-9_]*" style="width:100%;margin-top:6px;max-width:320px"></details>{{end}}
<div><button type="submit" class="btn" id="wiz-depo-btn">Подготовить и проверить</button></div>
</form>
<script>function wizDepo(){var f=document.getElementById('wiz-depo'),pg=f.db_type.value==='postgres',m=f.mode.value;
document.getElementById('wiz-depo-pgdb').style.display=pg?'block':'none';
var man=document.getElementById('wiz-depo-dbman'); if(man) man.disabled=pg;
f.querySelector('#wiz-depo-pgdb input').disabled=!pg;
var db=f.querySelector('input[name=depo_database]'), hint=document.getElementById('wiz-depo-dbhint');
if(db){ db.required=pg; db.placeholder=pg?'имя базы DEPO':'bj найдёт сам'; if(hint) hint.textContent=pg?'— для PostgreSQL обязательно':'— необязательно'; }
if(pg&&f.port.value==='1433') f.port.value='5432'; else if(!pg&&f.port.value==='5432') f.port.value='1433';
document.getElementById('wiz-depo-job').style.display=pg?'none':'block';
if(!f.port.value) f.port.placeholder=pg?'5432':'1433';
document.getElementById('wiz-depo-auto').style.display=m==='auto'?'grid':'none';
document.getElementById('wiz-depo-script').style.display=m==='script'?'block':'none';
document.getElementById('wiz-depo-existing').style.display=m==='existing'?'grid':'none';
document.getElementById('wiz-depo-btn').textContent=m==='auto'?'Подготовить и проверить':'Проверить';}
wizDepo();</script>
document.getElementById('wiz-depo-btn').textContent=m==='auto'?'Подготовить и проверить':'Проверить подключение';}
wizDepo();
document.getElementById('wiz-depo-show').onclick=function(){ // скрипт — прямо на странице, с текущими полями
var f=document.getElementById('wiz-depo'), box=document.getElementById('wiz-depo-sqlbox'), pre=document.getElementById('wiz-depo-sql'), b=this;
if(!f.reportValidity()) return;
var fd=new FormData(f); fd.set('view','1'); b.disabled=true;
fetch('/admin/setup/wizard-depo/script.sql',{method:'POST',body:new URLSearchParams(fd),cache:'no-store'})
.then(function(r){return r.text().then(function(t){return {ok:r.ok,t:t}})})
.then(function(x){ pre.textContent=x.ok?x.t:('✗ '+x.t.trim()); box.hidden=false; b.textContent='Обновить скрипт'; })
.catch(function(){ pre.textContent='✗ Не получилось — обновите страницу и попробуйте ещё раз.'; box.hidden=false; })
.then(function(){ b.disabled=false; });
};</script>
{{else if eq $sub "done"}}
<table style="margin:6px 0 10px">