Showing
6 changed files
with
276 additions
and
0 deletions
src/locales/lang/zh-CN/equipment/category.ts
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <BasicModal | ||
| 4 | + v-bind="$attrs" | ||
| 5 | + width="35rem" | ||
| 6 | + :title="getTitle" | ||
| 7 | + @register="register" | ||
| 8 | + @cancel="handleCancel" | ||
| 9 | + @ok="handleOk" | ||
| 10 | + destroyOnClose | ||
| 11 | + > | ||
| 12 | + <div> | ||
| 13 | + <BasicForm @register="registerForm" /> | ||
| 14 | + </div> | ||
| 15 | + </BasicModal> | ||
| 16 | + </div> | ||
| 17 | +</template> | ||
| 18 | +<script setup lang="ts"> | ||
| 19 | +import {BasicModal, useModalInner} from "/@/components/Modal"; | ||
| 20 | +import {BasicForm, useForm} from "/@/components/Form"; | ||
| 21 | +import {computed, ref, unref} from "vue"; | ||
| 22 | +import {useI18n} from "/@/hooks/web/useI18n"; | ||
| 23 | +import {schemas} from "/@/views/equipment/category/index"; | ||
| 24 | +import {ipRegex} from "/@/utils/rules"; | ||
| 25 | +import {deleteFormField} from "/@/views/device/deviceaccess/index"; | ||
| 26 | +import { | ||
| 27 | + deviceProfileAccessInformation, | ||
| 28 | + updateDeviceProfileAccessInformation | ||
| 29 | +} from "/@/api/device/deviceAccess"; | ||
| 30 | +import {useMessage} from "/@/hooks/web/useMessage"; | ||
| 31 | +const isUpdate = ref<Boolean>(false); | ||
| 32 | +const { t } = useI18n(); | ||
| 33 | +const emit = defineEmits(['handleReload', 'register']); | ||
| 34 | +const { createMessage } = useMessage(); | ||
| 35 | + | ||
| 36 | +const [registerForm, { getFieldsValue, setFieldsValue, validate, resetFields }] = useForm({ | ||
| 37 | + labelWidth: 150, | ||
| 38 | + schemas, | ||
| 39 | + actionColOptions: { | ||
| 40 | + span: 14, | ||
| 41 | + }, | ||
| 42 | + showActionButtonGroup: false, | ||
| 43 | +}); | ||
| 44 | + | ||
| 45 | +const recordInfo = ref<Recordable>({}); | ||
| 46 | + | ||
| 47 | +const [register, { closeModal, setModalProps }] = useModalInner(async (data) => { | ||
| 48 | + await resetFields(); | ||
| 49 | + setModalProps({ confirmLoading: false, loading: true }); | ||
| 50 | + isUpdate.value = data?.isUpdate; | ||
| 51 | + recordInfo.value = data?.record; | ||
| 52 | + if (data?.record) { | ||
| 53 | + const intranetIpAndPort = { | ||
| 54 | + inputIp: data?.record.intranetIp, | ||
| 55 | + inputPort: data?.record.intranetPort, | ||
| 56 | + }; | ||
| 57 | + const outerIpAndPort = { | ||
| 58 | + inputIp: data?.record.outerNetIp, | ||
| 59 | + inputPort: data?.record.outerNetPort, | ||
| 60 | + }; | ||
| 61 | + setFieldsValue(data?.record); | ||
| 62 | + setFieldsValue({ ...data?.record?.sipExtend }); | ||
| 63 | + setFieldsValue({ intranetIpAndPort, outerIpAndPort }); | ||
| 64 | + } | ||
| 65 | + setModalProps({ loading: false }); | ||
| 66 | +}); | ||
| 67 | + | ||
| 68 | +const getTitle = computed(() => | ||
| 69 | + !unref(isUpdate) | ||
| 70 | + ? t('equipment.category.createCategoryText') | ||
| 71 | + : t('equipment.category.editCategoryText') | ||
| 72 | +); | ||
| 73 | + | ||
| 74 | +const handleCancel = () => closeModal(); | ||
| 75 | + | ||
| 76 | +const handleOk = async () => { | ||
| 77 | + await validate(); | ||
| 78 | + let values = getFieldsValue(); | ||
| 79 | + const { intranetIpAndPort, outerIpAndPort } = values; | ||
| 80 | + // values.intranetIp = intranetIpAndPort.inputIp; | ||
| 81 | + // values.intranetPort = intranetIpAndPort.inputPort; | ||
| 82 | + // values.outerNetIp = outerIpAndPort.inputIp; | ||
| 83 | + // values.outerNetPort = outerIpAndPort.inputPort; | ||
| 84 | + // if (!ipRegex.test(values.intranetIp)) { | ||
| 85 | + // return createMessage.error(t('deviceManagement.deviceAccess.ipRuleText')); | ||
| 86 | + // } | ||
| 87 | + | ||
| 88 | + const sipExtend = { | ||
| 89 | + serverId: values['serverId'], | ||
| 90 | + serverDomain: values['serverDomain'], | ||
| 91 | + serverPassword: values['serverPassword'], | ||
| 92 | + }; | ||
| 93 | + values.sipExtend = sipExtend; | ||
| 94 | + deleteFormField.forEach((deleteItem) => { | ||
| 95 | + Reflect.deleteProperty(values, deleteItem); | ||
| 96 | + }); | ||
| 97 | + if (unref(isUpdate)) { | ||
| 98 | + // 更新 | ||
| 99 | + values = { ...values, id: unref(recordInfo).id }; | ||
| 100 | + // await updateDeviceProfileAccessInformation(values); | ||
| 101 | + } else { | ||
| 102 | + // await deviceProfileAccessInformation(values); | ||
| 103 | + } | ||
| 104 | + createMessage.success(t('equipment.category.operationSuccessText')); | ||
| 105 | + emit('handleReload'); | ||
| 106 | + handleCancel(); | ||
| 107 | +}; | ||
| 108 | + | ||
| 109 | +</script> | 
src/views/equipment/category/index.less
0 → 100644
| 1 | +.category-tree { | ||
| 2 | + flex: 1 1 auto; | ||
| 3 | + margin: 16px; | ||
| 4 | + padding: 32px; | ||
| 5 | + max-width: 100%; | ||
| 6 | + background: #ffffff; | ||
| 7 | + border-radius: 2px; | ||
| 8 | + &-search { | ||
| 9 | + width: 50%; | ||
| 10 | + margin-bottom: 20px; | ||
| 11 | + } | ||
| 12 | + .ant-tree-treenode-switcher-close:hover { | ||
| 13 | + background-color: #f4f4f5 !important; | ||
| 14 | + border-radius: 4px !important; | ||
| 15 | + } | ||
| 16 | + .ant-tree-node-content-wrapper { | ||
| 17 | + width: 100%; | ||
| 18 | + } | ||
| 19 | + .ant-tree-title { | ||
| 20 | + display: flex; | ||
| 21 | + } | ||
| 22 | + .tree-node { | ||
| 23 | + align-items: center; | ||
| 24 | + justify-content: space-between; | ||
| 25 | + width: 100%; | ||
| 26 | + | ||
| 27 | + .but_operation { | ||
| 28 | + display: none; // 默认隐藏按钮 | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + | ||
| 32 | + } | ||
| 33 | + .tree-node:hover { | ||
| 34 | + &:hover .but_operation { | ||
| 35 | + display: inline-block; // 悬停时显示按钮 | ||
| 36 | + .but_type { | ||
| 37 | + margin-left: 32px; | ||
| 38 | + color: red; | ||
| 39 | + } | ||
| 40 | + } | ||
| 41 | + } | ||
| 42 | +} | 
src/views/equipment/category/index.ts
0 → 100644
| 1 | + | ||
| 2 | +import { useI18n } from '/@/hooks/web/useI18n'; | ||
| 3 | + | ||
| 4 | +const { t } = useI18n(); | ||
| 5 | +import { FormSchema } from '/@/components/Table'; | ||
| 6 | + | ||
| 7 | +//表单字段 | ||
| 8 | +export const schemas: FormSchema[] = [ | ||
| 9 | + { | ||
| 10 | + field: 'intranetIpAndPort', | ||
| 11 | + label: t('deviceManagement.deviceAccess.intranetIPWithPortText'), | ||
| 12 | + component: 'FormInputGroup', | ||
| 13 | + required: true, | ||
| 14 | + componentProps: { | ||
| 15 | + inputPlaceholder: t('deviceManagement.deviceAccess.intranetIPPlaceholderText'), | ||
| 16 | + inputNumberPlaceholder: t('deviceManagement.deviceAccess.intranetPortPlaceholderText'), | ||
| 17 | + }, | ||
| 18 | + colProps: { span: 24 }, | ||
| 19 | + }, | ||
| 20 | + { | ||
| 21 | + field: 'outerIpAndPort', | ||
| 22 | + label: t('deviceManagement.deviceAccess.outernetIPWithPortText'), | ||
| 23 | + component: 'FormInputGroup', | ||
| 24 | + required: true, | ||
| 25 | + componentProps: { | ||
| 26 | + inputPlaceholder: t('deviceManagement.deviceAccess.outernetIPPlaceholderText'), | ||
| 27 | + inputNumberPlaceholder: t('deviceManagement.deviceAccess.outernetPortPlaceholderText'), | ||
| 28 | + }, | ||
| 29 | + colProps: { span: 24 }, | ||
| 30 | + } | ||
| 31 | +]; | 
src/views/equipment/category/index.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + | ||
| 3 | + <PageWrapper dense contentFullHeight contentClass="flex"> | ||
| 4 | + <div class="category-tree"> | ||
| 5 | + <div class="category-tree-search"> | ||
| 6 | + <a-input-search | ||
| 7 | + placeholder="请输入关键字搜索" | ||
| 8 | + enter-button | ||
| 9 | + size="large" | ||
| 10 | + /> | ||
| 11 | + </div> | ||
| 12 | + <a-tree :tree-data="treeData" default-expand-all show-icon :default-selected-keys="['0-0']"> | ||
| 13 | + <template #custom="{ title }"> | ||
| 14 | + <div class="tree-node"> | ||
| 15 | + <span>{{ title }}</span> | ||
| 16 | + <div class="but_operation"> | ||
| 17 | + <span class="but_type" @click="handleAdd(key)">新增</span> | ||
| 18 | + <span class="but_type">编辑</span> | ||
| 19 | + <span class="but_type">删除</span> | ||
| 20 | + </div> | ||
| 21 | + </div> | ||
| 22 | + </template> | ||
| 23 | + </a-tree> | ||
| 24 | + <categoryModal @register="registerModal" @handleReload="handleReload"/> | ||
| 25 | + </div> | ||
| 26 | + </PageWrapper> | ||
| 27 | + | ||
| 28 | +</template> | ||
| 29 | +<script setup lang="ts"> | ||
| 30 | +import {PageWrapper} from "/@/components/Page"; | ||
| 31 | +import './index.less'; | ||
| 32 | +import {categoryModal} from './components/index'; | ||
| 33 | +import {useModal} from "/@/components/Modal"; | ||
| 34 | + | ||
| 35 | +const [registerModal, {openModal}] = useModal(); | ||
| 36 | +const treeData = [ | ||
| 37 | + { | ||
| 38 | + title: '全部', | ||
| 39 | + key: '0-0', | ||
| 40 | + slots: {title: 'custom'}, // 添加 title: 'custom' | ||
| 41 | + children: [ | ||
| 42 | + { | ||
| 43 | + title: '德风石化有限公司', | ||
| 44 | + key: '0-0-0', | ||
| 45 | + slots: {title: 'custom'}, // 添加 title: 'custom' | ||
| 46 | + children: [ | ||
| 47 | + { | ||
| 48 | + title: '公共工程', | ||
| 49 | + key: '0-0-0-0', | ||
| 50 | + slots: {title: 'custom'}, // 添加 title: 'custom' | ||
| 51 | + children: [ | ||
| 52 | + { | ||
| 53 | + title: '中心控制室', | ||
| 54 | + key: '0-0-0-0-0', | ||
| 55 | + slots: {title: 'custom'} | ||
| 56 | + }, | ||
| 57 | + {title: '辅料管区', key: '0-0-0-0-1', slots: {title: 'custom'}}, | ||
| 58 | + {title: 'PSA伐区', key: '0-0-0-0-2', slots: {title: 'custom'}}, | ||
| 59 | + {title: '导热油房区', key: '0-0-0-0-3', slots: {title: 'custom'}}, | ||
| 60 | + {title: '甲醇裂解区', key: '0-0-0-0-4', slots: {title: 'custom'}}, | ||
| 61 | + {title: '机柜间', key: '0-0-0-0-5', slots: {title: 'custom'}} | ||
| 62 | + ] | ||
| 63 | + }, | ||
| 64 | + {title: '污水处理站', key: '0-0-0-1', slots: {title: 'custom'}} // 添加 title: 'custom' | ||
| 65 | + ] | ||
| 66 | + } | ||
| 67 | + ] | ||
| 68 | + } | ||
| 69 | +]; | ||
| 70 | + | ||
| 71 | +// 处理新建按钮点击事件 | ||
| 72 | +const handleAdd = (key: string) => { | ||
| 73 | + openModal(true, { | ||
| 74 | + isUpdate: false, // 表示是新建操作 | ||
| 75 | + parentKey: key, // 传递当前节点的 key | ||
| 76 | + }); | ||
| 77 | +}; | ||
| 78 | + | ||
| 79 | + | ||
| 80 | +const handleReload = () => { | ||
| 81 | + | ||
| 82 | +}; | ||
| 83 | +</script> |