|
|
@@ -0,0 +1,239 @@
|
|
|
+<template>
|
|
|
+ <el-drawer v-model="isDrawer" :size="width" :title="title" @close="handleReset">
|
|
|
+ <el-form
|
|
|
+ :model="nvrParams"
|
|
|
+ :rules="rules"
|
|
|
+ ref="formRef"
|
|
|
+ label-placement="left"
|
|
|
+ :label-width="80"
|
|
|
+ >
|
|
|
+ <el-form-item label="设备名称" prop="nvrName">
|
|
|
+ <el-input placeholder="请输入设备名称,不可重复" v-model="nvrParams.nvrName" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="设备编号" prop="deviceID">
|
|
|
+ <el-input placeholder="自定义编号,不可重复" v-model="nvrParams.deviceID" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="设备IP" prop="deviceIP">
|
|
|
+ <el-input placeholder="请输入设备IP" v-model="nvrParams.deviceIP" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="设备品牌" prop="deviceBrand">
|
|
|
+ <el-select v-model="nvrParams.deviceBrand" placeholder="请选择设备品牌">
|
|
|
+ <el-option
|
|
|
+ v-for="item in brands"
|
|
|
+ :key="item.value"
|
|
|
+ :label="item.label"
|
|
|
+ :value="item.label"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="端口" prop="ipAddress">
|
|
|
+ <el-input placeholder="请输入端口号" v-model="nvrParams.ipAddress" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="用户名" prop="username">
|
|
|
+ <el-input placeholder="请输入用户名" v-model="nvrParams.username" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="密码" prop="password">
|
|
|
+ <el-input placeholder="请输入密码" v-model="nvrParams.password" type="password" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="使用场景" prop="useCondition">
|
|
|
+ <el-cascader
|
|
|
+ v-model="nvrParams.useCondition"
|
|
|
+ :options="conditions"
|
|
|
+ :props="ismultiple"
|
|
|
+ collapse-tags
|
|
|
+ collapse-tags-tooltip
|
|
|
+ clearable
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="负责人" prop="principal">
|
|
|
+ <el-input placeholder="请输入设备安装负责人" v-model="nvrParams.principal" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="备注" prop="remark">
|
|
|
+ <el-input placeholder="请输入备注" v-model="nvrParams.remark" :rows="5" type="textarea" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <el-space size="middle">
|
|
|
+ <el-button @click="handleReset">重置</el-button>
|
|
|
+ <el-button type="primary" @click="formSubmit">提交</el-button>
|
|
|
+ </el-space>
|
|
|
+ </template>
|
|
|
+ </el-drawer>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script lang="ts" setup>
|
|
|
+import { ref, computed } from 'vue';
|
|
|
+import { nvrData } from '../type';
|
|
|
+import { brands, conditions } from '../constant';
|
|
|
+import { FormRules, ElMessage } from 'element-plus';
|
|
|
+import useNvrStore from '../store/useNvrList';
|
|
|
+import { cloneDeep } from 'lodash-es';
|
|
|
+const nvrStore = useNvrStore();
|
|
|
+const { getNvr } = nvrStore;
|
|
|
+const ismultiple = { multiple: true };
|
|
|
+const props = defineProps({
|
|
|
+ title: {
|
|
|
+ type: String,
|
|
|
+ default: '添加NVR',
|
|
|
+ },
|
|
|
+ width: {
|
|
|
+ type: Number,
|
|
|
+ default: 450,
|
|
|
+ },
|
|
|
+});
|
|
|
+const emit = defineEmits(['form-submit', 'form-edit']);
|
|
|
+const formRef: any = ref(null);
|
|
|
+const isDrawer = ref(false);
|
|
|
+const initFormNvr = () => ({
|
|
|
+ nvrName: '',
|
|
|
+ deviceID: '',
|
|
|
+ deviceIP: '',
|
|
|
+ deviceBrand: '',
|
|
|
+ ipAddress: '',
|
|
|
+ username: '',
|
|
|
+ password: '',
|
|
|
+ useCondition: '',
|
|
|
+ principal: '',
|
|
|
+ remark: '',
|
|
|
+});
|
|
|
+const nvrParams = ref<nvrData>(initFormNvr());
|
|
|
+const openDrawer = (id?: number) => {
|
|
|
+ isDrawer.value = true;
|
|
|
+ if (id) {
|
|
|
+ nvrParams.value = getNvr(id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+};
|
|
|
+const closeDrawer = () => {
|
|
|
+ isDrawer.value = false;
|
|
|
+};
|
|
|
+const handleReset = () => {
|
|
|
+ formRef.value.resetFields();
|
|
|
+ nvrParams.value = Object.assign(nvrParams.value, initFormNvr());
|
|
|
+};
|
|
|
+const isAddUser = computed(() => {
|
|
|
+ return props.title === '添加NVR';
|
|
|
+});
|
|
|
+const validateNvrName = (rule, value, callback) => {
|
|
|
+ const nvrList = getNvr();
|
|
|
+ let isDuplicate;
|
|
|
+ if (nvrList) {
|
|
|
+ isDuplicate = nvrList.some((nvr) => nvr.nvrName === value);
|
|
|
+ }
|
|
|
+ if (isDuplicate) {
|
|
|
+ callback(new Error('设备名称重复,请使用其他名称'));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+};
|
|
|
+const validatedeviceID = (rule, value, callback) => {
|
|
|
+ const nvrList = getNvr();
|
|
|
+ let isDuplicate;
|
|
|
+ if (nvrList) {
|
|
|
+ isDuplicate = nvrList.some((nvr) => nvr.deviceID === value);
|
|
|
+ }
|
|
|
+ if (isDuplicate) {
|
|
|
+ callback(new Error('设备编号重复,请使用其他编号'));
|
|
|
+ } else {
|
|
|
+ callback();
|
|
|
+ }
|
|
|
+};
|
|
|
+const rules: FormRules = {
|
|
|
+ nvrName: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '设备名称不能为空',
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ validator: validateNvrName,
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ deviceID: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '设备编号不能为空',
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+ {
|
|
|
+ validator: validatedeviceID,
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ deviceIP: {
|
|
|
+ required: true,
|
|
|
+ message: '设备IP不能为空',
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+ deviceBrand: {
|
|
|
+ required: true,
|
|
|
+ message: '设备品牌不能为空',
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+ ipAddress: {
|
|
|
+ required: true,
|
|
|
+ message: '端口不能为空',
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+ username: {
|
|
|
+ required: true,
|
|
|
+ message: '用户名不能为空',
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+ password: {
|
|
|
+ required: true,
|
|
|
+ message: '密码不能为空',
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+ useCondition: {
|
|
|
+ required: true,
|
|
|
+ message: '使用场景不能为空',
|
|
|
+ trigger: 'blur',
|
|
|
+ },
|
|
|
+};
|
|
|
+const formSubmit = () => {
|
|
|
+ const nvrList = getNvr();
|
|
|
+ formRef.value.validate((valid) => {
|
|
|
+ const maxID = nvrList.reduce((max, nvr) => Math.max(max, nvr.id), 0);
|
|
|
+ const nvrData = {
|
|
|
+ id: isAddUser.value ? maxID + 1 : nvrParams.value.id,
|
|
|
+ nvrName: nvrParams.value.nvrName,
|
|
|
+ deviceID: nvrParams.value.deviceID,
|
|
|
+ deviceIP: nvrParams.value.deviceIP,
|
|
|
+ deviceBrand: nvrParams.value.deviceBrand,
|
|
|
+ ipAddress: nvrParams.value.ipAddress,
|
|
|
+ username: nvrParams.value.username,
|
|
|
+ password: nvrParams.value.password,
|
|
|
+ useCondition: nvrParams.value.useCondition,
|
|
|
+ principal: nvrParams.value.principal,
|
|
|
+ remark: nvrParams.value.remark,
|
|
|
+ };
|
|
|
+ if (isAddUser.value) {
|
|
|
+ emit('form-submit', nvrData);
|
|
|
+ ElMessage({
|
|
|
+ message: '添加NVR设备成功.',
|
|
|
+ type: 'success',
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ emit('form-edit', nvrParams.value);
|
|
|
+ ElMessage({
|
|
|
+ message: '修改NVR设备成功.',
|
|
|
+ type: 'success',
|
|
|
+ });
|
|
|
+ }
|
|
|
+ closeDrawer();
|
|
|
+ handleReset();
|
|
|
+ });
|
|
|
+};
|
|
|
+defineExpose({
|
|
|
+ openDrawer,
|
|
|
+ closeDrawer,
|
|
|
+});
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+::v-deep .el-cascader {
|
|
|
+ width: 330px;
|
|
|
+}
|
|
|
+</style>
|