# RMDC 项目详情页面前端详细设计说明书 (Frontend DDS)
**文档名称**: RMDC 项目详情页面前端设计文档
**对应页面**:
- `frontend/src/modules/admin/pages/admin/ProjectDetail.vue` (管理员端)
- `frontend/src/modules/admin/pages/user/UserProjectDetail.vue` (用户端)
**版本**: v2.0
**编制日期**: 2026-01-15
---
## 文档修订历史
| 版本 | 日期 | 修订内容 |
|:---|:---|:---|
| v1.0 | 2026-01-12 | 初始版本,基础页面架构设计 |
| v1.2 | 2026-01-14 | 完善模块设计规范、中间件卡片设计 |
| v2.0 | 2026-01-15 | **新增**:查看/编辑状态分离、用户侧/管理侧差异化设计、工单关联与跳转机制、多工单场景处理、页面美化规范 |
---
## 1. 设计概述
### 1.1 设计背景
项目详情页面是 RMDC 系统的核心交互界面,需要支持复杂的生命周期管理流程,并满足不同角色用户的差异化需求。本设计文档详细定义了页面的功能逻辑、交互行为、组件结构和美化规范。
### 1.2 核心设计目标
| 目标 | 说明 |
|:---|:---|
| **状态分离** | 明确区分「只读查看模式」与「编辑修改模式」,防止误操作 |
| **角色差异化** | 超级管理员与普通用户看到的内容、操作权限不同,但尽量复用组件 |
| **生命周期可视化** | 清晰展示项目当前状态(INIT/DRAFTING/REVIEWING/RELEASED/MODIFYING/ARCHIVED) |
| **工单关联** | 支持项目详情页与工单详情页的双向跳转,处理多工单场景 |
| **美观专业** | 采用现代 Material Design 风格,注重留白、排版与微动效 |
| **高复用性** | 最大化组件复用,用户侧与管理侧共用核心表单组件 |
### 1.3 页面文件结构
```
frontend/src/modules/admin/
├── pages/
│ ├── admin/
│ │ └── ProjectDetail.vue # 超级管理员端项目详情
│ └── user/
│ └── UserProjectDetail.vue # 普通用户端项目详情(填写人视角)
├── components/
│ ├── BasicInfoForm.vue # 基本信息编辑表单
│ ├── BasicInfoReadonly.vue # 基本信息只读展示
│ ├── BusinessInfoReadonly.vue # 业务信息只读展示
│ ├── DeploymentBusinessForm.vue # 部署业务编辑表单
│ ├── DeploymentEnvironmentForm.vue # 部署环境编辑表单
│ ├── EnvironmentInfoReadonly.vue # 环境信息只读展示
│ ├── HostsInfoReadonly.vue # 主机信息只读展示
│ ├── HostsManagement.vue # 主机管理组件
│ ├── MiddlewareCardsGrid.vue # 中间件卡片网格
│ ├── MiddlewareInfoReadonly.vue # 中间件只读展示
│ ├── AuthorizationManagement.vue # 授权管理 (SuperAdmin Only)
│ ├── VersionHistory.vue # 版本历史 (SuperAdmin Only)
│ ├── SaveConfirmDialog.vue # 保存确认对话框
│ ├── ProjectBasicInfoCard.vue # 项目基本信息卡片
│ ├── CopyableField.vue # 可复制字段组件
│ └── index.ts # 组件统一导出
```
---
## 2. 页面架构设计
### 2.1 整体布局结构
页面采用 **「固定头部 + 固定 Tab 导航 + 可滚动内容区域」** 的三段式布局。
```
┌─────────────────────────────────────────────────────────────────────────┐
│ [固定区域] 生命周期状态提示横幅 (Alert Banner) │
├─────────────────────────────────────────────────────────────────────────┤
│ [固定区域] 页面头部 Header │
│ ┌─────────────────────────────────────┬─────────────────────────────┐ │
│ │ ← 返回 项目名称 │ [查看工单] [打回] [通过] │ │
│ │ Namespace | 省份 城市 │ [下载配置] [编辑/保存] │ │
│ │ 状态标签组 │ │ │
│ └─────────────────────────────────────┴─────────────────────────────┘ │
├─────────────────────────────────────────────────────────────────────────┤
│ [固定区域] Tab 导航栏 │
│ ┌─────────────────────────────────────────────────────────────────────┐│
│ │ 基本信息 | 部署业务 | 部署环境 | 主机管理 | 中间件 | 授权 | 版本历史 ││
│ └─────────────────────────────────────────────────────────────────────┘│
├─────────────────────────────────────────────────────────────────────────┤
│ [滚动区域] Tab 内容区域 │
│ ┌─────────────────────────────────────────────────────────────────────┐│
│ │ ││
│ │ 当前 Tab 对应的表单/只读内容 ││
│ │ ││
│ │ ││
│ └─────────────────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────────────────┘
```
### 2.2 CSS 布局实现
```css
.project-detail-page {
height: 100%;
max-height: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
}
.header-section {
flex-shrink: 0;
background: rgb(var(--v-theme-surface));
z-index: 1;
}
.content-area {
flex: 1 1 auto;
overflow-y: auto;
overflow-x: hidden;
min-height: 0; /* 关键:防止 Flex 子元素撑破父容器 */
padding-bottom: 24px;
}
```
---
## 3. 查看状态 vs 编辑状态
### 3.1 状态定义
| 状态 | 变量名 | 说明 |
|:---|:---|:---|
| **查看状态** | `isEditMode = false` | 默认状态,展示只读组件 |
| **编辑状态** | `isEditMode = true` | 编辑模式,展示表单组件 |
### 3.2 查看状态 (默认)
#### 3.2.1 展示形式
- 使用 `*Readonly.vue` 系列组件展示数据
- 采用 `v-row/v-col` 布局,键值对形式展示
- 关键字段(IP、URL、密码)支持一键复制
- 敏感字段(密码)默认脱敏显示 `******`
#### 3.2.2 交互行为
| 交互 | 说明 |
|:---|:---|
| **一键复制** | 使用 `CopyableField` 组件,点击复制图标复制到剪贴板 |
| **密码查看** | 点击"小眼睛"图标切换明文/密文 |
| **链接跳转** | URL 字段支持点击新窗口打开 |
#### 3.2.3 组件列表
| 组件名称 | 对应模块 | 说明 |
|:---|:---|:---|
| `BasicInfoReadonly.vue` | 基本信息 | 项目名、NS、省市、性质 |
| `BusinessInfoReadonly.vue` | 部署业务 | 部署人、系统版本、入口URL |
| `EnvironmentInfoReadonly.vue` | 部署环境 | 网络、IP、域名、主机统计 |
| `HostsInfoReadonly.vue` | 主机管理 | 主机列表只读表格 |
| `MiddlewareInfoReadonly.vue` | 中间件 | 中间件卡片只读展示 |
### 3.3 编辑状态
#### 3.3.1 进入条件
- 点击 Header 的「编辑」按钮
- 用户必须具备编辑权限(基于角色和生命周期状态)
#### 3.3.2 数据流
```mermaid
sequenceDiagram
participant User as 用户
participant View as 查看模式
participant Edit as 编辑模式
participant API as 后端API
User->>View: 点击[编辑]按钮
View->>Edit: isEditMode = true
Edit->>Edit: 深拷贝 masterData → editForm
Edit-->>User: 显示表单组件
User->>Edit: 修改字段
Edit->>Edit: computed hasChanges = true
User->>Edit: 点击[保存]
Edit->>Edit: 弹出 SaveConfirmDialog
User->>Edit: 确认保存
Edit->>API: 调用更新接口
API-->>Edit: 返回成功
Edit->>View: isEditMode = false, 刷新数据
```
#### 3.3.3 退出保护
- **脏数据检测**:通过 `computed hasChanges` 检测是否有未保存的修改
- **退出确认**:如有未保存修改,点击「取消」或切换页面时弹出确认对话框
```typescript
const exitEditMode = () => {
if (hasChanges.value) {
exitConfirmDialog.value = true // 弹出确认对话框
} else {
isEditMode.value = false
}
}
```
#### 3.3.4 编辑状态指示器
编辑模式下,Header 区域显示明显的「编辑模式」标签:
```html
mdi-pencil
编辑模式
```
---
## 4. 用户侧 vs 管理侧差异化设计
### 4.1 页面对照表
| 特性 | 管理员端 (ProjectDetail.vue) | 用户端 (UserProjectDetail.vue) |
|:---|:---|:---|
| **默认模式** | 查看模式 | 根据工单状态决定 |
| **查看权限** | 所有模块 | ACL 授权模块 |
| **授权信息 Tab** | ✅ 可见 | ❌ 不可见 |
| **版本历史 Tab** | ✅ 可见 | ❌ 不可见 |
| **主机管理 Tab** | ✅ 可见 | ❌ 不可见 |
| **基本信息** | 可编辑 | 只读(由管理员填写) |
| **编辑操作** | 直接保存(上帝模式) | 草稿 → 提交审核(工单流程) |
| **审批操作** | ✅ 通过/打回按钮 | ❌ 无 |
| **保存按钮** | 「保存修改」 | 「保存草稿」 |
| **提交按钮** | 无 | 「提交审核」 |
### 4.2 Tab 导航差异
#### 管理员端 Tabs
```html
基本信息
部署业务
部署环境
主机管理
中间件
授权信息
版本历史
```
#### 用户端 Tabs
```html
基本信息
部署业务
部署环境
中间件
```
### 4.3 组件复用策略
```mermaid
graph TB
subgraph 共用组件
A[BasicInfoForm]
B[DeploymentBusinessForm]
C[DeploymentEnvironmentForm]
D[MiddlewareCardsGrid]
E[BasicInfoReadonly]
F[BusinessInfoReadonly]
G[EnvironmentInfoReadonly]
H[MiddlewareInfoReadonly]
end
subgraph 管理端专用
I[AuthorizationManagement]
J[VersionHistory]
K[HostsManagement]
L[SaveConfirmDialog]
end
subgraph 用户端专用
M[ProjectBasicInfoCard]
end
Admin[ProjectDetail.vue] --> A
Admin --> B
Admin --> C
Admin --> D
Admin --> E
Admin --> F
Admin --> G
Admin --> H
Admin --> I
Admin --> J
Admin --> K
Admin --> L
User[UserProjectDetail.vue] --> B
User --> C
User --> D
User --> M
```
### 4.4 权限控制逻辑
```typescript
// 管理员端 - 编辑权限判断
const canEdit = computed(() => {
if (!masterData.value) return false
const status = masterData.value.lifecycle_status
// 超级管理员在已发布、变更中状态可以编辑
if (isSuperAdmin.value) {
return status === 'released' || status === 'modifying'
}
return false
})
// 用户端 - 编辑权限判断
const canEdit = computed(() => {
if (!workflowInfo.value) return true // 没有工单信息时默认可编辑
const status = workflowInfo.value.status
// 已分配、处理中、已打回状态可编辑
return ['assigned', 'in_progress', 'returned', 'draft_saved'].includes(status)
})
```
---
## 5. 项目生命周期状态展示
### 5.1 状态标签设计
项目详情页 Header 区域展示三类状态标签:
```html
{{ masterData.project_name }}
{{ PROJECT_STATUS[masterData.status] }}
{{ getLifecycleStatusIcon(masterData.lifecycle_status) }}
{{ LIFECYCLE_STATUS[masterData.lifecycle_status] }}
{{ PROJECT_CERTIFICATION[masterData.project_certification] }}
mdi-pencil
编辑模式
```
### 5.2 生命周期状态配置
```typescript
// 生命周期状态枚举
export const LIFECYCLE_STATUS = {
init: '初始化',
drafting: '填写中',
reviewing: '审核中',
released: '已发布',
modifying: '变更中',
archived: '已归档'
}
// 状态颜色映射
export const LIFECYCLE_STATUS_COLORS: Record = {
init: 'grey',
drafting: 'info',
reviewing: 'warning',
released: 'success',
modifying: 'primary',
archived: 'grey-darken-1'
}
// 状态图标
const getLifecycleStatusIcon = (status: string): string => {
const icons: Record = {
init: 'mdi-clock-outline',
drafting: 'mdi-pencil',
reviewing: 'mdi-eye',
released: 'mdi-check-circle',
modifying: 'mdi-sync',
archived: 'mdi-archive'
}
return icons[status] || 'mdi-help-circle'
}
```
### 5.3 生命周期提示横幅 (Alert Banner)
根据当前生命周期状态,在 Header 下方显示上下文提示:
```typescript
interface LifecycleAlert {
type: 'info' | 'warning' | 'success' | 'error'
message: string
action?: {
text: string
handler: () => void
}
}
const lifecycleStatusAlert = computed((): LifecycleAlert | null => {
if (!masterData.value) return null
const status = masterData.value.lifecycle_status
switch (status) {
case 'init':
return {
type: 'info',
message: '项目已创建,等待指定填写人录入详细信息'
}
case 'drafting':
return {
type: 'info',
message: `项目详情正在由 ${masterData.value.detail_filler_name || '填写人'} 填写中`,
action: masterData.value.workflow_id ? {
text: '查看工单',
handler: () => router.push(`/admin/workflows/${masterData.value?.workflow_id}`)
} : undefined
}
case 'reviewing':
return {
type: 'warning',
message: '项目详情已提交,等待审核',
action: masterData.value.workflow_id ? {
text: '查看工单',
handler: () => router.push(`/admin/workflows/${masterData.value?.workflow_id}`)
} : undefined
}
case 'modifying':
return {
type: 'info',
message: '项目存在活跃的变更工单,主线数据不受影响',
action: masterData.value.workflow_id ? {
text: '查看工单',
handler: () => router.push(`/admin/workflows/${masterData.value?.workflow_id}`)
} : undefined
}
case 'archived':
return {
type: 'warning',
message: '项目已归档,仅保留历史数据'
}
default:
return null
}
})
```
---
## 6. 工单关联与跳转机制
### 6.1 工单与项目的关系
| 工单类型 | 生命周期状态 | 数量关系 | 说明 |
|:---|:---|:---|:---|
| 填写工单 (project_detail) | INIT → DRAFTING | 1:1 | 项目创建时只能有一个 |
| 修改工单 (project_modify) | RELEASED → MODIFYING | 1:N | 已发布项目可有多个 |
### 6.2 工单按钮显示逻辑
```typescript
// 是否显示工单按钮
const showWorkflowButton = computed(() => {
if (!masterData.value?.workflow_id) return false
const status = masterData.value.lifecycle_status
// 在填写中、审核中、变更中状态显示工单按钮
return ['drafting', 'reviewing', 'modifying'].includes(status)
})
// 工单按钮文本
const workflowButtonText = computed(() => {
if (!masterData.value) return '查看工单'
const status = masterData.value.lifecycle_status
switch (status) {
case 'drafting':
return '查看填写工单'
case 'reviewing':
return '查看审核工单'
case 'modifying':
return '查看修改工单'
default:
return '查看工单'
}
})
```
### 6.3 多工单场景处理
当项目处于 `MODIFYING` 状态时,可能同时存在多个修改工单。需要设计专门的工单列表展示。
#### 6.3.1 设计方案
**方案一:下拉菜单选择**
```html
查看工单 ({{ workflowCount }})
mdi-chevron-down
{{ wf.workflow_id }}
{{ wf.creator_name }} | {{ formatDate(wf.created_at) }}
```
**方案二:工单列表对话框**(推荐用于工单较多的场景)
```html
mdi-sitemap
关联工单列表
{{ item.workflow_id }}
{{ item.status_name }}
```
### 6.4 从工单页面跳转回项目详情
工单详情页应提供「查看项目」按钮:
```typescript
// 工单详情页
const navigateToProject = () => {
if (workflowDetail.value?.business_context?.project_id) {
router.push(`/admin/projects/${workflowDetail.value.business_context.project_id}`)
}
}
```
---
## 7. 模块详细设计规范
### 7.1 基本信息模块 (Basic Info)
| 字段 | 类型 | 只读模式 | 编辑模式 |
|:---|:---|:---|:---|
| 项目名称 | String | 文本展示 + 复制 | `v-text-field` |
| 命名空间 | String | 文本展示 + 复制 | `disabled` 不可编辑 |
| 省份 | Enum | 文本展示 | 级联选择器 |
| 城市 | Enum | 文本展示 | 级联选择器(依赖省份) |
| 项目性质 | Enum | 文本展示 | `v-select` |
| 行业组人员 | String | 文本展示 | `v-text-field` |
| 行业组电话 | String | 文本展示 | `v-text-field` |
| 项目描述 | String | 多行文本 | `v-textarea` |
### 7.2 部署业务模块 (Deployment Business)
| 字段 | 类型 | 只读模式 | 编辑模式 |
|:---|:---|:---|:---|
| 部署人姓名 | String | 文本展示 | `v-text-field` 或用户搜索 |
| 部署人电话 | String | 文本展示 | `v-text-field` |
| 部署系统 | Enum | 文本展示 | `v-select` |
| 系统版本 | String | 文本展示 | `v-text-field` |
| 业务入口 URL | String | 可点击链接 | `v-text-field` |
| 超管账号 | String | 文本展示 + 复制 | `v-text-field` |
| 超管密码 | Password | 脱敏 + 查看按钮 | `v-text-field` 密码输入 |
### 7.3 部署环境模块 (Deployment Environment)
| 字段 | 类型 | 只读模式 | 编辑模式 |
|:---|:---|:---|:---|
| 网络环境 | Enum | 文本展示 | `v-select` |
| 主公网 IP | String | 文本展示 + 复制 | `v-text-field` IP 校验 |
| 域名 URL | String | 可点击链接 | `v-text-field` |
| 启用 SSL | Boolean | 图标显示 | `v-switch` |
| 主机管理方式 | Enum | 文本展示 | `v-select` |
| 管理控制台 URL | String | 可点击链接 | `v-text-field` |
| 主机数量 | Number | 文本展示 | `v-text-field type=number` |
| CPU 总核数 | Number | 统计卡片 | `v-text-field type=number` |
| 内存总量 | Number | 统计卡片 | `v-text-field type=number` |
| 存储总量 | Number | 统计卡片 | `v-text-field type=number` |
### 7.4 中间件模块 (Middleware)
采用 **卡片网格 (Card Grid)** 设计:
#### 7.4.1 数据结构
```typescript
interface MiddlewareFormItem {
middleware_type: string
public_ip: string
public_port: number
internal_ip: string
internal_port: number
admin_user: string
admin_password?: string
}
```
#### 7.4.2 只读模式
- 每个中间件一张卡片,响应式网格布局
- 卡片包含:类型图标 + 标题 + IP/Port 信息
- 图标映射逻辑:
```typescript
const MIDDLEWARE_ICONS: Record = {
'mysql': 'mdi-database',
'redis': 'mdi-database-clock',
'emqx': 'mdi-broadcast',
'minio': 'mdi-bucket',
'influxdb': 'mdi-chart-timeline-variant',
'nacos': 'mdi-cog-outline',
'k8s-dashboard': 'mdi-kubernetes'
}
```
#### 7.4.3 编辑模式
- 现有卡片右上角显示「编辑」「删除」按钮
- 列表末尾显示「添加中间件」虚线框卡片
- 点击添加/编辑弹出对话框:
- 类型选择:`v-combobox` 支持预设 + 自定义
- 选择预设类型时自动填充默认端口
### 7.5 主机管理模块 (Hosts Management)
- 复用 `HostsManagement.vue` 组件
- 支持表格展示所有主机信息
- 编辑模式支持添加/删除主机
### 7.6 授权信息模块 (Authorization) - SuperAdmin Only
| 功能 | 说明 |
|:---|:---|
| TOTP 密钥展示 | 二维码 + 文本形式 |
| 授权类型切换 | 永久/限时 |
| 授权天数设置 | 数字输入 |
| 下发授权 | 调用 Exchange-Hub 接口 |
| 撤销授权 | 调用 Exchange-Hub 接口 |
### 7.7 版本历史模块 (Version History) - SuperAdmin Only
| 功能 | 说明 |
|:---|:---|
| 版本列表 | 时间轴形式展示 |
| 版本详情 | 点击查看完整快照 |
| 版本对比 | 选择两个版本进行 Diff |
| 工单关联 | 点击跳转关联工单 |
---
## 8. 组件设计规范
### 8.1 CopyableField 组件
用于展示可复制的字段值:
```html
{{ displayValue }}
复制
```
### 8.2 SaveConfirmDialog 组件
保存前的确认对话框,展示变更差异:
```html
mdi-check-circle
确认保存修改
以下字段将被修改:
| 字段 |
修改前 |
修改后 |
| {{ item.label }} |
{{ item.oldValue || '空' }} |
{{ item.newValue || '空' }} |
取消
确认保存
```
### 8.3 DiffTextField 组件
编辑模式下显示与主线数据差异的输入框:
```html
mdi-alert-circle
```
---
## 9. 交互时序图
### 9.1 管理员编辑保存流程
```mermaid
sequenceDiagram
participant Admin as 超级管理员
participant Page as ProjectDetail.vue
participant Dialog as SaveConfirmDialog
participant API as 后端API
Admin->>Page: 点击[编辑]按钮
Page->>Page: isEditMode = true
Page->>Page: editForm = deepClone(masterData)
Admin->>Page: 修改字段
Page->>Page: hasChanges = true
Admin->>Page: 点击[保存修改]
Page->>Page: 计算 diffItems
Page->>Dialog: 显示确认对话框
Admin->>Dialog: 确认保存
Dialog->>API: updateProject()
API-->>Dialog: 成功
Dialog->>Page: emit('confirm')
Page->>API: loadProject()
Page->>Page: isEditMode = false
Page-->>Admin: Snackbar: 保存成功
```
### 9.2 用户草稿提交流程
```mermaid
sequenceDiagram
participant User as 普通用户
participant Page as UserProjectDetail.vue
participant Dialog as SubmitDialog
participant API as 后端API
participant WF as 工单模块
User->>Page: 填写表单
User->>Page: 点击[保存草稿]
Page->>API: saveDraft()
API-->>Page: 草稿保存成功
User->>Page: 点击[提交审核]
Page->>Dialog: 显示确认对话框
User->>Dialog: 填写备注并确认
Dialog->>API: saveDraft() (最终版本)
Dialog->>API: submitProjectDetail()
API->>WF: 触发工单状态转换
WF-->>API: 成功
API-->>Dialog: 提交成功
Page-->>User: 跳转至工单详情页
```
### 9.3 管理员审批流程
```mermaid
sequenceDiagram
participant Admin as 超级管理员
participant Page as ProjectDetail.vue
participant Dialog as ApproveDialog/RejectDialog
participant API as 后端API
participant WF as 工单模块
Note over Page: lifecycle_status = reviewing
Admin->>Page: 查看待审核内容
alt 通过审批
Admin->>Page: 点击[通过]
Page->>Dialog: 显示审批对话框
Admin->>Dialog: 填写备注并确认
Dialog->>API: transitionWorkflow(approve)
API->>WF: 工单状态 → approved
WF-->>API: 回调更新项目状态
API-->>Dialog: 成功
Page->>API: updateProjectCertification('official')
Page-->>Admin: Snackbar: 审批通过
else 打回修改
Admin->>Page: 点击[打回]
Page->>Dialog: 显示打回对话框
Admin->>Dialog: 填写打回原因并确认
Dialog->>API: transitionWorkflow(return)
API->>WF: 工单状态 → returned
WF-->>API: 回调更新项目状态
API-->>Dialog: 成功
Page-->>Admin: Snackbar: 已打回
end
```
---
## 10. 视觉设计规范
### 10.1 色彩系统
| 用途 | 颜色 | Vuetify 类 |
|:---|:---|:---|
| 主色调 | Deep Purple | `color="primary"` |
| 成功状态 | Green | `color="success"` |
| 警告状态 | Orange | `color="warning"` |
| 错误状态 | Red | `color="error"` |
| 信息状态 | Blue | `color="info"` |
| 页面背景 | Light Grey | `bg-grey-lighten-4` |
| 卡片背景 | White | `bg-white` |
### 10.2 卡片设计
```html
```
- 圆角:`rounded-lg` (8px)
- 阴影:`elevation-2`
- 内边距:`pa-4` (16px)
- Hover 效果:轻微上浮 + 阴影加深
### 10.3 排版规范
| 元素 | 字体样式 |
|:---|:---|
| 页面标题 | `text-h4 font-weight-bold` |
| 卡片标题 | `text-h6` |
| 字段标签 | `text-medium-emphasis text-body-2` |
| 字段值 | `text-high-emphasis` |
| 辅助文字 | `text-caption text-grey` |
### 10.4 间距规范
遵循 8px 网格系统:
| 间距 | Vuetify 类 | 值 |
|:---|:---|:---|
| 紧凑 | `pa-2` / `ma-2` | 8px |
| 标准 | `pa-4` / `ma-4` | 16px |
| 宽松 | `pa-6` / `ma-6` | 24px |
| 组件间距 | `gap-2` | 8px |
| 卡片间距 | `gap-4` | 16px |
### 10.5 动画与过渡
| 场景 | 效果 |
|:---|:---|
| Tab 切换 | `v-window` 默认滑动过渡 |
| 模式切换 | `v-expand-transition` |
| 按钮 Hover | 0.2s 缓动 |
| 卡片 Hover | `transform: translateY(-2px)` |
| 加载状态 | `v-skeleton-loader` 骨架屏 |
---
## 11. 响应式设计
### 11.1 断点配置
遵循 Vuetify 默认断点:
| 断点 | 宽度范围 |
|:---|:---|
| xs | < 600px |
| sm | 600px - 960px |
| md | 960px - 1280px |
| lg | 1280px - 1920px |
| xl | > 1920px |
### 11.2 布局适配
```html
```
### 11.3 移动端适配要点
1. **Tab 导航**:使用 `show-arrows` 支持左右滑动
2. **操作按钮**:使用 `v-bottom-sheet` 或收起到菜单
3. **表单布局**:单列堆叠
4. **表格**:使用 `mobile-breakpoint` 切换卡片视图
---
## 12. 数据类型定义
### 12.1 核心类型
```typescript
// 项目详情
interface ProjectDetail {
id: number
project_id: string
project_name: string
namespace: string
province: string
city: string
project_nature: string
industry_group_member: string
industry_group_phone: string
description: string
status: string
lifecycle_status: string
project_certification: string
workflow_id: string
detail_filler_id: number
detail_filler_name: string
deployment_business: DeploymentBusiness | null
deployment_environment: DeploymentEnvironment | null
middlewares: Middleware[]
hosts: Host[]
draft_data: Record | null
created_at: string
updated_at: string
}
// 表单数据类型
interface BasicFormData {
project_name: string
province: string
city: string
industry_group_member: string
industry_group_phone: string
project_nature: string
description: string
}
interface BusinessFormData {
deployer_name: string
deployer_phone: string
deploy_system: string
system_version: string
business_entry_url: string
super_admin_user: string
super_admin_password: string
}
interface EnvironmentFormData {
network_environment: string
main_public_ip: string
domain_url: string
enable_ssl: boolean
host_management_method: string
management_console_url: string
host_count: number
total_cpu: number
total_memory_gb: number
total_storage_gb: number
}
interface MiddlewareFormItem {
middleware_type: string
public_ip: string
public_port: number
internal_ip: string
internal_port: number
admin_user: string
admin_password?: string
}
// Diff 项
interface DiffItem {
field: string
label: string
oldValue: string | number | boolean
newValue: string | number | boolean
}
```
---
## 13. API 调用规范
### 13.1 项目管理 API
| 方法 | 路径 | 说明 |
|:---|:---|:---|
| POST | `/api/project/detail` | 获取项目详情 |
| POST | `/api/project/update` | 更新项目信息 (Admin) |
| POST | `/api/project/draft/save` | 保存草稿 |
| POST | `/api/project/draft/submit` | 提交审核 |
| POST | `/api/project/draft/discard` | 放弃草稿 |
| POST | `/api/project/export` | 导出配置 |
### 13.2 调用示例
```typescript
// 获取项目详情
const loadProject = async () => {
const res = await getProjectDetail(projectId.value)
if (res.code === 0) {
masterData.value = res.data
}
}
// 管理员保存修改
const confirmSave = async () => {
await updateProject(projectId.value, {
project_name: editForm.basic.project_name,
province: editForm.basic.province,
// ...
})
}
// 用户保存草稿
const handleSaveDraft = async () => {
const draftData = {
formData: { ...businessFormData.value, ...environmentFormData.value },
middlewareList: getMiddlewareList()
}
await saveDraft(projectId.value, draftData)
}
```
---
## 14. 附录
### 14.1 相关文档
| 文档 | 说明 |
|:---|:---|
| [项目管理 PRD](1-rmdc-project-management-PRD.md) | 产品需求文档 |
| [项目管理后端 DDS](2-rmdc-project-management-DDS.md) | 后端详细设计 |
| [Vue3 TypeScript 规范](../1-rmdc-system/prompts/vue3-typescript-stye.md) | 前端开发规范 |
| [API 开发规范](../../../ProjectAGiPrompt/1-Golang项目/3-api-development-prompt.md) | 接口设计规范 |
### 14.2 组件清单
| 组件 | 文件路径 | 说明 |
|:---|:---|:---|
| BasicInfoForm | `components/BasicInfoForm.vue` | 基本信息编辑表单 |
| BasicInfoReadonly | `components/BasicInfoReadonly.vue` | 基本信息只读 |
| BusinessInfoReadonly | `components/BusinessInfoReadonly.vue` | 业务信息只读 |
| DeploymentBusinessForm | `components/DeploymentBusinessForm.vue` | 业务信息表单 |
| DeploymentEnvironmentForm | `components/DeploymentEnvironmentForm.vue` | 环境信息表单 |
| EnvironmentInfoReadonly | `components/EnvironmentInfoReadonly.vue` | 环境信息只读 |
| HostsInfoReadonly | `components/HostsInfoReadonly.vue` | 主机信息只读 |
| HostsManagement | `components/HostsManagement.vue` | 主机管理 |
| MiddlewareCardsGrid | `components/MiddlewareCardsGrid.vue` | 中间件卡片网格 |
| MiddlewareInfoReadonly | `components/MiddlewareInfoReadonly.vue` | 中间件只读 |
| AuthorizationManagement | `components/AuthorizationManagement.vue` | 授权管理 |
| VersionHistory | `components/VersionHistory.vue` | 版本历史 |
| SaveConfirmDialog | `components/SaveConfirmDialog.vue` | 保存确认对话框 |
| CopyableField | `components/CopyableField.vue` | 可复制字段 |
| ProjectBasicInfoCard | `components/ProjectBasicInfoCard.vue` | 项目基本信息卡片 |