整体架构
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 │ │
│ │ 文档数据库 │ │ 关系数据库 │ │ 缓存 │ │
│ └────────────┘ └────────────┘ └──────────┘ │
└──────────────────────────────────────────────────────────────┘技术选型
前端技术栈
| 技术 | 版本 | 说明 | 为什么选择 |
|---|---|---|---|
| Vue | 3.x | 渐进式框架 | 易学易用,生态完善,性能优秀 |
| TypeScript | 5.x | 类型系统 | 类型安全,减少运行时错误 |
| Vite | 6.x | 构建工具 | 极速开发体验,HMR 快 |
| Element Plus | - | UI 组件库 | 组件丰富,文档完善,企业级 |
| UnoCSS | - | 原子化 CSS | 按需生成,性能优秀 |
| Pinia | - | 状态管理 | Vue 官方推荐,TypeScript 友好 |
| qiankun | - | 微前端 | 阿里开源,成熟稳定 |
后端技术栈
| 技术 | 版本 | 说明 | 为什么选择 |
|---|---|---|---|
| EggJS | 3.x | 企业级框架 | 约定优于配置,插件生态丰富 |
| MongoDB | 4.x+ | NoSQL 数据库 | 灵活的文档结构,水平扩展 |
| Mongoose | 7.x | MongoDB ODM | 强大的 Schema 系统 |
| MariaDB | 10.x+ | 关系数据库 | 开源,兼容 MySQL,性能好 |
| Sequelize | 6.x | SQL ORM | 支持多种数据库,API 友好 |
| Redis | 5.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 UserMariaRepository4. 微前端架构
基于 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:
| 特性 | MongoDB | MariaDB |
|---|---|---|
| 数据模型 | 文档型 | 关系型 |
| 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 │
└────────────┘ └─────────────┘下一步
- 📖 Repository 模式 - 深入理解核心设计
- 🗄️ 双数据库支持 - 学习数据库切换
- 🏗️ 三层架构 - 了解架构设计
- 💡 最佳实践 - 新模块开发指南