VibePress系统技术文档 V1.0 Beta

作者头像

谢藏锋

2025-11-18
后端开发
AI摘要VibePress系统文档V1.0Beta
文章封面

1. 文档概述

1.1 文档目的

本文档旨在详细描述 VibePress 开源内容发布系统的技术架构设计,包括系统整体架构、各核心模块的技术选型、功能实现、部署方案等,为开发人员、运维人员及相关技术决策者提供全面的技术参考,保障系统开发、部署、维护工作的规范化与高效化。

1.2 系统简介

VibePress 是一款基于 Nest.js 与 Nuxt.js 构建的高性能开源内容发布系统,核心定位为 “安全、高效、易扩展的全场景内容发布解决方案”。系统采用前后端分离与协同渲染结合的架构,分为三大核心组件:VibePress-Server(服务端)、VibePress-Nuxt(协同渲染服务)、VibePress-Admin(管理端),覆盖内容生产、发布、渲染、管理全流程,适用于博客、资讯平台、企业官网等多种内容发布场景。

2. 系统整体架构

2.1 架构总览

VibePress 系统采用 “三层服务 + 多端协同” 的架构设计,整体架构图如下(文字描述):

  • 基础设施层:包含 Docker、Nginx、数据库、缓存、USB-KEY 硬件设备等,为系统提供底层资源支持。
  • 核心服务层:包含 VibePress-Server(API 服务)、VibePress-Nuxt(协同渲染服务)、VibePress-Admin(管理端应用),是系统核心业务逻辑与功能实现的载体。
  • 接入层:提供 HTTP/HTTPS 接入、负载均衡、权限校验等能力,支持用户通过浏览器、客户端等方式访问系统。

系统数据流向:管理端通过内网 / VPN 访问服务端,提交内容管理、系统配置等请求;服务端处理请求后,将数据存储至数据库,同时提供 API 给协同渲染服务;协同渲染服务基于服务端数据进行前后端协同渲染,生成静态页面或动态内容,通过 Nginx 提供给外部用户访问。

2.2 技术栈总览

组件核心技术选型辅助技术 / 工具
VibePress-ServerNest.js(Node.js 框架)、TypeORM(ORM 框架)、JWT(身份认证)、Casbin(权限控制)Sharp(图片处理)、Docker(容器化)、Redis(缓存)、MySQL/PostgreSQL(数据库)
VibePress-NuxtNuxt.js(Vue 服务端渲染框架)、Vue3Tailwind CSS(样式框架)、Axios(HTTP 客户端)、Nitro(Nuxt 服务引擎)
VibePress-AdminVue3、Element Plus(UI 组件库)Vue Router(路由)、Pinia(状态管理)、Vite(构建工具)、Nginx(部署)

3. VibePress-Server 服务端架构

3.1 核心定位

VibePress-Server 是系统的核心 API 服务端,负责业务逻辑处理、数据持久化、权限校验、高并发处理等核心能力,为管理端和协同渲染服务提供稳定、安全、高效的接口支持。

3.2 技术选型详解

  • 核心框架:Nest.js - 基于 Node.js 的企业级后端框架,支持依赖注入、模块化设计,符合 OOP(面向对象编程)思想,便于代码组织与扩展,原生支持 TypeScript,提升开发效率与代码质量。
  • ORM 框架:TypeORM - 支持多种数据库(MySQL、PostgreSQL、SQLite 等),提供强大的查询构建器、事务管理、数据迁移能力,与 Nest.js 无缝集成,简化数据库操作。
  • 权限控制:Casbin - 开源的访问控制框架,支持 RBAC(基于角色的访问控制)、ABAC(基于属性的访问控制)等多种权限模型,可灵活配置资源访问规则,满足苛刻的鉴权需求。
  • 身份认证:JWT(JSON Web Token) - 无状态身份认证机制,结合 HTTPS 传输,确保身份信息的安全性,支持令牌过期管理、刷新令牌机制,适配分布式部署场景。
  • 图片处理:Sharp - 高性能 Node.js 图片处理库,支持图片裁剪、压缩、格式转换等功能,处理速度快,占用资源少,满足内容发布场景下的图片处理需求。
  • 容器化部署:Docker - 将服务端应用及其依赖打包为容器,确保开发环境与生产环境一致性,简化部署流程,提升运维效率,支持水平扩展。

3.3 架构分层设计

