dongyukun
2024-11-06 2de83496f3ac13c63b45c5c93e37b4bb044522c3
提交 | 用户 | 时间
30566d 1 <template>
H 2   <Dialog v-model="dialogVisible" :title="dialogTitle" width="50%">
3     <el-form
4       ref="formRef"
5       v-loading="formLoading"
6       :model="formData"
7       :rules="formRules"
8       label-width="80px"
9     >
10       <el-row>
11         <el-col :span="12">
12           <el-form-item label="编码" prop="code">
13             <el-input v-model="formData.code" placeholder="请输入编码" />
14           </el-form-item>
15         </el-col>
c3e84e 16         <el-col :span="12">
H 17           <el-form-item label="抓图方式">
18             <el-select v-model="formData.captureType" placeholder="请选择">
19               <el-option
20                 v-for="dict in getStrDictOptions(DICT_TYPE.CAPTURE_TYPE)"
21                 :key="dict.value"
22                 :label="dict.label"
23                 :value="dict.value"
24               />
25             </el-select>
26           </el-form-item>
27         </el-col>
30566d 28       </el-row>
H 29       <el-row>
30         <el-col :span="12">
31           <el-form-item label="通道" prop="channel">
32             <el-input v-model="formData.channel" placeholder="请输入通道" />
33           </el-form-item>
34         </el-col>
35         <el-col :span="12">
36           <el-form-item label="监控区域" prop="location">
37             <el-input v-model="formData.location" placeholder="请输入监控区域" />
38           </el-form-item>
39         </el-col>
40       </el-row>
41
42       <el-row>
43         <el-col :span="24">
44           <el-form-item label="备注" prop="remark">
45             <el-input v-model="formData.remark" clearable type="textarea" />
46           </el-form-item>
47         </el-col>
48       </el-row>
49     </el-form>
50     <template #footer>
51       <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
52       <el-button @click="dialogVisible = false">取 消</el-button>
53     </template>
54   </Dialog>
55 </template>
56 <script lang="ts" setup>
57 import * as CameraApi from '@/api/data/dev/camera'
c3e84e 58 import {DICT_TYPE, getIntDictOptions, getStrDictOptions} from "@/utils/dict";
30566d 59
H 60 defineOptions({ name: 'CameraForm' })
61
62 const { t } = useI18n() // 国际化
63 const message = useMessage() // 消息弹窗
64 const dialogVisible = ref(false) // 弹窗的是否展示
65 const dialogTitle = ref('') // 弹窗的标题
66 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
67 const nvrId = ref('') // 录像机id
68 const formType = ref('') // 表单的类型:create - 新增;update - 修改
69 const formData = ref({
70   id: undefined,
71   nvrId: '',
72   code: undefined,
c3e84e 73   captureType: '',
30566d 74   channel: undefined,
H 75   location: undefined,
76   remark: undefined
77 })
78 const formRules = reactive({
79   code: [{ required: true, message: '编码不能为空', trigger: 'blur' }],
c3e84e 80   captureType: [{ required: true, message: '抓图方式不能为空', trigger: 'blur' }],
30566d 81   channel: [{ required: true, message: '通道不能为空', trigger: 'blur' }],
H 82   location: [{ required: true, message: '监控区域不能为空', trigger: 'blur' }]
83 })
84 const formRef = ref() // 表单 Ref
85
86 /** 打开弹窗 */
87 const open = async (type: string, id?: number, nvr_id?: string) => {
88   dialogVisible.value = true
89   if (nvr_id != null) {
90     nvrId.value = nvr_id
91   }
92   dialogTitle.value = t('action.' + type)
93   formType.value = type
94   resetForm()
95   // 修改时,设置数据
96   if (id) {
97     formLoading.value = true
98     try {
99       formData.value = await CameraApi.getCamera(id)
100     } finally {
101       formLoading.value = false
102     }
103   }
104 }
105 defineExpose({ open }) // 提供 open 方法,用于打开弹窗
106
107 /** 提交表单 */
108 const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
109 const submitForm = async () => {
110   // 校验表单
111   if (!formRef) return
112   const valid = await formRef.value.validate()
113   if (!valid) return
114   // 提交请求
115   formLoading.value = true
116   try {
117     const data = formData.value as unknown as CameraApi.CameraVO
118     if (formType.value === 'create') {
119       data.nvrId = nvrId.value
120       await CameraApi.createCamera(data)
121       message.success(t('common.createSuccess'))
122     } else {
123       await CameraApi.updateCamera(data)
124       message.success(t('common.updateSuccess'))
125     }
126     dialogVisible.value = false
127     // 发送操作成功的事件
128     emit('success')
129   } finally {
130     formLoading.value = false
131   }
132 }
133
134 /** 重置表单 */
135 const resetForm = () => {
136   formData.value = {
137     id: undefined,
c3e84e 138     nvrId: '',
30566d 139     code: undefined,
c3e84e 140     captureType: '',
H 141     channel: undefined,
142     location: undefined,
30566d 143     remark: undefined
H 144   }
145   formRef.value?.resetFields()
146 }
147 </script>