91 lines
6.0 KiB
Markdown
91 lines
6.0 KiB
Markdown
# SMS Task Two — редактор переменных среды
|
||
|
||
Десктопное приложение на **Avalonia** (.NET 8) для чтения и изменения пользовательских переменных среды. Ядро, ViewModels и модуль окружения вынесены в переносимые проекты для последующего порта на **WPF**.
|
||
|
||
## Solution
|
||
|
||
Файл решения: [`Sms.TaskTwo.slnx`](Sms.TaskTwo.slnx) (формат XML solution).
|
||
|
||
## Структура проектов
|
||
|
||
| Проект | Назначение |
|
||
|--------|------------|
|
||
| `Sms.Environment` | Интерфейс `IEnvironmentVariableStore` |
|
||
| `Sms.Environment.Windows` | User env через реестр `HKCU\Environment` |
|
||
| `Sms.Environment.Linux` | `~/.config/environment.d/99-sms-task-two.conf` |
|
||
| `Sms.TaskTwo.Core` | Конфигурация, сервис, логирование |
|
||
| `Sms.TaskTwo.ViewModels` | MVVM (`CommunityToolkit.Mvvm`) |
|
||
| `Sms.TaskTwo.Avalonia` | UI-хост |
|
||
|
||
## Сборка и запуск
|
||
|
||
```bash
|
||
dotnet restore Sms.TaskTwo.slnx
|
||
dotnet build Sms.TaskTwo.slnx
|
||
dotnet run --project src/Sms.TaskTwo.Avalonia/Sms.TaskTwo.Avalonia.csproj
|
||
```
|
||
|
||
## Конфигурация
|
||
|
||
[`src/Sms.TaskTwo.Avalonia/appsettings.json`](src/Sms.TaskTwo.Avalonia/appsettings.json):
|
||
|
||
- `EnvironmentVariables:Names` — массив имён переменных (обязательно по ТЗ).
|
||
- `EnvironmentVariables:CommentsVariableName` — служебная переменная с JSON-комментариями (`имя → текст`).
|
||
- `EnvironmentVariables:Defaults` — значения по умолчанию, если переменная ещё не существует в ОС.
|
||
- `Logging:LogDirectory` — каталог логов (по умолчанию `logs`).
|
||
|
||
## Комментарии
|
||
|
||
Комментарии к полям хранятся в одной переменной среды (например `SMS_TASK_TWO_COMMENTS`) в формате JSON:
|
||
|
||
```json
|
||
{"SMS_MEAL_SERVER_URL":"URL сервера","SMS_MEAL_API_KEY":"ключ API"}
|
||
```
|
||
|
||
Переменная записывается тем же механизмом, что и остальные, и доступна другим процессам после применения окружения ОС.
|
||
|
||
## Логирование
|
||
|
||
Класс `Sms.TaskTwo.Core.Logging.ConsoleLog` — дублирует записи в консоль и файл.
|
||
|
||
По умолчанию для GUI: `logs/test-sms-wpf-app-yyyyMMdd.log`. При вызове `ConsoleLog.Open()` без имени — `test-sms-console-app-yyyyMMdd_HHmmss.log`.
|
||
|
||
Пример строки:
|
||
|
||
```
|
||
2026-06-04 18:30:01 [INFO] Changed value: SMS_MEAL_SERVER_URL=https://example.com (previous: <none>)
|
||
```
|
||
|
||
## UI
|
||
|
||
- **Добавить** — создаёт пользовательскую переменную (имя + значение); список имён хранится в env-переменной `SMS_TASK_TWO_CUSTOM_VARS` (JSON-массив). Пользовательские строки подсвечиваются жёлтым, идут после переменных из конфига. **Удалить** у пользовательской переменной убирает её из списка и из user store.
|
||
- При старте переменные из `appsettings.json`, отсутствующие в пользовательском хранилище, **создаются автоматически** (со значением из `Defaults` или пустой строкой).
|
||
- Строки из конфига **всегда вверху** таблицы (в порядке из `Names`), остальные — ниже по алфавиту.
|
||
- Изменение одной строки обновляет только её ViewModel (без пересборки всей таблицы); при переключении «все переменные» строки добавляются/удаляются/переставляются инкрементально.
|
||
- **Отображать все переменные** — показывает все переменные процесса; значения можно записать в пользовательское хранилище (реестр / `environment.d`).
|
||
- Строки из `appsettings.json` подсвечиваются голубым (`#E3F2FD`).
|
||
- Переменные в пользовательском хранилище помечаются **USER** и зелёной полосой; кнопка **Удалить** снимает их из HKCU / `environment.d`.
|
||
- Совпадение обоих признаков — фон `#C8E6C9`.
|
||
|
||
## Платформы
|
||
|
||
### Windows
|
||
|
||
- Чтение/запись: реестр `HKEY_CURRENT_USER\Environment`.
|
||
- **Применить к сессии** (`ReloadEnvironment`): обновляет env текущего процесса и рассылает `WM_SETTINGCHANGE` для других GUI-приложений.
|
||
|
||
### Linux
|
||
|
||
- Запись в `~/.config/environment.d/` (systemd `KEY=value`).
|
||
- **Применить к сессии** не поддерживается: переменные подхватываются после перезапуска login-сессии.
|
||
|
||
## Предположения (ТЗ)
|
||
|
||
1. Колонка «Поле» — только имена из `appsettings.json`, без добавления новых строк вручную.
|
||
2. Значения по умолчанию показываются в UI, в ОС записываются при первом изменении пользователем.
|
||
3. Pixel-perfect вёрстка не требуется; элементы стилизованы по макету (заголовок, DataGrid, кнопки «−» / «×»).
|
||
|
||
## Порт на WPF
|
||
|
||
Создать `Sms.TaskTwo.Wpf`, подключить `Sms.TaskTwo.Core`, `Sms.TaskTwo.ViewModels`, зарегистрировать `IEnvironmentVariableStore` так же, как в `App.axaml.cs` Avalonia-проекта.
|