vue2-client 1.20.71 → 1.20.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,78 +5,160 @@
5
5
  <template slot="title">
6
6
  <div class="device-header">
7
7
  <div class="device-title">
8
- <a-icon type="tool" style="color: #1890FF;" />
9
- <span>AI拍照识别</span>
8
+ <a-icon type="tool" style="color: #1890FF;"/>
9
+ <span>{{ config?.titleText || 'AI检测结果' }}</span>
10
10
  </div>
11
11
  <div class="device-count">
12
- AI识别 {{ (deviceList || []).length }}
12
+ {{ config?.titleLeftCountText || 'AI识别' }}{{ (deviceList || []).length }}{{
13
+ config?.titleLeftCountUnitText
14
+ || '项'
15
+ }}
13
16
  </div>
14
17
  </div>
15
18
  </template>
16
19
 
17
20
  <!-- 设备网格 -->
18
21
  <div class="device-grid">
19
- <div
20
- v-for="device in deviceList"
21
- :key="device.id"
22
- class="device-item"
23
- :class="device.statusClass"
24
- >
25
- <!-- 状态指示条 -->
26
- <!-- 设备内容 -->
27
- <div class="device-content">
28
- <!-- 设备头部:图标、名称、品牌型号和状态 -->
29
- <div class="device-item-header">
30
- <div class="device-info-section">
31
- <div class="device-icon">
32
- <device-icon :type="getDeviceIconType(device)" />
22
+ <!-- 第一行:两个卡片并排 -->
23
+ <div class="device-row">
24
+ <!-- 操作违规 -->
25
+ <div class="device-item">
26
+ <div class="device-content">
27
+ <div class="device-item-header">
28
+ <div class="device-info-section">
29
+ <div class="device-icon">
30
+ <device-icon type="stove"/>
31
+ </div>
32
+ <div class="device-info">
33
+ <div class="device-name">{{ getDeviceByName('operationalViolation')?.name }}</div>
34
+ <div class="device-brand-model">{{ getDeviceByName('operationalViolation')?.desc }}</div>
35
+ </div>
33
36
  </div>
34
- <div class="device-info">
35
- <div class="device-name">{{ getDeviceName(device) }}</div>
36
- <div class="device-brand-model"></div>
37
+ <div class="device-status-badge status-warning">
38
+ <span class="status-text">{{ getDeviceByName('operationalViolation')?.tag }}</span>
37
39
  </div>
38
40
  </div>
39
- <div class="device-status-badge" :class="getStatusBadgeClass(device)">
40
- <span class="status-text">{{ getDeviceKxd(device) }}</span>
41
+ <div class="violation-section">
42
+ <div class="violation-row section-header">
43
+ <span class="header-item">详情</span>
44
+ <span class="header-item">图片</span>
45
+ </div>
46
+ <div
47
+ v-for="item in getDeviceByName('operationalViolation')?.item || []"
48
+ :key="item.key"
49
+ class="violation-row">
50
+ <span class="violation-key">{{ item.key }}</span>
51
+ <div class="violation-images" v-if="item.img && item.img.length > 0">
52
+ <img
53
+ v-for="(imgUrl, idx) in item.img"
54
+ :key="idx"
55
+ :src="imgUrl"
56
+ :alt="item.key + '-' + idx"
57
+ class="violation-img"
58
+ />
59
+ </div>
60
+ <div v-else class="violation-images-empty"></div>
61
+ </div>
62
+ <div v-if="(!getDeviceByName('operationalViolation')?.item || getDeviceByName('operationalViolation')?.item.length === 0)" class="empty-content">
63
+ <span>暂无数据</span>
64
+ </div>
41
65
  </div>
42
66
  </div>
67
+ </div>
43
68
 