VibePress-Server 采用分层架构设计,从上至下分为以下层级,各层级职责清晰,解耦性强:

3.3.1 接口层(Controller)

  • 职责:接收客户端请求(HTTP/HTTPS),参数校验,路由分发,返回响应结果。
  • 设计:基于 Nest.js 的 @Controller 装饰器定义路由模块,按业务域划分控制器(如 ContentController、UserController、ConfigController),通过 @Body、@Query、@Param 等装饰器获取请求参数,使用类验证器(class-validator)进行参数校验。

3.3.2 业务逻辑层(Service)

  • 职责:实现核心业务逻辑,协调数据访问层与其他服务,处理业务规则与流程。
  • 设计:基于 Nest.js 的 @Injectable 装饰器定义服务,按业务域拆分服务类(如 ContentService、UserService、PermissionService),通过依赖注入机制调用其他服务或数据访问层接口,确保业务逻辑的复用性与可维护性。

3.3.3 数据访问层(Repository)

  • 职责:与数据库交互,封装数据查询、新增、修改、删除操作,屏蔽数据库底层细节。
  • 设计:基于 TypeORM 的 Repository 模式,每个实体(Entity)对应一个 Repository,通过 TypeORM 提供的 API 实现数据操作,支持自定义查询构建器,满足复杂查询需求。

3.3.4 数据模型层(Entity)

  • 职责:定义数据实体结构,映射数据库表结构,配置字段类型、关联关系、索引等。
  • 设计:基于 TypeORM 的 Entity 装饰器,每个 Entity 对应数据库中的一张表,通过装饰器配置字段属性(如主键、非空、默认值)、关联关系(一对一、一对多、多对多),支持数据迁移自动生成表结构。

3.3.5 公共组件层(Common)

  • 职责:提供全局通用功能,如异常处理、日志记录、工具函数、常量定义等。
  • 核心组件:异常过滤器:统一捕获系统异常与业务异常,格式化响应结果(包含错误码、错误信息)。日志模块:基于 Nest.js 的 Logger 或 winston 实现日志记录,支持按级别(info、warn、error)输出到文件或控制台。工具类:封装日期处理、加密解密、字符串处理、图片处理(基于 Sharp)等通用工具函数。常量定义:统一管理业务常量、错误码、状态码等,避免硬编码。

3.3.6 权限认证层(Auth)

  • 职责:实现身份认证与权限校验,确保接口访问安全。
  • 核心实现:JWT 认证:通过 Nest.js 的 Passport 模块集成 JWT 策略,客户端登录成功后获取 JWT 令牌,后续请求通过 Authorization 头携带令牌,服务端验证令牌有效性。Casbin 权限校验:在控制器或方法上通过自定义装饰器(如 @CheckPermission)配置所需权限,拦截器拦截请求后调用 Casbin 检查当前用户是否拥有该权限,无权限则返回 403 错误。

3.4 高并发与性能优化设计

  • 缓存策略:集成 Redis 缓存热点数据(如首页内容、分类列表、用户信息),减少数据库查询压力,通过 Nest.js 的缓存模块实现缓存注解(如 @Cacheable),支持缓存过期时间配置。
  • 数据库优化:合理设计索引(主键索引、联合索引),避免全表扫描;使用 TypeORM 的查询缓存、延迟加载等特性;针对高并发场景(如内容发布、访问量统计)采用分库分表或读写分离。
  • 异步处理:通过 Nest.js 的任务队列(基于 Bull 或其他队列组件)处理耗时操作(如图片批量处理、邮件发送、数据导出),避免阻塞主线程,提升接口响应速度。
  • 限流机制:集成 rate-limiter-flexible 等限流组件,对接口访问频率进行限制,防止恶意请求或突发流量导致系统过载。
  • 容器化部署:生产环境基于 Docker 部署,支持通过 Kubernetes 实现服务水平扩展,根据负载动态调整实例数量,应对高并发访问。

3.5 部署方案

  • 部署环境:Docker 容器(支持 Linux 操作系统)。
  • 部署流程:
  1. 编写 Dockerfile,将 Nest.js 应用打包为 Docker 镜像(基于 Node.js 基础镜像,安装依赖、构建应用、暴露端口)。
  2. 通过 Docker Compose 或 Kubernetes 编排容器,配置环境变量(数据库连接信息、JWT 密钥、Redis 地址等)。
  3. 映射容器端口到宿主机,配置反向代理(如 Nginx)转发请求,启用 HTTPS 加密传输。
  • 监控与日志:集成 Prometheus + Grafana 实现系统监控(CPU、内存、接口响应时间、数据库连接数);日志输出到容器日志驱动,支持日志收集(如 ELK 栈)与分析。

