@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration
@inject AssetService AssetService
@{
var userInfo = User.UserInfo;
}
<!DOCTYPE html>
<html lang="zh-Hans">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
<title>@(ViewData["Title"] ?? "个人中心") - @(userInfo?.Name ?? "用户")</title>
<environment include="Development">
<link rel="stylesheet" href="~/css/member/member.css" asp-append-version="true">
<link rel="stylesheet" href="~/css/member/dark-mode.css" asp-append-version="true">
</environment>
<environment exclude="Development">
<link href="@Program.AssetsHost@AssetService.GetPath("css/member/member.min.css")" rel="stylesheet">
</environment>
<link rel="stylesheet" href="@Program.LibraryHost/library/fontawesome/css/all.min.css" />
<link rel="stylesheet" href="@Program.LibraryHost/library/cherry-markdown/cherry-markdown.css" />
<link rel="stylesheet" href="@Program.LibraryHost/library/prism/prism.css" />
<link rel="stylesheet" href="@Program.LibraryHost/library/photoswipe/photoswipe.css" />
<script src="@Program.LibraryHost/library/jquery/jquery.min.js"></script>
<script src="@Program.LibraryHost/library/jquery.pjax.js"></script>
@await RenderSectionAsync("Styles", required: false)
</head>
<body class="member-body">
<!-- 手机端菜单切换按钮 -->
<button class="menu-toggle" id="menuToggle">
<i class="fa fa-bars"></i>
</button>
<!-- 手机端遮罩层 -->
<div class="sidebar-overlay" id="sidebarOverlay"></div>
<!-- 面包屑导航 -->
<div class="breadcrumb-container">
<div class="breadcrumb">
<a href="/">首页</a>
<span class="separator">/</span>
<a href="@Url.Action("Index", "Member")">个人中心</a>
@if (ViewData["Breadcrumb"] != null)
{
<span class="separator">/</span>
<span class="current" id="currentPageTitle">@ViewData["Breadcrumb"]</span>
}
</div>
</div>
<!-- 主容器 -->
<div class="member-container">
<!-- 侧边栏导航 -->
<div class="member-sidebar">
<div class="user-profile">
<div class="avatar-container">
<img src="@(userInfo?.Avatar)" alt="@userInfo?.Id" class="user-avatar"
id="userAvatar">
<div class="avatar-upload">
<i class="fa fa-camera"></i>
</div>
</div>
<h3 class="user-name" id="userName">@userInfo?.Id</h3>
<p class="user-email" id="userEmail">@userInfo?.Sign</p>
</div>
<nav class="member-nav">
<ul>
<li class="nav-item @(ViewData["ActiveMenu"]?.ToString() == "profile" ? "active" : "")">
<a asp-action="Index" asp-controller="Member" data-pjax>
<i class="fa fa-user"></i>
<span>基本设置</span>
</a>
</li>
<li class="nav-item @(ViewData["ActiveMenu"]?.ToString() == "articles" ? "active" : "")">
<a asp-action="Articles" asp-controller="Member" data-pjax>
<i class="fa fa-file-text"></i>
<span>我的文章</span>
</a>
</li>
<li class="nav-item @(ViewData["ActiveMenu"]?.ToString() == "mumbles" ? "active" : "")">
<a asp-action="Mumbles" asp-controller="Member" data-pjax>
<i class="fa fa-comment"></i>
<span>我的碎碎念</span>
</a>
</li>
<li class="nav-item @(ViewData["ActiveMenu"]?.ToString() == "timeline" ? "active" : "")">
<a asp-action="Timeline" asp-controller="Member" data-pjax>
<i class="fa fa-calendar"></i>
<span>我的时间轴</span>
</a>
</li>
<li class="nav-item @(ViewData["ActiveMenu"]?.ToString() == "photos" ? "active" : "")">
<a asp-action="Photos" asp-controller="Member" data-pjax>
<i class="fa fa-image"></i>
<span>我的相册</span>
</a>
</li>
@if (User.HasSystem)
{
<li class="nav-item">
<a href="@Program.HangfireDashboardPath" target="_blank">
<i class="fa-solid fa-bars-progress"></i>
<span>任务调度</span>
</a>
</li>
}
</ul>
</nav>
<!-- 环境和版本信息 -->
<div class="sidebar-footer">
@{
var environment = Configuration["AgileConfig:env"] ?? "Unknown";
var envClass = environment.ToUpper() switch
{
"PROD" or "PRODUCTION" => "env-production",
"STAGING" => "env-staging",
"TEST" => "env-test",
"DEV" or "DEVELOPMENT" => "env-development",
_ => "env-unknown"
};
}
<div class="env-info">
<div class="env-badge @envClass">
<i class="fa fa-server"></i>
<span>@environment</span>
</div>
<div class="version-info">
<i class="fa fa-code-fork"></i>
<span>@Program.Version</span>
</div>
</div>
</div>
</div>
<!-- 主内容区域 -->
<div class="member-content" id="pjax-container">
@RenderBody()
</div>
</div>
<!-- 确认删除模态框 -->
<div class="modal-overlay" id="deleteModal" style="display: none;">
<div class="modal-content">
<div class="modal-header">
<h3>确认删除</h3>
<button type="button" class="close-btn" id="closeDeleteModal">
<i class="fa fa-times"></i>
</button>
</div>
<div class="modal-body">
<p>确定要删除这个项目吗?此操作无法撤销。</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" id="cancelDelete">取消</button>
<button type="button" class="btn btn-danger" id="confirmDelete">确认删除</button>
</div>
</div>
</div>
<!-- 查看内容模态框 -->
<div class="modal-overlay" id="viewContentModal" style="display: none;">
<div class="modal-content large">
<div class="modal-header">
<h3>查看详细内容</h3>
<button type="button" class="close-btn" id="closeViewContentModal">
<i class="fa fa-times"></i>
</button>
</div>
<div class="modal-body" id="viewContentModalBody">
<!-- 内容将被动态插入 -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" id="closeViewContentBtn">关闭</button>
</div>
</div>
</div>
<!-- 加载提示 -->
<div class="loading-overlay" id="loadingOverlay">
<div class="loading-spinner">
<div class="spinner-border"></div>
<span class="loading-text">加载中...</span>
</div>
</div>
<script src="@Program.LibraryHost/library/showdown/showdown.min.js"></script>
<script src="@Program.LibraryHost/library/prism/prism.js"></script>
<environment include="Development">
<script type="module" src="~/js/member/main.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
<script
type="module"
src="@Program.AssetsHost@AssetService.GetPath("js/member/main.min.js")"
asp-fallback-src="@AssetService.GetPath("js/member/main.min.js")">
</script>
</environment>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
评论加载中...