# Vampirewal.BlogCore
**Repository Path**: vampirewal/vampirewal.blogcore
## Basic Information
- **Project Name**: Vampirewal.BlogCore
- **Description**: 完全通过c#代码来启动一个博客页面,具体更新内容可拉取项目之后查看更新日志
- **Primary Language**: C#
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2024-06-25
- **Last Updated**: 2026-06-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[](https://www.nuget.org/packages/Vampirewal.BlogCore/)
[](https://www.nuget.org/packages/Vampirewal.BlogCore/)
[](LICENSE)
[](https://dotnet.microsoft.com/)
[](https://htmx.org/)
# Vampirewal.BlogCore
**用纯 C# 代码构建 VuePress 风格的博客系统,零前端依赖**
[快速开始](#-快速开始) · [功能特性](#-功能特性) · [控件列表](#-内置控件) · [主题切换](#-主题切换) · [Markdown支持](#-markdown支持) · [登录鉴权](#-登录鉴权)
---
## 📖 项目简介
Vampirewal.BlogCore 是一个基于 .NET 6.0+ 的博客框架,让你用纯 C# 代码构建功能完整的博客系统。
**v2.0 重大升级**:移除了 Vue / Element Plus / Axios / Highlight.js 等前端框架依赖,改用纯 HTML + CSS + htmx 实现 VuePress 风格主题,体积从 ~950KB 降至 ~35KB,首屏加载更快,永不受前端框架升级影响。
### 为什么选择 Vampirewal.BlogCore?
| 对比项 | 传统博客框架 | Vampirewal.BlogCore |
|--------|-------------|---------------------|
| 前端依赖 | Vue/React + UI库 (~1MB) | htmx (14KB) + CSS (~30KB) |
| 前端代码 | 需要写 JS/TS | 纯 C#,零前端代码 |
| 框架升级 | 可能破坏兼容性 | 无前端框架,永不过时 |
| 代码高亮 | 客户端 JS 渲染 | 服务端 C# 渲染 |
| 部署方式 | 前后端分离 | 单 DLL 部署 |
| SEO | SPA 不友好 | 纯 HTML,搜索引擎直接抓取 |
| 主题切换 | 需要前端框架支持 | CSS 变量驱动,4套内置主题 |
---
## ✨ 功能特性
### 🎯 核心功能
- **纯 C# 开发** - 无需编写任何前端代码,用 C# 构建完整博客
- **VuePress 风格主题** - 左侧菜单 + 右侧目录 + 顶部导航的经典文档布局
- **4 套内置主题** - 默认/蓝色/紫色/暗黑,一行代码切换,支持前端实时切换
- **VuePress 风格首页** - Hero 区域 + 特性展示,一键生成博客首页
- **动态控件系统** - 25+ 内置控件,覆盖表格、表单、容器、展示等场景
- **Markdown 支持** - 通过 Markdig 渲染 Markdown 文件,支持表格、YAML头部、Mermaid图表、热更新
- **服务端代码高亮** - 自研 C# 语法高亮器,支持 C#/JS/Go/SQL/Python/HTML/CSS/JSON/Bash
- **一键复制代码** - 代码块自带复制按钮
- **页面缓存机制** - 支持页面级缓存,提升访问性能
- **登录鉴权** - 支持全局鉴权和页面级鉴权,内置 VuePress 风格登录页
- **响应式布局** - 适配桌面端和移动端
### 🛠 交互能力
- **htmx 局部刷新** - 点击菜单只更新内容区,无需整页刷新
- **轮播图** - 支持前后切换和指示器
- **折叠面板** - 点击展开/折叠
- **标签页** - 多标签页切换
- **表单提交** - htmx 原生表单提交
- **主题实时切换** - 导航栏下拉菜单切换主题,localStorage 持久化
---
## 🖥 支持环境
| 环境 | 版本要求 |
|------|----------|
| .NET SDK | 6.0 及以上 |
| 操作系统 | Windows / Linux / macOS |
| 浏览器 | Chrome 90+ / Edge 90+ / Firefox 88+ |
---
## 🚀 快速开始
### 1. 安装 NuGet 包
```bash
dotnet add package Vampirewal.BlogCore
```
### 2. 创建博客项目
```csharp
using Vampirewal.BlogCore;
public class Program
{
public static void Main(string[] args)
{
App.RunBlog(args, html =>
{
// 配置博客基本信息
html.SetTitle("我的博客")
.SetKeywords("博客,技术,编程")
.SetDescription("一个技术博客")
.SetIcoPath("/assets/logo.ico")
.SetLogoPath("/assets/logo.png")
.SetTheme(ThemeType.Default); // 设置主题
// 配置 VuePress 风格首页
html.SetHomePage(home =>
{
home.Hero.Title = "我的博客";
home.Hero.Description = "用纯 C# 代码构建博客系统";
home.Hero.Logo = "/assets/logo.png";
home.Hero.Actions.Add(App.CreateHeroAction("快速开始", html.GetPageUrl("快速开始")));
home.Features.Add(App.CreateFeature("🚀", "纯C#开发", "无需编写任何前端代码"));
home.Features.Add(App.CreateFeature("🎨", "主题切换", "内置4套主题,一行代码切换"));
home.Footer = "Powered by Vampirewal.BlogCore";
});
// 配置左侧菜单
html.SetLeftMenu(menu =>
{
menu.Add(new LeftTreeMenu()
{
GroupName = "入门指南",
Sort = 0,
Children = new List()
{
new LeftTreeMenu()
{
Id = "0-1",
Name = "快速开始",
Sort = 0
},
new LeftTreeMenu()
{
Id = "0-2",
Name = "配置说明",
Sort = 1
}
}
});
});
// 配置顶部菜单
html.SetTopMenu(top =>
{
top.Add(new TopMenu()
{
Id = "0",
Name = "项目地址",
Children = new List()
{
new TopMenu()
{
Id = "0-1",
Name = "Gitee",
Control = App.CreateLink(
"Gitee",
href: "https://gitee.com/vampirewal/vampirewal.blogcore",
targetType: LinkTargetType.Blank
)
}
}
});
});
},
service =>
{
// 注册依赖服务
service.AddBlogOptions();
},
app =>
{
// 配置中间件
app.UseForwardedHeaders();
});
}
}
```
### 3. 创建页面
继承 `PageBase` 创建新页面,使用控件组合构建页面内容:
```csharp
public class QuickStartPage : PageBase
{
public override string Title => "快速开始";
public override string MenuGroup => "入门指南";
public override int MenuGroupSort => 0;
public override int Sort => 0;
public override bool IsCache => true;
public override List Tags => new()
{
App.CreateTag("重要", TagType.Primary)
};
public override List PartContainers => new()
{
App.CreatePartContainer("安装", children =>
{
children.Add(App.CreateTip("提示", TipType.Tip, tip =>
{
tip.Add(App.CreateText("通过包管理器安装:"));
tip.Add(App.CreateCode("dotnet add package Vampirewal.BlogCore", "bash"));
}));
}),
App.CreatePartContainer("创建页面", children =>
{
children.Add(App.CreateText("继承 PageBase 即可创建新页面:"));
children.Add(App.CreateCode(
"public class MyPage : PageBase\n{\n public override string Title => \"我的页面\";\n public override string MenuGroup => \"主页\";\n public override int Sort => 1;\n public override bool IsCache => true;\n}", "csharp"));
})
};
}
```
### 4. 页面间跳转
使用 `PageUrl` 属性和 `GetPageUrl` 方法实现页面间跳转:
```csharp
// 方式1:在首页 HeroAction 中使用
home.Hero.Actions.Add(App.CreateHeroAction("快速开始", html.GetPageUrl("快速开始")));
// 方式2:在页面类中通过 PageUrl 获取自身URL
public class MyPage : PageBase
{
// PageUrl 由框架自动赋值,格式为 /page/{id}
public void SomeMethod()
{
var url = this.PageUrl; // 例如 "/page/0-1"
}
}
```
---
## 📦 内置控件
### 容器控件
| 控件 | 说明 | 示例 |
|------|------|------|
| `PartContainer` | 内容分区(带标题和锚点) | `App.CreatePartContainer("标题", children => {...})` |
| `Row` / `Column` | 栅格布局(24栏制) | `App.CreateRow(row => { row.Add(App.CreateColumn(col => {...}, "12")); })` |
| `Card` | 卡片容器(支持头部/底部/阴影) | `App.CreateCard(500, "标题", children => {...}, "底部")` |
| `Space` | 间距容器(水平/垂直排列) | `App.CreateSpace(children => {...}, direction: DirectionType.Vertical)` |
| `Tip` | 提示容器(tip/warning/success) | `App.CreateTip("提示", TipType.Tip, children => {...})` |
| `Tabs` / `TabPane` | 标签页 | `App.CreateTabs(tabs => { tabs.Add(App.CreateTabPane("标签1", () => content)); })` |
| `Collapse` / `CollapseItem` | 折叠面板 | `App.CreateCollapse(items => { items.Add(App.CreateCollapseItem("标题", () => content)); })` |
| `Carousel` / `CarouselItem` | 轮播图 | `App.CreateCarousel(300, items => { items.Add(App.CreateCarouselItem(300, () => content)); })` |
| `Descriptions` / `DescriptionItem` | 描述列表 | `App.CreateDescriptions("标题", items => {...})` |
### 表单控件
| 控件 | 说明 | 示例 |
|------|------|------|
| `Form` / `FormItem` | 表单容器 | `App.CreateForm(children => {...})` |
| `Input` | 文本输入框 | `App.CreateInput("form.name", "请输入姓名")` |
| `CreateTextArea` | 多行文本框 | `App.CreateTextArea("form.desc", rowCount: 4)` |
| `NumInput` | 数字输入框 | `App.CreateNumInput("form.age", min: 0, max: 150)` |
| `Checkbox` | 复选框 | `App.CreateCheckbox("同意协议", "agree", "1")` |
| `Radio` | 单选框 | `App.CreateRadio("选项A", "option", "a")` |
| `Toggle` | 开关 | `App.CreateToggle("enable", "启用功能", isOn: false)` |
| `Select` | 下拉选择 | `App.CreateSelect("city", "请选择", options: list)` |
### 展示控件
| 控件 | 说明 | 示例 |
|------|------|------|
| `Text` | 文本(支持颜色/大小/标签类型) | `App.CreateText("内容", TextType.Primary, tag: TextTagType.B)` |
| `Code` | 代码块(服务端高亮+行号+复制) | `App.CreateCode("console.log('hi')", "javascript")` |
| `Table` | 数据表格 | `App.CreateTable(dataList)` |
| `Image` | 图片 | `App.CreateImage(true, "/img/photo.png", 200, 150)` |
| `Link` | 链接 | `App.CreateLink("Gitee", href: "https://gitee.com")` |
| `Tag` | 标签 | `App.CreateTag("新功能", TagType.Success)` |
| `Icon` | 图标(Unicode符号) | `App.CreateIcon("Select", "#009400", 20)` |
| `TimeLine` / `TimeLineItem` | 时间轴 | `App.CreateTimeLine(500, items => {...})` |
| `RawHtml` | 原始HTML(不包装样式) | `new RawHtml("自定义HTML
")` |
### 按钮控件
| 控件 | 说明 | 示例 |
|------|------|------|
| `Button` | 按钮(支持点击事件/提交/自定义) | `App.CreateButton("提交", ButtonType.Primary).SetSubmit("methodName")` |
| `ButtonGroup` | 按钮组 | `App.CreateButtonGroup(buttons => {...})` |
---
## 🎨 主题切换
### 内置主题
框架内置 4 套 VuePress 风格主题,通过 CSS 变量驱动,切换无需刷新页面:
| 主题 | 枚举值 | 说明 |
|------|--------|------|
| 🌿 默认 | `ThemeType.Default` | VuePress 经典绿色主题 |
| 🌊 蓝色 | `ThemeType.Blue` | 清新蓝色主题 |
| 🔮 紫色 | `ThemeType.Purple` | 优雅紫色主题 |
| 🌙 暗黑 | `ThemeType.Dark` | 护眼暗黑主题 |
### 配置默认主题
```csharp
html.SetTheme(ThemeType.Dark); // 构建时指定默认主题
```
### 前端实时切换
导航栏右侧自动显示主题切换下拉菜单,用户可实时切换主题,选择会通过 `localStorage` 持久化保存。
---
## 📝 Markdown支持
继承 `MarkdownPage` 从 Markdown 文件渲染页面:
```csharp
public class ReadmePage : MarkdownPage
{
public override string Title => "项目说明";
public override string MenuGroup => "文档";
public override int MenuGroupSort => 0;
public override int Sort => 1;
public override bool IsCache => true;
public override List Tags => new()
{
App.CreateTag("文档", TagType.Info)
};
// 指定 Markdown 文件路径
public override string MarkdownPath => "./docs/readme.md";
}
```
也支持直接从 Markdown 字符串渲染:
```csharp
var html = MarkdownPage.RenderMarkdownFromString("# 标题\n\n正文内容");
```
### 热更新
将 `IsCache` 设为 `false`,每次访问都会重新读取 Markdown 文件,实现热更新:
```csharp
public override bool IsCache => false; // 每次访问重新读取MD文件
```
Markdig 扩展支持:表格、任务列表、Emoji、YAML 头部、Mermaid 图表等。
---
## 🎨 代码高亮
自研服务端语法高亮器 `CodeHighlighter`,无需任何前端 JS 依赖:
```csharp
// 在控件中使用
App.CreateCode("public class Foo { }", "csharp");
// 直接调用高亮器
string html = CodeHighlighter.Highlight(code, "go");
```
支持的语言:C#、JavaScript、Go、SQL、Python、HTML、CSS、JSON、Bash/Shell
特性:
- 服务端渲染,零 JS 开销
- 自动行号(CSS counter)
- 一键复制按钮
- One Dark 深色主题
---
## 📋 配置说明
### BlogOptions
```csharp
public class BlogOptions : IBlogOption
{
public string ApiUrl { get; set; } // API服务地址
}
```
| 配置项 | 类型 | 说明 | 默认值 |
|--------|------|------|--------|
| `ApiUrl` | string | API 服务地址 | - |
---
## 🔐 登录鉴权
### 两种鉴权模式
| 模式 | 枚举值 | 说明 |
|------|--------|------|
| 全局鉴权 | `AuthMode.Global` | 所有页面都需要登录才能访问(默认) |
| 页面级鉴权 | `AuthMode.Page` | 仅标记 `RequireAuth=true` 的页面需要登录 |
### 开启全局鉴权
```csharp
// 全局鉴权:所有页面都需要登录
html.SetOpenLoginAuth(
secretKey: "your-secret-key",
signatureKey: "signature-key",
tokenExpiry: TimeSpan.FromHours(24)
);
```
### 开启页面级鉴权
```csharp
// 页面级鉴权:仅 RequireAuth=true 的页面需要登录
html.SetOpenLoginAuth(
secretKey: "your-secret-key",
signatureKey: "signature-key",
tokenExpiry: TimeSpan.FromHours(24),
authMode: AuthMode.Page
);
```
### 标记需要鉴权的页面
```csharp
public class AdminPage : PageBase
{
public override string Title => "管理后台";
public override string MenuGroup => "系统管理";
public override int MenuGroupSort => 99;
public override int Sort => 0;
public override bool IsCache => false;
// 标记此页面需要登录才能访问
public override bool RequireAuth => true;
// ... 其他属性
}
```
### 实现鉴权逻辑
```csharp
App.RunBlog(args, html => { ... },
// ... 其他配置
loginAuthCheck: (username, password) =>
{
// 返回 true 表示验证通过
return username == "admin" && password == "123456";
}
);
```
鉴权采用 POST 表单提交 + HttpOnly Cookie 方式,登录页自动适配当前主题风格。
---
## 🏠 首页配置
通过 `SetHomePage` 配置 VuePress 风格首页:
```csharp
html.SetHomePage(home =>
{
// Hero 区域
home.Hero.Title = "VampirewalBlog博客";
home.Hero.Description = "通过纯 C# 代码构建博客系统,无需编写前端代码";
home.Hero.Logo = "/assets/logo.png";
// Hero 操作按钮
home.Hero.Actions.Add(App.CreateHeroAction("快速开始", html.GetPageUrl("快速开始")));
home.Hero.Actions.Add(App.CreateHeroAction("项目地址", "https://gitee.com/vampirewal/vampirewal.blogcore", HeroActionType.Secondary));
// 特性展示
home.Features.Add(App.CreateFeature("🚀", "纯C#开发", "无需编写任何前端代码,使用C#即可构建完整博客"));
home.Features.Add(App.CreateFeature("🎨", "主题切换", "内置4套主题(默认/蓝色/紫色/暗黑),一行代码切换"));
home.Features.Add(App.CreateFeature("📝", "Markdown支持", "继承MarkdownPage即可从MD文件渲染页面,支持热更新"));
// 页脚
home.Footer = "Powered by Vampirewal.BlogCore";
});
```
---
## 📁 项目结构
```
Vampirewal.BlogCore/
├── Vampirewal.BlogCore/ # 核心类库
│ ├── Controls/ # 控件库
│ │ ├── Button/ # 按钮控件(Button/ButtonGroup)
│ │ ├── Container/ # 容器控件(Card/Tabs/Collapse/Carousel/Tip/Code/...)
│ │ ├── Form/ # 表单控件(Input/NumInput/Checkbox/Radio/Toggle/Select)
│ │ ├── Other/ # 展示控件(Text/Tag/Icon/Link/Image/TimeLine/RawHtml)
│ │ │ ├── ThemeType.cs # 主题类型枚举
│ │ │ └── AuthMode.cs # 鉴权模式枚举
│ │ └── Table/ # 表格控件
│ ├── Utils/ # 工具类
│ │ ├── CodeHighlighter.cs # 服务端代码语法高亮器
│ │ └── Param.cs # 参数构建工具
│ ├── Resource/ # 嵌入资源
│ │ ├── theme-default.css # 默认绿色主题
│ │ ├── theme-blue.css # 蓝色主题
│ │ ├── theme-purple.css # 紫色主题
│ │ ├── theme-dark.css # 暗黑主题
│ │ └── htmx.min.js # htmx 交互库
│ ├── Attributes/ # 特性定义
│ ├── Extensions/ # 扩展方法
│ ├── Message/ # 消息处理
│ ├── Options/ # 配置选项
│ ├── App.cs # 全局入口
│ ├── HtmlConfig.cs # HTML 配置与模板
│ ├── BlogCoreConfig.cs # 博客核心配置
│ ├── ControlBase.cs # 控件基类
│ ├── PageBase.cs # 页面基类(含 RequireAuth)
│ └── MarkdownPage.cs # Markdown 页面基类
├── Vampirewal.BlogCore.TestWebApi/ # 测试项目
└── README.md
```
---
## 📊 版本更新
| 版本 | 日期 | 更新内容 |
|------|------|----------|
| **2.0.0** | 2026-06-15 | **重大架构升级**:移除 Vue/Element Plus/Axios/Highlight.js,改用纯 HTML+CSS+htmx 实现 VuePress 风格主题;自研服务端代码高亮器;新增 MarkdownPage 支持(含热更新);4套内置主题(默认/蓝色/紫色/暗黑)支持实时切换;VuePress 风格首页;新增表单控件(Checkbox/Radio/Toggle/Select);页面级鉴权(AuthMode.Global/Page);VuePress 风格登录页;PageUrl 页面跳转;前端体积从 ~950KB 降至 ~35KB |
| 1.0.19 | 2026-04-20 | 升级 Vue 至 v3.5.32、Element Plus 至 v2.13.7、修复 Vue 2/3 API 混用问题 |
| 1.0.18 | 2024-06-13 | 初始版本发布 |
---
## 📄 许可证
本项目采用 [MIT 许可证](LICENSE),详情请查看 LICENSE 文件。
---
## 📧 联系方式
- **作者**: vampirewal
- **邮箱**: 235160615@qq.com
- **Gitee**: [https://gitee.com/vampirewal/vampirewal.blogcore](https://gitee.com/vampirewal/vampirewal.blogcore)
---
如果这个项目对您有帮助,请 ⭐ Star 支持一下!