4. VibePress-Nuxt 协同渲染服务架构

4.1 核心定位

VibePress-Nuxt 是系统的协同渲染服务,基于 Nuxt.js 实现前后端协同渲染(SSR/SSG/CSR 混合模式),核心目标是提升首屏加载速度、优化 SEO 表现,为外部用户提供高效、流畅的内容访问体验。

4.2 技术选型详解

  • 核心框架:Nuxt.js(最新稳定版) - 基于 Vue3 的服务端渲染框架,集成了 Vue Router、Pinia、Vite 等核心工具,支持 SSR(服务端渲染)、SSG(静态站点生成)、ISR(增量静态再生)、CSR(客户端渲染)多种渲染模式,灵活适配不同内容场景。
  • 前端技术:Vue3 - 采用 Composition API 语法,提升代码复用性与可维护性;Tailwind CSS - 原子化 CSS 框架,快速构建响应式界面,减少样式冗余。
  • 网络请求:Axios - 封装 HTTP 客户端,用于请求 VibePress-Server 提供的 API,支持请求拦截、响应拦截、错误处理、请求缓存等功能。
  • 服务引擎:Nitro - Nuxt.js 内置的服务引擎,支持跨平台部署(Node.js、Serverless、Workers 等),提供高效的服务端渲染能力,优化冷启动速度。

4.3 架构设计

4.3.1 目录结构(核心目录)

VibePress-Nuxt/

├── components/       # 公共 Vue 组件(页面组件、UI 组件)

├── pages/            # 页面路由(Nuxt 自动生成路由)

├── layouts/          # 页面布局组件(全局布局、专题布局)

├── composables/      # Vue3 Composition API 组合函数(复用逻辑)

├── services/         # API 服务封装(Axios 请求配置、接口定义)

├── stores/           # Pinia 状态管理(全局状态、页面状态)

├── assets/           # 静态资源(图片、样式、字体)

├── nuxt.config.ts    # Nuxt 配置文件(渲染模式、插件、模块)

├── nitro.config.ts   # Nitro 服务配置(服务器、代理、缓存)

└── package.json      # 依赖配置

4.3.2 渲染模式设计

VibePress-Nuxt 采用混合渲染模式,根据内容类型与访问场景动态选择渲染方式:

  • SSG 静态站点生成:适用于静态内容(如关于我们、帮助中心、固定分类页),构建时预渲染为静态 HTML 文件,部署在 CDN 上,访问速度最快,SEO 最优。
  • SSR 服务端渲染:适用于动态内容(如最新资讯、热门文章、用户个性化内容),每次请求由服务端渲染页面并返回 HTML,确保内容实时性,同时保证首屏加载速度与 SEO 表现。
  • ISR 增量静态再生:适用于半动态内容(如文章详情页、列表页),构建时预渲染静态页面,设置过期时间,过期后自动重新生成页面,兼顾性能与内容新鲜度。
  • CSR 客户端渲染:适用于交互性强的内容(如评论区、搜索结果、用户中心),客户端加载页面后通过 AJAX 请求数据并渲染,提升交互体验。

4.3.3 核心功能模块

  • 路由模块:基于 Nuxt.js 的 pages 目录自动生成路由,支持动态路由(如 /articles/:id)、嵌套路由、路由守卫(全局守卫、页面守卫),实现页面跳转与权限控制(如部分页面需要登录访问)。
  • API 服务模块:封装 Axios 实例,统一配置请求基础路径、超时时间、请求头(如携带 JWT 令牌),按业务域划分接口(如 contentApi、userApi),通过组合函数(composables)提供给页面组件调用。
  • 状态管理模块:基于 Pinia 定义全局状态(如用户信息、全局配置、缓存数据),支持状态持久化(localStorage/sessionStorage),实现组件间数据共享。
  • 组件模块:按功能拆分公共组件(如 ArticleCard、Pagination、Header、Footer),支持 props 传参、事件触发,确保组件复用性与灵活性;使用 Element Plus 或自定义 UI 组件库保证界面一致性。
  • 缓存优化模块:通过 Nitro 配置缓存策略,缓存服务端渲染结果、API 响应数据,减少重复渲染与请求;利用浏览器缓存(Cache-Control 头)缓存静态资源与预渲染页面。

