342 lines
11 KiB
Markdown
342 lines
11 KiB
Markdown
# Управление пользователем (User Management)
|
||
|
||
Система пользователей, аутентификации и владения компанией.
|
||
|
||
## Обзор
|
||
|
||
Модуль управления пользователями включает регистрацию, аутентификацию и связь пользователя с компанией.
|
||
|
||
📂 **Код:** [`backend/src/MyBiz.Core/User.cs`](../../backend/src/MyBiz.Core/User.cs), [`AuthService.cs`](../../backend/src/MyBiz.Core/AuthService.cs)
|
||
|
||
---
|
||
|
||
## Архитектура
|
||
|
||
```
|
||
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||
│ User │ ──────► │ Company │ ──────► │ BusinessUnit│
|
||
│ (пользов.) │ OwnerId │ (компания) │ Units │ (единицы) │
|
||
│ │ │ │ │ │
|
||
│ - Username │ │ - Cash │ │ - Shop │
|
||
│ - Email │ │ - Assets │ │ - Factory │
|
||
│ - Password │ │ - Buildings │ │ - Warehouse │
|
||
│ Hash │ │ - Units │ │ - Office │
|
||
│ │ │ │ │ - Lab │
|
||
└─────────────┘ └─────────────┘ └─────────────┘
|
||
▲
|
||
│
|
||
┌─────────────┐
|
||
│ AuthService │
|
||
│ (аутентиф.) │
|
||
└─────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## User
|
||
|
||
**Назначение:** Пользователь системы (игрок).
|
||
|
||
📂 **Исходный код:** [`User.cs`](../../backend/src/MyBiz.Core/User.cs)
|
||
|
||
### Основные свойства
|
||
|
||
| Свойство | Тип | Описание |
|
||
|----------|-----|----------|
|
||
| `Id` | Guid | Уникальный ID пользователя |
|
||
| `Username` | string | Имя пользователя (логин) |
|
||
| `Email` | string | Email адрес |
|
||
| `PasswordHash` | string | Хеш пароля |
|
||
| `CreatedAt` | DateTime | Дата регистрации |
|
||
| `LastLoginAt` | DateTime? | Дата последнего входа |
|
||
| `IsActive` | bool | Активен ли пользователь |
|
||
| `Company` | Company? | Компания пользователя |
|
||
| `CompanyId` | Guid? | ID компании |
|
||
| `Stats` | UserStats | Статистика игры |
|
||
|
||
---
|
||
|
||
## UserStats
|
||
|
||
**Назначение:** Статистика достижений пользователя.
|
||
|
||
📂 **Исходный код:** [`User.cs`](../../backend/src/MyBiz.Core/User.cs#L54-L85)
|
||
|
||
### Свойства
|
||
|
||
| Свойство | Тип | Описание |
|
||
|----------|-----|----------|
|
||
| `GamesPlayed` | int | Всего игр сыграно |
|
||
| `TotalHoursPlayed` | int | Всего часов в игре |
|
||
| `MaxNetWorth` | decimal | Максимальная чистая стоимость |
|
||
| `TotalBuildingsBuilt` | int | Всего зданий построено |
|
||
| `FirstGameDate` | DateTime? | Дата первой игры |
|
||
| `LastGameDate` | DateTime? | Дата последней игры |
|
||
|
||
---
|
||
|
||
## AuthService
|
||
|
||
**Назначение:** Сервис аутентификации (заглушка для MVP).
|
||
|
||
📂 **Исходный код:** [`AuthService.cs`](../../backend/src/MyBiz.Core/AuthService.cs)
|
||
|
||
### Методы
|
||
|
||
| Метод | Описание |
|
||
|-------|----------|
|
||
| `Register(username, email, password, companyName)` | Регистрация нового пользователя |
|
||
| `Login(username, password)` | Вход в систему |
|
||
| `Logout(token)` | Выход из системы |
|
||
| `ValidateToken(token)` | Проверка токена |
|
||
| `GetUserById(userId)` | Получить пользователя по ID |
|
||
| `GetUserByUsername(username)` | Получить пользователя по имени |
|
||
|
||
### Возвращаемые значения
|
||
|
||
**AuthResult:**
|
||
| Свойство | Тип | Описание |
|
||
|----------|-----|----------|
|
||
| `Success` | bool | Успешна ли операция |
|
||
| `User` | User? | Пользователь (если успешно) |
|
||
| `Token` | string? | Токен доступа |
|
||
| `ErrorMessage` | string? | Сообщение об ошибке |
|
||
|
||
---
|
||
|
||
## Примеры использования
|
||
|
||
### Регистрация нового пользователя
|
||
|
||
```csharp
|
||
var authService = new AuthService();
|
||
|
||
var result = authService.Register(
|
||
username: "ivan_ivanov",
|
||
email: "ivan@example.com",
|
||
password: "SecurePassword123",
|
||
companyName: "Ivan Corp"
|
||
);
|
||
|
||
if (result.Success)
|
||
{
|
||
var user = result.User;
|
||
var token = result.Token;
|
||
|
||
Console.WriteLine($"Пользователь {user.Username} зарегистрирован!");
|
||
Console.WriteLine($"Компания: {user.Company.Name}");
|
||
Console.WriteLine($"Стартовый капитал: {user.Company.Cash}$");
|
||
}
|
||
else
|
||
{
|
||
Console.WriteLine($"Ошибка: {result.ErrorMessage}");
|
||
}
|
||
```
|
||
|
||
### Вход в систему
|
||
|
||
```csharp
|
||
var loginResult = authService.Login("ivan_ivanov", "SecurePassword123");
|
||
|
||
if (loginResult.Success)
|
||
{
|
||
var token = loginResult.Token;
|
||
// Использовать токен для авторизации запросов
|
||
}
|
||
else
|
||
{
|
||
Console.WriteLine($"Ошибка входа: {loginResult.ErrorMessage}");
|
||
}
|
||
```
|
||
|
||
### Проверка токена
|
||
|
||
```csharp
|
||
var user = authService.ValidateToken(token);
|
||
|
||
if (user != null)
|
||
{
|
||
Console.WriteLine($"Пользователь: {user.Username}");
|
||
Console.WriteLine($"Компания: {user.Company?.Name ?? "Нет компании"}");
|
||
}
|
||
else
|
||
{
|
||
Console.WriteLine("Неверный токен");
|
||
}
|
||
```
|
||
|
||
### Выход из системы
|
||
|
||
```csharp
|
||
authService.Logout(token);
|
||
```
|
||
|
||
---
|
||
|
||
## Company (обновлено)
|
||
|
||
**Назначение:** Компания игрока с бизнес-единицами.
|
||
|
||
📂 **Исходный код:** [`Company.cs`](../../backend/src/MyBiz.Core/Company.cs)
|
||
|
||
### Новые свойства
|
||
|
||
| Свойство | Тип | Описание |
|
||
|----------|-----|----------|
|
||
| `OwnerId` | Guid | ID владельца (пользователя) |
|
||
| `BusinessUnits` | List<BusinessUnit> | Бизнес-единицы компании |
|
||
| `FoundedAt` | DateTime | Дата основания |
|
||
|
||
### Новые методы
|
||
|
||
| Метод | Описание |
|
||
|-------|----------|
|
||
| `AddBusinessUnit(unit)` | Добавить бизнес-единицу |
|
||
| `RemoveBusinessUnit(unitId)` | Удалить бизнес-единицу |
|
||
| `Tick()` | Обновить все единицы (каждый тик) |
|
||
| `CalculateTotalProfit()` | Рассчитать общую прибыль |
|
||
| `CalculateAssets()` | Рассчитать стоимость активов |
|
||
|
||
### Свойства для фильтрации
|
||
|
||
| Свойство | Тип | Описание |
|
||
|----------|-----|----------|
|
||
| `Shops` | IEnumerable<Shop> | Все магазины |
|
||
| `Factories` | IEnumerable<Factory> | Все фабрики |
|
||
| `Warehouses` | IEnumerable<Warehouse> | Все склады |
|
||
|
||
---
|
||
|
||
## Примеры использования Company
|
||
|
||
### Добавление бизнес-единицы
|
||
|
||
```csharp
|
||
var company = new Company
|
||
{
|
||
Name = "My Corp",
|
||
Cash = 100000m
|
||
};
|
||
|
||
// Добавить магазин
|
||
var shop = new Shop
|
||
{
|
||
Name = "Главный магазин",
|
||
CityId = "city_1",
|
||
X = 100,
|
||
Y = 200
|
||
};
|
||
company.AddBusinessUnit(shop);
|
||
|
||
// Добавить фабрику
|
||
var factory = new Factory
|
||
{
|
||
Name = "Текстильная фабрика",
|
||
CityId = "city_1",
|
||
OutputProductId = "comp_fabric"
|
||
};
|
||
company.AddBusinessUnit(factory);
|
||
|
||
Console.WriteLine($"Магазинов: {company.Shops.Count()}");
|
||
Console.WriteLine($"Фабрик: {company.Factories.Count()}");
|
||
```
|
||
|
||
### Обновление состояния (тик)
|
||
|
||
```csharp
|
||
// Каждый тик игры:
|
||
company.Tick();
|
||
|
||
// Обновляются:
|
||
// - Эффективность единиц
|
||
// - Производственные цепочки
|
||
// - Статистика
|
||
```
|
||
|
||
### Расчёт прибыли
|
||
|
||
```csharp
|
||
var shop1 = new Shop
|
||
{
|
||
LastPeriodIncome = 10000m,
|
||
LastPeriodExpenses = 7000m
|
||
};
|
||
var shop2 = new Shop
|
||
{
|
||
LastPeriodIncome = 15000m,
|
||
LastPeriodExpenses = 10000m
|
||
};
|
||
|
||
company.AddBusinessUnit(shop1);
|
||
company.AddBusinessUnit(shop2);
|
||
|
||
var totalProfit = company.CalculateTotalProfit();
|
||
// (10000 - 7000) + (15000 - 10000) = 8000m
|
||
```
|
||
|
||
---
|
||
|
||
## Тесты
|
||
|
||
📂 **Код:** [`backend/tests/MyBiz.Tests/UserTests.cs`](../../backend/tests/MyBiz.Tests/UserTests.cs)
|
||
|
||
### UserTests
|
||
|
||
| Тест | Описание |
|
||
|------|----------|
|
||
| `User_Creation_ShouldInitializeProperties` | Создание пользователя |
|
||
| `User_Company_Assignment_ShouldWork` | Назначение компании |
|
||
| `UserStats_ShouldInitializeDefaults` | Инициализация статистики |
|
||
|
||
### AuthServiceTests
|
||
|
||
| Тест | Описание |
|
||
|------|----------|
|
||
| `AuthService_Register_ShouldCreateUser` | Регистрация пользователя |
|
||
| `AuthService_Register_DuplicateUsername_ShouldFail` | Дубликат имени |
|
||
| `AuthService_Login_CorrectCredentials_ShouldSucceed` | Успешный вход |
|
||
| `AuthService_Login_WrongPassword_ShouldFail` | Неверный пароль |
|
||
| `AuthService_Login_NonExistentUser_ShouldFail` | Несуществующий пользователь |
|
||
| `AuthService_Logout_ShouldInvalidateToken` | Выход из системы |
|
||
| `AuthService_ValidateToken_ValidToken_ShouldReturnUser` | Проверка токена |
|
||
| `AuthService_GetUserById_ShouldReturnUser` | Поиск по ID |
|
||
|
||
### BusinessUnitTests
|
||
|
||
| Тест | Описание |
|
||
|------|----------|
|
||
| `BusinessUnit_Creation_ShouldInitializeProperties` | Создание единицы |
|
||
| `BusinessUnit_HireEmployee_ShouldIncreaseCount` | Найм сотрудника |
|
||
| `BusinessUnit_FireEmployee_ShouldDecreaseCount` | Увольнение |
|
||
| `BusinessUnit_Upgrade_ShouldIncreaseLevel` | Повышение уровня |
|
||
| `BusinessUnit_UpdateEfficiency_*` | Расчёт эффективности |
|
||
|
||
### ShopTests, FactoryTests, WarehouseTests, ResearchLabTests
|
||
|
||
| Тест | Описание |
|
||
|------|----------|
|
||
| `*_Creation_ShouldInitializeDefaults` | Инициализация |
|
||
| `*_Calculation_ShouldBeCorrect` | Расчёты |
|
||
| `*_AddToInventory/*_RemoveFromInventory` | Операции с запасами |
|
||
|
||
### CompanyBusinessUnitTests
|
||
|
||
| Тест | Описание |
|
||
|------|----------|
|
||
| `Company_AddBusinessUnit_ShouldAddToList` | Добавление единицы |
|
||
| `Company_Shops_Filter_ShouldReturnOnlyShops` | Фильтрация магазинов |
|
||
| `Company_CalculateTotalProfit_ShouldSumAllUnits` | Расчёт прибыли |
|
||
| `Company_Tick_ShouldUpdateAllUnits` | Обновление состояния |
|
||
|
||
---
|
||
|
||
## Связанные документы
|
||
|
||
- [Ядро](core.md) — базовые классы
|
||
- [Бизнес-единицы](business-units.md) — детальное описание единиц
|
||
- [Здания](buildings.md) — типы зданий
|
||
|
||
---
|
||
|
||
**Последнее обновление:** 21.02.2026
|