From e76f0739e647fe8a7e0e2618914e2faff554b1b7 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期一, 17 十一月 2025 17:33:23 +0800
Subject: [PATCH] 解决冲突
---
mes-web/src/views/device/DeviceGroupEditDialog.vue | 712 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 712 insertions(+), 0 deletions(-)
diff --git a/mes-web/src/views/device/DeviceGroupEditDialog.vue b/mes-web/src/views/device/DeviceGroupEditDialog.vue
new file mode 100644
index 0000000..57dc0c9
--- /dev/null
+++ b/mes-web/src/views/device/DeviceGroupEditDialog.vue
@@ -0,0 +1,712 @@
+<template>
+ <el-dialog
+ :visible="visible"
+ :title="title"
+ width="70%"
+ :close-on-click-modal="false"
+ @close="handleClose"
+ @update:visible="(val) => emit('update:visible', val)"
+ >
+ <el-form
+ ref="formRef"
+ :model="form"
+ :rules="rules"
+ label-width="120px"
+ class="device-group-form"
+ >
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <!-- 鍩烘湰淇℃伅 -->
+ <el-card shadow="never" class="form-card">
+ <template #header>
+ <div class="card-header">
+ <span>鍩烘湰淇℃伅</span>
+ </div>
+ </template>
+
+ <el-form-item label="缁勫悕绉�" prop="groupName">
+ <el-input
+ v-model="form.groupName"
+ placeholder="璇疯緭鍏ヨ澶囩粍鍚嶇О"
+ maxlength="50"
+ show-word-limit
+ />
+ </el-form-item>
+
+ <el-form-item label="缁勭紪鐮�" prop="groupCode">
+ <el-input
+ v-model="form.groupCode"
+ placeholder="璇疯緭鍏ヨ澶囩粍缂栫爜"
+ maxlength="20"
+ :disabled="isEdit"
+ @blur="generateCode"
+ >
+ <template #append>
+ <el-button @click="generateCode" :disabled="isEdit">
+ 鑷姩鐢熸垚
+ </el-button>
+ </template>
+ </el-input>
+ </el-form-item>
+
+ <el-form-item label="缁勭被鍨�" prop="groupType">
+ <el-select v-model="form.groupType" placeholder="閫夋嫨缁勭被鍨�">
+ <el-option label="璁惧缁�" value="璁惧缁�" />
+ <el-option label="绠$悊缁�" value="绠$悊缁�" />
+ <el-option label="鐩戞帶缁�" value="鐩戞帶缁�" />
+ <el-option label="缁存姢缁�" value="缁存姢缁�" />
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="鎻忚堪淇℃伅">
+ <el-input
+ v-model="form.description"
+ type="textarea"
+ :rows="4"
+ placeholder="璇疯緭鍏ヨ澶囩粍鎻忚堪淇℃伅"
+ maxlength="200"
+ show-word-limit
+ />
+ </el-form-item>
+
+ <el-form-item label="鎺掑簭搴忓彿" prop="sortOrder">
+ <el-input-number
+ v-model="form.sortOrder"
+ :min="0"
+ :max="999"
+ placeholder="鎺掑簭搴忓彿"
+ />
+ </el-form-item>
+ </el-card>
+ </el-col>
+
+ <el-col :span="12">
+ <!-- 閰嶇疆淇℃伅 -->
+ <el-card shadow="never" class="form-card">
+ <template #header>
+ <div class="card-header">
+ <span>閰嶇疆淇℃伅</span>
+ </div>
+ </template>
+
+ <el-form-item label="缁勭姸鎬�" prop="groupStatus">
+ <el-select v-model="form.groupStatus" placeholder="閫夋嫨缁勭姸鎬�">
+ <el-option label="鍚敤" value="ENABLED" />
+ <el-option label="绂佺敤" value="DISABLED" />
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="鏈�澶ц澶囨暟" prop="maxDeviceCount">
+ <el-input-number
+ v-model="form.maxDeviceCount"
+ :min="1"
+ :max="1000"
+ placeholder="鏈�澶ц澶囨暟"
+ />
+ <div class="form-tip">璇ヨ澶囩粍鏈�澶氬彲绠$悊鐨勮澶囨暟閲�</div>
+ </el-form-item>
+
+ <el-form-item label="蹇冭烦闂撮殧" prop="heartbeatInterval">
+ <el-input-number
+ v-model="form.heartbeatInterval"
+ :min="1"
+ :max="3600"
+ placeholder="蹇冭烦闂撮殧(绉�)"
+ />
+ <div class="form-tip">璁惧涓庤缁勭殑蹇冭烦妫�娴嬮棿闅�</div>
+ </el-form-item>
+
+ <el-form-item label="杩炴帴瓒呮椂" prop="connectionTimeout">
+ <el-input-number
+ v-model="form.connectionTimeout"
+ :min="1"
+ :max="300"
+ placeholder="杩炴帴瓒呮椂(绉�)"
+ />
+ <div class="form-tip">杩炴帴璇ョ粍璁惧鐨勬渶澶х瓑寰呮椂闂�</div>
+ </el-form-item>
+
+ <el-form-item label="閲嶈瘯娆℃暟" prop="retryCount">
+ <el-input-number
+ v-model="form.retryCount"
+ :min="0"
+ :max="10"
+ placeholder="閲嶈瘯娆℃暟"
+ />
+ <div class="form-tip">杩炴帴澶辫触鏃剁殑閲嶈瘯娆℃暟</div>
+ </el-form-item>
+ </el-card>
+ </el-col>
+ </el-row>
+
+ <!-- 鍛婅閰嶇疆 -->
+ <el-row :gutter="20">
+ <el-col :span="24">
+ <el-card shadow="never" class="form-card">
+ <template #header>
+ <div class="card-header">
+ <span>鍛婅閰嶇疆</span>
+ </div>
+ </template>
+
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鍚敤鍛婅" prop="enableAlert">
+ <el-switch v-model="form.enableAlert" />
+ </el-form-item>
+
+ <el-form-item label="绂荤嚎鍛婅闃堝��" prop="offlineThreshold">
+ <el-input-number
+ v-model="form.offlineThreshold"
+ :min="1"
+ :max="100"
+ placeholder="绂荤嚎璁惧鏁伴噺闃堝��"
+ />
+ <div class="form-tip">瓒呰繃姝ら槇鍊兼椂瑙﹀彂绂荤嚎鍛婅</div>
+ </el-form-item>
+
+ <el-form-item label="鍝嶅簲瓒呮椂闃堝��" prop="responseTimeout">
+ <el-input-number
+ v-model="form.responseTimeout"
+ :min="1"
+ :max="600"
+ placeholder="鍝嶅簲瓒呮椂闃堝��(绉�)"
+ />
+ <div class="form-tip">璁惧鍝嶅簲鏃堕棿瓒呰繃姝ら槇鍊兼椂鍛婅</div>
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="鍛婅閫氱煡鏂瑰紡" prop="alertNotificationMethod">
+ <el-checkbox-group v-model="form.alertNotificationMethod">
+ <el-checkbox label="email">閭欢</el-checkbox>
+ <el-checkbox label="sms">鐭俊</el-checkbox>
+ <el-checkbox label="wechat">寰俊</el-checkbox>
+ <el-checkbox label="webhook">Webhook</el-checkbox>
+ </el-checkbox-group>
+ </el-form-item>
+
+ <el-form-item label="閫氱煡浜�" prop="notifyUsers">
+ <el-select
+ v-model="form.notifyUsers"
+ multiple
+ placeholder="閫夋嫨閫氱煡浜哄憳"
+ style="width: 100%"
+ >
+ <el-option label="寮犱笁" value="user1" />
+ <el-option label="鏉庡洓" value="user2" />
+ <el-option label="鐜嬩簲" value="user3" />
+ </el-select>
+ </el-form-item>
+
+ <el-form-item label="Webhook URL" v-if="form.alertNotificationMethod?.includes('webhook')">
+ <el-input
+ v-model="form.webhookUrl"
+ placeholder="杈撳叆Webhook閫氱煡鍦板潃"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-card>
+ </el-col>
+ </el-row>
+
+ <!-- 楂樼骇閰嶇疆 -->
+ <el-row :gutter="20">
+ <el-col :span="24">
+ <el-card shadow="never" class="form-card">
+ <template #header>
+ <div class="card-header">
+ <span>楂樼骇閰嶇疆</span>
+ <el-button type="text" @click="showAdvanced = !showAdvanced">
+ {{ showAdvanced ? '鏀惰捣' : '灞曞紑' }}
+ </el-button>
+ </div>
+ </template>
+
+ <div v-show="showAdvanced">
+ <el-row :gutter="20">
+ <el-col :span="12">
+ <el-form-item label="鏁版嵁閲囬泦闂撮殧" prop="dataCollectionInterval">
+ <el-input-number
+ v-model="form.dataCollectionInterval"
+ :min="1"
+ :max="3600"
+ placeholder="鏁版嵁閲囬泦闂撮殧(绉�)"
+ />
+ </el-form-item>
+
+ <el-form-item label="鏁版嵁淇濆瓨鍛ㄦ湡" prop="dataRetentionPeriod">
+ <el-input-number
+ v-model="form.dataRetentionPeriod"
+ :min="1"
+ :max="365"
+ placeholder="鏁版嵁淇濆瓨鍛ㄦ湡(澶�)"
+ />
+ </el-form-item>
+
+ <el-form-item label="鏃ュ織绾у埆" prop="logLevel">
+ <el-select v-model="form.logLevel" placeholder="閫夋嫨鏃ュ織绾у埆">
+ <el-option label="ERROR" value="ERROR" />
+ <el-option label="WARN" value="WARN" />
+ <el-option label="INFO" value="INFO" />
+ <el-option label="DEBUG" value="DEBUG" />
+ </el-select>
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="鍚敤鑷姩澶囦唤" prop="enableAutoBackup">
+ <el-switch v-model="form.enableAutoBackup" />
+ </el-form-item>
+
+ <el-form-item label="澶囦唤闂撮殧" prop="backupInterval" v-if="form.enableAutoBackup">
+ <el-input-number
+ v-model="form.backupInterval"
+ :min="1"
+ :max="168"
+ placeholder="澶囦唤闂撮殧(灏忔椂)"
+ />
+ </el-form-item>
+
+ <el-form-item label="鑷畾涔夊弬鏁�">
+ <el-input
+ v-model="customParamsText"
+ type="textarea"
+ :rows="3"
+ placeholder="JSON鏍煎紡鑷畾涔夊弬鏁�"
+ @blur="validateCustomParams"
+ />
+ <div class="form-tip">渚嬪: {"key1": "value1", "key2": 123}</div>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </div>
+ </el-card>
+ </el-col>
+ </el-row>
+ </el-form>
+
+ <!-- 閰嶇疆楠岃瘉缁撴灉 -->
+ <div v-if="validationResult" class="validation-result">
+ <el-alert
+ :title="validationResult.valid ? '閰嶇疆楠岃瘉閫氳繃' : '閰嶇疆楠岃瘉澶辫触'"
+ :type="validationResult.valid ? 'success' : 'error'"
+ :closable="false"
+ show-icon
+ >
+ <template #default>
+ <div v-if="!validationResult.valid">
+ <p v-for="error in validationResult.errors" :key="error" style="margin: 0;">
+ {{ error }}
+ </p>
+ </div>
+ <div v-else>
+ <p style="margin: 0;">鎵�鏈夐厤缃弬鏁伴獙璇侀�氳繃</p>
+ </div>
+ </template>
+ </el-alert>
+ </div>
+
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button @click="handleClose">鍙栨秷</el-button>
+ <el-button @click="testConfiguration" :loading="testing" :disabled="!form.groupName">
+ 娴嬭瘯閰嶇疆
+ </el-button>
+ <el-button type="primary" @click="submit" :loading="saving">
+ {{ isEdit ? '鏇存柊' : '鍒涘缓' }}
+ </el-button>
+ </div>
+ </template>
+ </el-dialog>
+</template>
+
+<script setup>
+import { ref, reactive, computed, watch, nextTick } from 'vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { deviceGroupApi } from '@/api/device/deviceManagement'
+
+// Props
+const props = defineProps({
+ visible: {
+ type: Boolean,
+ default: false
+ },
+ data: {
+ type: Object,
+ default: () => null
+ }
+})
+
+// Emits
+const emit = defineEmits(['update:visible', 'success', 'close'])
+
+// 鍝嶅簲寮忔暟鎹�
+const formRef = ref(null)
+const showAdvanced = ref(false)
+const testing = ref(false)
+const saving = ref(false)
+const validationResult = ref(null)
+const customParamsText = ref('')
+
+// 琛ㄥ崟鏁版嵁
+const form = reactive({
+ groupName: '',
+ groupCode: '',
+ groupType: '璁惧缁�',
+ description: '',
+ sortOrder: 0,
+ groupStatus: 'ENABLED',
+ maxDeviceCount: 100,
+ heartbeatInterval: 30,
+ connectionTimeout: 10,
+ retryCount: 3,
+ enableAlert: false,
+ offlineThreshold: 5,
+ responseTimeout: 30,
+ alertNotificationMethod: [],
+ notifyUsers: [],
+ webhookUrl: '',
+ dataCollectionInterval: 5,
+ dataRetentionPeriod: 30,
+ logLevel: 'INFO',
+ enableAutoBackup: false,
+ backupInterval: 24,
+ customParams: {}
+})
+
+// 璁$畻灞炴��
+const isEdit = computed(() => !!props.data)
+const title = computed(() => (isEdit.value ? '缂栬緫璁惧缁�' : '鏂板缓璁惧缁�'))
+
+// 楠岃瘉瑙勫垯
+const rules = {
+ groupName: [
+ { required: true, message: '璇疯緭鍏ヨ澶囩粍鍚嶇О', trigger: 'blur' },
+ { min: 2, max: 50, message: '鍚嶇О闀垮害搴斿湪2-50涓瓧绗︿箣闂�', trigger: 'blur' }
+ ],
+ groupCode: [
+ { required: true, message: '璇疯緭鍏ヨ澶囩粍缂栫爜', trigger: 'blur' },
+ { pattern: /^[A-Z0-9_]+$/, message: '缂栫爜鍙兘鍖呭惈澶у啓瀛楁瘝銆佹暟瀛楀拰涓嬪垝绾�', trigger: 'blur' }
+ ],
+ groupType: [
+ { required: true, message: '璇烽�夋嫨缁勭被鍨�', trigger: 'change' }
+ ],
+ sortOrder: [
+ { type: 'number', min: 0, max: 999, message: '鎺掑簭搴忓彿搴斿湪0-999涔嬮棿', trigger: 'blur' }
+ ],
+ maxDeviceCount: [
+ { type: 'number', min: 1, max: 1000, message: '鏈�澶ц澶囨暟搴斿湪1-1000涔嬮棿', trigger: 'blur' }
+ ],
+ heartbeatInterval: [
+ { type: 'number', min: 1, max: 3600, message: '蹇冭烦闂撮殧搴斿湪1-3600绉掍箣闂�', trigger: 'blur' }
+ ],
+ connectionTimeout: [
+ { type: 'number', min: 1, max: 300, message: '杩炴帴瓒呮椂搴斿湪1-300绉掍箣闂�', trigger: 'blur' }
+ ],
+ retryCount: [
+ { type: 'number', min: 0, max: 10, message: '閲嶈瘯娆℃暟搴斿湪0-10涔嬮棿', trigger: 'blur' }
+ ],
+ offlineThreshold: [
+ { type: 'number', min: 1, max: 100, message: '绂荤嚎鍛婅闃堝�煎簲鍦�1-100涔嬮棿', trigger: 'blur' }
+ ],
+ responseTimeout: [
+ { type: 'number', min: 1, max: 600, message: '鍝嶅簲瓒呮椂闃堝�煎簲鍦�1-600绉掍箣闂�', trigger: 'blur' }
+ ],
+ dataCollectionInterval: [
+ { type: 'number', min: 1, max: 3600, message: '鏁版嵁閲囬泦闂撮殧搴斿湪1-3600绉掍箣闂�', trigger: 'blur' }
+ ],
+ dataRetentionPeriod: [
+ { type: 'number', min: 1, max: 365, message: '鏁版嵁淇濆瓨鍛ㄦ湡搴斿湪1-365澶╀箣闂�', trigger: 'blur' }
+ ],
+ backupInterval: [
+ { type: 'number', min: 1, max: 168, message: '澶囦唤闂撮殧搴斿湪1-168灏忔椂涔嬮棿', trigger: 'blur' }
+ ]
+}
+
+// 鐩戝惉鏁版嵁鍙樺寲
+watch(() => props.visible, (newVal) => {
+ if (newVal) {
+ nextTick(() => {
+ resetForm()
+ if (props.data) {
+ loadFormData()
+ }
+ })
+ }
+})
+
+// 鏂规硶瀹氫箟
+const resetForm = () => {
+ Object.assign(form, {
+ groupName: '',
+ groupCode: '',
+ groupType: '璁惧缁�',
+ description: '',
+ sortOrder: 0,
+ groupStatus: 'ENABLED',
+ maxDeviceCount: 100,
+ heartbeatInterval: 30,
+ connectionTimeout: 10,
+ retryCount: 3,
+ enableAlert: false,
+ offlineThreshold: 5,
+ responseTimeout: 30,
+ alertNotificationMethod: [],
+ notifyUsers: [],
+ webhookUrl: '',
+ dataCollectionInterval: 5,
+ dataRetentionPeriod: 30,
+ logLevel: 'INFO',
+ enableAutoBackup: false,
+ backupInterval: 24,
+ customParams: {}
+ })
+ customParamsText.value = ''
+ validationResult.value = null
+ formRef.value?.clearValidate()
+}
+
+const loadFormData = () => {
+ if (!props.data) return
+
+ Object.assign(form, {
+ groupName: props.data.groupName || '',
+ groupCode: props.data.groupCode || '',
+ groupType: props.data.groupType || '璁惧缁�',
+ description: props.data.description || '',
+ sortOrder: props.data.sortOrder || 0,
+ groupStatus: props.data.groupStatus || 'ENABLED',
+ maxDeviceCount: props.data.maxDeviceCount || 100,
+ heartbeatInterval: props.data.heartbeatInterval || 30,
+ connectionTimeout: props.data.connectionTimeout || 10,
+ retryCount: props.data.retryCount || 3,
+ enableAlert: props.data.enableAlert || false,
+ offlineThreshold: props.data.offlineThreshold || 5,
+ responseTimeout: props.data.responseTimeout || 30,
+ alertNotificationMethod: props.data.alertNotificationMethod || [],
+ notifyUsers: props.data.notifyUsers || [],
+ webhookUrl: props.data.webhookUrl || '',
+ dataCollectionInterval: props.data.dataCollectionInterval || 5,
+ dataRetentionPeriod: props.data.dataRetentionPeriod || 30,
+ logLevel: props.data.logLevel || 'INFO',
+ enableAutoBackup: props.data.enableAutoBackup || false,
+ backupInterval: props.data.backupInterval || 24,
+ customParams: props.data.customParams || {}
+ })
+
+ customParamsText.value = JSON.stringify(form.customParams, null, 2)
+}
+
+const generateCode = () => {
+ if (!form.groupName || isEdit.value) return
+
+ const pinyin = require('pinyin-pro')
+ let code = pinyin.pinyin(form.groupName, {
+ toneType: 'none',
+ type: 'array'
+ }).join('').replace(/[^a-zA-Z0-9]/g, '')
+
+ code = code.toUpperCase()
+ if (code.length > 0) {
+ form.groupCode = code
+ }
+}
+
+const validateCustomParams = () => {
+ if (!customParamsText.value.trim()) {
+ validationResult.value = { valid: true, errors: [] }
+ return
+ }
+
+ try {
+ const params = JSON.parse(customParamsText.value)
+ if (typeof params === 'object' && params !== null) {
+ form.customParams = params
+ validationResult.value = { valid: true, errors: [] }
+ } else {
+ throw new Error('鑷畾涔夊弬鏁板繀椤讳负JSON瀵硅薄')
+ }
+ } catch (error) {
+ validationResult.value = {
+ valid: false,
+ errors: [`鑷畾涔夊弬鏁版牸寮忛敊璇�: ${error.message}`]
+ }
+ }
+}
+
+const testConfiguration = async () => {
+ try {
+ testing.value = true
+
+ // 楠岃瘉琛ㄥ崟
+ await formRef.value.validate()
+
+ // 楠岃瘉鑷畾涔夊弬鏁�
+ validateCustomParams()
+
+ if (validationResult.value && !validationResult.value.valid) {
+ ElMessage.error('璇蜂慨姝i厤缃獙璇侀敊璇�')
+ return
+ }
+
+ const config = {
+ ...form,
+ customParams: form.customParams
+ }
+
+ const response = await deviceGroupApi.testConfiguration(config)
+
+ if (response.success) {
+ validationResult.value = { valid: true, errors: [] }
+ ElMessage.success('閰嶇疆娴嬭瘯閫氳繃')
+ } else {
+ validationResult.value = {
+ valid: false,
+ errors: response.errors || ['閰嶇疆娴嬭瘯澶辫触']
+ }
+ ElMessage.error('閰嶇疆娴嬭瘯澶辫触')
+ }
+ } catch (error) {
+ console.error('娴嬭瘯閰嶇疆澶辫触:', error)
+ if (error.message && error.message.includes('楠岃瘉澶辫触')) {
+ ElMessage.error('璇锋鏌ヨ〃鍗曞~鍐欐槸鍚︽纭�')
+ } else {
+ ElMessage.error('娴嬭瘯閰嶇疆澶辫触')
+ }
+ } finally {
+ testing.value = false
+ }
+}
+
+const submit = async () => {
+ try {
+ saving.value = true
+
+ // 楠岃瘉琛ㄥ崟
+ await formRef.value.validate()
+
+ // 楠岃瘉鑷畾涔夊弬鏁�
+ validateCustomParams()
+
+ if (validationResult.value && !validationResult.value.valid) {
+ ElMessage.error('璇蜂慨姝i厤缃獙璇侀敊璇�')
+ return
+ }
+
+ const config = {
+ ...form,
+ customParams: form.customParams
+ }
+
+ let response
+ if (isEdit.value) {
+ response = await deviceGroupApi.update(props.data.id, config)
+ } else {
+ response = await deviceGroupApi.create(config)
+ }
+
+ if (response.success) {
+ ElMessage.success(isEdit.value ? '璁惧缁勬洿鏂版垚鍔�' : '璁惧缁勫垱寤烘垚鍔�')
+ emit('success', isEdit.value ? 'update' : 'create')
+ handleClose()
+ } else {
+ ElMessage.error(response.message || (isEdit.value ? '鏇存柊澶辫触' : '鍒涘缓澶辫触'))
+ }
+ } catch (error) {
+ console.error('淇濆瓨閰嶇疆澶辫触:', error)
+ ElMessage.error(error.message || (isEdit.value ? '鏇存柊澶辫触' : '鍒涘缓澶辫触'))
+ } finally {
+ saving.value = false
+ }
+}
+
+const handleClose = () => {
+ emit('update:visible', false)
+ emit('close')
+}
+
+// 鐩戝惉鑷畾涔夊弬鏁板彉鍖�
+watch(customParamsText, () => {
+ if (showAdvanced.value) {
+ validateCustomParams()
+ }
+})
+</script>
+
+<style scoped>
+.device-group-form {
+ max-height: 60vh;
+ overflow-y: auto;
+ padding-right: 10px;
+}
+
+.form-card {
+ margin-bottom: 20px;
+}
+
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ font-weight: bold;
+ color: #303133;
+}
+
+.form-tip {
+ font-size: 12px;
+ color: #909399;
+ margin-top: 4px;
+ line-height: 1.4;
+}
+
+.validation-result {
+ margin: 16px 0;
+}
+
+.dialog-footer {
+ text-align: right;
+}
+
+/* 鑷畾涔夋粴鍔ㄦ潯 */
+.device-group-form::-webkit-scrollbar {
+ width: 6px;
+}
+
+.device-group-form::-webkit-scrollbar-track {
+ background: #f1f1f1;
+ border-radius: 3px;
+}
+
+.device-group-form::-webkit-scrollbar-thumb {
+ background: #c0c4cc;
+ border-radius: 3px;
+}
+
+.device-group-form::-webkit-scrollbar-thumb:hover {
+ background: #909399;
+}
+
+/* 琛ㄥ崟鍏冪礌鏍峰紡璋冩暣 */
+:deep(.el-card__body) {
+ padding: 20px;
+}
+
+:deep(.el-form-item) {
+ margin-bottom: 18px;
+}
+
+:deep(.el-input-number) {
+ width: 100%;
+}
+
+:deep(.el-textarea__inner) {
+ font-family: 'Microsoft YaHei', sans-serif;
+}
+
+/* 楂樼骇閰嶇疆灞曞紑鏀惰捣鍔ㄧ敾 */
+.advanced-config {
+ transition: all 0.3s ease;
+}
+</style>
\ No newline at end of file
--
Gitblit v1.8.0