4.4 性能与 SEO 优化

  • 首屏加载优化:SSR/SSG 渲染减少客户端 JavaScript 执行时间,提升首屏渲染速度;代码分割(Code Splitting)按需加载页面组件与资源;图片懒加载、预加载优化;静态资源 CDN 分发。
  • SEO 优化:Nuxt.js 自动生成 <title>、<meta> 标签,支持通过 useHead 组合函数自定义页面元信息(关键词、描述);预渲染 HTML 确保搜索引擎爬虫能抓取到完整内容;支持 sitemap.xml 与 robots.txt 生成。
  • 响应式设计:基于 Tailwind CSS 实现移动端、平板、PC 端自适应布局,确保多端访问体验一致。
  • 代码优化:ESLint + Prettier 规范代码风格;Tree Shaking 移除未使用代码;压缩 JavaScript、CSS、HTML 资源;使用 Vue3 的 Teleport、Suspense 等特性优化组件渲染。

4.5 部署方案

  • 部署模式:支持静态部署(SSG 产物)与服务端部署(SSR/ISR 服务)。
  • 静态部署:执行 nuxt generate 生成静态 HTML、CSS、JavaScript 文件,部署到 Nginx、Netlify、Vercel 或 CDN 上,适用于纯静态内容场景。
  • 服务端部署:
  1. 执行 nuxt build 构建应用,生成 Nitro 服务产物。
  2. 部署到 Node.js 服务器、Docker 容器或 Serverless 平台(如 AWS Lambda、阿里云函数计算)。
  3. 配置 Nginx 反向代理,转发用户请求到 Nuxt 服务,启用 HTTPS,配置负载均衡(多实例部署场景)。
  • 监控与日志:集成 Sentry 捕获前端与服务端错误;通过 Nitro 日志模块记录请求日志、错误日志,支持日志收集与分析。

5. VibePress-Admin 管理端架构

5.1 核心定位

VibePress-Admin 是系统的管理后台,用于内容管理(文章发布、编辑、删除)、用户管理(账号创建、权限分配)、系统配置(网站设置、缓存管理)等操作,核心目标是提供安全、高效、易用的管理体验,仅限内网或 VPN 访问,保障系统管理安全。

5.2 技术选型详解

  • 核心框架:Vue3 - 采用 Composition API 语法,结合 <script setup> 语法糖,提升开发效率;Vite - 下一代前端构建工具,支持快速热更新、按需构建,优化开发体验与构建速度。
  • UI 组件库:Element Plus - 基于 Vue3 的企业级 UI 组件库,提供丰富的表单、表格、弹窗、导航等组件,支持自定义主题,满足管理后台复杂 UI 需求。
  • 路由管理:Vue Router - 实现管理端页面路由跳转、嵌套路由、路由守卫,支持基于角色的路由权限控制(未授权用户无法访问指定路由)。
  • 状态管理:Pinia - 替代 Vuex 的轻量级状态管理库,支持模块化设计,集成 Dev
  • 状态管理:Pinia - 替代 Vuex 的轻量级状态管理库,支持模块化设计,集成 DevTools 调试工具,支持热更新,语法简洁,与 Vue3 无缝兼容,用于管理全局状态(如用户信息、权限列表、系统配置)。
  • 构建工具:Vite - 基于 ESModule 的前端构建工具,相比 Webpack 构建速度更快,支持按需编译、热模块替换(HMR),开发环境启动秒开,生产环境构建产物体积更小,优化加载性能。
  • 部署工具:Nginx - 高性能 HTTP 服务器,用于管理端静态资源部署、反向代理、访问控制,支持配置 SSL 证书、限流、缓存等功能,保障管理端访问安全与稳定性。
  • 硬件认证:USB-KEY - 硬件级身份认证设备,支持国密算法(如 SM2/SM3),存储用户数字证书或密钥,登录时需插入 USB-KEY 并验证密码,实现 “硬件 + 密码” 双重认证,提升管理员账号安全性。

5.3 架构设计

5.3.1 目录结构(核心目录)

VibePress-Admin/

├── src/

│   ├── api/            # API 接口封装(Axios 配置、接口定义)

│   ├── assets/         # 静态资源(图片、样式、字体)

│   ├── components/     # 公共组件(布局组件、业务组件、UI 组件)

