diff --git a/src/api/data-collect/channel.ts b/src/api/data-collect/channel.ts index 5c9a5312..08bbbd8c 100644 --- a/src/api/data-collect/channel.ts +++ b/src/api/data-collect/channel.ts @@ -1,10 +1,27 @@ import server from '@/utils/request'; -export const queryChannel = (type: string, data: any) => +export const query = (data: any) => server.post(`/data-collect/channel/_query`, data); -export const removeChannel = (type: string, data: any) => - server.remove(`/data-collect/channel//${id}`); +export const remove = (id: string) => + server.remove(`/data-collect/channel/${id}`); -export const updateChannel = (type: string, data: any) => - server.patch(`/data-collect/channel//${id}`, data); +export const save = (data: any) => server.post(`/data-collect/channel`, data); + +export const update = (id: string, data: any) => + server.put(`/data-collect/channel/${id}`, data); + +export const getProviders = () => server.get(`/gateway/device/providers`); + +export const queryOptionsList = (type: strimg) => + server.get(`/data-collect/opc/${type}`); + +export const validateField = (data: any) => + server.post(`/data-collect/opc/endpoint/_validate`, data, null, { + headers: { + 'Content-Type': 'text/plain;charset=UTF-8', + }, + }); + +export const queryCertificateList = () => + server.get(`/network/certificate/_query/no-paging?paging=false`, {}); diff --git a/src/views/DataCollect/Channel/Detail/index.vue b/src/views/DataCollect/Channel/Detail/index.vue deleted file mode 100644 index 48f32450..00000000 --- a/src/views/DataCollect/Channel/Detail/index.vue +++ /dev/null @@ -1,1332 +0,0 @@ - - - - - diff --git a/src/views/DataCollect/Channel/Save/index.vue b/src/views/DataCollect/Channel/Save/index.vue new file mode 100644 index 00000000..350091e2 --- /dev/null +++ b/src/views/DataCollect/Channel/Save/index.vue @@ -0,0 +1,315 @@ + + + + diff --git a/src/views/DataCollect/Channel/data.ts b/src/views/DataCollect/Channel/data.ts index 9bd25bd6..27c3d759 100644 --- a/src/views/DataCollect/Channel/data.ts +++ b/src/views/DataCollect/Channel/data.ts @@ -1,305 +1,39 @@ -export const Configuration = { - parserType: undefined, - port: undefined, - host: undefined, - publicPort: '', - publicHost: '', - remoteHost: '', - remotePort: '', - secure: false, - username: '', - password: '', - topicPrefix: '', - maxMessageSize: 8192, - certId: undefined, - privateKeyAlias: '', - clientId: '', - parserConfiguration: { - delimited: '', - lang: '', - script: '', - size: '', - length: '4', - offset: '0', - little: 'false', - }, -}; +import { validateField } from '@/api/data-collect/channel'; +import { FormDataType } from './type.d'; -export const FormStates = { +export const FormState: FormDataType = { name: '', - type: 'UDP', - shareCluster: true, + provider: undefined, + configuration: { + host: '', + port: '502', + endpoint: '', + securityPolicy: undefined, + securityMode: undefined, + certificate: undefined, + authType: undefined, + username: '', + password: '', + }, description: '', }; -export const FormStates2 = { - serverId: undefined, - configuration: Configuration, +export const StatusColorEnum = { + running: 'success', + disabled: 'error', + partialError: 'processing', + failed: 'warning', + stopped: 'default', }; - -export const TCPList = [ - 'TCP_SERVER', - 'WEB_SOCKET_SERVER', - 'HTTP_SERVER', - 'MQTT_SERVER', -]; -export const UDPList = ['UDP', 'COAP_SERVER']; - -const VisibleMost = [ - 'COAP_SERVER', - 'MQTT_SERVER', - 'WEB_SOCKET_SERVER', - 'TCP_SERVER', - 'UDP', - 'HTTP_SERVER', -]; - -export const VisibleData = { - parserType: ['TCP_SERVER'], - port: VisibleMost, - host: VisibleMost, - publicPort: VisibleMost, - publicHost: VisibleMost, - serverId: ['MQTT_CLIENT'], - remoteHost: ['MQTT_CLIENT'], - remotePort: ['MQTT_CLIENT'], - secure: ['TCP_SERVER', 'UDP', 'COAP_SERVER'], - username: ['MQTT_CLIENT'], - password: ['MQTT_CLIENT'], - topicPrefix: ['MQTT_CLIENT'], - maxMessageSize: ['MQTT_SERVER', 'MQTT_CLIENT'], - clientId: ['MQTT_CLIENT'], - delimited: ['DELIMITED'], - lang: ['SCRIPT'], - script: ['SCRIPT'], - size: ['FIXED_LENGTH'], - length: ['LENGTH_FIELD'], - offset: ['LENGTH_FIELD'], - little: ['LENGTH_FIELD'], -}; - -export const ParserTypeOptions = [ - { value: 'DIRECT', label: '不处理' }, - { value: 'DELIMITED', label: '分隔符' }, - { value: 'SCRIPT', label: '自定义脚本' }, - { value: 'FIXED_LENGTH', label: '固定长度' }, - { value: 'LENGTH_FIELD', label: '长度字段' }, -]; -export const LengthOptions = [ - { value: '1', label: '1' }, - { value: '2', label: '2' }, - { value: '3', label: '3' }, - { value: '4', label: '4' }, - { value: '8', label: '8' }, -]; -export const LittleOptions = [ - { label: '大端', value: 'false' }, - { label: '小端', value: 'true' }, -]; - -export const isVisible = ( - LastName: string, - dependencies: string | boolean | undefined, -) => VisibleData[LastName].includes(dependencies); - -export const Validator = { - regIp: new RegExp( - /((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}/, - ), - regDomain: new RegExp( - /[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/, - ), - regOnlyNumber: new RegExp(/^\d+$/), -}; - -export const Rules = { - name: [ - { - required: true, - message: '请输入名称', - }, - { - max: 64, - message: '最大可输入64个字符', - }, - ], - type: [ - { - required: true, - message: '请选择类型', - }, - ], - shareCluster: [ - { - required: true, - message: '请选择集群', - }, - ], - host: [ - { - required: true, - message: '请选择本地地址', - }, - ], - port: [ - { - required: true, - message: '请选择本地端口', - }, - ], - publicHost: [ - { - required: true, - message: '请输入公网地址', - }, - { - pattern: Validator.regIp || Validator.regDomain, - message: '请输入IP或者域名', - }, - ], - publicPort: [ - { - required: true, - message: '请输入公网端口', - }, - { - pattern: Validator.regOnlyNumber, - message: '请输入1-65535之间的正整数', - }, - ], - remoteHost: [ - { - required: true, - message: '请输入远程地址', - }, - { - pattern: Validator.regIp || Validator.regDomain, - message: '请输入IP或者域名', - }, - ], - remotePort: [ - { - required: true, - message: '输入远程端口', - }, - { - pattern: Validator.regOnlyNumber, - message: '请输入1-65535之间的正整数', - }, - ], - clientId: [ - { - required: true, - message: '请输入ClientId', - }, - { - max: 64, - message: '最大可输入64个字符', - }, - ], - username: [ - { - required: true, - message: '请输入用户名', - }, - { - max: 64, - message: '最大可输入64个字符', - }, - ], - password: [ - { - required: true, - message: '请输入密码', - }, - { - max: 64, - message: '最大可输入64个字符', - }, - ], - topicPrefix: [ - { - max: 64, - message: '最大可输入64个字符', - }, - ], - maxMessageSize: [ - { - required: true, - message: '请输入最大消息长度', - }, - ], - secure: [ - { - required: true, - }, - ], - certId: [ - { - required: true, - message: '请选择证书', - }, - ], - privateKeyAlias: [ - { - required: true, - message: '请输入私钥别名', - }, - { - max: 64, - message: '最大可输入64个字符', - }, - ], - parserType: [ - { - required: true, - message: '请选择粘拆包规则', - }, - ], - delimited: [ - { - required: true, - message: '请输入分隔符', - }, - { - max: 64, - message: '最大可输入64个字符', - }, - ], - lang: [ - { - required: true, - message: '请选择脚本语言', - }, - { - max: 64, - message: '最大可输入64个字符', - }, - ], - script: [ - { - required: true, - message: '请输入脚本', - }, - ], - size: [ - { - required: true, - message: '请输入长度值', - }, - ], - length: [ - { - required: true, - message: '请选择长度', - }, - ], - offset: [ - { - pattern: Validator.regOnlyNumber, - message: '请输入0-65535之间的正整数', - }, - ], +export const updateStatus = { + disabled: { + state: 'enabled', + runningState: 'running', + }, + enabled: { + state: 'disabled', + runningState: 'stopped', + }, }; export const TiTlePermissionButtonStyle = { @@ -313,3 +47,95 @@ export const TiTlePermissionButtonStyle = { width: 'calc(100%-100px)', // width: '60%', }; + +export const regOnlyNumber = new RegExp(/^\d+$/); + +export const regIP = new RegExp( + /^([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/, +); +export const regIPv6 = new RegExp( + /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/, +); +export const regDomain = new RegExp( + /([0-9a-z-]{2,}\.[0-9a-z-]{2,3}\.[0-9a-z-]{2,3}|[0-9a-z-]{2,}\.[0-9a-z-]{2,3})$/i, +); +export const checkEndpoint = (_rule: Rule, value: string): Promise => + new Promise(async (resolve, reject) => { + if (value) { + const res = await validateField(value); + return res.result.passed ? resolve('') : reject(res.result.reason); + } + }); +export const FormValidate = { + name: [ + { required: true, message: '请输入名称', trigger: 'blur' }, + { max: 64, message: '最多可输入64个字符' }, + ], + provider: [{ required: true, message: '请选择通讯协议' }], + host: [ + { + required: true, + message: '请输入Modbus主机IP', + }, + { + pattern: regIP || regIPv6 || regDomain, + message: '请输入正确格式的Modbus主机IP地址', + }, + ], + port: [ + { + required: true, + message: '请输入端口', + }, + { + pattern: regOnlyNumber, + message: '请输入1-65535之间的正整数', + }, + ], + + endpoint: [ + { + required: true, + message: '请输入端点url', + }, + { + validator: checkEndpoint, + trigger: 'blur', + }, + ], + + securityPolicy: [ + { + required: true, + message: '请选择安全策略', + }, + ], + securityMode: [ + { + required: true, + message: '请选择安全模式', + }, + ], + certificate: [ + { + required: true, + message: '请选择证书', + }, + ], + authType: [ + { + required: true, + message: '请选择权限认证', + }, + ], + username: [ + { required: true, message: '请输入用户名', trigger: 'blur' }, + { max: 64, message: '最多可输入64个字符' }, + ], + password: [ + { required: true, message: '请输入密码', trigger: 'blur' }, + { max: 64, message: '最多可输入64个字符' }, + ], + + description: [{ max: 200, message: '最多可输入200个字符' }], +}; diff --git a/src/views/DataCollect/Channel/index.vue b/src/views/DataCollect/Channel/index.vue index 9ec96770..5c6782e5 100644 --- a/src/views/DataCollect/Channel/index.vue +++ b/src/views/DataCollect/Channel/index.vue @@ -3,12 +3,12 @@
- - + +