< Summary

Information
Class: AspNetCoreGeneratedDocument.Areas_Identity_Pages_Account_Logout
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Identity/Pages/Account/Logout.cshtml
Line coverage
0%
Covered lines: 0
Uncovered lines: 22
Coverable lines: 22
Total lines: 331
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 22
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ExecuteAsync()0%506220%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Identity/Pages/Account/Logout.cshtml

#LineLine coverage
 1@page
 2@model LogoutModel
 3@using Microsoft.AspNetCore.Identity
 4@using OzonRepositories.Context.Identity
 5@inject UserManager<CustomIdentityUser> UserManager
 6
 7@{
 08    ViewData["Title"] = "Выход из системы";
 09    Layout = "~/Views/Shared/_Layout.cshtml";
 10}
 11
 12<style>
 13    .logout-container {
 14        max-width: 800px;
 15        margin: 2rem auto;
 16    }
 17
 18    .card {
 19        border: none;
 20        border-radius: 0.5rem;
 21        box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);
 22        margin-bottom: 1.5rem;
 23    }
 24
 25    .card-header {
 26        background-color: #f8f9fa;
 27        border-bottom: 1px solid #dee2e6;
 28        border-radius: 0.5rem 0.5rem 0 0 !important;
 29        padding: 1rem 1.5rem;
 30    }
 31
 32    .card-header h3 {
 33        color: #212529;
 34        margin: 0;
 35        font-size: 1.25rem;
 36        font-weight: 600;
 37    }
 38
 39    .card-body {
 40        padding: 1.5rem;
 41    }
 42
 43    .info-section {
 44        background-color: #f8f9fa;
 45        border-radius: 0.5rem;
 46        padding: 1.5rem;
 47        margin-bottom: 1.5rem;
 48        border: 1px solid #e9ecef;
 49    }
 50
 51    .info-section h5 {
 52        color: #495057;
 53        font-size: 1rem;
 54        font-weight: 600;
 55        margin-bottom: 1rem;
 56    }
 57
 58    .info-row {
 59        display: flex;
 60        justify-content: space-between;
 61        align-items: center;
 62        padding: 0.75rem 0;
 63        border-bottom: 1px solid #e9ecef;
 64    }
 65
 66    .info-row:last-child {
 67        border-bottom: none;
 68    }
 69
 70    .info-label {
 71        font-weight: 500;
 72        color: #6c757d;
 73        display: flex;
 74        align-items: center;
 75    }
 76
 77    .info-label i {
 78        margin-right: 0.5rem;
 79        color: #6c757d;
 80        width: 20px;
 81    }
 82
 83    .info-value {
 84        color: #212529;
 85        text-align: right;
 86    }
 87
 88    .badge-custom {
 89        font-size: 0.875rem;
 90        padding: 0.4rem 0.8rem;
 91        font-weight: 500;
 92    }
 93
 94    .session-stats {
 95        background-color: #f8f9fa;
 96        border: 1px solid #e9ecef;
 97        border-radius: 0.5rem;
 98        padding: 1.5rem;
 99        margin-bottom: 1.5rem;
 100    }
 101
 102    .session-stats h5 {
 103        color: #495057;
 104        font-size: 1rem;
 105        font-weight: 600;
 106        margin-bottom: 1rem;
 107    }
 108
 109    .stat-item {
 110        text-align: center;
 111    }
 112
 113    .stat-value {
 114        font-size: 1.5rem;
 115        font-weight: 600;
 116        color: #212529;
 117        margin-bottom: 0.5rem;
 118    }
 119
 120    .stat-label {
 121        font-size: 0.875rem;
 122        color: #6c757d;
 123    }
 124
 125    .logout-actions {
 126        display: flex;
 127        gap: 1rem;
 128        justify-content: center;
 129        margin-top: 2rem;
 130    }
 131
 132    .btn-logout {
 133        min-width: 180px;
 134        padding: 0.6rem 1.5rem;
 135        font-size: 1rem;
 136        font-weight: 500;
 137    }
 138
 139    .warning-box {
 140        background-color: #fff3cd;
 141        border: 1px solid #ffc107;
 142        border-radius: 0.5rem;
 143        padding: 1rem;
 144        margin-bottom: 1.5rem;
 145    }
 146
 147    .warning-box i {
 148        color: #856404;
 149        margin-right: 0.5rem;
 150    }
 151
 152    .warning-box strong {
 153        color: #856404;
 154    }
 155</style>
 156
 157<div class="container-fluid">
 158    <div class="logout-container">
 0159        @if (User.Identity?.IsAuthenticated == true && Model.CurrentUser != null)
 160        {
 161            <div class="card shadow-sm">
 162                <div class="card-header">
 163                    <h3>
 164                        <i class="fas fa-sign-out-alt me-2"></i>Выход из системы
 165                    </h3>
 166                </div>
 167                <div class="card-body">
 168                    <div class="warning-box">
 169                        <i class="fas fa-exclamation-triangle"></i>
 170                        <strong>Внимание!</strong> Вы собираетесь выйти из системы. Все несохраненные данные будут потер
 171                    </div>
 172
 173                    <!-- Информация о пользователе -->
 174                    <div class="info-section">
 175                        <h5 class="mb-3">
 176                            <i class="fas fa-user-circle me-2"></i>Информация о пользователе
 177                        </h5>
 178                        <div class="info-row">
 179                            <div class="info-label">
 180                                <i class="fas fa-user"></i>
 181                                <span>Имя пользователя:</span>
 182                            </div>
 183                            <div class="info-value">
 0184                                <strong>@Model.CurrentUser.UserName</strong>
 185                            </div>
 186                        </div>
 0187                        @if (!string.IsNullOrEmpty(Model.CurrentUser.Email))
 188                        {
 189                            <div class="info-row">
 190                                <div class="info-label">
 191                                    <i class="fas fa-envelope"></i>
 192                                    <span>Email:</span>
 193                                </div>
 0194                                <div class="info-value">@Model.CurrentUser.Email</div>
 195                            </div>
 196                        }
 197                        <div class="info-row">
 198                            <div class="info-label">
 199                                <i class="fas fa-shield-alt"></i>
 200                                <span>Роли:</span>
 201                            </div>
 202                            <div class="info-value">
 0203                                @if (Model.UserRoles != null && Model.UserRoles.Length > 0)
 204                                {
 0205                                    @foreach (var role in Model.UserRoles)
 206                                    {
 207                                        <span class="badge bg-success badge-custom me-1">
 0208                                            <i class="fas fa-user-tag me-1"></i>@role
 209                                        </span>
 210                                    }
 211                                }
 212                                else
 213                                {
 214                                    <span class="text-muted">Нет назначенных ролей</span>
 215                                }
 216                            </div>
 217                        </div>
 218                    </div>
 219
 220                    <!-- Статистика сессии -->
 0221                    @if (Model.SessionStartTime.HasValue)
 222                    {
 0223                        var sessionDuration = DateTime.Now - Model.SessionStartTime.Value;
 0224                        var totalMinutes = (int)sessionDuration.TotalMinutes;
 0225                        var hours = totalMinutes / 60;
 0226                        var minutes = totalMinutes % 60;
 0227                        var durationText = hours > 0 ? $"{hours} ч. {minutes} мин." : $"{minutes} мин.";
 228
 229                        <div class="session-stats">
 230                            <h5>
 231                                <i class="fas fa-chart-line me-2"></i>Статистика сессии
 232                            </h5>
 233                            <div class="row">
 234                                <div class="col-md-4 stat-item">
 0235                                    <div class="stat-value">@durationText</div>
 236                                    <div class="stat-label">Длительность сессии</div>
 237                                </div>
 238                                <div class="col-md-4 stat-item">
 0239                                    <div class="stat-value">@Model.SessionStartTime.Value.ToString("HH:mm")</div>
 240                                    <div class="stat-label">Время входа</div>
 241                                </div>
 242                                <div class="col-md-4 stat-item">
 0243                                    <div class="stat-value">@DateTime.Now.ToString("HH:mm")</div>
 244                                    <div class="stat-label">Текущее время</div>
 245                                </div>
 246                            </div>
 247                            <div class="mt-3 text-center">
 248                                <small class="text-muted">
 249                                    <i class="fas fa-calendar me-1"></i>
 0250                                    Дата входа: @Model.SessionStartTime.Value.ToString("dd.MM.yyyy")
 251                                </small>
 252                            </div>
 253                        </div>
 254                    }
 255                    else
 256                    {
 257                        <div class="info-section">
 258                            <h5 class="mb-3">
 259                                <i class="fas fa-chart-line me-2"></i>Статистика сессии
 260                            </h5>
 261                            <p class="text-muted mb-0">
 262                                <i class="fas fa-info-circle me-2"></i>
 263                                Информация о длительности сессии недоступна
 264                            </p>
 265                        </div>
 266                    }
 267
 268                    <!-- Информация о подключении -->
 269                    <div class="info-section">
 270                        <h5 class="mb-3">
 271                            <i class="fas fa-network-wired me-2"></i>Информация о подключении
 272                        </h5>
 273                        <div class="info-row">
 274                            <div class="info-label">
 275                                <i class="fas fa-globe"></i>
 276                                <span>IP адрес:</span>
 277                            </div>
 278                            <div class="info-value">
 0279                                <code>@Model.UserIpAddress</code>
 280                            </div>
 281                        </div>
 0282                        @if (!string.IsNullOrEmpty(Model.UserAgent))
 283                        {
 284                            <div class="info-row">
 285                                <div class="info-label">
 286                                    <i class="fas fa-desktop"></i>
 287                                    <span>Браузер:</span>
 288                                </div>
 289                                <div class="info-value">
 0290                                    <small>@Model.UserAgent</small>
 291                                </div>
 292                            </div>
 293                        }
 294                    </div>
 295
 296                    <!-- Действия -->
 297                    <div class="logout-actions">
 298                        <form asp-area="Identity" asp-page="/Account/Logout" method="post" style="display: inline;">
 299                            <button type="submit" class="btn btn-danger btn-logout">
 300                                <i class="fas fa-sign-out-alt me-2"></i>Выйти из системы
 301                </button>
 302            </form>
 303                        <a href="/Studio2/OrdersGrid" class="btn btn-secondary btn-logout">
 304                            <i class="fas fa-arrow-left me-2"></i>Отмена
 305                        </a>
 306                    </div>
 307                </div>
 308            </div>
 309        }
 310        else
 311        {
 312            <div class="card shadow-sm">
 313                <div class="card-header">
 314                    <h3>
 315                        <i class="fas fa-check-circle me-2"></i>Выход выполнен
 316                    </h3>
 317                </div>
 318                <div class="card-body text-center">
 319                    <div class="mb-4">
 320                        <i class="fas fa-check-circle" style="font-size: 3rem; color: #28a745;"></i>
 321                    </div>
 322                    <h4 class="mb-3" style="color: #212529;">Вы успешно вышли из системы</h4>
 323                    <p class="text-muted mb-4">Спасибо за использование системы. Для повторного входа используйте форму 
 324                    <a href="/Identity/Account/Login" class="btn btn-primary">
 325                        <i class="fas fa-sign-in-alt me-2"></i>Войти снова
 326                    </a>
 327                </div>
 328            </div>
 329        }
 330    </div>
 331</div>

Methods/Properties

ExecuteAsync()