│   ├── layouts/        # 页面布局(主布局、登录布局)

│   ├── router/         # 路由配置(路由规则、路由守卫)

│   ├── stores/         # Pinia 状态管理(用户、权限、系统配置)

│   ├── views/          # 业务页面(内容管理、用户管理、系统配置)

│   ├── utils/          # 工具函数(权限判断、加密解密、请求工具)

│   ├── App.vue         # 根组件

│   └── main.ts         # 入口文件

├── public/             # 静态资源(无需构建的资源)

├── vite.config.ts      # Vite 配置文件

├── package.json        # 依赖配置

└── nginx.conf          # Nginx 部署配置文件

5.3.2 架构分层设计

VibePress-Admin 采用 “页面 + 组件 + 服务 + 状态” 的分层设计,各层职责清晰,解耦性强:

5.3.2.1 页面层(Views)
  • 职责:承载具体业务功能,组合公共组件与业务组件,实现页面逻辑与用户交互。
  • 设计:按业务域划分页面目录(如 /views/content 内容管理、/views/user 用户管理、/views/system 系统配置),每个页面对应一个 Vue 组件,通过 Composition API 编写页面逻辑,调用 API 服务与状态管理模块。
5.3.2.2 组件层(Components)
  • 职责:封装可复用的 UI 组件与业务组件,减少代码冗余,提升开发效率。
  • 分类:基础 UI 组件:基于 Element Plus 二次封装(如 ElTable 扩展、ElForm 封装),统一 UI 风格与交互逻辑。业务组件:针对管理端场景封装(如 ArticleEditor 文章编辑器、RolePermission 角色权限选择器),复用核心业务逻辑。布局组件:页面布局相关组件(如 Sidebar 侧边栏、Header 顶部导航、Breadcrumb 面包屑),统一页面布局结构。
5.3.2.3 API 服务层(Api)
  • 职责:封装与 VibePress-Server 的交互接口,统一处理请求配置、响应拦截、错误处理。
  • 设计:基础配置:创建 Axios 实例,配置基础请求路径、超时时间、请求头(如携带 JWT 令牌)。接口封装:按业务域划分接口模块(如 contentApi.ts、userApi.ts),每个接口对应一个函数,返回 Promise 对象。拦截器:请求拦截器:添加 JWT 令牌、设置请求加载状态。响应拦截器:统一处理响应数据、捕获接口错误(如令牌过期、权限不足),触发全局错误提示。
5.3.2.4 状态管理层(Stores)
  • 职责:管理全局状态与页面共享状态,实现组件间数据通信。
  • 核心模块:userStore:存储用户信息(账号、角色、权限)、登录状态,提供登录、退出、刷新用户信息等方法。permissionStore:存储权限列表、路由列表,提供权限判断、路由过滤等方法。systemStore:存储系统配置(主题、布局、缓存策略),提供配置修改与持久化方法。
5.3.2.5 工具层(Utils)
  • 职责:提供全局通用工具函数,支撑各层功能实现。
  • 核心工具:权限工具:permission.ts - 封装权限判断函数(如 hasPermission 检查是否拥有指定权限),基于 Casbin 权限列表实现。加密工具:crypto.ts - 封装密码加密(如 bcrypt 哈希)、数据加密(如 AES 加密)函数。格式化工具:format.ts - 封装日期、数字、字符串格式化函数,统一数据展示格式。全局提示:message.ts - 封装 Element Plus 的 ElMessage、ElMessageBox,统一提示风格。

5.3.3 路由与权限控制设计

5.3.3.1 路由配置
  • 基于 Vue Router 实现路由管理,按业务域划分路由模块,支持嵌套路由、动态路由。
  • 路由元信息(meta)配置:
{

  path: '/content/article',

  name: 'ArticleManagement',

  component: () => import('@/views/content/Article.vue'),

  meta: {

    title: '文章管理', // 页面标题

    requiresAuth: true, // 是否需要登录

    permission: 'content:article:view' // 所需权限(对应 Casbin 资源权限)

  }

}
5.3.3.2 路由守卫
  • 全局前置守卫:拦截所有路由跳转,检查是否登录(requiresAuth: true),未登录则跳转至登录页;已登录则检查是否拥有该路由权限,无权限则跳转至 403 页面。
  • 示例代码:
