post_waver

系统架构

版本: v1.0 最后更新: 2026-04-03 受众: 开发者、架构师 阅读时间: 15 分钟


📋 目录


🎯 概述

PostWaver 是一个本地优先的内容管理系统,采用模块化 Monorepo 架构,支持将 Markdown 内容发布到多个平台。

核心目标

  1. 本地优先: 内容存储在本地 Markdown 文件中
  2. 多平台支持: 一键发布到多个平台(掘金、微信、CSDN、知乎、HTML)
  3. 格式转换: 自动转换为各平台兼容的格式
  4. 博客同步: 自动同步到 Hexo 博客
  5. 可扩展性: 易于添加新平台和功能

系统特点


🎨 设计原则

1. 关注点分离(Separation of Concerns)

各包专注于单一职责:

2. 依赖倒置(Dependency Inversion)

高层模块不依赖低层模块,都依赖抽象:

3. 单一数据源(Single Source of Truth)

4. 可扩展性(Extensibility)

5. 本地优先(Local-First)


🏗️ 系统架构

分层架构

┌─────────────────────────────────────────────────────────┐
│                     应用层 (Application)                  │
│  ┌──────────────┐           ┌──────────────┐            │
│  │   Web UI     │           │ Converter Web │            │
│  │  (React)     │           │   (React)     │            │
│  └──────────────┘           └──────────────┘            │
└─────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────┐
│                      引擎层 (Engine)                      │
│  ┌────────────────────────────────────────────────┐     │
│  │  Engine (Hono.js)                              │     │
│  │  - API 服务器                                   │     │
│  │  - 工作流编排                                   │     │
│  │  - 预览系统                                     │     │
│  └────────────────────────────────────────────────┘     │
└─────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────┐
│                      业务层 (Business)                     │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐              │
│  │  Core    │  │ Linker   │  │Transform │              │
│  │ 解析/扫描 │  │ 关系生成 │  │ 平台转换 │              │
│  └──────────┘  └──────────┘  └──────────┘              │
└─────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────┐
│                      数据层 (Data)                        │
│  ┌──────────┐           ┌──────────┐                    │
│  │ Database │           │  Config  │                    │
│  │(Prisma)  │           │ Manager  │                    │
│  └──────────┘           └──────────┘                    │
└─────────────────────────────────────────────────────────┘
                            ↓
┌─────────────────────────────────────────────────────────┐
│                   存储层 (Storage)                        │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐              │
│  │  SQLite  │  │ Markdown │  │   Hexo   │              │
│  │ (元数据)  │  │ (内容)    │  │  (博客)  │              │
│  └──────────┘  └──────────┘  └──────────┘              │
└─────────────────────────────────────────────────────────┘

层次说明

1. 应用层(Application Layer)

职责: 用户界面和交互

组件:

技术:

2. 引擎层(Engine Layer)

职责: 工作流编排和 API 服务

组件:

技术:

3. 业务层(Business Layer)

职责: 核心业务逻辑

组件:

4. 数据层(Data Layer)

职责: 数据持久化和配置管理

组件:

5. 存储层(Storage Layer)

职责: 底层存储

组件:


🛠️ 技术栈

前端

技术 版本 用途
React 18.2.0 UI 框架
React Router 6.21.0 路由管理
Vite 5.0.11 构建工具
TypeScript 5.3.3 类型系统

后端

技术 版本 用途
Node.js 18+ 运行时
Hono.js Latest Web 框架
Prisma 5.22.0 ORM
SQLite 3.x 数据库

内容处理

技术 版本 用途
unified 11.0.5 统一处理接口
remark 15.0.1 Markdown 解析
gray-matter 4.0.3 Frontmatter 解析
juice - CSS 内联化(WeChat)

开发工具

工具 版本 用途
pnpm 8+ 包管理器
ESLint Latest 代码检查
Prettier Latest 代码格式化
Vitest Latest 测试框架
TypeScript 5.3.3 类型检查

部署

