Newer
Older
IntegratedFront / src / layouts / components / Tools / pushConfig.vue
<!-- 配置下发弹窗 -->
<script lang="ts" setup name="PushConfig">
import axios from 'axios'
import type { FormInstance, FormRules } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getConfig, pushConfig } from '@/api/page/control'
const dialogFormVisible = ref<boolean>(false) // 对话框是否显示
const dataFormRef = ref<FormInstance>()
// 表单对象
const dataForm = ref({
  push_url: '', // 地址
  push_interval: '', // 间隔
  push_type: '', // 类型
})
function validateURL(url: string) {
  try {
    new URL(url)
    return true
  } catch (error) {
    return false
  }
}
const validateIp = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback(new Error('地址不能为空'))
  }
  else {
    if (validateURL(value)) {
      callback()
    }
    else {
      callback(new Error('地址不合法'))
    }
    callback()
  }
}
const validateNumber = (rule: any, value: any, callback: any) => {
  if (value === '') {
    callback()
  }
  else {
    if (Number(value) < 0) {
      callback(new Error('请输入大于等于0的数字'))
    }
    else {
      callback()
    }
    callback()
  }
}
// 校验规则
const rules: FormRules = reactive({
  push_type: [{ required: true, message: '推送类型必选', trigger: ['blur', 'change'] }],
  push_url: [{ required: true, validator: validateIp, trigger: ['blur', 'change'] }],
  push_interval: [{ validator: validateNumber, trigger: ['blur', 'change'] }],
})// 前端校验规则
// 弹窗初始化
const initDialog = () => {
  dialogFormVisible.value = true
  resetForm()
  nextTick(() => {
    dataFormRef.value?.resetFields()
  })
}

defineExpose({ initDialog })

// 重置表单
function resetForm() {
  // console.log(dataForm.value)
  dataForm.value.push_url = ''
  dataForm.value.push_interval = ''
  dataForm.value.push_type = ''
}
// 保存数据
function saveData() {
  dataFormRef.value?.validate(async (valid: boolean) => {
    if (valid) {
      ElMessageBox.confirm(
        `确认推送配置吗?`,
        '提示',
        { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' },
      ).then(() => {
        pushConfig(dataForm.value).then((res) => {
          ElMessage.success('操作成功')
          dialogFormVisible.value = false
        })
      })

    }
  })
}
const pushList = ref<any[]>([])
axios.get(`./config/config.json?ts=${new Date().getTime()}`).then((res) => {
  pushList.value = res.data.push_type
})
// 监听类型 获取之前的配置
watch(() => dataForm.value.push_type, (newVal) => {
  if (newVal) {
    getConfig().then(res => {
      const current = res.data.filter((item: any) => String(item.push_type) === newVal)
      if (current.length) {
        // ElMessageBox.confirm(
        //   `查询到上一次下发配置内容,是否填充到当前?`,
        //   '提示',
        //   { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' },
        // ).then(() => {
        dataForm.value.push_url = current[0].push_url
        dataForm.value.push_interval = current[0].push_interval
        // })

      }
    })
  }
}, {
  deep: true,
  immediate: true
})
</script>

<template>
  <el-dialog v-model="dialogFormVisible" title="推送配置" append-to-body width="40%">
    <el-form ref="dataFormRef" :rules="rules" :model="dataForm" label-position="right" label-width="80px">
      <el-form-item label="推送类型" prop="push_type">
        <el-select v-model="dataForm.push_type" placeholder="推送类型" clearable class="select" style="width: 100%;">
          <el-option v-for="item in pushList" :key="item.value" :value="item.value" :label="item.name" />
        </el-select>
      </el-form-item>
      <el-form-item label="推送地址" prop="push_url">
        <el-input :disabled="!dataForm.push_type" v-model.trim="dataForm.push_url" type="text" placeholder="必填"
          style="width: 100%;" />
      </el-form-item>
      <el-form-item label="推送间隔" prop="push_interval">
        <el-input :disabled="!dataForm.push_type" v-model.trim="dataForm.push_interval" type="number" :step="10"
          controls-position="right" style="width: 100%;" />
      </el-form-item>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button type="primary" @click="saveData">
          保存
        </el-button>
        <el-button @click="dialogFormVisible = false">
          取消
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>

<style lang="scss" scoped>
.footer {
  display: flex;
  justify-content: flex-end;
}
</style>