router.beforeEach((to, from, next) => {

  const userStore = useUserStore();

  const permissionStore = usePermissionStore();

  

  // 检查是否需要登录

  if (to.meta.requiresAuth) {

    if (!userStore.isLogin) {

      next('/login'); // 未登录跳转至登录页

    } else {

      // 检查是否拥有权限

      if (permissionStore.hasPermission(to.meta.permission)) {

        next();

      } else {

        next('/403'); // 无权限跳转至 403 页面

      }

    }

  } else {

    next();

  }

});

5.4 安全设计

VibePress-Admin 作为系统管理端,安全设计至关重要,采用 “多层防护 + 严格鉴权” 策略:

5.4.1 访问控制

  • 网络访问限制:生产环境部署在 Nginx 上,通过 Nginx 配置限制访问来源,仅允许内网 IP 或 VPN 地址访问,外部直接访问将被拒绝。
  • Nginx 配置示例:
server {

  listen 80;

  server\_name admin.vibepress.com;

  

  # 仅允许内网 IP 访问

  allow 192.168.0.0/16;

  allow 10.0.0.0/8;

  deny all;

  

  # 静态资源部署

  root /usr/share/nginx/html;

  index index.html;

  

  # 前端路由刷新配置

  location / {

    try\_files \$uri \$uri/ /index.html;

  }

}

5.4.2 身份认证

  • 双重认证机制:基础认证:账号密码登录,密码采用 bcrypt 哈希存储,传输过程通过 HTTPS 加密。硬件认证:SU 账号(系统超级管理员)登录时,需插入 USB-KEY 硬件设备,验证设备内置的数字证书或密钥,实现硬件级身份校验,防止账号被盗用。
  • JWT 令牌管理:登录成功后,服务端返回 JWT 令牌(包含用户 ID、角色、权限等信息),客户端存储在 localStorage/sessionStorage 中。令牌过期策略:访问令牌有效期设为 1 小时,刷新令牌有效期设为 7 天,过期后自动跳转至登录页。

5.4.3 权限控制

  • 细粒度权限管理:基于 Casbin 的 RBAC 权限模型,支持 “角色 - 权限 - 资源” 三级权限控制,可配置单个接口、单个按钮的访问权限。
  • 前端权限过滤:路由级过滤:未拥有权限的路由不显示在侧边栏,且无法通过 URL 直接访问。按钮级过滤:通过自定义指令 v-permission 控制按钮显示 / 隐藏,无权限时按钮禁用或隐藏。示例代码(自定义指令):
// 注册 v-permission 指令

app.directive('permission', {

  mounted(el, binding) {

    const permissionStore = usePermissionStore();

    const requiredPermission = binding.value;

    if (!permissionStore.hasPermission(requiredPermission)) {

      el.style.display = 'none'; // 无权限隐藏按钮

    }

  }

});
\<!-- 按钮使用示例 -->

\<el-button v-permission="'content:article:add'">新增文章\</el-button>

5.4.4 数据安全

  • 数据传输加密:所有 API 请求通过 HTTPS 传输,防止数据被窃听或篡改。
  • 敏感数据脱敏:前端展示敏感数据时(如手机号、邮箱)进行脱敏处理(如 138****1234)。
  • 防 XSS 攻击:使用 Element Plus 组件自带的 XSS 防护,对用户输入内容进行过滤,避免恶意脚本注入。
  • 防 CSRF 攻击:API 请求中携带 JWT 令牌,服务端通过令牌验证请求合法性,防止跨站请求伪造。

5.5 部署方案

5.5.1 部署环境

  • 服务器:Linux 操作系统(如 CentOS、Ubuntu)。
  • 部署工具:Nginx(静态资源部署、反向代理、访问控制)。
  • 访问方式:内网访问或 VPN 访问,不对外开放公网地址。

5.5.2 部署流程

  1. 构建产物
\# 安装依赖

npm install

\# 生产环境构建(生成 dist 目录)