工具 用途
GitHub Actions CI/CD
GitHub Pages Web UI 部署
Git 版本控制

🌊 数据流

内容发布流程

┌─────────────┐
│ 用户写作     │
│ Markdown    │
└──────┬──────┘
       ↓
┌─────────────┐
│ 扫描内容     │  ← core/scanner
│ 生成 frontmatter │
└──────┬──────┘
       ↓
┌─────────────┐
│ 解析内容     │  ← core/parser
│ 提取图片     │
└──────┬──────┘
       ↓
┌─────────────┐
│ 生成关系     │  ← linker
│ 相关文章     │
│ 前后篇       │
└──────┬──────┘
       ↓
┌─────────────┐
│ 存储元数据   │  ← database
│ SQLite DB   │
└──────┬──────┘
       ↓
┌─────────────┐
│ 平台转换     │  ← transformer
│ 格式适配     │
└──────┬──────┘
       ↓
┌─────────────┐
│ 上传图片     │  ← adapter
│ (如果需要)   │
└──────┬──────┘
       ↓
┌─────────────┐
│ 发布到平台   │  ← adapter/engine
│ 或同步博客   │
└─────────────┘

关键数据流

  1. 内容扫描
    Markdown 文件 → Scanner → Frontmatter 生成 → 数据库存储
    
  2. 内容解析
    Markdown → Parser → AST → 提取内容/图片
    
  3. 关系生成
    数据库查询 → Linker → 关系计算 → 相关文章列表
    
  4. 平台转换
    通用内容 → Transformer → 平台特定格式
    
  5. Hexo 同步
    转换后内容 → 模板注入 → Hexo 博客 → Git 提交
    

📦 包架构

包依赖关系

                    ┌─────────────┐
                    │   web-ui    │
                    │ converter-web│
                    └──────┬──────┘
                           │
                    ┌──────▼──────┐
                    │   engine    │
                    └──────┬──────┘
                           │
        ┌──────────────────┼──────────────────┐
        │                  │                  │
┌───────▼────────┐ ┌───────▼────────┐ ┌──────▼─────┐
│     core       │ │    linker      │ │transformer │
└───────┬────────┘ └───────┬────────┘ └──────┬─────┘
        │                  │                  │
        └──────────────────┼──────────────────┘
                           │
                    ┌──────▼──────┐
                    │   config    │
                    └──────┬──────┘
                           │
                    ┌──────▼──────┐
                    │  database   │
                    └─────────────┘

包职责

职责 主要依赖
core 内容解析、扫描、注入 database, linker
linker 内容关系生成 database
transformer 平台格式转换
adapter 平台 API 适配
database 数据持久化
config 配置管理
engine 工作流编排、API core, transformer, adapter, database, config
web-ui React 界面 engine
converter-web 独立转换工具 transformer

🔌 扩展点

1. 添加新平台

步骤:

  1. transformer/src/ 中创建新转换器
  2. 实现 Transformer 接口
  3. adapter/src/ 中实现平台 API(如需要)
  4. 更新配置文件

示例:

// transformer/src/to-newplatform.ts
export function transformToNewPlatform(content: string): string {
  // 实现转换逻辑
}

2. 添加新的内容注入器

步骤:

  1. core/src/ 中创建新的注入器
  2. 实现 Injector 接口
  3. 在扫描流程中调用

示例:

// core/src/custom-injector.ts
export function injectCustom(content: string, data: any): string {
  // 实现注入逻辑
}

3. 添加新的数据库模型

步骤:

  1. database/prisma/schema.prisma 中定义模型
  2. 运行 prisma migrate
  3. database/src/dal/ 中创建 DAL 方法

4. 添加新的 API 端点

步骤:

  1. engine/src/ 中添加路由
  2. 实现处理函数
  3. 添加类型定义

📚 相关文档


🤝 贡献

想要贡献代码?请阅读 贡献指南


最后更新: 2026-04-03 维护者: PostWaver Team 反馈: GitHub Issues