44
- <!-- 安全检查 -->
45
- <div class="safety-checks-section" v-if="getDeviceDetail(device).length > 0">
46
- <div class="section-title">详情</div>
47
- <div class="safety-checks-grid">
69
+ <!-- 检测结果不一致 -->
70
+ <div class="device-item">
71
+ <div class="device-content">
72
+ <div class="device-item-header">
73
+ <div class="device-info-section">
74
+ <div class="device-icon">
75
+ <device-icon type="stove"/>
76
+ </div>
77
+ <div class="device-info">
78
+ <div class="device-name">{{ getDeviceByName('detectionResultInconsistent')?.name }}</div>
79
+ <div class="device-brand-model">{{ getDeviceByName('detectionResultInconsistent')?.desc }}</div>
80
+ </div>
81
+ </div>
82
+ <div class="device-status-badge status-warning">
83
+ <span class="status-text">{{ getDeviceByName('detectionResultInconsistent')?.tag }}</span>
84
+ </div>
85
+ </div>
86
+ <div class="inconsistent-section">
87
+ <div class="inconsistent-row section-header">
88
+ <span class="header-item">详情</span>
89
+ <span class="header-item">图片</span>
90
+ <span class="header-item">安检结果</span>
91
+ <span class="header-item">AI检测结果</span>
92
+ </div>
48
93
  <div
49
- v-for="check in getDeviceDetail(device)"
50
- :key="check.key"
51
- class="check-item"
52
- :class="{ 'check-risk': check.isRisk }"
53
- >
54
- <span class="check-label">{{ check.key }}:</span>
55
- <span class="check-value" :class="getCheckValueClass(check.isRisk)">{{ check.value }}</span>
94
+ v-for="item in getDeviceByName('detectionResultInconsistent')?.item || []"
95
+ :key="item.index"
96
+ class="inconsistent-row">
97
+ <div class="inconsistent-item">{{ item.name }}</div>
98
+ <div class="inconsistent-item"><img v-if="item.inspectorImg" :src="item.inspectorImg" class="violation-img" /><span v-else></span></div>
99
+ <div class="inconsistent-item">
100
+ <a-tag :color="getStatusTag(item.inspectorVal, item.options)?.color">
101
+ {{ getStatusTag(item.inspectorVal, item.options)?.text }}
102
+ </a-tag>
103
+ </div>
104
+ <div class="inconsistent-action">
105
+ <a-tag
106
+ :color="getStatusTag(item.aiVal, item.options)?.color"
107
+ :class="{ 'clickable-tag': isInconsistent(item) }"
108
+ @click="isInconsistent(item) && handleProcess(item)"
109
+ >
110
+ {{ getStatusTag(item.aiVal, item.options)?.text }}
111
+ </a-tag>
112
+ </div>
113
+ </div>
114
+ <div v-if="(!getDeviceByName('detectionResultInconsistent')?.item || getDeviceByName('detectionResultInconsistent')?.item.length === 0)" class="empty-content">
115
+ <span>暂无数据</span>
56
116
  </div>
57
117
  </div>
58
118
  </div>
119
+ </div>
120
+ </div>
59
121
 
