CreateDrawer.vue 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <template>
  2. <div>
  3. <el-drawer v-model="isDrawer" :size="350" :title="title" @close="closeDrawer">
  4. <el-form :model="formParams" :rules="rules" ref="formRef" label-position="left" :label-width="85">
  5. <el-form-item label="设备名称:" prop="name">
  6. <el-input v-model="formParams.name" placeholder="请输入设备名称" />
  7. </el-form-item>
  8. <el-form-item label="设备编号:" prop="code" :error="codeError">
  9. <el-input v-model="formParams.code" placeholder="自定义编码,不可重复" />
  10. </el-form-item>
  11. <el-form-item label="设备品牌:" prop="nvrType">
  12. <el-select v-model="formParams.nvrType" placeholder="请选择设备品牌">
  13. <el-option v-for="item in brands" :key="item.value" :label="item.label" :value="item.value" />
  14. </el-select>
  15. </el-form-item>
  16. <el-form-item label="IP地址:" prop="nvrIp" :error="ipError">
  17. <el-input v-model="formParams.nvrIp" placeholder="请输入设备IP地址,不可重复" />
  18. </el-form-item>
  19. <el-form-item label="端口:" prop="nvrPort">
  20. <el-input v-model="formParams.nvrPort" placeholder="请输入设备端口" />
  21. </el-form-item>
  22. <el-form-item label="用户名:" prop="username">
  23. <el-input v-model="formParams.username" placeholder="请输入设备用户名" />
  24. </el-form-item>
  25. <el-form-item label="密码:" prop="password">
  26. <el-input v-model="formParams.password" placeholder="请输入设备密码" type="password" show-password />
  27. </el-form-item>
  28. <!-- <el-form-item label="使用场景:" prop="workshopList">
  29. <el-tree-select class="temp" v-model="workLocations" :data="locationOptions" multiple
  30. :render-after-expand="false" placeholder="请选择使用该NVR的车间" @change="handleCascaderChange" />
  31. </el-form-item> -->
  32. <el-form-item label="负责人:" prop="principal">
  33. <el-input v-model="formParams.principal" placeholder="请输入设备安装负责人" />
  34. </el-form-item>
  35. <el-form-item label="备注:" prop="remark">
  36. <el-input v-model="formParams.remark" type="textarea" maxlength="200" :autosize="{ minRows: 3 }"
  37. show-word-limit placeholder="请输入该设备相关备注" />
  38. </el-form-item>
  39. </el-form>
  40. <template #footer>
  41. <div class="btn-box">
  42. <el-button @click="closeDrawer">取消</el-button>
  43. <el-button type="primary" @click="formSubmit">提交</el-button>
  44. </div>
  45. </template>
  46. </el-drawer>
  47. </div>
  48. </template>
  49. <script lang="ts" setup>
  50. import { ref, computed, onMounted } from 'vue';
  51. import { brands, useWorkLocation } from '../constant';
  52. import { FormRules } from 'element-plus';
  53. import {
  54. NVRListItem,
  55. NVRListItemAll,
  56. addNVRListItem,
  57. updateNVRListItem,
  58. } from '@/api/camera/camera-nvr';
  59. interface Props {
  60. title: String;
  61. }
  62. const props = defineProps<Props>();
  63. const emit = defineEmits(['form-submit', 'form-edit']);
  64. const isDrawer = ref(false);
  65. const formRef: any = ref(null);
  66. // const ismultiple = { multiple: true };
  67. const { getLocationOptions } = useWorkLocation();
  68. // const workLocations = ref<[number | undefined, number | undefined] | []>([]);
  69. const workLocations = ref<number[]>([]);
  70. const codeError = ref('');
  71. const ipError = ref('');
  72. const initFormNvr = () => ({
  73. name: '',
  74. code: '',
  75. nvrIp: '',
  76. nvrType: '',
  77. nvrPort: '',
  78. username: '',
  79. password: '',
  80. principal: '',
  81. remark: '',
  82. });
  83. const formParams = ref<NVRListItem>(initFormNvr());
  84. const deleteKey = (obj, ...args) => {
  85. args.forEach((v) => {
  86. delete obj[v];
  87. });
  88. return obj;
  89. };
  90. const openDrawer = (row: NVRListItemAll) => {
  91. isDrawer.value = true;
  92. if (row) {
  93. formParams.value = Object.assign(formParams.value, row);
  94. deleteKey(
  95. formParams.value,
  96. 'createdAt',
  97. 'isDeleted',
  98. 'tenantId',
  99. 'updatedAt',
  100. 'workshopName',
  101. );
  102. return;
  103. }
  104. };
  105. const closeDrawer = () => {
  106. isDrawer.value = false;
  107. formRef.value.resetFields();
  108. formParams.value = Object.assign(formParams.value, initFormNvr());
  109. workLocations.value = [];
  110. };
  111. const isAddUser = computed(() => {
  112. return props.title === '添加NVR';
  113. });
  114. const rules: FormRules = {
  115. name: { required: true, message: '设备名称不能为空', trigger: 'blur' },
  116. code: [
  117. { required: true, message: '设备编号不能为空', trigger: 'change' },
  118. {
  119. pattern: /^[a-zA-Z0-9-_]+$/,
  120. message: '请输入大小写字母、数字、-、_的组合',
  121. trigger: 'change',
  122. },
  123. ],
  124. nvrType: { required: true, message: '设备品牌不能为空', trigger: 'change' },
  125. nvrIp: { required: true, message: '设备IP不能为空', trigger: 'change' },
  126. nvrPort: { required: true, message: '端口不能为空', trigger: 'blur' },
  127. username: { required: true, message: '用户名不能为空', trigger: 'blur' },
  128. password: { required: true, message: '密码不能为空', trigger: 'blur' },
  129. workshopList: { required: true, message: '使用场景不能为空', trigger: 'change' },
  130. };
  131. const formSubmit = () => {
  132. const errorText = ref('');
  133. // 捕获当前表单中是否有el-form-item__error即错误信息
  134. const errorTipElements = document.querySelectorAll('.el-form-item__error');
  135. errorTipElements.forEach((element) => {
  136. if (element.textContent) errorText.value = element.textContent;
  137. });
  138. if (errorText.value === '') {
  139. // codeError.value = '';
  140. // ipError.value = '';
  141. formRef.value.validate((valid) => {
  142. if (valid) {
  143. const nvrData = {
  144. name: formParams.value.name,
  145. code: formParams.value.code,
  146. nvrIp: formParams.value.nvrIp,
  147. nvrType: formParams.value.nvrType,
  148. nvrPort: formParams.value.nvrPort,
  149. username: formParams.value.username,
  150. password: formParams.value.password,
  151. principal: formParams.value.principal,
  152. remark: formParams.value.remark,
  153. };
  154. if (isAddUser.value) {
  155. addNVRListItem(nvrData).then(() => {
  156. emit('form-submit');
  157. closeDrawer();
  158. // if (Object.getOwnPropertyNames(res).length != 0) {
  159. // codeError.value = res.code;
  160. // ipError.value = res.nvrIp;
  161. // } else {
  162. // }
  163. });
  164. } else {
  165. updateNVRListItem(formParams.value).then(() => {
  166. emit('form-edit');
  167. closeDrawer();
  168. // if (Object.getOwnPropertyNames(res).length != 0) {
  169. // codeError.value = res.code;
  170. // ipError.value = res.nvrIp;
  171. // } else {
  172. // }
  173. });
  174. }
  175. }
  176. });
  177. }
  178. };
  179. defineExpose({
  180. openDrawer,
  181. closeDrawer,
  182. });
  183. onMounted(() => {
  184. getLocationOptions();
  185. });
  186. </script>
  187. <style lang="scss" scoped>
  188. :deep(.el-drawer__header) {
  189. position: relative;
  190. > :first-child {
  191. margin-left: 32px;
  192. font-weight: 600;
  193. font-size: 16px;
  194. color: rgba(0, 0, 0, 0.88);
  195. }
  196. .el-drawer__close-btn {
  197. position: absolute;
  198. color: #000;
  199. }
  200. }
  201. :deep(.el-drawer__body) {
  202. border-top: 1px solid #0000000f;
  203. }
  204. :deep(.el-form-item__label) {
  205. padding-right: 0;
  206. }
  207. :deep(.el-cascader) {
  208. width: 230px;
  209. }
  210. .btn-box {
  211. display: flex;
  212. align-items: center;
  213. justify-content: center;
  214. width: 100%;
  215. margin-top: 10px;
  216. }
  217. :deep(.temp .el-select__selection) {
  218. min-height: 24px;
  219. max-height: 55px;
  220. overflow: auto;
  221. }
  222. </style>