feat: 使用Bootstrap重写前端页面 #2
|
@ -1,7 +1,6 @@
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using Microsoft.FluentUI.AspNetCore.Components;
|
|
||||||
using YaeBlog.Core.Models;
|
using YaeBlog.Core.Models;
|
||||||
using YaeBlog.Core.Processors;
|
using YaeBlog.Core.Processors;
|
||||||
using YaeBlog.Core.Services;
|
using YaeBlog.Core.Services;
|
||||||
|
@ -15,7 +14,6 @@ public static class WebApplicationBuilderExtensions
|
||||||
builder.Services.Configure<BlogOptions>(builder.Configuration.GetSection(BlogOptions.OptionName));
|
builder.Services.Configure<BlogOptions>(builder.Configuration.GetSection(BlogOptions.OptionName));
|
||||||
|
|
||||||
builder.Services.AddHttpClient();
|
builder.Services.AddHttpClient();
|
||||||
builder.Services.AddFluentUIComponents();
|
|
||||||
|
|
||||||
builder.Services.AddMarkdig();
|
builder.Services.AddMarkdig();
|
||||||
builder.Services.AddYamlParser();
|
builder.Services.AddYamlParser();
|
||||||
|
|
|
@ -14,9 +14,7 @@ public class EssayContentService
|
||||||
|
|
||||||
public bool TryAdd(string key, BlogEssay essay) => _essays.TryAdd(key, essay);
|
public bool TryAdd(string key, BlogEssay essay) => _essays.TryAdd(key, essay);
|
||||||
|
|
||||||
public IEnumerable<KeyValuePair<string, BlogEssay>> Essays => _essays;
|
public IDictionary<string, BlogEssay> Essays => _essays;
|
||||||
|
|
||||||
public int Count => _essays.Count;
|
|
||||||
|
|
||||||
public void RefreshTags()
|
public void RefreshTags()
|
||||||
{
|
{
|
||||||
|
@ -42,6 +40,7 @@ public class EssayContentService
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<KeyValuePair<string, int>> Tags => from item in _tags
|
public IEnumerable<KeyValuePair<string, int>> Tags => from item in _tags
|
||||||
|
orderby item.Value.Count descending
|
||||||
select KeyValuePair.Create(item.Key, item.Value.Count);
|
select KeyValuePair.Create(item.Key, item.Value.Count);
|
||||||
|
|
||||||
public int TagCount => _tags.Count;
|
public int TagCount => _tags.Count;
|
||||||
|
|
|
@ -30,8 +30,6 @@
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.6" />
|
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.6" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
|
||||||
<PackageReference Include="YamlDotNet" Version="13.7.1" />
|
<PackageReference Include="YamlDotNet" Version="13.7.1" />
|
||||||
<PackageReference Include="Microsoft.FluentUI.AspNetCore.Components" Version="4.8.0" />
|
|
||||||
<PackageReference Include="Microsoft.FluentUI.AspNetCore.Components.Icons" Version="4.8.0" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
@using YaeBlog.Core.Models
|
|
||||||
|
|
||||||
@inject BlogOptions BlogOptionsInstance
|
|
||||||
|
|
||||||
<div style="width: 100%">
|
|
||||||
<FluentCard>
|
|
||||||
<div class="announcement-title">
|
|
||||||
<FluentIcon Value="@(new Icons.Regular.Size16.Note())" />
|
|
||||||
<FluentLabel Typo="@Typography.H5" Style="margin-left: 0.5rem">
|
|
||||||
公告
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="height: 1rem"></div>
|
|
||||||
|
|
||||||
<FluentLabel>
|
|
||||||
@(BlogOptionsInstance.Announcement)
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<div style="height: 0.5rem"></div>
|
|
||||||
</FluentCard>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,4 +0,0 @@
|
||||||
.announcement-title {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
|
@ -7,21 +7,18 @@
|
||||||
<base href="/"/>
|
<base href="/"/>
|
||||||
<link rel="stylesheet" href="YaeBlog.styles.css"/>
|
<link rel="stylesheet" href="YaeBlog.styles.css"/>
|
||||||
<link rel="icon" href="images/favicon.ico"/>
|
<link rel="icon" href="images/favicon.ico"/>
|
||||||
<link href="_content/Microsoft.FluentUI.AspNetCore.Components/css/reboot.css" rel="stylesheet"/>
|
<link rel="stylesheet" href="bootstrap.min.css"/>
|
||||||
<link href="globals.css" rel="stylesheet"/>
|
<link rel="stylesheet" href="bootstrap-icons.min.css"/>
|
||||||
|
<link rel="stylesheet" href="_content/Blazor.Bootstrap/blazor.bootstrap.css"/>
|
||||||
|
<link rel="stylesheet" href="globals.css"/>
|
||||||
<HeadOutlet/>
|
<HeadOutlet/>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<Routes/>
|
<Routes/>
|
||||||
|
|
||||||
<FluentDesignTheme StorageName="theme" Mode="@DesignThemeModes.System"/>
|
|
||||||
<loading-theme storage-name="theme"></loading-theme>
|
|
||||||
|
|
||||||
<script src="_content/Microsoft.FluentUI.AspNetCore.Components/js/loading-theme.js" type="text/javascript"></script>
|
|
||||||
<script src="_framework/blazor.web.js"></script>
|
<script src="_framework/blazor.web.js"></script>
|
||||||
<script src="_content/Microsoft.FluentUI.AspNetCore.Components/Microsoft.FluentUI.AspNetCore.Components.lib.module.js" type="module" async></script>
|
<script src="bootstrap.bundle.min.js"></script>
|
||||||
<script src="themes.js" type="module"></script>
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1,53 +0,0 @@
|
||||||
@using YaeBlog.Core.Models
|
|
||||||
@using YaeBlog.Core.Services
|
|
||||||
|
|
||||||
@inject BlogOptions BlogOptionsInstance
|
|
||||||
@inject EssayContentService EssayContentInstance
|
|
||||||
|
|
||||||
<div style="margin: 2rem 0; width: 100%">
|
|
||||||
<FluentCard>
|
|
||||||
<FluentStack Orientation="@Orientation.Vertical"
|
|
||||||
HorizontalAlignment="@HorizontalAlignment.Center">
|
|
||||||
<div class="about-avatar">
|
|
||||||
<img src="@(BlogOptionsInstance.About.AvatarImage)" alt="author-avatar"
|
|
||||||
class="about-avatar-img">
|
|
||||||
</div>
|
|
||||||
<FluentLabel Typo="@Typography.H3">
|
|
||||||
@(BlogOptionsInstance.Author)
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<div style="height: 0.5rem"></div>
|
|
||||||
|
|
||||||
<FluentStack Orientation="@Orientation.Horizontal"
|
|
||||||
HorizontalAlignment="@HorizontalAlignment.Center"
|
|
||||||
HorizontalGap="20">
|
|
||||||
<a href="/blog/archives">
|
|
||||||
<div>
|
|
||||||
<FluentLabel Typo="@Typography.H4">
|
|
||||||
文章
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.H4">
|
|
||||||
@(EssayContentInstance.Count)
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<a href="/blog/tags">
|
|
||||||
<div>
|
|
||||||
<FluentLabel Typo="@Typography.H4">
|
|
||||||
标签
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.H4">
|
|
||||||
@(EssayContentInstance.TagCount)
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</FluentStack>
|
|
||||||
</FluentStack>
|
|
||||||
</FluentCard>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,30 +0,0 @@
|
||||||
.about-avatar {
|
|
||||||
position: relative;
|
|
||||||
width: 6rem;
|
|
||||||
height: 6rem;
|
|
||||||
z-index: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-avatar-img {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
border-radius: 50%;
|
|
||||||
background-color: transparent;
|
|
||||||
object-fit: cover;
|
|
||||||
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16),
|
|
||||||
0 2px 10px 0 rgba(0, 0, 0, 0.12);
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-avatar-img:hover {
|
|
||||||
animation: rotate-animation 1s ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes rotate-animation {
|
|
||||||
from {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
to {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,33 +0,0 @@
|
||||||
@using YaeBlog.Core.Models
|
|
||||||
@inject BlogOptions BlogOptionsInstance
|
|
||||||
|
|
||||||
<div class="footer-content">
|
|
||||||
<div>
|
|
||||||
<a href="https://learn.microsoft.com/zh-cn/aspnet/core/blazor/" target="_blank" rel="nofollow noopener">
|
|
||||||
<span> Blazor </span>
|
|
||||||
</a>
|
|
||||||
<i class="love-tag"></i>
|
|
||||||
<span> YaeBlog </span>
|
|
||||||
<i class="love-tag"></i>
|
|
||||||
<span>FluentUI</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="padding-top: 0.3rem">
|
|
||||||
<span>
|
|
||||||
©@(BlogOptionsInstance.StartYear) - @(DateTime.Now.Year) By @(BlogOptionsInstance.Author)
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@if (!string.IsNullOrEmpty(BlogOptionsInstance.RegisterInformation))
|
|
||||||
{
|
|
||||||
<div style="padding-top: 0.3rem">
|
|
||||||
<a href="https://beian.miit.gov.cn/" target="_blank" rel="nofollow noopener">
|
|
||||||
<span>@(BlogOptionsInstance.RegisterInformation)</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
.footer-content {
|
|
||||||
padding: 2rem 0 1rem 0;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.love-tag {
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 400;
|
|
||||||
font-family: "Font Awesome 6 Free", sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.love-tag::before {
|
|
||||||
content: "\f004";
|
|
||||||
}
|
|
42
YaeBlog/Components/BlogInformationCard.razor
Normal file
42
YaeBlog/Components/BlogInformationCard.razor
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
@using YaeBlog.Core.Services
|
||||||
|
|
||||||
|
@inject EssayContentService EssayContentInstance
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-auto p-4">
|
||||||
|
<Image Src="images/avatar.png" Alt="Ricardo's avatar"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row justify-content-center p-3">
|
||||||
|
<div class="col-auto fs-4">
|
||||||
|
“奇奇怪怪东西的聚合地”
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row justify-content-between px-2 py-1 fs-5">
|
||||||
|
<div class="col-auto">
|
||||||
|
文章
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/blog/archives">
|
||||||
|
@(EssayContentInstance.Essays.Count)
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row justify-content-between px-2 py-1 fs-5">
|
||||||
|
<div class="col-auto">
|
||||||
|
标签
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/blog/tags">
|
||||||
|
@(EssayContentInstance.TagCount)
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
39
YaeBlog/Components/EssayCard.razor
Normal file
39
YaeBlog/Components/EssayCard.razor
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
@using YaeBlog.Core.Models
|
||||||
|
|
||||||
|
<div class="container p-3">
|
||||||
|
<div class="row fs-2 fw-bold py-2 essay-title">
|
||||||
|
<a href="/blog/essays/@(Essay.FileName)" target="_blank">@(Essay.Title)</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row p-2 justify-content-start">
|
||||||
|
<div class="col-auto fw-light">
|
||||||
|
@(Essay.PublishTime.ToString("yyyy-MM-dd"))
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@foreach (string key in Essay.Tags)
|
||||||
|
{
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/blog/tags/?tagName=@key">
|
||||||
|
# @key
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row p-2">
|
||||||
|
<div class="col">
|
||||||
|
@(Essay.Description)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col border-bottom">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[Parameter]
|
||||||
|
public required BlogEssay Essay { get; set; }
|
||||||
|
}
|
3
YaeBlog/Components/EssayCard.razor.css
Normal file
3
YaeBlog/Components/EssayCard.razor.css
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
.essay-title a {
|
||||||
|
color: var(--bs-body-color);
|
||||||
|
}
|
14
YaeBlog/Components/Foonter.razor
Normal file
14
YaeBlog/Components/Foonter.razor
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
<div class="row align-items-end text-center">
|
||||||
|
<div class="row">
|
||||||
|
<p class="fs-6">
|
||||||
|
2021 - @(DateTimeOffset.Now.Year) © <a href="https://rrricardo.top" target="_blank">Ricardo Ren</a>,
|
||||||
|
由 <a href="https://dotnet.microsoft.com/zh-cn/" target="_blank">.NET @(Environment.Version)</a> 驱动。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<p class="fs-6">
|
||||||
|
<a href="https://beian.miit.gov.cn" target="_blank">蜀ICP备2022004429号-1</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
0
YaeBlog/Components/Foonter.razor.css
Normal file
0
YaeBlog/Components/Foonter.razor.css
Normal file
|
@ -1,36 +0,0 @@
|
||||||
<FluentGridItem md="3" sm="6" xs="12">
|
|
||||||
<FluentStack Orientation="@Orientation.Horizontal" HorizontalAlignment="@HorizontalAlignment.Center">
|
|
||||||
<div style="margin: 10px 20px; width: 75%; height: 90%">
|
|
||||||
<a href="@Address" target="_blank">
|
|
||||||
<FluentCard Width="100%" Height="100%">
|
|
||||||
<FluentStack Orientation="@Orientation.Horizontal">
|
|
||||||
<div style="width: 25%; margin: 5px 0">
|
|
||||||
<img src="@ImageAddress" alt="@Name" width="100%"/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<FluentStack Orientation="@Orientation.Vertical">
|
|
||||||
<FluentLabel Typo="@Typography.H3">
|
|
||||||
@Name
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.Body">
|
|
||||||
@Description
|
|
||||||
</FluentLabel>
|
|
||||||
</FluentStack>
|
|
||||||
</FluentStack>
|
|
||||||
</FluentCard>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</FluentStack>
|
|
||||||
</FluentGridItem>
|
|
||||||
|
|
||||||
|
|
||||||
@code {
|
|
||||||
[Parameter] public string Name { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
[Parameter] public string Description { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
[Parameter] public string ImageAddress { get; set; } = string.Empty;
|
|
||||||
|
|
||||||
[Parameter] public string Address { get; set; } = string.Empty;
|
|
||||||
}
|
|
|
@ -1,77 +1,49 @@
|
||||||
@using YaeBlog.Core.Models
|
|
||||||
@inherits LayoutComponentBase
|
@inherits LayoutComponentBase
|
||||||
|
|
||||||
@inject BlogOptions BlogOptionsInstance
|
@attribute [StreamRendering]
|
||||||
|
|
||||||
<FluentLayout>
|
<main class="container">
|
||||||
<FluentHeader>
|
<div class="row" style="height: 80px">
|
||||||
<FluentStack Orientation="@Orientation.Horizontal">
|
<div class="px-2 col-8">
|
||||||
<div style="width: 50px"></div>
|
<a href="/blog/" class="p-2">
|
||||||
|
<h4>Ricardo's Blog</h4>
|
||||||
<a href="/blog">
|
|
||||||
<FluentLabel Typo="@Typography.H3" Color="@Color.Lightweight">
|
|
||||||
@BlogOptionsInstance.Author
|
|
||||||
</FluentLabel>
|
|
||||||
</a>
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
<FluentSpacer/>
|
<div class="col-4 d-flex justify-content-around align-items-center">
|
||||||
|
<a href="/blog/" class="p-2">
|
||||||
<a href="/blog" style="margin: auto 0 auto 0">
|
<div class="d-inline-flex" style="text-align: center">
|
||||||
<div class="quick-link">
|
<Icon Name="@IconName.House" Color="@IconColor.Primary" class="px-2 d-none d-xl-block" Size="@IconSize.x5"/>
|
||||||
<FluentIcon Value="@(new Icons.Regular.Size16.Home())" Color="@Color.Fill"/>
|
<h5>首页</h5>
|
||||||
<FluentLabel Typo="@Typography.H5" Color="@Color.Lightweight"
|
|
||||||
Style="margin-left: 0.2rem">
|
|
||||||
首页
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="/blog/archives" style="margin: auto 0 auto 0">
|
<a href="/blog/archives/" class="p-2">
|
||||||
<div class="quick-link">
|
<div class="d-inline-flex">
|
||||||
<FluentIcon Value="@(new Icons.Regular.Size16.Archive())" Color="@Color.Fill"/>
|
<Icon Name="@IconName.Archive" Color="@IconColor.Primary" class="px-2 d-none d-xl-block" Size="IconSize.x5"/>
|
||||||
<FluentLabel Typo="@Typography.H5" Color="@Color.Lightweight"
|
<h5>归档</h5>
|
||||||
Style="margin-left: 0.2rem">
|
|
||||||
归档
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="/blog/tags" style="margin: auto 0 auto 0">
|
<a href="/blog/tags/" class="p-2">
|
||||||
<div class="quick-link">
|
<div class="d-inline-flex">
|
||||||
<FluentIcon Value="@(new Icons.Regular.Size16.Tag())" Color="@Color.Fill"/>
|
<Icon Name="@IconName.Tags" Color="@IconColor.Primary" class="px-2 d-none d-xl-block" Size="@IconSize.x5"/>
|
||||||
<FluentLabel Typo="@Typography.H5" Color="@Color.Lightweight"
|
<h5>标签</h5>
|
||||||
Style="margin-left: 0.2rem">
|
|
||||||
标签
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="/blog/about" style="margin: auto 0 auto 0">
|
<a href="/blog/about/" class="p-2">
|
||||||
<div class="quick-link">
|
<div class="d-inline-flex">
|
||||||
<FluentIcon Value="@(new Icons.Regular.Size16.PersonInfo())" Color="@Color.Fill"/>
|
<Icon Name="@IconName.Person" Color="@IconColor.Primary" class="px-2 d-none d-xl-block" Size="@IconSize.x5"/>
|
||||||
<FluentLabel Typo="@Typography.H5" Color="@Color.Lightweight"
|
<h5>关于</h5>
|
||||||
Style="margin-left: 0.2rem">
|
|
||||||
关于
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="/blog/links" style="margin: auto 0 auto 0">
|
|
||||||
<div class="quick-link">
|
|
||||||
<FluentIcon Value="@(new Icons.Regular.Size16.LinkMultiple())" Color="@Color.Fill"/>
|
|
||||||
<FluentLabel Typo="@Typography.H5" Color="@Color.Lightweight"
|
|
||||||
Style="margin-left: 0.2rem">
|
|
||||||
友链
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</div>
|
||||||
|
|
||||||
<div style="width: 20px"></div>
|
<div class="row px-4 py-2">
|
||||||
</FluentStack>
|
|
||||||
</FluentHeader>
|
|
||||||
<FluentBodyContent Style="height: 100%">
|
|
||||||
<main style="height: 100%">
|
|
||||||
@Body
|
@Body
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Foonter/>
|
||||||
</main>
|
</main>
|
||||||
</FluentBodyContent>
|
|
||||||
</FluentLayout>
|
|
||||||
|
|
|
@ -1,4 +0,0 @@
|
||||||
.quick-link {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
|
@ -1,18 +1,25 @@
|
||||||
@inherits LayoutComponentBase
|
@inherits LayoutComponentBase
|
||||||
|
|
||||||
|
<main class="container">
|
||||||
<FluentLayout Style="min-height: 100vh">
|
<div class="row" style="height: 80px">
|
||||||
<FluentHeader Height="60">
|
<div class="px-2 col-8">
|
||||||
<a href="/">
|
<a href="/" class="p-2">
|
||||||
<FluentLabel Typo="@Typography.H3" Color="@Color.Lightweight">
|
<h4>Ricardo's Index</h4>
|
||||||
Ricardo's Index
|
|
||||||
</FluentLabel>
|
|
||||||
</a>
|
</a>
|
||||||
</FluentHeader>
|
</div>
|
||||||
|
|
||||||
<FluentBodyContent>
|
<div class="col-4 d-flex justify-content-around align-items-center">
|
||||||
<main style="height: 100%">
|
<a href="mailto://shicangjuner@outlook.com" class="p-2" target="_blank">
|
||||||
|
<h5>E-mail</h5>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row px-4 center">
|
||||||
|
<div class="py-2">
|
||||||
@Body
|
@Body
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Foonter/>
|
||||||
</main>
|
</main>
|
||||||
</FluentBodyContent>
|
|
||||||
</FluentLayout>
|
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
.center {
|
||||||
|
margin: 0 auto;
|
||||||
|
max-width: 48em;
|
||||||
|
min-height: calc(100vh - 80px);
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
|
@ -1,40 +1,87 @@
|
||||||
@page "/blog/about"
|
@page "/blog/about"
|
||||||
@using YaeBlog.Core.Models
|
|
||||||
|
|
||||||
@inject BlogOptions BlogOptionsInstance
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
<PageTitle>
|
<div class="col">
|
||||||
关于 - @(BlogOptionsInstance.Author)
|
<h1>关于</h1>
|
||||||
</PageTitle>
|
|
||||||
|
|
||||||
<div style="height: 100%">
|
|
||||||
<div class="about-background" style="background-image: url('@(BlogOptionsInstance.EssayImage)')">
|
|
||||||
<div class="about-content">
|
|
||||||
<FluentCard>
|
|
||||||
<FluentStack Orientation="@Orientation.Vertical"
|
|
||||||
HorizontalAlignment="@HorizontalAlignment.Center">
|
|
||||||
<div class="about-avatar">
|
|
||||||
<img src="@(BlogOptionsInstance.About.AvatarImage)" alt="author-avatar"
|
|
||||||
class="about-avatar-img">
|
|
||||||
</div>
|
|
||||||
<FluentLabel Typo="@Typography.H2">
|
|
||||||
@(BlogOptionsInstance.Author)
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.Body">
|
|
||||||
@(BlogOptionsInstance.About.Introduction)
|
|
||||||
</FluentLabel>
|
|
||||||
</FluentStack>
|
|
||||||
|
|
||||||
<div style="height: 2rem"></div>
|
|
||||||
<FluentLabel Typo="@Typography.Body">
|
|
||||||
@(BlogOptionsInstance.About.Description)
|
|
||||||
</FluentLabel>
|
|
||||||
</FluentCard>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BlogFooter/>
|
<div class="row">
|
||||||
|
<div class="col fst-italic py-4">
|
||||||
|
把字刻在石头上!
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row p-2">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<h3>关于我</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row py-2">
|
||||||
|
<div class="col">
|
||||||
|
计算机科学与技术在读大学生,明光村幼儿园附属大学所属。正处于读书和失业的叠加态。
|
||||||
|
一般在互联网上使用<span class="fst-italic">初冬的朝阳</span>或者<span class="fst-italic">jackfiled</span>的名字活动。
|
||||||
|
<span class="text-decoration-line-through">都是ICP备案过的人了,网名似乎没有太大的用处(</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row py-2">
|
||||||
|
<div class="col">
|
||||||
|
主要是一个C#程序员,目前也在尝试写一点Rust。总体上对于编程语言的态度是“<span>大家都是我的翅膀.jpg</span>”。
|
||||||
|
前后端分离的项目本当上手。
|
||||||
|
常常因为现实的压力而写一些C/C++。
|
||||||
|
对于Java和Go的评价很低。
|
||||||
|
日常使用ArchLinux。
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row py-2">
|
||||||
|
<div class="col">
|
||||||
|
100%社恐。日常生活是宅在电脑前面自言自语。兴趣活动是读书和看番。
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row py-2">
|
||||||
|
<div class="col">
|
||||||
|
常常被人批评没有梦想,这里就随便瞎编一下。
|
||||||
|
成为嵌入式工程师,修好桌面上的<a href="https://www.bilibili.com/video/BV1VA411p7MD">HoloCubic</a>。
|
||||||
|
完成第一个不是课程设计的个人开源项目。
|
||||||
|
遇到能够搭伙过日子的人也算是一大梦想,虽然社恐人根本不知道从何开始的说,
|
||||||
|
<span class="text-decoration-line-through">什么时候天上才能掉美少女?</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row py-2">
|
||||||
|
<div class="col">
|
||||||
|
公开的联系渠道是<a href="mailto:shicangjuner@outlook.com">电子邮件</a>。
|
||||||
|
也可以试试在各大平台搜索上面提到的名字。
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row p-2">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<h3>关于本站</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row py-2">
|
||||||
|
<div class="col">
|
||||||
|
本站肇始于2021年下半年,在开始的两年中个人网站和博客是分别的两个网站,个人网站是裸HTML写的,博客是用
|
||||||
|
<a href="https://hexo.io">Hexo</a>渲染的。
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row py-2">
|
||||||
|
<div class="col">
|
||||||
|
2024年,我们决定使用.NET技术完全重构两个网站,合二为一。虽然目前这个版本还是一个半成品,但是我们一定会努力的~(确信。
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
.about-background {
|
|
||||||
position: relative;
|
|
||||||
height: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: cover;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-content {
|
|
||||||
top: 33%;
|
|
||||||
position: absolute;
|
|
||||||
width: 80%;
|
|
||||||
margin: 0 10%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-avatar {
|
|
||||||
position: relative;
|
|
||||||
width: 10rem;
|
|
||||||
height: 10rem;
|
|
||||||
z-index: 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-avatar-img {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
border-radius: 50%;
|
|
||||||
background-color: transparent;
|
|
||||||
object-fit: cover;
|
|
||||||
box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16),
|
|
||||||
0 2px 10px 0 rgba(0, 0, 0, 0.12);
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-avatar-img:hover {
|
|
||||||
animation: rotate-animation 1s ease-in-out;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes rotate-animation {
|
|
||||||
from {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
|
|
||||||
to {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -2,64 +2,59 @@
|
||||||
@using YaeBlog.Core.Models
|
@using YaeBlog.Core.Models
|
||||||
@using YaeBlog.Core.Services
|
@using YaeBlog.Core.Services
|
||||||
|
|
||||||
@inject BlogOptions BlogOptionsInstance
|
|
||||||
@inject EssayContentService EssayContentInstance
|
@inject EssayContentService EssayContentInstance
|
||||||
|
|
||||||
<PageTitle>
|
<div class="container">
|
||||||
存档
|
<div class="row">
|
||||||
</PageTitle>
|
<div class="col">
|
||||||
|
<div class="container">
|
||||||
<div style="height: 100%">
|
<div class="row">
|
||||||
<div class="archive-background" style="background-image: url('@(BlogOptionsInstance.EssayImage)')">
|
<div class="col">
|
||||||
<div class="archive-title">
|
<h1>归档</h1>
|
||||||
<FluentStack Orientation="@Orientation.Vertical"
|
|
||||||
HorizontalAlignment="@HorizontalAlignment.Center">
|
|
||||||
<FluentLabel Typo="@Typography.H1" Color="@Color.Fill">
|
|
||||||
存 档
|
|
||||||
</FluentLabel>
|
|
||||||
</FluentStack>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="height: 2rem"></div>
|
<div class="row">
|
||||||
|
<div class="col fst-italic py-4">
|
||||||
<div style="margin: 0 8% 0 8%">
|
时光图书馆,黑历史集散地。
|
||||||
<FluentCard>
|
</div>
|
||||||
<div style="margin: 0 8% 0 8%">
|
</div>
|
||||||
<FluentLabel Typo="@Typography.H2" Style="margin: 3rem 0 2rem 0; color: #404853">
|
</div>
|
||||||
共计@(EssayContentInstance.Count)篇文章
|
</div>
|
||||||
</FluentLabel>
|
</div>
|
||||||
|
|
||||||
@foreach (IGrouping<DateTime, KeyValuePair<string, BlogEssay>> group in _essays)
|
@foreach (IGrouping<DateTime, KeyValuePair<string, BlogEssay>> group in _essays)
|
||||||
{
|
{
|
||||||
<FluentLabel Typo="@Typography.H3" Style="color: #718096; margin: 2rem 0 1rem 0">
|
<div class="row">
|
||||||
@(group.Key.ToString("yyyy年"))
|
<div class="col">
|
||||||
</FluentLabel>
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<h3>@(group.Key.Year)</h3>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div style="margin: 0 4% 0 4%">
|
<div class="container px-3 py-2">
|
||||||
@foreach (KeyValuePair<string, BlogEssay> pair in group)
|
@foreach (KeyValuePair<string, BlogEssay> essay in group)
|
||||||
{
|
{
|
||||||
<div class="archive-item">
|
<div class="row py-1">
|
||||||
<a href="/blog/essays/@(pair.Key)" target="_blank">
|
<div class="col-auto">
|
||||||
<FluentStack Orientation="@Orientation.Horizontal">
|
@(essay.Value.PublishTime.ToString("MM-dd"))
|
||||||
<FluentLabel Typo="@Typography.H5" Style="width: 80px">
|
</div>
|
||||||
@(pair.Value.PublishTime.ToString("MM-dd"))
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.H5">
|
<div class="col-auto">
|
||||||
@(pair.Value.Title)
|
<a href="/blog/@(essay.Key)">
|
||||||
</FluentLabel>
|
@(essay.Value.Title)
|
||||||
</FluentStack>
|
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</FluentCard>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
<BlogFooter/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
@ -67,12 +62,11 @@
|
||||||
|
|
||||||
protected override void OnInitialized()
|
protected override void OnInitialized()
|
||||||
{
|
{
|
||||||
IEnumerable<IGrouping<DateTime, KeyValuePair<string, BlogEssay>>> essays =
|
base.OnInitialized();
|
||||||
from essay in EssayContentInstance.Essays
|
|
||||||
|
_essays.AddRange(from essay in EssayContentInstance.Essays
|
||||||
orderby essay.Value.PublishTime descending
|
orderby essay.Value.PublishTime descending
|
||||||
group essay by new DateTime(essay.Value.PublishTime.Year, 1, 1);
|
group essay by new DateTime(essay.Value.PublishTime.Year, 1, 1));
|
||||||
|
|
||||||
_essays.AddRange(essays);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
.archive-background {
|
|
||||||
position: relative;
|
|
||||||
height: 60%;
|
|
||||||
overflow: hidden;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: cover;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-title {
|
|
||||||
top: 43%;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-item {
|
|
||||||
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
|
|
||||||
margin: 0.5rem 0 0.5rem 0;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.archive-item:hover {
|
|
||||||
background-color: rgba(169, 169, 169, 0.22);
|
|
||||||
}
|
|
||||||
|
|
|
@ -2,178 +2,111 @@
|
||||||
@using YaeBlog.Core.Models
|
@using YaeBlog.Core.Models
|
||||||
@using YaeBlog.Core.Services
|
@using YaeBlog.Core.Services
|
||||||
|
|
||||||
@inject BlogOptions BlogOptionsInstance
|
|
||||||
@inject EssayContentService EssayContentInstance
|
@inject EssayContentService EssayContentInstance
|
||||||
@inject NavigationManager NavigationManagerInstance
|
@inject NavigationManager NavigationInstance
|
||||||
|
|
||||||
<PageTitle>
|
<div class="container">
|
||||||
@(BlogOptionsInstance.Author)'s Blog
|
<div class="row">
|
||||||
</PageTitle>
|
<div class="col-sm-12 col-md-9">
|
||||||
|
@foreach (KeyValuePair<string, BlogEssay> pair in _essays)
|
||||||
<div style="height: 100%">
|
|
||||||
<div class="banner" style="background-image: url('@BlogOptionsInstance.BannerImage')">
|
|
||||||
<div class="blog-title">
|
|
||||||
<FluentLabel Typo="@Typography.H1" Style="color: white">
|
|
||||||
@(BlogOptionsInstance.Author)'s Blog
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="scroll-down">
|
|
||||||
<i class="scroll-down-tag"></i>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="height: 2rem" id="blog-content"></div>
|
|
||||||
|
|
||||||
<div style="margin: 0 8% 0 8%">
|
|
||||||
<FluentGrid>
|
|
||||||
<FluentGridItem xs="12" sm="12" md="9" lg="9">
|
|
||||||
<div>
|
|
||||||
@foreach (KeyValuePair<string, BlogEssay> essay in _essays)
|
|
||||||
{
|
{
|
||||||
<FluentCard Style="margin: 2rem 0 2rem 0">
|
<EssayCard Essay="@(pair.Value)"/>
|
||||||
<div>
|
|
||||||
<a href="/blog/essays/@(essay.Key)" target="_blank">
|
|
||||||
<FluentLabel Typo="@Typography.H4">
|
|
||||||
@(essay.Value.Title)
|
|
||||||
</FluentLabel>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<div style="margin: 0.5rem 0 0.5rem 0">
|
|
||||||
<a href="/blog/essays/@(essay.Key)" target="_blank" style="color: #718096;">
|
|
||||||
<div class="essay-description">
|
|
||||||
@(essay.Value.Description)
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<FluentStack VerticalAlignment="@VerticalAlignment.Center"
|
|
||||||
Style="margin: 1rem 0 1rem 0"
|
|
||||||
HorizontalGap="4">
|
|
||||||
<FluentIcon Value="@(new Icons.Regular.Size16.Calendar())"/>
|
|
||||||
<span style="margin: auto 0 auto 0">
|
|
||||||
@(essay.Value.PublishTime.ToString("yyyy-MM-dd HH:mm:ss"))
|
|
||||||
</span>
|
|
||||||
@if (essay.Value.Tags.Count != 0)
|
|
||||||
{
|
|
||||||
<FluentIcon Value="@(new Icons.Regular.Size16.TagMultiple())"/>
|
|
||||||
@foreach (string tag in essay.Value.Tags)
|
|
||||||
{
|
|
||||||
<span style="margin: auto 0 auto 0">
|
|
||||||
@tag
|
|
||||||
</span>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</FluentStack>
|
|
||||||
</div>
|
|
||||||
</FluentCard>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="pagination">
|
<div class="row align-items-center justify-content-center p-3">
|
||||||
<FluentStack HorizontalAlignment="@HorizontalAlignment.Center"
|
@if (_page == 1)
|
||||||
HorizontalGap="20">
|
|
||||||
@if (Page != 1)
|
|
||||||
{
|
{
|
||||||
<a href="/blog/?page=@(Page - 1)#blog-content" class="pagination-item">
|
<div class="col-auto fw-light">上一页</div>
|
||||||
<i class="chevron-left"></i>
|
|
||||||
</a>
|
|
||||||
}
|
|
||||||
|
|
||||||
@if (Page == 1)
|
|
||||||
{
|
|
||||||
<a href="/blog/?page=1#blog-content" class="pagination-item">
|
|
||||||
<span>1</span>
|
|
||||||
</a>
|
|
||||||
<a href="/blog/?page=2#blog-content" class="pagination-item">
|
|
||||||
<span>2</span>
|
|
||||||
</a>
|
|
||||||
<a href="/blog/?page=3#blog-content" class="pagination-item">
|
|
||||||
<span>3</span>
|
|
||||||
</a>
|
|
||||||
}
|
|
||||||
else if (Page == _pageCount)
|
|
||||||
{
|
|
||||||
<a href="/blog/?page=@(_pageCount - 2)#blog-content" class="pagination-item">
|
|
||||||
<span>@(_pageCount - 2)</span>
|
|
||||||
</a>
|
|
||||||
<a href="/blog/?page=@(_pageCount - 1)#blog-content" class="pagination-item">
|
|
||||||
<span>@(_pageCount - 1)</span>
|
|
||||||
</a>
|
|
||||||
<a href="/blog/?page=@(_pageCount)#blog-content" class="pagination-item">
|
|
||||||
<span>@(_pageCount)</span>
|
|
||||||
</a>
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<a href="/blog/?page=@(Page - 1)#blog-content" class="pagination-item">
|
<div class="col-auto">
|
||||||
<span>@(Page - 1)</span>
|
<a href="/blog/?page=@(_page - 1)">上一页</a>
|
||||||
</a>
|
</div>
|
||||||
<a href="/blog/?page=@(Page)#blog-content" class="pagination-item">
|
|
||||||
<span>@(Page)</span>
|
|
||||||
</a>
|
|
||||||
<a href="/blog/?page=@(Page + 1)#blog-content" class="pagination-item">
|
|
||||||
<span>@(Page + 1)</span>
|
|
||||||
</a>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@if (Page != _pageCount)
|
@if (_page == 1)
|
||||||
{
|
{
|
||||||
<a href="/blog/?page=@(Page + 1)#blog-content" class="pagination-item">
|
<div class="col-auto">
|
||||||
<i class="chevron-right"></i>
|
1
|
||||||
</a>
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/blog/?page=2">2</a>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/blog/?page=3">3</a>
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
</FluentStack>
|
else if (_page == _pageCount)
|
||||||
|
{
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/blog/?page=@(_pageCount - 2)">@(_pageCount - 2)</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/blog/?page=@(_pageCount - 1)">@(_pageCount - 1)</a>
|
||||||
</div>
|
</div>
|
||||||
</FluentGridItem>
|
<div class="col-auto">
|
||||||
<FluentGridItem xs="12" sm="12" md="3" lg="3">
|
@(_pageCount)
|
||||||
<FluentStack Orientation="@Orientation.Vertical">
|
</div>
|
||||||
<AuthorInformation/>
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/blog/?page=@(_page - 1)">@(_page - 1)</a>
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
@(_page)
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/blog/?page=@(_page + 1)">@(_page + 1)</a>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
<Announcement/>
|
@if (_page == _pageCount)
|
||||||
</FluentStack>
|
{
|
||||||
</FluentGridItem>
|
<div class="col-auto fw-light">
|
||||||
</FluentGrid>
|
下一页
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/blog/?page=@(_page + 1)">下一页</a>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<BlogFooter/>
|
<div class="col-sm-12 col-md-3">
|
||||||
|
<BlogInformationCard/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
|
||||||
[SupplyParameterFromQuery] private int? Page { get; set; }
|
[SupplyParameterFromQuery] private int? Page { get; set; }
|
||||||
|
|
||||||
private readonly List<KeyValuePair<string, BlogEssay>> _essays = [];
|
private readonly List<KeyValuePair<string, BlogEssay>> _essays = [];
|
||||||
private int _pageCount;
|
private const int EssaysPerPage = 8;
|
||||||
|
private int _pageCount = 1;
|
||||||
|
private int _page = 1;
|
||||||
|
|
||||||
protected override void OnInitialized()
|
protected override void OnInitialized()
|
||||||
{
|
{
|
||||||
Page ??= 1;
|
_page = Page ?? 1;
|
||||||
|
_pageCount = EssayContentInstance.Essays.Count / EssaysPerPage + 1;
|
||||||
|
|
||||||
IEnumerable<KeyValuePair<string, BlogEssay>[]> chunks =
|
if (EssaysPerPage * _page > EssayContentInstance.Essays.Count + EssaysPerPage)
|
||||||
EssayContentInstance.Essays
|
|
||||||
.OrderByDescending(pair => pair.Value.PublishTime)
|
|
||||||
.Chunk(10);
|
|
||||||
|
|
||||||
var count = 1;
|
|
||||||
var flag = false;
|
|
||||||
foreach (KeyValuePair<string, BlogEssay>[] chunk in chunks)
|
|
||||||
{
|
{
|
||||||
if (Page == count)
|
NavigationInstance.NavigateTo("/NotFount");
|
||||||
{
|
return;
|
||||||
flag = true;
|
|
||||||
_essays.AddRange(chunk);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
count += 1;
|
_essays.AddRange(EssayContentInstance.Essays
|
||||||
}
|
.OrderByDescending(p => p.Value.PublishTime)
|
||||||
|
.Skip((_page - 1) * EssaysPerPage)
|
||||||
_pageCount = count - 1;
|
.Take(EssaysPerPage));
|
||||||
|
|
||||||
if (flag is false)
|
|
||||||
{
|
|
||||||
NavigationManagerInstance.NavigateTo("/NotFount");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,96 +1,7 @@
|
||||||
.banner {
|
.essay-title a {
|
||||||
position: relative;
|
color: var(--bs-body-color);
|
||||||
height: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
background-size: cover;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-attachment: fixed;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.blog-title {
|
.read-more a {
|
||||||
color: white;
|
color: var(--bs-body-color);
|
||||||
text-align: center;
|
|
||||||
top: 43%;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scroll-down {
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scroll-down-tag {
|
|
||||||
font-family: "Font Awesome 6 Free", sans-serif;
|
|
||||||
font-size: 36px;
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 900;
|
|
||||||
color: white;
|
|
||||||
text-align: center;
|
|
||||||
position: relative;
|
|
||||||
display: inline-block;
|
|
||||||
width: 100%;
|
|
||||||
animation: scroll-down-animation 1.5s infinite;
|
|
||||||
}
|
|
||||||
|
|
||||||
.scroll-down-tag::before {
|
|
||||||
content: "\f107";
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes scroll-down-animation {
|
|
||||||
0% {
|
|
||||||
top: 0;
|
|
||||||
opacity: 0.4;
|
|
||||||
}
|
|
||||||
|
|
||||||
50% {
|
|
||||||
top: -20px;
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
100% {
|
|
||||||
top: 0;
|
|
||||||
opacity: 0.4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.essay-description {
|
|
||||||
width: 100%;
|
|
||||||
line-height: 1.4rem;
|
|
||||||
word-break: break-word;
|
|
||||||
display: -webkit-box;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
-webkit-line-clamp: 2;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination {
|
|
||||||
font-size: 2em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.pagination-item {
|
|
||||||
margin: auto 0 auto 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chevron-left {
|
|
||||||
font-size: 1.2rem;
|
|
||||||
font-family: "Font Awesome 6 Free", sans-serif;
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 900;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chevron-left::before {
|
|
||||||
content: "\f053";
|
|
||||||
}
|
|
||||||
|
|
||||||
.chevron-right {
|
|
||||||
font-size: 1.2rem;
|
|
||||||
font-family: "Font Awesome 6 Free", sans-serif;
|
|
||||||
font-style: normal;
|
|
||||||
font-weight: 900;
|
|
||||||
}
|
|
||||||
|
|
||||||
.chevron-right::before {
|
|
||||||
content: "\f054";
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,83 +0,0 @@
|
||||||
@page "/blog/essays/{Filename}"
|
|
||||||
@using YaeBlog.Core.Models
|
|
||||||
@using YaeBlog.Core.Services
|
|
||||||
|
|
||||||
@inject BlogOptions BlogOptionsInstance
|
|
||||||
@inject EssayContentService EssayContent
|
|
||||||
@inject NavigationManager NavigationInstance
|
|
||||||
|
|
||||||
<PageTitle>
|
|
||||||
@(_essay!.Title)
|
|
||||||
</PageTitle>
|
|
||||||
|
|
||||||
<div style="height: 100%">
|
|
||||||
<div class="essay-background" style="background-image: url('@(BlogOptionsInstance.EssayImage)')">
|
|
||||||
<div class="essay-title">
|
|
||||||
<FluentStack Orientation="@Orientation.Vertical"
|
|
||||||
HorizontalAlignment="@HorizontalAlignment.Center">
|
|
||||||
<FluentLabel Typo="@Typography.H1" Style="color: white">
|
|
||||||
@(_essay!.Title)
|
|
||||||
</FluentLabel>
|
|
||||||
<div class="essay-subtitle">
|
|
||||||
<FluentIcon Value="@(new Icons.Regular.Size16.Calendar())"
|
|
||||||
Color="@Color.Fill"/>
|
|
||||||
<FluentLabel Typo="@Typography.H5" Style="color: white; margin-left: 0.25rem">
|
|
||||||
@(_essay!.PublishTime.ToString("yyyy年MM月dd日"))
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
|
||||||
<div class="essay-subtitle">
|
|
||||||
<FluentIcon Value="@(new Icons.Regular.Size16.DataBarVerticalAscending())"
|
|
||||||
Color="@Color.Fill"/>
|
|
||||||
<FluentLabel Typo="@Typography.H5" Style="color: white; margin-left: 0.25rem">
|
|
||||||
@(_essay!.WordCount)字
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
|
||||||
</FluentStack>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="height: 2rem"></div>
|
|
||||||
|
|
||||||
<div style="margin: 0 8% 0 8%">
|
|
||||||
<FluentGrid>
|
|
||||||
<FluentGridItem xs="12" sm="12" md="8" lg="8">
|
|
||||||
<FluentCard Style="margin: 2rem 0">
|
|
||||||
<div class="essay-content">
|
|
||||||
@((MarkupString)_essay!.HtmlContent)
|
|
||||||
</div>
|
|
||||||
</FluentCard>
|
|
||||||
</FluentGridItem>
|
|
||||||
|
|
||||||
<FluentGridItem xs="12" sm="12" md="4" lg="4">
|
|
||||||
<FluentStack Orientation="@Orientation.Vertical">
|
|
||||||
<AuthorInformation/>
|
|
||||||
|
|
||||||
<Announcement/>
|
|
||||||
</FluentStack>
|
|
||||||
</FluentGridItem>
|
|
||||||
</FluentGrid>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<BlogFooter/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
[Parameter] public string? Filename { get; set; }
|
|
||||||
|
|
||||||
private BlogEssay? _essay;
|
|
||||||
|
|
||||||
protected override void OnInitialized()
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(Filename))
|
|
||||||
{
|
|
||||||
NavigationInstance.NavigateTo("NotFound");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!EssayContent.TryGet(Filename, out _essay))
|
|
||||||
{
|
|
||||||
NavigationInstance.NavigateTo("NotFound");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,24 +0,0 @@
|
||||||
.essay-background {
|
|
||||||
position: relative;
|
|
||||||
height: 80%;
|
|
||||||
overflow: hidden;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: cover;
|
|
||||||
}
|
|
||||||
|
|
||||||
.essay-title {
|
|
||||||
color: white;
|
|
||||||
top: 43%;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.essay-content {
|
|
||||||
font-size: 1rem;
|
|
||||||
line-height: 1.6;
|
|
||||||
}
|
|
||||||
|
|
||||||
.essay-subtitle {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
61
YaeBlog/Pages/Essays.razor
Normal file
61
YaeBlog/Pages/Essays.razor
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
@page "/blog/essays/{BlogKey}"
|
||||||
|
@using YaeBlog.Core.Models
|
||||||
|
@using YaeBlog.Core.Services
|
||||||
|
|
||||||
|
@inject NavigationManager NavigationInstance
|
||||||
|
@inject EssayContentService EssayContentInstance
|
||||||
|
|
||||||
|
<PageTitle>
|
||||||
|
@(_essay!.Title)
|
||||||
|
</PageTitle>
|
||||||
|
|
||||||
|
<div class="container py-4">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-auto">
|
||||||
|
<h1>@(_essay!.Title)</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row p-4">
|
||||||
|
<div class="col-auto fw-light">
|
||||||
|
@(_essay!.PublishTime.ToString("yyyy-MM-dd"))
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@foreach (string tag in _essay!.Tags)
|
||||||
|
{
|
||||||
|
<div class="col-auto">
|
||||||
|
<a href="/tags/?tagName=@(tag)"># @(tag)</a>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-8 col-md-12">
|
||||||
|
@((MarkupString)_essay!.HtmlContent)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[Parameter]
|
||||||
|
public string? BlogKey { get; set; }
|
||||||
|
|
||||||
|
private BlogEssay? _essay;
|
||||||
|
|
||||||
|
protected override void OnInitialized()
|
||||||
|
{
|
||||||
|
base.OnInitialized();
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(BlogKey))
|
||||||
|
{
|
||||||
|
NavigationInstance.NavigateTo("/NotFound");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!EssayContentInstance.TryGet(BlogKey, out _essay))
|
||||||
|
{
|
||||||
|
NavigationInstance.NavigateTo("/NotFound");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
0
YaeBlog/Pages/Essays.razor.css
Normal file
0
YaeBlog/Pages/Essays.razor.css
Normal file
|
@ -1,89 +1,53 @@
|
||||||
@page "/"
|
@page "/"
|
||||||
|
|
||||||
<PageTitle>
|
<div class="container">
|
||||||
初冬的朝阳个人主页
|
<div class="row py-4">
|
||||||
</PageTitle>
|
<div class="col-4">
|
||||||
|
<Image Src="images/avatar.png" Alt="Ricardo's Avatar"/>
|
||||||
<FluentStack Orientation="@Orientation.Vertical" Width="100%" Style="min-height: 100%">
|
|
||||||
<div style="width: 100%; height: auto">
|
|
||||||
<FluentGrid>
|
|
||||||
<FluentGridItem md="3" xs="12">
|
|
||||||
<FluentStack Orientation="@Orientation.Horizontal" HorizontalAlignment="@HorizontalAlignment.Center">
|
|
||||||
<img src="images/avatar.png" alt="Ricardo's Avatar" class="avatar-image"/>
|
|
||||||
</FluentStack>
|
|
||||||
</FluentGridItem>
|
|
||||||
|
|
||||||
<FluentGridItem md="9" xs="12">
|
|
||||||
<FluentStack Orientation="@Orientation.Vertical" Style="padding: 25px" VerticalGap="20">
|
|
||||||
<FluentLabel Typo="@Typography.H3" Weight="@FontWeight.Bold">
|
|
||||||
初冬的朝阳 (Ricardo Ren)
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.Body">
|
|
||||||
a.k.a jackfiled
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.Body" Style="font-style: italic">
|
|
||||||
世界很大,时间很长。
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.Body">
|
|
||||||
一个平平无奇的CS学生。
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.Body">
|
|
||||||
还太菜了,连微小的贡献都没做。
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<div style="height: 20px"></div>
|
|
||||||
|
|
||||||
<FluentStack Orientation="@Orientation.Horizontal" HorizontalGap="20">
|
|
||||||
<FluentLabel Typo="@Typography.Body">
|
|
||||||
<a href="https://github.com/jackfiled">Github</a>
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.Body">
|
|
||||||
<a href="https://git.rrricardo.top/jackfiled">Gitea</a>
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.Body">
|
|
||||||
<a href="mailto://shicangjuner@outlook.com">E-Mail</a>
|
|
||||||
</FluentLabel>
|
|
||||||
</FluentStack>
|
|
||||||
</FluentStack>
|
|
||||||
</FluentGridItem>
|
|
||||||
</FluentGrid>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<FluentStack Orientation="@Orientation.Horizontal" HorizontalAlignment="@HorizontalAlignment.Center">
|
<div class="col-8">
|
||||||
<FluentDivider Style="width: 90%" Orientation="@Orientation.Horizontal" Role="@DividerRole.Separator"/>
|
<div class="container px-3">
|
||||||
</FluentStack>
|
<div class="row">
|
||||||
|
<h4 class="fw-bold">初冬的朝阳 (Ricardo Ren)</h4>
|
||||||
<div style="width: 100%; height: auto">
|
|
||||||
<FluentGrid Justify="@JustifyContent.Center">
|
|
||||||
<WebsiteCard Name="部落格" Address="/blog/" ImageAddress="/images/blog-icon.png"
|
|
||||||
Description="奇奇怪怪东西的聚集地"/>
|
|
||||||
<WebsiteCard Name="笔记本" Address="https://jackfiled.github.io/wiki/" ImageAddress="/images/wiki-icon.png"
|
|
||||||
Description="技校学习笔记"/>
|
|
||||||
</FluentGrid>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<p class="fs-5">a.k.a jackfiled</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div style="flex: 1"></div>
|
<div class="row">
|
||||||
|
<p class="fs-5 fst-italic">世界很大,时间很长。</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<FluentStack Orientation="@Orientation.Horizontal" HorizontalAlignment="@HorizontalAlignment.Center">
|
<div class="row">
|
||||||
<FluentStack Orientation="@Orientation.Vertical" HorizontalAlignment="@HorizontalAlignment.Center"
|
<p class="fs-5">
|
||||||
Style="padding: 20px">
|
平平无奇的计算机科学与技术学徒,连微小的贡献都没做。
|
||||||
<FluentLabel>
|
</p>
|
||||||
2021 - @(DateTimeOffset.Now.Year) By <a href="https://rrricardo.top">Ricardo Ren</a>
|
</div>
|
||||||
</FluentLabel>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<FluentLabel>
|
<div class="row" style="padding-top: 80px">
|
||||||
<a href="https://beian.miit.gov.cn">蜀ICP备2022004429号-1</a>
|
<p class="fs-5">恕我不能亲自为您沏茶(?),还是非常欢迎您能够来到我的主页。</p>
|
||||||
</FluentLabel>
|
</div>
|
||||||
</FluentStack>
|
|
||||||
</FluentStack>
|
<div class="row">
|
||||||
</FluentStack>
|
<p class="fs-5">
|
||||||
|
如果您想四处看看,了解一下屏幕对面的人,可以在我的 <a href="/blog/">博客</a> 看看。
|
||||||
|
如果您对于明光村幼儿园某附属技校的计算机教学感兴趣,您可以移步到
|
||||||
|
<a href="https://jackfiled.github.io/wiki/">我的学习笔记</a>,
|
||||||
|
<span class="fs-5 text-decoration-line-through">虽然这笔记我自己也木有看过。</span>
|
||||||
|
如果您想批判一下我的代码,在 <a href="https://github.com/jackfiled" target="_blank">Github</a> 和
|
||||||
|
<a href="https://git.rrricardo.top/jackfiled/" target="_blank">Gitea</a> 都可以找到。
|
||||||
|
</p>
|
||||||
|
<p class="fs-5">
|
||||||
|
如果您真的很闲,也可以四处搜寻一下,也许存在着一些不为人知的彩蛋。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
.index-container {
|
|
||||||
background-color: #f0f2f5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.avatar-image {
|
|
||||||
margin: 25px;
|
|
||||||
width: 100%;
|
|
||||||
height: auto;
|
|
||||||
max-width: 300px;
|
|
||||||
max-height: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.footer-zone {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
@page "/blog/links"
|
|
||||||
@using YaeBlog.Core.Models
|
|
||||||
|
|
||||||
@inject BlogOptions BlogOptionsInstance
|
|
||||||
|
|
||||||
<PageTitle>
|
|
||||||
友链
|
|
||||||
</PageTitle>
|
|
||||||
|
|
||||||
<div style="height: 100%">
|
|
||||||
<div class="link-background" style="background-image: url('@(BlogOptionsInstance.EssayImage)')">
|
|
||||||
<div class="link-content">
|
|
||||||
<FluentStack Orientation="@Orientation.Vertical"
|
|
||||||
HorizontalAlignment="@HorizontalAlignment.Center">
|
|
||||||
<FluentLabel Typo="@Typography.H2" Style="color: white">
|
|
||||||
友 情 链 接
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<div style="height: 5rem"></div>
|
|
||||||
|
|
||||||
<FluentCard Style="padding: 3rem;">
|
|
||||||
<FluentGrid>
|
|
||||||
@foreach (FriendLink link in BlogOptionsInstance.Links)
|
|
||||||
{
|
|
||||||
<FluentGridItem xs="12" sm="6" md="4" lg="3">
|
|
||||||
<a href="@(link.Link)" target="_blank">
|
|
||||||
<div class="link-item">
|
|
||||||
<div class="link-item-image">
|
|
||||||
<img src="@(link.AvatarImage)" alt="@(link.Name)">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="margin: 0.5rem">
|
|
||||||
<FluentLabel Typo="@Typography.H4">
|
|
||||||
@(link.Name)
|
|
||||||
</FluentLabel>
|
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.Body" Style="color: #718096">
|
|
||||||
@(link.Description)
|
|
||||||
</FluentLabel>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</FluentGridItem>
|
|
||||||
}
|
|
||||||
</FluentGrid>
|
|
||||||
</FluentCard>
|
|
||||||
</FluentStack>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<BlogFooter/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@code {
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
.link-background {
|
|
||||||
position: relative;
|
|
||||||
height: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: cover;
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-content {
|
|
||||||
top: 23%;
|
|
||||||
position: absolute;
|
|
||||||
width: 80%;
|
|
||||||
margin: 0 10%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-item {
|
|
||||||
display: flex;
|
|
||||||
padding: 1rem;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-item:hover {
|
|
||||||
background-color: rgba(172, 172, 172, 0.25);
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-item-image {
|
|
||||||
width: 4rem;
|
|
||||||
height: 4rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
.link-item-image img {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,7 @@
|
||||||
@page "/NotFound"
|
@page "/NotFound"
|
||||||
|
|
||||||
<div style="height: 100%">
|
<div class="container">
|
||||||
<div style="height: 2rem"></div>
|
<h3>NotFound!</h3>
|
||||||
|
|
||||||
<div style="margin: 0 8%">
|
|
||||||
<FluentCard>
|
|
||||||
<FluentLabel Typo="@Typography.H4">
|
|
||||||
前面的区域,以后再来探索吧,,
|
|
||||||
</FluentLabel>
|
|
||||||
</FluentCard>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
|
0
YaeBlog/Pages/NotFound.razor.css
Normal file
0
YaeBlog/Pages/NotFound.razor.css
Normal file
|
@ -1,96 +1,67 @@
|
||||||
@page "/blog/tags"
|
@page "/blog/tags/"
|
||||||
@using YaeBlog.Core.Models
|
@using YaeBlog.Core.Models
|
||||||
@using YaeBlog.Core.Services
|
@using YaeBlog.Core.Services
|
||||||
|
|
||||||
@inject BlogOptions BlogOptionsInstance
|
|
||||||
@inject EssayContentService EssayContentInstance
|
@inject EssayContentService EssayContentInstance
|
||||||
|
|
||||||
<PageTitle>
|
<div class="container">
|
||||||
标签
|
<div class="row">
|
||||||
</PageTitle>
|
<div class="col">
|
||||||
|
|
||||||
<div style="height: 100%">
|
|
||||||
<div class="tag-background" style="background-image: url('@(BlogOptionsInstance.EssayImage)')">
|
|
||||||
<div class="tag-title">
|
|
||||||
<FluentStack Orientation="@Orientation.Vertical"
|
|
||||||
HorizontalAlignment="@HorizontalAlignment.Center">
|
|
||||||
<FluentLabel Typo="@Typography.H1" Color="@Color.Fill">
|
|
||||||
@(TagName ?? "标 签")
|
|
||||||
</FluentLabel>
|
|
||||||
</FluentStack>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="height: 2rem"></div>
|
|
||||||
|
|
||||||
<div style="margin: 0 8% 0 8%">
|
|
||||||
<FluentCard>
|
|
||||||
<div style="margin: 0 8%">
|
|
||||||
@if (TagName is null)
|
@if (TagName is null)
|
||||||
{
|
{
|
||||||
<FluentStack Orientation="@Orientation.Horizontal"
|
<h1>标签</h1>
|
||||||
Wrap="true" Style="margin: 2rem 0">
|
|
||||||
@foreach (KeyValuePair<string, int> pair in EssayContentInstance.Tags)
|
|
||||||
{
|
|
||||||
<div class="tag-item">
|
|
||||||
<a href="/blog/tags?TagName=@(pair.Key)">
|
|
||||||
<span style="font-size: @(14 + pair.Value)px; color: @(RandomColor())">
|
|
||||||
@pair.Key
|
|
||||||
</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
</FluentStack>
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<FluentLabel Typo="@Typography.H2" Style="margin: 3rem 0 2rem 0; color: #404853">
|
<h2>@(TagName)</h2>
|
||||||
共计@(EssayContentInstance.GetTag(TagName).Count())篇文章
|
}
|
||||||
</FluentLabel>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
@foreach (BlogEssay essay in EssayContentInstance.GetTag(TagName))
|
<div class="row">
|
||||||
|
<div class="col fst-italic py-4">
|
||||||
|
在野外游荡的指针,走向未知的方向。
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if (TagName is null)
|
||||||
{
|
{
|
||||||
<div style="margin: 0 4% 0 4%">
|
<div>
|
||||||
<div class="tag-essay-item">
|
<ul>
|
||||||
<a href="/blog/essays/@(essay.FileName)" target="_blank">
|
@foreach (KeyValuePair<string, int> pair in EssayContentInstance.Tags)
|
||||||
<FluentStack Orientation="@Orientation.Horizontal">
|
{
|
||||||
<FluentLabel Typo="@Typography.H5" Style="width: 120px">
|
<li class="p-2">
|
||||||
@(essay.PublishTime.ToString("yyyy-MM-dd"))
|
<a href="/blog/tags/?tagName=@(pair.Key)">
|
||||||
</FluentLabel>
|
<div class="container fs-5">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-auto">
|
||||||
|
# @(pair.Key)
|
||||||
|
</div>
|
||||||
|
|
||||||
<FluentLabel Typo="@Typography.H5">
|
<div class="col-auto tag-count">
|
||||||
@(essay.Title)
|
@(pair.Value)
|
||||||
</FluentLabel>
|
</div>
|
||||||
</FluentStack>
|
</div>
|
||||||
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</li>
|
||||||
|
}
|
||||||
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div class="container">
|
||||||
|
@foreach (BlogEssay essay in EssayContentInstance.GetTag(TagName).OrderByDescending(e => e.PublishTime))
|
||||||
|
{
|
||||||
|
<EssayCard Essay="@essay"/>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
</FluentCard>
|
}
|
||||||
</div>
|
|
||||||
|
|
||||||
<BlogFooter/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
[SupplyParameterFromQuery]
|
[SupplyParameterFromQuery] public string? TagName { get; set; }
|
||||||
private string? TagName { get; set; }
|
|
||||||
|
|
||||||
private static string[] s_colors =
|
|
||||||
[
|
|
||||||
"#337ab7",
|
|
||||||
"#bbe",
|
|
||||||
"#4e87c2",
|
|
||||||
"#a0aee3",
|
|
||||||
"#6994cd",
|
|
||||||
"#85a1d8"
|
|
||||||
];
|
|
||||||
|
|
||||||
private static string RandomColor()
|
|
||||||
{
|
|
||||||
return Random.Shared.GetItems(s_colors, 1)[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,27 +1,6 @@
|
||||||
.tag-background {
|
.tag-count {
|
||||||
position: relative;
|
background: var(--bs-secondary-bg);
|
||||||
height: 60%;
|
border-radius: 5px;
|
||||||
overflow: hidden;
|
padding: 0 6px;
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: cover;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.tag-title {
|
|
||||||
top: 43%;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tag-item {
|
|
||||||
margin: 0.25rem auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tag-essay-item {
|
|
||||||
padding: 0.5rem 0.5rem 0.5rem 0.5rem;
|
|
||||||
margin: 0.5rem 0 0.5rem 0;
|
|
||||||
border-radius: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.tag-essay-item:hover {
|
|
||||||
background-color: rgba(169, 169, 169, 0.22);
|
|
||||||
}
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
|
||||||
builder.Services.AddRazorComponents()
|
builder.Services.AddRazorComponents()
|
||||||
.AddInteractiveServerComponents();
|
.AddInteractiveServerComponents();
|
||||||
builder.Services.AddControllers();
|
builder.Services.AddControllers();
|
||||||
|
builder.Services.AddBlazorBootstrap();
|
||||||
builder.AddYaeBlog();
|
builder.AddYaeBlog();
|
||||||
|
|
||||||
WebApplication application = builder.Build();
|
WebApplication application = builder.Build();
|
||||||
|
|
|
@ -4,6 +4,10 @@
|
||||||
<ProjectReference Include="..\YaeBlog.Core\YaeBlog.Core.csproj" />
|
<ProjectReference Include="..\YaeBlog.Core\YaeBlog.Core.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Blazor.Bootstrap" Version="3.0.0-preview.2" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
|
|
@ -6,6 +6,6 @@
|
||||||
@using static Microsoft.AspNetCore.Components.Web.RenderMode
|
@using static Microsoft.AspNetCore.Components.Web.RenderMode
|
||||||
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
@using Microsoft.AspNetCore.Components.Web.Virtualization
|
||||||
@using Microsoft.JSInterop
|
@using Microsoft.JSInterop
|
||||||
@using Microsoft.FluentUI.AspNetCore.Components
|
@using BlazorBootstrap
|
||||||
@using YaeBlog
|
@using YaeBlog
|
||||||
@using YaeBlog.Components
|
@using YaeBlog.Components
|
||||||
|
|
5
YaeBlog/wwwroot/bootstrap-icons.min.css
vendored
Normal file
5
YaeBlog/wwwroot/bootstrap-icons.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
7
YaeBlog/wwwroot/bootstrap.bundle.min.js
vendored
Normal file
7
YaeBlog/wwwroot/bootstrap.bundle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
YaeBlog/wwwroot/bootstrap.min.css
vendored
Normal file
6
YaeBlog/wwwroot/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
YaeBlog/wwwroot/fonts/bootstrap-icons.woff
Normal file
BIN
YaeBlog/wwwroot/fonts/bootstrap-icons.woff
Normal file
Binary file not shown.
BIN
YaeBlog/wwwroot/fonts/bootstrap-icons.woff2
(Stored with Git LFS)
Normal file
BIN
YaeBlog/wwwroot/fonts/bootstrap-icons.woff2
(Stored with Git LFS)
Normal file
Binary file not shown.
|
@ -2,31 +2,10 @@ body a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
html, body {
|
body main {
|
||||||
height: 100%;
|
flex: 1;
|
||||||
}
|
min-height: 100vh;
|
||||||
|
overflow-x: visible;
|
||||||
p {
|
|
||||||
font-size: 1rem;
|
|
||||||
line-height: 1.6;
|
|
||||||
}
|
|
||||||
|
|
||||||
*::-webkit-scrollbar {
|
|
||||||
width: 8px;
|
|
||||||
height: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
*::-webkit-scrollbar-thumb {
|
|
||||||
background-color: #80c8f8;
|
|
||||||
}
|
|
||||||
|
|
||||||
*::-webkit-scrollbar-track {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
* {
|
|
||||||
scrollbar-width: thin;
|
|
||||||
scrollbar-color: #80c8f8 transparent;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user