npm run build
  1. Nginx 配置
  • 将 dist 目录下的静态资源上传至 Nginx 部署目录(如 /usr/share/nginx/html)。
  • 配置 Nginx 访问规则(访问控制、HTTPS、路由刷新),参考 5.4.1 节 Nginx 配置示例。
  1. HTTPS 配置
  • 申请 SSL 证书(如 Let's Encrypt 免费证书),配置 Nginx 启用 HTTPS,强制跳转 HTTP 至 HTTPS。
  • Nginx HTTPS 配置示例:
server {

  listen 443 ssl;

  server\_name admin.vibepress.com;

  

  # SSL 证书配置

  ssl\_certificate /etc/nginx/ssl/admin.vibepress.com.crt;

  ssl\_certificate\_key /etc/nginx/ssl/admin.vibepress.com.key;

  

  # 仅允许内网 IP 访问

  allow 192.168.0.0/16;

  allow 10.0.0.0/8;

  deny all;

  

  root /usr/share/nginx/html;

  index index.html;

  

  location / {

    try\_files \$uri \$uri/ /index.html;

  }

}

\# HTTP 强制跳转 HTTPS

server {

  listen 80;

  server\_name admin.vibepress.com;

  return 301 https://\$host\$request\_uri;

}
  1. USB-KEY 配置
  • 在 SU 账号登录页面集成 USB-KEY 驱动,支持读取设备信息与证书验证。
  • 服务端对接 USB-KEY 验证接口,校验设备合法性与用户绑定关系。

5.5.3 监控与维护

  • 错误监控:集成 Sentry 捕获前端错误(JS 错误、接口错误、资源加载错误),实时告警并记录错误详情,便于排查问题。
  • 日志记录:通过 Nginx 日志记录访问日志(IP、访问时间、请求路径、状态码),定期分析日志,发现异常访问行为。
  • 版本更新:通过脚本自动化部署更新,先备份旧版本产物,再上传新版本,确保更新失败可回滚。

6. 系统集成与交互设计

6.1 组件间交互流程

6.1.1 管理端与服务端交互

  1. 管理端通过 Axios 发送 API 请求(携带 JWT 令牌)。
  2. 服务端通过 JWT 中间件验证令牌有效性,通过 Casbin 校验权限。
  3. 服务端处理业务逻辑,返回响应数据(成功 / 失败)。
  4. 管理端响应拦截器处理响应,成功则更新状态或展示数据,失败则提示错误信息。

6.1.2 协同渲染服务与服务端交互

  1. VibePress-Nuxt 通过 Axios 请求服务端 API,获取内容数据(文章、分类、配置)。
  2. 服务端返回数据后,Nuxt.js 按渲染模式(SSR/SSG/ISR)生成页面。
  3. 静态页面通过 CDN 分发,动态页面通过 Nginx 反向代理提供访问。

6.1.3 数据同步流程

  1. 管理端修改内容(发布 / 编辑文章、更新配置)后,发送请求至服务端。
  2. 服务端更新数据库数据,同时更新 Redis 缓存(如首页内容、分类列表)。
  3. 服务端触发 VibePress-Nuxt 缓存刷新(ISR 模式),确保前端展示最新内容。

6.2 核心集成点

6.2.1 权限系统集成

  • 管理端、服务端共用 Casbin 权限模型,权限规则存储在数据库中。
  • 管理端通过 API 管理角色与权限,服务端实时加载权限规则,确保权限变更即时生效。

6.2.2 缓存系统集成

  • 服务端 Redis 缓存热点数据,VibePress-Nuxt 缓存渲染结果与 API 响应。
  • 管理端提供缓存管理功能(手动刷新缓存、设置缓存过期时间),通过 API 调用服务端缓存操作接口。

6.2.3 图片处理集成

  • 管理端上传图片时,通过 API 上传至服务端,服务端使用 Sharp 处理图片(压缩、裁剪、生成缩略图)。
  • 处理后的图片存储在文件服务器或对象存储(如 S3、OSS),服务端返回图片 URL,前端直接引用。

7. 系统扩展性设计

7.1 模块化扩展

  • 服务端模块化:Nest.js 支持模块拆分,新增业务功能时可创建独立模块(如 CommentModule 评论模块、StatisticsModule 统计模块),通过模块导入实现功能扩展,不影响现有代码。
  • 前端组件化:管理端与 Nuxt 服务采用组件化设计,新增业务页面时可复用现有组件,降低开发成本。

7.2 插件化机制

  • 服务端支持自定义插件,通过 Nest.js 模块动态导入,实现功能增强(如第三方登录、支付集成)。
  • 管理端支持组件插件,通过注册中心加载第三方组件,扩展管理功能(如自定义报表、数据分析工具)。

7.3 数据库扩展

  • TypeORM 支持多数据库适配,可无缝切换 MySQL、PostgreSQL 等数据库。
  • 支持分库分表(基于 TypeORM 分表插件),应对数据量增长场景。


0