Skip to content

整体架构

DoraCMS 采用现代化的微服务架构设计,前后端分离,支持微前端和双数据库。

系统架构图

┌─────────────────────────────────────────────────────────────┐
│                    前端应用层                                │
│  ┌──────────────┐  ┌──────────────┐  ┌─────────────────┐   │
│  │  用户中心     │  │  管理后台     │  │  远程微前端应用 │   │
│  │  Vue 3       │  │  Vue 3 + TS  │  │   qiankun      │   │
│  │  Vite        │  │  UnoCSS      │  │                │   │
│  └──────┬───────┘  └──────┬───────┘  └────────┬────────┘   │
└─────────┼──────────────────┼───────────────────┼────────────┘
          │                  │                   │
          └──────────────────┼───────────────────┘
                             │ HTTP/WebSocket
┌──────────────────────────┼──────────────────────────────────┐
│                    API 网关层                                │
│         ┌────────────────▼───────────────────┐              │
│         │         Nginx / API Gateway        │              │
│         │    · 路由转发  · 负载均衡          │              │
│         │    · SSL 终止  · 限流防护          │              │
│         └────────────────┬───────────────────┘              │
└──────────────────────────┼──────────────────────────────────┘

┌──────────────────────────▼──────────────────────────────────┐
│                    应用服务层                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              EggJS 后端服务                          │   │
│  │  ┌───────────┐  ┌──────────┐  ┌──────────────┐     │   │
│  │  │Controller │➜ │ Service  │➜ │ Repository   │     │   │
│  │  │   层      │  │   层     │  │     层       │     │   │
│  │  └───────────┘  └──────────┘  └──────┬───────┘     │   │
│  │                                       │             │   │
│  │  ┌──────────┐  ┌──────────┐  ┌──────▼───────┐     │   │
│  │  │ 中间件   │  │  插件    │  │   Adapter    │     │   │
│  │  │  Auth    │  │  Redis   │  │   适配器     │     │   │
│  │  │  Error   │  │  Upload  │  │   转换层     │     │   │
│  │  └──────────┘  └──────────┘  └──────┬───────┘     │   │
│  └─────────────────────────────────────┼─────────────┘   │
└────────────────────────────────────────┼─────────────────┘

┌────────────────────────────────────────▼─────────────────────┐
│                      数据存储层                               │
│  ┌────────────┐         ┌────────────┐        ┌──────────┐  │
│  │  MongoDB   │◄───OR──►│  MariaDB   │        │  Redis   │  │
│  │  文档数据库 │         │  关系数据库 │        │  缓存    │  │
│  └────────────┘         └────────────┘        └──────────┘  │
└──────────────────────────────────────────────────────────────┘

技术选型

前端技术栈

技术版本说明为什么选择
Vue3.x渐进式框架易学易用,生态完善,性能优秀
TypeScript5.x类型系统类型安全,减少运行时错误
Vite6.x构建工具极速开发体验,HMR 快
Element Plus-UI 组件库组件丰富,文档完善,企业级
UnoCSS-原子化 CSS按需生成,性能优秀
Pinia-状态管理Vue 官方推荐,TypeScript 友好
qiankun-微前端阿里开源,成熟稳定

后端技术栈

技术版本说明为什么选择
EggJS3.x企业级框架约定优于配置,插件生态丰富
MongoDB4.x+NoSQL 数据库灵活的文档结构,水平扩展
Mongoose7.xMongoDB ODM强大的 Schema 系统
MariaDB10.x+关系数据库开源,兼容 MySQL,性能好
Sequelize6.xSQL ORM支持多种数据库,API 友好
Redis5.x+缓存高性能,数据结构丰富
JWT-认证无状态,易于扩展

架构特点

1. 前后端分离

优势:

  • ✅ 前后端独立开发部署
  • ✅ 前端可以使用任何框架
  • ✅ API 可以被多端复用
  • ✅ 更好的性能和用户体验

实现:

javascript
// 后端:提供 RESTful API
router.get('/api/articles', controller.article.index)
router.post('/api/articles', controller.article.create)

// 前端:调用 API
const articles = await axios.get('/api/articles')

2. 三层架构

Controller → Service → Repository

javascript
// Controller 层:处理请求
class ArticleController {
  async index() {
    const result = await this.ctx.service.article.getList(this.ctx.query)
    this.ctx.body = result
  }
}

// Service 层:业务逻辑
class ArticleService {
  async getList(params) {
    return await this.ctx.repo.article.findByPage(params)
  }
}

// Repository 层:数据访问
class ArticleRepository {
  async findByPage(params) {
    return await this.model.find(params)
  }
}

3. Repository 模式

核心价值:

  • ✅ 数据访问层抽象
  • ✅ 支持双数据库切换
  • ✅ 代码复用率 90%+
  • ✅ 统一的查询接口

四层继承结构:

IBaseRepository (接口)

BaseStandardRepository (跨数据库基类)
    ↓                    ↓
BaseMongoRepository  BaseMariaRepository
    ↓                    ↓