60
- <!-- 设备照片 -->
61
- <div class="device-photos-section" v-if="getDevicePhoto(device).length > 0">
62
- <div class="section-title">设备照片</div>
63
- <file-image-group
64
- :file-ids="getDevicePhoto(device)"
65
- :service-name="serviceName"
66
- :columns="2"
67
- :image-size="60"
68
- :gap="8"
69
- :alt-prefix="device.name + '照片'"
70
- empty-text="暂无设备照片"
71
- />
122
+ <!-- 第二行:新增隐患(只有item长度大于0才展示) -->
123
+ <div class="device-row" v-if="getDeviceByName('addDanger')?.item && getDeviceByName('addDanger')?.item.length > 0">
124
+ <div class="device-item danger-full-width">
125
+ <div class="device-content">
126
+ <div class="device-item-header">
127
+ <div class="device-info-section">
128
+ <div class="device-icon">
129
+ <device-icon type="stove"/>
130
+ </div>
131
+ <div class="device-info">
132
+ <div class="device-name">{{ getDeviceByName('addDanger')?.name }}</div>
133
+ <div class="device-brand-model">{{ getDeviceByName('addDanger')?.desc }}</div>
134
+ </div>
135
+ </div>
136
+ <div class="device-status-badge status-warning">
137
+ <span class="status-text">{{ getDeviceByName('addDanger')?.tag }}</span>
138
+ </div>
139
+ </div>
140
+ <div class="danger-section">
141
+ <div class="danger-row section-header">
142
+ <span class="header-item">详情</span>
143
+ <span class="header-item">图片</span>
144
+ <span class="header-item">AI检测结果</span>
145
+ </div>
146
+ <div
147
+ v-for="item in getDeviceByName('addDanger')?.item || []"
148
+ :key="item.index"
149
+ class="danger-row">
150
+ <div class="danger-item">{{ item.name }}</div>
151
+ <div class="danger-item"><img v-if="item.aiImg" :src="item.aiImg" class="violation-img" /><span v-else></span></div>
152
+ <div class="danger-item">{{ item.aiVal }}</div>
153
+ </div>
154
+ </div>
72
155
  </div>
73
-
74
156
  </div>
75
157
  </div>
76
158
 
77
159
  <!-- 空状态 -->
78
- <div v-if="!deviceList || deviceList.length === 0" class="device-empty">
79
- <a-icon type="tool" style="font-size: 48px; color: #d9d9d9;" />
160
+ <div v-if="deviceList.length === 0" class="device-empty">
161
+ <a-icon type="tool" style="font-size: 48px; color: #d9d9d9;"/>
80
162
  <p style="color: #999; margin-top: 16px;">暂无设备信息</p>
81
163
  </div>
82
164
  </div>
@@ -85,7 +167,7 @@
85
167
  </template>
86
168
 
87
169
  <script>
88
- import { FileImageGroup } from '@vue2-client/base-client/components/common/FileImage'
170
+ import {FileImageGroup} from '@vue2-client/base-client/components/common/FileImage'
89
171
  import DeviceIcon from './DeviceIcon.vue'
90
172
 
