📟 组件设计
## 目录结构设计
```language
-- index.vue // 主体
-- dashborad-card.vue 面板组件
-- add-widget.vue 编辑 or 新增小部件
-- components
---- modal-box.vue // 弹窗集合
---- monitor-form.vue // 动态表单集合
---- title-content.vue // 卡片标题
---- tab-btn.vue // 可操作按钮集合
...
-- card-components
---- alarm-stats.vue // 告警统计
---- resource-monitor.vue // 资源监控
---- group-view.vue // 分组
...
```
## 组件细节
#### index.vue
>w ◆ keepAlive 组件缓存
◆ 主体数据控制中心
#### dashborad-card.vue
`参数配置:`
```javascript
// 组件调用
<dashborad-card
v-if="activeName===item.id&&cardData.length"
:rate="rate" // 布局设置占比
:catalogueEdit="catalogueEdit" // 编辑状态
:gutter="gutter" // 间隙
:cardData="cardData" // 小部件数据集合
:tabId="item.id" // 面板id
:height="height" // 1*1单卡片高度
@changeShow="changeShow" // 分组 收起、展开
@updateLayout="updateLayout" // 拖拽小部件更新视图
@updateGroup="updateGroup" // 拖拽分组更新视图
@editCard="editCard" // 编辑小部件
/>
// 组件内容
sortable: null, // 排序实例
is_put_away: false, // 是否展开,逻辑变量
isChooseGroup: false, // 拖拽选择组,逻辑变量
isRefresh: false // echart 防止变形
```
#### add-widget.vue
`system/overview/addWidget?id=2&cardId=1`
<span style="color:#ff0000">id:面板id,cardId:小部件id</span>
>w ◆ 浏览器刷新 根据 编辑状态 返回主面板与否
◆ 编辑小部件主体数据控制中心
#### modal-box.vue
`参数配置`
```javascript
// 组件调用
<modal-box
:type="modalType" // 弹窗类型
@clearType="clearType" // 关闭弹窗
/>
// 组件内容:
dialogVisible: false, // 弹窗打开状态
dialogMap: { // 弹窗集合
ADD_DB: {
title: "新增面板",
width: "20%",
btns: [
{ type: 'default', name: '取消', handleClick: this.clearType },
{ type: 'primary', name: '确定', handleClick: this.submit }]
},
EDIT_DIR: {
title: "切换目录",
width: "30%",
btns: []
}
},
```
#### monitor-form.vue
`参数配置`
```javascript
// 组件调用
<monitor-form
v-for="item in monitorForm" // 动态表单数据
v-bind="item"
:key="item.id"
@changeValue="changeValue" // 更新数据
/>
// 组件内容:
watch: {
value(val) {
this.$emit('changeValue', { val, id: this.id })
}
},
created() {
this.value = _.cloneDeep(this.val)
},
```
#### title-content.vue
`参数配置`
```javascript
// 组件调用
<title-content
v-bind="$attrs" // 参数传递
v-on="$listeners" // 事件传递
:catalogueEdit='catalogueEdit' // 编辑状态
/>
// 组件内容:
editCard(name) { // 编辑卡片
this.$emit('editCard', { name, id: this.id })
}
```
#### tab-btn.vue
`参数配置`
```javascript
// 组件调用
<tab-btn
:catalogueEdit="catalogueEdit" // 编辑状态
@onIcon="onIcon" // icons 按钮 多个
/>
// 组件内容:
btnList: [
{ icon: 'icon-aw-add-to2', text: '', name: 'add', show: true },
{ icon: 'icon-aw-tb', text: '', name: 'tab', show: true },
{ icon: 'icon-aw-tsbaob', text: '', name: 'screen', show: true },
{ icon: 'icon-aw-setting', text: '', name: 'edit', show: true },
{ icon: 'icon-aw-add-to2', text: '添加小部件', name: 'addWidget', show: false },
{ icon: 'icon-aw-storage', text: '保存', name: 'save', show: false },
{ icon: 'icon-aw-delete', text: '删除', name: 'delete', show: false }
],
time: [], // 面板数据范围时间
pickerOptions: { // 时间枚举配置
shortcuts: this.getShortcuts()
}
onIcon(name) {
this.$emit('onIcon', name)
},
getShortcuts() {
let arr = ['minute_5', 'minute_10', 'minute_15', 'hour_1', 'hour_4', 'day_1', 'day_2', 'day_7', 'day_30']
let newArr = []
arr.forEach(item => {
const value = item.split("_")
newArr.push({
text: this.$t('global.timeType', { num: value[1], type: this.$t(`units.${value[0]}`) }),
onClick(picker) {
const end = moment().format('YYYY-MM-DD HH:mm:ss');
const start = moment().subtract(1, 'months').format('YYYY-MM-DD HH:mm:ss');
picker.$emit("pick", [start, end]);
}
})
})
return newArr
}
```
### card-components
`多个,单例扼要:`
#### alarm-stats.vue
`参数配置`
```javascript
// 组件调用
<alarm-stats
v-if="item.widget_type==='alarm_stats'"
v-bind="item"
v-on="$listeners" // 事件传递
:catalogueEdit='catalogueEdit' // 编辑状态
:isRefresh="isRefresh" // echart 防止变形
/>
// 组件内容:
alarmMessageMap: { // 状态枚举
'4': 'urgency',
'3': 'serious',
'2': "common",
'1': 'slight'
},
alarmMessageList: [], // 状态
option: {}, // 趋势
```