registry/docs/设计.md

216 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 概要设计文档:微服务配置管理中心 (Registry)
## 1. 系统架构
```mermaid
flowchart TD
A[浏览器 Browser] --> B[Express Web Server]
B --> C[路由层 Router]
C --> D[项目模块 Project Service]
C --> E[配置模块 Config Service]
D --> F[JSON 持久化层 Persistence]
E --> F
F --> G[(JSON 文件存储)]
```
## 2. 技术选型
| 层级 | 技术 | 说明 |
|------|------|------|
| 后端框架 | Express 4.x | 轻量级 HTTP 服务 |
| 前端 | 原生 HTML/CSS/JS | 无框架依赖,降低复杂度 |
| 持久化 | JSON 文件 | 当前实现,简单可靠 |
| 模板引擎 | EJS | 服务端渲染基础页面 |
| 图标 | 内联 SVG | 不依赖第三方图标库 |
## 3. 数据模型
### 3.1 项目 (Project)
```json
{
"id": "proj-001",
"name": "用户服务",
"description": "用户微服务配置",
"enableIdc": true,
"enableEnvironment": true,
"enableGroup": true,
"idcMapping": "path",
"environmentMapping": "path",
"groupMapping": "label",
"createdAt": "2026-07-15T10:00:00Z",
"updatedAt": "2026-07-15T10:00:00Z"
}
```
字段说明:
- `enableXxx`:维度是否启用,创建后不可修改。
- `xxxMapping`:维度映射方式,`path` 表示作为配置存储路径前缀,`label` 表示仅作筛选标签、不进入路径。创建后可通过映射配置接口调整。
### 3.2 配置项 (ConfigItem)
```json
{
"id": "cfg-001",
"projectId": "proj-001",
"path": "华北/dev/用户模块/db.host",
"key": "db.host",
"value": "192.168.1.100",
"type": "string",
"description": "数据库主机地址",
"purpose": "指定 MySQL 数据库连接地址",
"valueRange": "合法 IPv4 地址",
"createdAt": "2026-07-15T10:00:00Z",
"updatedAt": "2026-07-15T10:00:00Z"
}
```
### 3.3 配置路径构建规则
配置路径由“维度映射方式”与“嵌套键”共同决定:
```
路径模板 = [映射为 path 的维度前缀...]/嵌套键
- 维度启用且映射为 path → 该维度值作为路径前缀
- 维度启用且映射为 label → 该维度不进入路径,仅作维度栏筛选
- 维度未启用 → 跳过
- 配置键 key 自身可用 / 嵌套多级json 类型在展示时按 . 分割)
```
示例(机房=path、环境=path、分组=label
- 配置键 `db/host`,机房 `华北`,环境 `dev`,分组 `用户模块`
- 生成路径:`华北/dev/db/host`(分组作为标签筛选,不进入路径)
示例(全部映射为 path
- 配置键 `db.host` → 路径 `华北/dev/用户模块/db.host`
## 4. API 设计
### 4.1 项目接口
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/projects` | 获取项目列表 |
| GET | `/api/projects/:id` | 获取项目详情 |
| POST | `/api/projects` | 创建项目(含维度开关与映射方式) |
| PUT | `/api/projects/:id/mappings` | 更新维度映射方式path/label |
| DELETE | `/api/projects/:id` | 删除项目 |
### 4.2 配置接口
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/projects/:id/configs` | 获取项目下所有配置 |
| GET | `/api/projects/:id/configs/:configId` | 获取单个配置详情 |
| POST | `/api/projects/:id/configs` | 新增配置项 |
| PUT | `/api/projects/:id/configs/:configId` | 修改配置项 |
| DELETE | `/api/projects/:id/configs/:configId` | 删除配置项 |
### 4.3 模式接口
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | `/api/mode` | 获取当前模式 |
| PUT | `/api/mode` | 切换模式plan/edit/readonly |
## 5. 前端界面设计
### 5.1 布局结构
```
+--------------------------------------------------+
| 标题栏:应用名 | 当前项目名 |
+--------------------------------------------------+
| 工具栏(分组):项目 | 模式 | 配置 | 数据 |
+--------------------------------------------------+
| 维度栏:机房▼ | 环境▼ | 分组▼ | ⚙映射配置 |
+------------+-------------------------------------+
| 树形导航 | 地址栏:📍 路径 [转到][拷贝] |
| (左侧) | +-------------------------------+ |
| 📦 项目A | | 键名 | 值 | 类型 | 说明 | |
| 📁 华北 | |------+----+------+----------| |
| 📁 dev | | db/host|192.|string|数据库.. | |
| 📁 db | | db/port|3306|number|数据库.. | |
| 🔑host| +-------------------------------+ |
+------------+-------------------------------------+
| 状态栏 |
+--------------------------------------------------+
```
界面分区说明:
- 标题栏:仅展示应用名与当前项目名,与操作区分离。
- 工具栏:按“项目 / 模式 / 配置 / 数据”分组排列操作按钮。
- 维度栏:展示已启用维度的筛选下拉与映射方式标记,提供映射配置入口。
- 地址栏:注册表风格路径框,支持拷贝、粘贴后回车跳转到对应节点。
- 树形导航按“path 维度前缀 + 嵌套键”逐级展开,叶子节点(🔑)为真实配置项。
### 5.2 三种模式差异化
| 功能 | 规划模式 | 编辑模式 | 只读模式 |
|------|---------|---------|---------|
| 查看配置 | ✓ | ✓ | ✓ |
| 新增/删除配置 | ✓ | ✓ | ✗ |
| 修改值 | ✗ | ✓ | ✗ |
| 修改类型/说明/用途/范围 | ✓ | ✗ | ✗ |
| 配置值校验 | 仅格式 | 格式+范围 | 不校验 |
## 6. 持久化层设计
### 6.1 存储结构
```
data/
├── projects.json # 项目元数据
├── configs/
│ └── {projectId}.json # 每个项目独立配置文件
└── system.json # 系统级配置(当前模式等)
```
### 6.2 持久化接口(预留扩展)
```javascript
class PersistenceAdapter {
async loadProjects() {}
async saveProjects(projects) {}
async loadConfigs(projectId) {}
async saveConfigs(projectId, configs) {}
async loadSystem() {}
async saveSystem(system) {}
}
```
当前实现 `JsonFileAdapter`,后续可扩展 `SqliteAdapter`、`NacosAdapter` 等。
## 7. 目录结构
```
registry/
├── docs/
│ ├── requirements.md # 需求文档
│ └── design.md # 概要设计文档
├── data/ # 持久化数据目录
├── src/
│ ├── server.js # 服务入口
│ ├── routes/
│ │ ├── projects.js # 项目路由
│ │ └── configs.js # 配置路由
│ ├── services/
│ │ ├── projectService.js
│ │ └── configService.js
│ ├── persistence/
│ │ └── jsonAdapter.js # JSON 持久化适配器
│ └── utils/
│ └── validator.js # 配置值校验
├── public/
│ ├── index.html # 主页面
│ ├── css/
│ │ └── style.css # 样式
│ └── js/
│ ├── app.js # 主逻辑
│ ├── tree.js # 树形组件
│ └── api.js # API 调用封装
├── package.json
└── README.md
```