146 lines
7.7 KiB
Markdown
146 lines
7.7 KiB
Markdown
# LicenseManager — пользовательская документация
|
||
|
||
## Назначение
|
||
LicenseManager — настольное приложение на Qt5 для ведения базы клиентов и выпуска файлов лицензий на основе аппаратного идентификатора.
|
||
|
||
## Возможности
|
||
- хранение клиентов в локальной базе SQLite;
|
||
- добавление, редактирование и удаление записей;
|
||
- импорт данных клиента из JSON-файла (drag-and-drop или выбор файла);
|
||
- выдача файла лицензии по выбранной записи;
|
||
- отображение статуса базы и информации о сборке.
|
||
|
||
## Требования
|
||
- ОС: Linux/Windows/macOS (Qt5);
|
||
- зависимости при сборке: Qt5 (Core, Gui, Widgets, Sql), OpenSSL;
|
||
- для SQLite: системный драйвер Qt `QSQLITE` (например, пакет `libqt5sql5-sqlite` в Debian/Ubuntu).
|
||
|
||
## Сборка из исходников
|
||
```bash
|
||
cmake -S . -B build
|
||
cmake --build build -j
|
||
./build/LicenseManager
|
||
```
|
||
|
||
## Установка как .deb (опционально)
|
||
```bash
|
||
./deb/build.sh /path/to/LicenseManager
|
||
sudo dpkg -i licensemanager_*.deb
|
||
```
|
||
|
||
## Первое использование и база данных
|
||
- Приложение хранит данные в `./db.sqlite` относительно текущей рабочей директории.
|
||
- При первом запуске, если структура базы отсутствует, приложение предложит создать базу.
|
||
- Если нужен фиксированный путь, запускайте приложение из нужной папки или измените `DB_PATH` в коде.
|
||
|
||
## Интерфейс
|
||
### Таблица клиентов
|
||
Столбцы:
|
||
- Фамилия, Имя, Отчество
|
||
- Email, Телефон
|
||
- Компания, Город
|
||
- Срок лицензии (если пусто — отображается `Permanent`)
|
||
- Комментарий
|
||
|
||
### Панель инструментов
|
||
- Add client — добавить запись;
|
||
- Edit client — редактировать выбранную запись;
|
||
- Delete client — удалить выбранные записи;
|
||
- Get info — информация о сборке.
|
||
|
||
### Контекстное меню таблицы
|
||
- Reload table — обновить список;
|
||
- Add/Edit/Delete client — действия с записями;
|
||
- Get license file — сформировать файл лицензии.
|
||
|
||
### Иконки действий
|
||
| Действие | Иконка | Файл |
|
||
| --- | --- | --- |
|
||
| App icon | <img src="deps/icon.png" width="28" height="28" alt="App"> | `deps/icon.png` |
|
||
| Reload table | <img src="deps/reload.png" width="28" height="28" alt="Reload"> | `deps/reload.png` |
|
||
| Add client | <img src="deps/add.png" width="28" height="28" alt="Add"> | `deps/add.png` |
|
||
| Edit client | <img src="deps/edit.png" width="28" height="28" alt="Edit"> | `deps/edit.png` |
|
||
| Delete client | <img src="deps/delete.png" width="28" height="28" alt="Delete"> | `deps/delete.png` |
|
||
| Get info | <img src="deps/info.png" width="28" height="28" alt="Info"> | `deps/info.png` |
|
||
| Get license file | <img src="deps/getLicenseFile.png" width="28" height="28" alt="License file"> | `deps/getLicenseFile.png` |
|
||
| Drop files (автозаполнение) | <img src="deps/dropFiles.png" width="28" height="28" alt="Drop files"> | `deps/dropFiles.png` |
|
||
|
||
### Строка статуса
|
||
Показывает состояние базы (готова/ошибка/в работе).
|
||
|
||
## Работа с клиентами
|
||
### Добавление
|
||
1. Нажмите `Add client`.
|
||
2. Вкладка `File autofilled`:
|
||
- перетащите JSON-файл на область или нажмите и выберите файл;
|
||
- данные будут подставлены автоматически.
|
||
3. Вкладка `Main info`:
|
||
- заполните поля вручную.
|
||
4. Вкладка `License time`:
|
||
- включите `License is temporally`, чтобы выбрать дату окончания.
|
||
5. Нажмите `Save`.
|
||
|
||
Важно: поле `Hardware hash` можно редактировать только при добавлении записи.
|
||
|
||
### Редактирование
|
||
1. Выберите одну запись.
|
||
2. Нажмите `Edit client`.
|
||
3. Измените данные и нажмите `Save`.
|
||
|
||
Если нужно изменить `Hardware hash`, удалите запись и создайте новую.
|
||
|
||
### Удаление
|
||
Выберите записи и нажмите `Delete client` (или через контекстное меню). Подтвердите удаление.
|
||
|
||
### Обновление списка
|
||
Используйте `Reload table` для перечитывания данных из базы.
|
||
|
||
## Генерация файла лицензии
|
||
1. Выберите одну запись в таблице.
|
||
2. Нажмите `Get license file`.
|
||
3. Укажите место сохранения (по умолчанию — `Documents/` или `Home/`).
|
||
4. Файл сохраняется с расширением `.dat` (если расширение не указано, оно добавляется автоматически).
|
||
|
||
Внутри файла содержится зашифрованный (RSA) CBOR/JSON с полями:
|
||
- `machineId` — аппаратный идентификатор (`hardwareHash`);
|
||
- `validUntil` — дата окончания лицензии в ISO-формате (опционально).
|
||
|
||
## Формат JSON для авто‑заполнения
|
||
Пример:
|
||
```json
|
||
{
|
||
"lastName": "Иванов",
|
||
"firstName": "Иван",
|
||
"patronymic": "Иванович",
|
||
"email": "ivan@example.com",
|
||
"phone": "+7(777)777-77-77",
|
||
"city": "Москва",
|
||
"yourCompany": "ООО Ромашка",
|
||
"hardwareHash": "abcdef0123456789"
|
||
}
|
||
```
|
||
Любое поле можно опустить — оно останется пустым. Для выдачи лицензии важно заполнить `hardwareHash`.
|
||
|
||
## Хранилище данных
|
||
SQLite-файл: `db.sqlite` в рабочей директории.
|
||
|
||
Таблица `clients`:
|
||
- `id` (INTEGER, PK, AUTOINCREMENT)
|
||
- `city`, `email`, `firstName`, `hardwareHash`, `lastName`, `patronymic`, `phone`, `yourCompany` (TEXT, NOT NULL)
|
||
- `licenseTime` (TEXT, nullable)
|
||
- `comment` (TEXT, nullable)
|
||
|
||
## Настройки
|
||
Размеры окон сохраняются через `QSettings` (организация `LicenseManager`).
|
||
Расположение конфигурации зависит от ОС (на Linux обычно `~/.config/LicenseManager/`).
|
||
|
||
## Технический обзор (для сопровождения)
|
||
- Стек: C++20, Qt5 Widgets/Sql, OpenSSL, SQLite.
|
||
- Основные модули:
|
||
- `MainWidget` — главное окно, таблица, меню, выдача лицензии.
|
||
- `LicenseModel` — модель таблицы и работа с SQLite (в асинхронных задачах).
|
||
- `EditClientDialog` — диалог добавления/редактирования, импорт JSON.
|
||
- `LicenseGenerator`/`Crypt` — утилиты шифрования и генерации файла (часть функций не привязана к UI).
|
||
- Ресурсы Qt (`deps.qrc`) включают иконки, `tables.ddl` для инициализации БД и приватный ключ `Key`.
|
||
- Для смены ключа шифрования замените `deps/Key` и пересоберите проект.
|