Skip to content

项目结构

DoraCMS 采用 monorepo 架构,使用 pnpm 管理。

整体结构

DoraCMS/
├── server/                    # 后端服务
│   ├── app/                   # 应用核心
│   │   ├── controller/        # 控制器层
│   │   ├── service/           # 服务层
│   │   ├── repository/        # 仓储层 ⭐
│   │   ├── model/             # 数据模型
│   │   ├── middleware/        # 中间件
│   │   └── extend/            # 扩展
│   ├── config/                # 配置文件
│   ├── lib/                   # 自定义框架
│   ├── test/                  # 测试文件
│   └── package.json

├── client/                    # 前端应用
│   ├── admin-center/          # 管理后台
│   │   ├── src/
│   │   │   ├── views/         # 页面组件
│   │   │   ├── components/    # 公共组件
│   │   │   ├── api/           # API 接口
│   │   │   ├── stores/        # Pinia 状态管理
│   │   │   └── router/        # 路由配置
│   │   └── package.json
│   │
│   ├── user-center/           # 用户中心
│   │   └── src/
│   │       ├── views/
│   │       ├── components/
│   │       └── api/
│   │
│   └── remote-page/           # 微前端应用

├── docker/                    # Docker 配置
│   ├── docker-compose.yml
│   └── Dockerfile

├── scripts/                   # 脚本工具
│   ├── init-mongo.js
│   └── init-maria.js

├── package.json               # 根配置
├── pnpm-workspace.yaml        # workspace 配置
└── README.md

后端结构详解

app/ 目录

app/
├── controller/                # 控制器:处理 HTTP 请求
│   ├── user.js               # 用户控制器
│   ├── article.js            # 文章控制器
│   └── auth.js               # 认证控制器

├── service/                   # 服务:业务逻辑
│   ├── user.js
│   ├── article.js
│   └── auth.js

├── repository/                # 仓储:数据访问 ⭐
│   ├── base/
│   │   ├── IBaseRepository.js
│   │   ├── BaseStandardRepository.js
│   │   ├── BaseMongoRepository.js
│   │   └── BaseMariaRepository.js
│   ├── mongo/
│   │   ├── UserMongoRepository.js
│   │   └── ArticleMongoRepository.js
│   └── maria/
│       ├── UserMariaRepository.js
│       └── ArticleMariaRepository.js

├── model/                     # 数据模型
│   ├── user.js               # MongoDB/MariaDB 模型
│   ├── article.js
│   └── category.js

├── middleware/                # 中间件
│   ├── auth.js               # 认证中间件
│   ├── error_handler.js      # 错误处理
│   └── permission.js         # 权限检查

└── extend/                    # 扩展
    ├── context.js            # Context 扩展
    ├── application.js        # Application 扩展
    └── helper.js             # Helper 扩展

config/ 目录

config/
├── config.default.js          # 默认配置
├── config.local.js            # 本地开发配置
├── config.prod.js             # 生产环境配置
└── plugin.js                  # 插件配置

前端结构详解

admin-center/ 管理后台

admin-center/
├── src/
│   ├── views/                 # 页面组件
│   │   ├── user/
│   │   │   ├── list.vue
│   │   │   └── edit.vue
│   │   └── article/
│   │       ├── list.vue
│   │       └── edit.vue
│   │
│   ├── components/            # 公共组件
│   │   ├── layout/
│   │   │   ├── Header.vue
│   │   │   └── Sidebar.vue
│   │   └── common/
│   │       ├── Table.vue
│   │       └── Form.vue
│   │
│   ├── api/                   # API 接口
│   │   ├── user.ts
│   │   └── article.ts
│   │
│   ├── stores/                # 状态管理
│   │   ├── user.ts
│   │   └── app.ts
│   │
│   ├── router/                # 路由
│   │   └── index.ts
│   │
│   ├── styles/                # 样式
│   │   └── index.scss
│   │
│   └── utils/                 # 工具函数
│       ├── request.ts
│       └── auth.ts

└── package.json

核心文件说明

server/app/extend/context.js

扩展 Context,注入 Repository:

javascript
const REPO = Symbol('Context#repo')

module.exports = {
  get repo() {
    if (!this[REPO]) {
      const dbType = this.app.config.dbType
      this[REPO] = {}
      
      if (dbType === 'mongodb') {
        this[REPO].user = new UserMongoRepository(this.app)
        this[REPO].article = new ArticleMongoRepository(this.app)
      } else {
        this[REPO].user = new UserMariaRepository(this.app)
        this[REPO].article = new ArticleMariaRepository(this.app)
      }
    }
    return this[REPO]
  }
}

pnpm-workspace.yaml

定义 monorepo 工作空间:

yaml
packages:
  - 'server'
  - 'client/admin-center'
  - 'client/user-center'
  - 'client/remote-page'

配置文件

package.json (root)

json
{
  "name": "doracms",
  "version": "3.0.0",
  "scripts": {
    "dev": "concurrently \"pnpm dev:server\" \"pnpm dev:user-center\"",
    "dev:all": "concurrently \"pnpm dev:server\" \"pnpm dev:user-center\" \"pnpm dev:admin-center\"",
    "dev:server": "pnpm --filter \"./server\" dev",
    "dev:user-center": "pnpm --filter \"./client/user-center\" dev",
    "dev:admin-center": "pnpm --filter \"./client/admin-center\" dev"
  }
}

开发规范

1. 文件命名

  • 控制器:user.js, article.js
  • 服务:user.js, article.js
  • Repository:UserMongoRepository.js, ArticleMariaRepository.js
  • 模型:user.js, article.js

2. 类命名

  • Controller:UserController, ArticleController
  • Service:UserService, ArticleService
  • Repository:UserMongoRepository, ArticleMariaRepository

3. 目录组织

  • 按功能模块组织
  • 相关文件放在同一目录
  • 公共代码提取到 common/shared/

更多信息请查看 配置指南