Кабинет: веб-установщик и управление пользователями в ядре
- установщик в самом кабинете: до настройки любая страница ведёт в /install; три шага — проверка сервера (каталог данных, https), связь с ядром (режим, адрес, ключ; связь проверяется до сохранения, в режиме ожидания страница ждёт подключения ядра), администратор кабинета (заводится в ядре через /api/lk/admin/bootstrap, только пока администраторов нет); настройки в data/lk.json 0600, окружение перекрывает файл; после установки установщик закрыт - настройки кабинета можно менять на ходу: Server за мьютексом, один mux на всё время - ключ модуля больше не кладётся в архив: его вводят в установщике; на странице настроек ключ показан целиком 10 минут после создания, потом маска - ядро: карточка «Пользователи кабинета» в настройках — список, заведение, смена пароля (гасит сессии), блокировка, права сотрудника, разрешение поручений, удаление; письма не отправляются - инструкция /admin/help/lk дополнена шагами установщика и разделом о подходящем хостинге - тесты: TestInstaller, TestNotConfigured, TestSetupPageLKUsersAndLink; установщик проверен вживую вторым экземпляром против боевого ядра Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -303,6 +303,88 @@ input[type=checkbox]{width:20px;min-height:20px;height:20px}
|
||||
{{else}}<p class="empty">Поручений пока нет.</p>{{end}}
|
||||
</main></body></html>{{end}}
|
||||
|
||||
{{define "install"}}{{template "head" .}}{{$d := .D}}
|
||||
<div class="login">
|
||||
<section class="side">
|
||||
<span class="brand">{{template "mark" .}}<span class="lbl" style="font-size:12px;letter-spacing:.14em;color:#f3f0e7">Установка кабинета</span></span>
|
||||
<div>
|
||||
<h1>Три шага — и кабинет работает</h1>
|
||||
<div style="display:flex;flex-direction:column;gap:12px;margin-top:22px;font-size:14.5px">
|
||||
<span style="display:flex;gap:12px"><span class="n" style="color:{{if ge $d.Step 1}}#e8a33d{{else}}#8e8879{{end}}">01</span><span>Проверка сервера{{if gt $d.Step 1}} — готово{{end}}</span></span>
|
||||
<span style="display:flex;gap:12px"><span class="n" style="color:{{if ge $d.Step 2}}#e8a33d{{else}}#8e8879{{end}}">02</span><span>Связь с ядром депозитария{{if gt $d.Step 2}} — готово{{end}}</span></span>
|
||||
<span style="display:flex;gap:12px"><span class="n" style="color:{{if ge $d.Step 3}}#e8a33d{{else}}#8e8879{{end}}">03</span><span>Администратор кабинета</span></span>
|
||||
</div>
|
||||
</div>
|
||||
<p class="mut" style="color:#8e8879;margin:0">Кабинет ничего не хранит у себя: пользователи, пароли и данные клиентов живут в ядре. Здесь сохраняется только способ связи с ним.</p>
|
||||
</section>
|
||||
<section class="form">
|
||||
<form method="post" action="/install" style="max-width:520px"><input type="hidden" name="csrf" value="{{$.CSRF}}">
|
||||
{{if $d.Error}}<div class="msg err">{{$d.Error}}</div>{{end}}
|
||||
{{if $d.Notice}}<div class="msg ok">{{$d.Notice}}</div>{{end}}
|
||||
|
||||
{{if lt $d.Step 3}}
|
||||
<h1 style="margin:0">Сервер и связь с ядром</h1>
|
||||
<div style="display:grid;gap:8px">
|
||||
{{range $d.Checks}}<div style="display:flex;gap:10px;align-items:flex-start;font-size:14px"><span style="color:{{if .OK}}{{if .Warn}}#e8a33d{{else}}#3f8f5a{{end}}{{else}}#c0392b{{end}};font-weight:700">{{if .OK}}✓{{else}}✗{{end}}</span><span><b>{{.Name}}.</b> {{.Note}}</span></div>{{end}}
|
||||
</div>
|
||||
|
||||
{{if $d.Waiting}}
|
||||
<meta http-equiv="refresh" content="5">
|
||||
<div class="msg ok">Настройки сохранены. Ждём, когда ядро подключится к кабинету по адресу <b>{{$d.Host}}</b>… Страница обновляется сама.</div>
|
||||
<p class="mut" style="margin:0">В настройках ядра (раздел «Личный кабинет») выберите «Ядро подключается к кабинету» и укажите этот адрес. Ключ должен совпадать.</p>
|
||||
<input type="hidden" name="step" value="wait">
|
||||
{{else}}
|
||||
<input type="hidden" name="step" value="connect">
|
||||
<div>
|
||||
<label>Заголовок кабинета</label>
|
||||
<input name="title" value="{{$d.Cfg.Title}}" placeholder="Депозитарий · личный кабинет">
|
||||
</div>
|
||||
<div>
|
||||
<label>Как связаться с ядром</label>
|
||||
<label style="display:flex;gap:8px;align-items:flex-start;text-transform:none;letter-spacing:0;font-family:inherit;font-size:14px;color:var(--ink);margin-top:6px"><input type="radio" name="mode" value="direct" {{if not $d.Cfg.Agent}}checked{{end}}> <span><b>Кабинет обращается к ядру</b> — у ядра есть адрес, доступный с этого сервера.</span></label>
|
||||
<label style="display:flex;gap:8px;align-items:flex-start;text-transform:none;letter-spacing:0;font-family:inherit;font-size:14px;color:var(--ink);margin-top:6px"><input type="radio" name="mode" value="agent" {{if $d.Cfg.Agent}}checked{{end}}> <span><b>Ядро подключается к кабинету</b> — у ядра нет адреса в интернете; оно само дозвонится сюда.</span></label>
|
||||
</div>
|
||||
<div>
|
||||
<label for="bj_url">Адрес ядра <span style="text-transform:none;letter-spacing:0">(только для первого способа)</span></label>
|
||||
<input id="bj_url" name="bj_url" value="{{$d.Cfg.BJURL}}" placeholder="https://bj.депозитарий.ru" autocomplete="off">
|
||||
</div>
|
||||
<div>
|
||||
<label for="bj_key">Ключ доступа модуля</label>
|
||||
<input id="bj_key" name="bj_key" type="password" value="{{$d.Cfg.BJKey}}" autocomplete="off" placeholder="lk-…">
|
||||
<p class="mut" style="margin:6px 0 0">Создаётся в настройках ядра: «Личный кабинет» → «Создать ключ».</p>
|
||||
</div>
|
||||
<button class="btn main" type="submit">Проверить связь и сохранить</button>
|
||||
{{end}}
|
||||
|
||||
{{else}}
|
||||
<h1 style="margin:0">Администратор кабинета</h1>
|
||||
<p class="mut" style="margin:0">Сотрудник депозитария, который входит в кабинет, видит список клиентов и может открыть кабинет клиента на просмотр. Учётная запись заводится в ядре. Если администратор уже есть — шаг можно пропустить.</p>
|
||||
<input type="hidden" name="step" value="admin">
|
||||
<div><label for="login">Логин</label><input id="login" name="login" autocomplete="off"></div>
|
||||
<div><label for="full_name">Имя сотрудника</label><input id="full_name" name="full_name" autocomplete="off"></div>
|
||||
<div><label for="email">Электронная почта <span style="text-transform:none;letter-spacing:0">(письма пока не отправляются)</span></label><input id="email" name="email" type="email" autocomplete="off"></div>
|
||||
<div><label for="password">Пароль <span style="text-transform:none;letter-spacing:0">(от 10 символов, буквы и цифра)</span></label><input id="password" name="password" type="password" autocomplete="new-password"></div>
|
||||
<div><label for="password2">Пароль ещё раз</label><input id="password2" name="password2" type="password" autocomplete="new-password"></div>
|
||||
<div style="display:flex;gap:10px;flex-wrap:wrap">
|
||||
<button class="btn main" type="submit">Создать и завершить</button>
|
||||
<button class="btn" type="submit" name="skip" value="1">Пропустить</button>
|
||||
</div>
|
||||
{{end}}
|
||||
</form>
|
||||
</section>
|
||||
</div>
|
||||
</body></html>{{end}}
|
||||
|
||||
{{define "install_done"}}{{template "head" .}}
|
||||
<div class="login"><section class="side"><span class="brand">{{template "mark" .}}<span class="lbl" style="font-size:12px;letter-spacing:.14em;color:#f3f0e7">Установка кабинета</span></span><div><h1>Кабинет установлен</h1></div><p class="mut" style="color:#8e8879;margin:0">Настройки — в файле <span class="n">{{.File}}</span>. Чтобы пройти установку заново, удалите его.</p></section>
|
||||
<section class="form"><form action="/login" method="get" style="max-width:420px"><h1 style="margin:0">Готово</h1><p class="mut" style="margin:0">Клиенты входят по логину и паролю, которые выдаёт депозитарий. Учётные записи заводятся в настройках ядра, раздел «Личный кабинет».</p><button class="btn main" type="submit">Перейти ко входу</button></form></section></div>
|
||||
</body></html>{{end}}
|
||||
|
||||
{{define "installed"}}{{template "head" .}}
|
||||
<div class="login"><section class="side"><span class="brand">{{template "mark" .}}<span class="lbl" style="font-size:12px;letter-spacing:.14em;color:#f3f0e7">Установка кабинета</span></span><div><h1>Кабинет уже настроен</h1></div></section>
|
||||
<section class="form"><form action="/login" method="get" style="max-width:420px"><p class="mut" style="margin:0">Установщик закрыт: настройки сохранены в <span class="n">{{.File}}</span>. Чтобы изменить их, отредактируйте файл или удалите его и откройте эту страницу снова.</p><button class="btn main" type="submit">Перейти ко входу</button></form></section></div>
|
||||
</body></html>{{end}}
|
||||
|
||||
{{define "profile"}}{{template "head" .}}{{template "nav" .}}
|
||||
<section class="board"><div class="board-row">
|
||||
<div><span class="lbl" style="color:var(--dim)">Профиль</span>
|
||||
|
||||
Reference in New Issue
Block a user