项目结构
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/
更多信息请查看 配置指南。