91
173
  export default {
@@ -95,180 +177,89 @@ export default {
95
177
  DeviceIcon
96
178
  },
97
179
  inject: {
98
- serviceName: { default: '' }
180
+ serviceName: {default: ''}
99
181
  },
100
182
  props: {
101
183
  deviceList: {
102
184
  type: Array,
103
185
  default: () => []
186
+ },
187
+ config: {
188
+ type: Object,
189
+ default: () => {
190
+ }
104
191
  }
105
192
  },
106
193
  methods: {
107
- /**
108
- * 根据设备信息获取图标类型
109
- */
110
- getDeviceIconType (device) {
111
- // 根据设备名称判断类型
112
- return 'stove'
113
- },
114
-
115
- getDeviceName (device) {
116
- // 根据设备名称判断类型
117
- const find = device.properties.find(item => item.key === '名称')
118
- return find?.value || 'default'
119
- },
120
-
121
- getDeviceKxd (device) {
122
- // 根据设备名称判断类型
123
- const find = device.properties.find(item => item.key === '可信度')
124
- return find?.value || '90%'
125
- },
126
-
127
- getDeviceDetail (device) {
128
- // 过滤掉“名称”
129
- const filter = device.properties.filter(item => item.key !== '名称')
130
-
131
- // 遍历处理“可信度”
132
- const result = filter.map(item => {
133
- if (item.key === '可信度') {
134
- const val = item.value
135
-
136
- // 如果是类似 "62.7%" 或 "62.86000000000001%"
137
- if (typeof val === 'string' && val.includes('%')) {
138
- const num = parseFloat(val.replace('%', ''))
139
-
140
- if (!isNaN(num)) {
141
- // 控制精度(保留1位 or 2位按你需求)
142
- item.value = num.toFixed(1) + '%'
143
- }
144
- }
145
-
146
- // 如果是纯数字(例如 0.6286)
147
- else if (typeof val === 'number') {
148
- item.value = (val * 100).toFixed(1) + '%'
149
- }
150
- }
151
-
152
- return item
153
- })
154
-
155
- console.warn('getDeviceDetail', result)
156
- return result || []
157
- },
158
194
 
159
195
  /**
160
- * 检查照片是否有真实文件ID
196
+ * 根据key获取设备数据
197
+ * @param {string} key - 设备key
198
+ * @returns {object|null} - 设备数据
161
199
  */
162
- hasRealFileIds (photos) {
163
- return photos && photos.length > 0 && photos.some(photo => photo.fileId)
200
+ getDeviceByName(key) {
201
+ return this.deviceList.find(device => device.key === key)
164
202
  },
165
203
 
166
204
  /**
167
- * 获取文件ID数组
205
+ * 判断安检结果和AI检测结果是否不一致
206
+ * @param {object} item - 检测项数据
207
+ * @returns {boolean} - 是否不一致
168
208
  */
169
- getFileIds (photos) {
170
- return photos.filter(photo => photo.fileId).map(photo => photo.fileId)
209
+ isInconsistent(item) {
210
+ const inspectorTag = this.getStatusTag(item.inspectorVal, item.options)
211
+ const aiTag = this.getStatusTag(item.aiVal, item.options)
212
+ return inspectorTag?.text !== aiTag?.text
171
213
  },
172
214
 
173
215
  /**
174
- * 获取状态徽章样式类
216
+ * 根据值和options判断状态
217
+ * @param {string} value - 当前值
218
+ * @param {array} options - 选项配置数组
219
+ * @returns {object} - { color, text }
175
220
  */
176
- getStatusBadgeClass (device) {
177
- const statusMap = {
178
- normal: 'status-normal',
179
- warning: 'status-warning',
180
- error: 'status-error'
181
- }
182
- // 根据设备名称判断类型
183
- const find = device.properties.find(item => item.key === '可信度')
184
- const value = parseFloat(find?.value)
185
- console.warn('getStatusBadgeClass', value)
186
-
187
- if (isNaN(value)) return statusMap.error
188
-
189
- if (value >= 70) {
190
- return statusMap.normal
191
- } else if (value >= 40) {
192
- return statusMap.warning
193
- } else {
194
- return statusMap.error
221
+ getStatusTag(value, options) {
222
+ if (!options || !Array.isArray(options)) {
223
+ return { color: 'default', text: value || '未知' }
195
224
  }
196
- },
197
225
 
198
- /**
199
- * 格式化字段值
200
- */
201
- formatFieldValue (field) {
202
- if (!field.value) return '——'
226
+ // 扁平化 options(处理二维数组)
227
+ const flatOptions = options.flat()
228
+ const matchedOption = flatOptions.find(opt => opt.data === value)
203
229
 
204
- // 如果是日期类型,格式化显示
205
- if (field.type === 'datePicker' || field.key.includes('_date')) {
206
- return this.formatDate(field.value)
230
+ if (matchedOption) {
231
+ if (matchedOption.isdefect) {
232
+ return { color: 'red', text: '异常' }
233
+ } else {
234
+ return { color: 'green', text: '正常' }
235
+ }
207
236
  }
208
237
 
209
- return field.value
238
+ return { color: 'default', text: value || '未知' }
210
239
  },
211
240
 
212
241
  /**
213
- * 格式化日期
242
+ * 处理按钮点击事件 - 将数据抛出到父组件
214
243
  */
215
- formatDate (dateStr) {
216
- if (!dateStr) return '——'
217
-
218
- try {
219
- const date = new Date(dateStr)
220
- if (isNaN(date.getTime())) return dateStr
221
-
222
- return date.toISOString().substring(0, 10)
223
- } catch (error) {
224
- return dateStr
225
- }
244
+ handleProcess(item) {
245
+ this.$emit('process-item', item)
226
246
  },
227
247
 
228
248
  /**
229
- *
249
+ * 获取设备照片(将 url 数组转换为 {url} 数组)
230
250
  */
231
- getDevicePhoto(device) {
232
- return device?.image || []
251
+ getImagesPhotos(images) {
252
+ return Array.isArray(images)
253
+ ? images.map(url => ({url}))
254
+ : []
233
255
  },
234
256
 
235
257
  /**
236
258
  * 预览隐患照片
237
259
  */
238
- handlePreviewHazardPhotos (hazardPhotos, currentIndex = 0) {
260
+ handlePreviewHazardPhotos(hazardPhotos, currentIndex = 0) {
239
261
  const photos = hazardPhotos.map(photo => photo.url)
240
262
  this.$emit('preview-photos', photos, currentIndex)
241
- },
242
-
243
- /**
244
- * 获取检查值样式类
245
- */
246
- getCheckValueClass (isRisk) {
247
- return isRisk ? 'check-value-risk' : 'check-value-normal'
248
- },
249
-
250
- /**
251
- * 获取建议样式类
252
- */
253
- getAdviceClass (status) {
254
- const classMap = {
255
- normal: 'advice-normal',
256
- warning: 'advice-warning',
257
- error: 'advice-error'
258
- }
259
- return classMap[status] || 'advice-normal'
260
- },
261
-
262
- /**
263
- * 获取建议图标
264
- */
265
- getAdviceIcon (status) {
266
- const iconMap = {
267
- normal: 'check-circle',
268
- warning: 'exclamation-circle',
269
- error: 'close-circle'
270
- }
271
- return iconMap[status] || 'info-circle'
272
263
  }
273
264
  }
274
265
  }
@@ -304,10 +295,15 @@ export default {
304
295
  }
305
296
 
306
297
  .device-grid {
307
- display: grid;
308
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
298
+ display: flex;
299
+ flex-direction: column;
300
+ gap: 16px;
301
+ min-height: 150px;
302
+ }
303
+
304
+ .device-row {
305
+ display: flex;
309
306
  gap: 16px;
310
- min-height: 200px;
311
307
  }
312
308
 
313
309
  .device-item {
@@ -318,11 +314,16 @@ export default {
318
314
  overflow: hidden;
319
315
  background: white;
320
316
  transition: all 0.3s ease;
317
+ width: calc(50% - 8px);
321
318
 
322
319
  &:hover {
323
320
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
324
321
  transform: translateY(-2px);
325
322
  }
323
+
324
+ &.danger-full-width {
325
+ width: calc(50% - 8px);
326
+ }
326
327
  }
327
328
 
328
329
  .device-status-bar {
@@ -358,7 +359,7 @@ export default {
358
359
  gap: 4px;
359
360
  padding: 2px 8px;
360
361
  border-radius: 12px;
361
- font-size: 11px;
362
+ font-size: 12px;
362
363
  font-weight: 500;
363
364
  border: 1px solid;
364
365
  white-space: nowrap; // 禁止换行,防止打印时文字竖排显示
@@ -431,12 +432,12 @@ export default {
431
432
  }
432
433
 
433
434
  span {
434
- font-size: 11px;
435
+ font-size: 12px;
435
436
  }
436
437
  }
437
438
 
438
439
  .device-details {
439
- font-size: 11px;
440
+ font-size: 12px;
440
441
  color: #6b7280;
441
442
  line-height: 1.4;
442
443
  max-height: 120px;
@@ -492,20 +493,45 @@ export default {
492
493
  text-align: center;
493
494
  }
494
495
 
496
+ /* 空内容样式 */
497
+ .empty-content {
498
+ display: flex;
499
+ align-items: center;
500
+ justify-content: center;
501
+ padding: 16px;
502
+ color: #9ca3af;
503
+ font-size: 12px;
504
+ }
505
+
495
506
  /* 响应式适配 */
496
507
  @media (max-width: 1200px) {
497
508
  .device-grid {
498
- grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
499
509
  gap: 12px;
500
510
  }
511
+
512
+ .device-row {
513
+ gap: 12px;
514
+ }
515
+
516
+ .device-item {
517
+ width: calc(50% - 6px);
518
+ }
501
519
  }
502
520
 
503
521
  @media (max-width: 768px) {
504
522
  .device-grid {
505
- grid-template-columns: 1fr;
506
523
  gap: 12px;
507
524
  }
508
525
 
526
+ .device-row {
527
+ flex-direction: column;
528
+ gap: 12px;
529
+ }
530
+
531
+ .device-item {
532
+ width: 100%;
533
+ }
534
+
509
535
  .device-content {
510
536
  padding: 12px;
511
537
  }
@@ -617,7 +643,7 @@ export default {
617
643
  }
618
644
 
619
645
  .tag-label {
620
- font-size: 11px;
646
+ font-size: 12px;
621
647
  color: #6b7280;
622
648
  font-weight: 500;
623
649
  }
@@ -635,8 +661,9 @@ export default {
635
661
  }
636
662
 
637
663
  .check-item {
638
- display: flex;
639
- justify-content: space-between;
664
+ display: grid;
665
+ grid-template-columns: 1fr 60px;
666
+ gap: 12px;
640
667
  align-items: center;
641
668
  font-size: 12px;
642
669
  padding: 6px 0;
@@ -648,6 +675,11 @@ export default {
648
675
  }
649
676
  }
650
677
 
678
+ .check-text {
679
+ display: flex;
680
+ align-items: center;
681
+ }
682
+
651
683
  .check-label {
652
684
  color: #6b7280;
653
685
  flex-shrink: 0;
@@ -663,6 +695,18 @@ export default {
663
695
  font-weight: 600;
664
696
  }
665
697
 
698
+ .check-photo {
699
+ width: 60px;
700
+ height: 40px;
701
+ border-radius: 4px;
702
+ overflow: hidden;
703
+ }
704
+
705
+ .check-photo-placeholder {
706
+ width: 60px;
707
+ height: 40px;
708
+ }
709
+
666
710
  .hazard-photos-section {
667
711
  .hazard-photos-grid {
668
712
  display: grid;
@@ -786,6 +830,165 @@ export default {
786
830
  }
787
831
  }
788
832
 
833
+ /* 标题行样式 */
834
+ .section-header {
835
+ font-size: 12px;
836
+ font-weight: 600;
837
+ color: #6b7280;
838
+ border-bottom: 1px solid #e5e7eb;
839
+ margin-bottom: 8px;
840
+ }
841
+
842
+ /* 操作违规样式 */
843
+ .violation-section {
844
+ margin-top: 12px;
845
+
846
+ .section-header {
847
+ .header-item:nth-child(1) {
848
+ flex: 3;
849
+ }
850
+ .header-item:nth-child(2) {
851
+ flex: 1;
852
+ }
853
+ }
854
+ }
855
+
856
+ .violation-row {
857
+ display: flex;
858
+ align-items: center;
859
+ gap: 12px;
860
+ padding: 8px 0;
861
+ border-bottom: 1px solid #f0f0f0;
862
+
863
+ &:last-child {
864
+ border-bottom: none;
865
+ }
866
+ }
867
+
868
+ .violation-key {
869
+ font-size: 12px;
870
+ color: #374151;
871
+ flex: 1;
872
+ }
873
+
874
+ .violation-images {
875
+ display: flex;
876
+ gap: 8px;
877
+ }
878
+
879
+ .violation-img {
880
+ width: 50px;
881
+ height: 50px;
882
+ border-radius: 4px;
883
+ object-fit: cover;
884
+ }
885
+
886
+ .violation-images-empty {
887
+ width: 50px;
888
+ height: 50px;
889
+ border: 1px dashed #d1d5db;
890
+ border-radius: 4px;
891
+ background: #f9fafb;
892
+ }
893
+
894
+ /* 检测结果不一致样式 */
895
+ .inconsistent-section {
896
+ margin-top: 12px;
897
+
898
+ .section-header {
899
+ display: grid;
900
+ grid-template-columns: 5fr 3fr 3fr 3fr;
901
+ gap: 8px;
902
+ padding: 8px;
903
+ border-bottom: 1px solid #e5e7eb;
904
+ margin-bottom: 8px;
905
+ font-size: 12px;
906
+ font-weight: 600;
907
+ color: #6b7280;
908
+ }
909
+ }
910
+
911
+ .inconsistent-row {
912
+ display: grid;
913
+ grid-template-columns: 5fr 3fr 3fr 3fr;
914
+ gap: 4px;
915
+ padding: 8px;
916
+ border-radius: 8px;
917
+ margin-bottom: 8px;
918
+ font-size: 12px;
919
+ color: #6b7280;
920
+
921
+ &:last-child {
922
+ margin-bottom: 0;
923
+ }
924
+ }
925
+
926
+ .inconsistent-item {
927
+ display: flex;
928
+ align-items: center;
929
+ justify-content: left;
930
+ word-break: break-word;
931
+ text-align: left;
932
+ }
933
+
934
+ .inconsistent-action {
935
+ display: flex;
936
+ align-items: center;
937
+ justify-content: center;
938
+ }
939
+
940
+ .clickable-tag {
941
+ cursor: pointer;
942
+ }
943
+
944
+ /* 新增隐患样式 */
945
+ .danger-section {
946
+ margin-top: 12px;
947
+
948
+ .section-header {
949
+ display: grid;
950
+ grid-template-columns: 3fr 2fr 2fr;
951
+ gap: 8px;
952
+ padding: 8px;
953
+ //border-bottom: 1px solid #e5e7eb;
954
+ //margin-bottom: 8px;
955
+ font-size: 12px;
956
+ font-weight: 600;
957
+ color: #6b7280;
958
+ }
959
+ }
960
+
961
+ .danger-row {
962
+ display: grid;
963
+ grid-template-columns: 3fr 2fr 2fr;
964
+ gap: 8px;
965
+ padding: 8px;
966
+ //background: #fff5f5;
967
+ border-radius: 8px;
968
+ margin-bottom: 8px;
969
+ //border: 1px solid #ffccc7;
970
+ font-size: 12px;
971
+ color: #6b7280;
972
+
973
+ &:last-child {
974
+ margin-bottom: 0;
975
+ }
976
+ }
977
+
978
+ .danger-item {
979
+ display: flex;
980
+ align-items: center;
981
+ justify-content: left;
982
+ word-break: break-word;
983
+ text-align: left;
984
+ }
985
+
986
+ .danger-action {
987
+ display: flex;
988
+ align-items: center;
989
+ justify-content: center;
990
+ }
991
+
789
992
  /* 响应式适配优化 */
790
993
  @media (max-width: 1024px) {
791
994
  .basic-info-tags {
@@ -798,7 +1001,7 @@ export default {
798
1001
  }
799
1002
 
800
1003
  .tag-value {
801
- font-size: 11px;
1004
+ font-size: 12px;
802
1005
  }
803
1006
 
804
1007
  .device-icon {
@@ -815,7 +1018,7 @@ export default {
815
1018
  }
816
1019
 
817
1020
  .device-brand-model {
818
- font-size: 11px;
1021
+ font-size: 12px;
819
1022
  }
820
1023
  }
821
1024
 
@@ -846,11 +1049,11 @@ export default {
846
1049
  }
847
1050
 
848
1051
  .section-title {
849
- font-size: 11px;
1052
+ font-size: 12px;
850
1053
  }
851
1054
 
852
1055
  .check-item {
853
- font-size: 11px;
1056
+ font-size: 12px;
854
1057
  }
855
1058
  }
856
1059
  </style>