UserMongoRepository  UserMariaRepository

4. 微前端架构

基于 qiankun 的微前端方案:

javascript
// 主应用:注册子应用
registerMicroApps([
  {
    name: 'admin',
    entry: '//localhost:5173',
    container: '#subapp-viewport',
    activeRule: '/admin',
  },
  {
    name: 'user',
    entry: '//localhost:3000',
    container: '#subapp-viewport',
    activeRule: '/user',
  }
])

优势:

  • ✅ 应用独立开发部署
  • ✅ 技术栈无关
  • ✅ 增量升级
  • ✅ 按需加载

5. 双数据库支持

MongoDB vs MariaDB:

特性MongoDBMariaDB
数据模型文档型关系型
Schema灵活固定
扩展性水平扩展容易垂直扩展
事务支持(4.0+)完全支持
查询简单查询快复杂查询好
适用场景非结构化数据结构化数据

切换方式:

javascript
// config.js
config.dbType = 'mongodb'  // 或 'mariadb'

// 业务代码无需修改
const users = await this.ctx.repo.user.findMany({})

数据流向

请求流程

1. 用户请求

2. Nginx(路由、负载均衡)

3. Controller(参数验证、权限检查)

4. Service(业务逻辑处理)

5. Repository(数据库操作)

6. Adapter(查询转换)

7. MongoDB/MariaDB(数据存储)

8. 逆向返回到用户

认证流程

1. 用户登录

2. Controller 接收请求

3. Service 验证账号密码

4. 生成 JWT Token

5. 返回 Token 给前端

6. 前端后续请求携带 Token

7. Auth 中间件验证 Token

8. 解析用户信息

9. 注入到 ctx.user

权限控制

管理端权限链路采用“权限定义 → 菜单/按钮 → 角色 → 管理员缓存 → 中间件校验”的闭环,详细流程见 /architecture/permission-control

性能与安全(概览)

  • 查询与缓存:Repository 支持字段选择、关联查询优化与 Redis 缓存;索引与连接池配置按数据库类型调整
  • 前端优化:路由/组件按需加载、CDN/Gzip/懒加载等标准手段
  • 安全基线:JWT 认证、RBAC 权限(详见 /architecture/permission-control)、密码加密、敏感字段过滤、CSRF/XSS/限流防护
  • 生产运维与加固:参见 运维与排障

可扩展性

1. 水平扩展

bash
# 多实例部署
pm2 start app.js -i max  # 根据 CPU 核心数启动实例

# Nginx 负载均衡
upstream api_backend {
    server 127.0.0.1:8080;
    server 127.0.0.1:7002;
    server 127.0.0.1:7003;
}

2. 插件系统

javascript
// 自定义插件
module.exports = app => {
  // 插件初始化
  app.beforeStart(async () => {
    // 注册自定义功能
  })
}

3. 微服务演进

当单体应用无法满足需求时,可以拆分为微服务:

DoraCMS Monolith

┌─────────┬─────────┬─────────┬─────────┐
│ User    │Article  │Comment  │  File   │
│ Service │Service  │Service  │ Service │
└─────────┴─────────┴─────────┴─────────┘

监控和日志

1. 应用监控

javascript
// EggJS 内置监控
app.on('error', (err, ctx) => {
  ctx.logger.error('Application Error:', err)
})

// 性能监控
app.use(async (ctx, next) => {
  const start = Date.now()
  await next()
  const duration = Date.now() - start
  ctx.logger.info(`[${ctx.method}] ${ctx.url} - ${duration}ms`)
})

2. 日志管理

javascript
// 分级日志
ctx.logger.debug('调试信息')
ctx.logger.info('普通信息')
ctx.logger.warn('警告信息')
ctx.logger.error('错误信息')

// 日志文件
logs/
├── doracms-web.log        # 应用日志
├── common-error.log       # 错误日志
├── egg-agent.log          # Agent 日志
└── egg-schedule.log       # 定时任务日志

部署架构

开发环境

┌─────────────────────────────────────┐
│  开发机器                            │
│  ├── Node.js                        │
│  ├── MongoDB/MariaDB (本地)         │
│  └── Redis (可选)                   │
└─────────────────────────────────────┘

生产环境

┌────────────────────────────────────────────┐
│  负载均衡 (Nginx/HAProxy)                  │
└──────────┬─────────────────────────────────┘

    ┌──────┴──────┬──────────┬──────────┐
    │             │          │          │
┌───▼───┐    ┌───▼───┐  ┌───▼───┐  ┌──▼───┐
│App 1  │    │App 2  │  │App 3  │  │Static│
│Node   │    │Node   │  │Node   │  │Files │
└───┬───┘    └───┬───┘  └───┬───┘  └──────┘
    │            │          │
    └────────────┼──────────┘

    ┌────────────┴──────────────┐
    │                           │
┌───▼────────┐         ┌────────▼────┐
│MongoDB     │         │  Redis      │
│Replica Set │         │  Cluster    │
└────────────┘         └─────────────┘

下一步