diff --git a/src/api/device/firmware.ts b/src/api/device/firmware.ts index a21e948a..19e3c7b0 100644 --- a/src/api/device/firmware.ts +++ b/src/api/device/firmware.ts @@ -49,8 +49,10 @@ export const queryProduct = (data?: any) => export const queryDevice = () => server.get(`/device/instance/_query/no-paging?paging=false`); -export const validateVersion = (productId: string, versionOrder: number) => - server.get(`/firmware/${productId}/${versionOrder}/exists`); +export const validateVersion = ( + productId: string, + versionOrder: number | string, +) => server.get(`/firmware/${productId}/${versionOrder}/exists`); export const queryDetailList = (data: Record) => server.post(`/device-instance/detail/_query`, data); diff --git a/src/api/link/dashboard.ts b/src/api/link/dashboard.ts new file mode 100644 index 00000000..0d1920cc --- /dev/null +++ b/src/api/link/dashboard.ts @@ -0,0 +1,11 @@ +import server from '@/utils/request'; + +export const dashboard = (data: object) => + server.post(`/dashboard/_multi`, data); +export const productCount = (data: object) => + server.post(`/device-product/_count`, data); +export const getGeo = (data: object) => + server.post(`/geo/object/device/_search/geo.json`, data); +export const deviceCount = (data: object) => + server.get(`/device/instance/_count`, data); +export const serverNode = () => server.get(`/dashboard/cluster/nodes`); diff --git a/src/views/device/Firmware/Save/index.vue b/src/views/device/Firmware/Save/index.vue index ab01402a..7b8d5e71 100644 --- a/src/views/device/Firmware/Save/index.vue +++ b/src/views/device/Firmware/Save/index.vue @@ -184,7 +184,12 @@ import { message, Form } from 'ant-design-vue'; import { getImage } from '@/utils/comm'; import FileUpload from './FileUpload.vue'; -import { save, update, queryProduct } from '@/api/device/firmware'; +import { + save, + update, + queryProduct, + validateVersion, +} from '@/api/device/firmware'; import type { FormInstance } from 'ant-design-vue'; import type { Properties } from '../type'; @@ -246,6 +251,21 @@ const validatorSign = async (_: Record, value: string) => { return Promise.resolve(); } }; +const validatorVersionOrder = async (_: Record, value: string) => { + const { signMethod, productId } = formData.value; + if (value && !!signMethod && productId) { + const res = await validateVersion(productId, value); + if (res.status === 200) { + if (id && props.data.versionOrder === value) { + formData.value.versionOrder = ''; + } else { + Promise.reject(res.result ? ['版本序号已存在'] : ''); + } + } + } else { + return Promise.resolve(); + } +}; const { resetFields, validate, validateInfos } = useForm( formData, @@ -258,8 +278,12 @@ const { resetFields, validate, validateInfos } = useForm( version: [ { required: true, message: '请输入版本号' }, { max: 64, message: '最多可输入64个字符', trigger: 'change' }, + { validator: validatorVersionOrder, trigger: 'blur' }, + ], + versionOrder: [ + { required: true, message: '请输入版本序号' }, + { validator: validatorVersionOrder, trigger: 'blur' }, ], - versionOrder: [{ required: true, message: '请输入版本序号' }], signMethod: [{ required: true, message: '请选择签名方式' }], sign: [ { required: true, message: '请输入签名' }, @@ -280,10 +304,10 @@ const onSubmit = async () => { validate() .then(async (res) => { const product = productOptions.value.find( - (item) => item.value === res.productId, + (item) => item?.value === res.productId, ); - const productName = product.label || props.data?.url; - const size = extraValue.value.length || props.data?.size; + const productName = product?.label || props.data?.url; + const size = extraValue.value?.length || props.data?.size; const params = { ...toRaw(formData.value), diff --git a/src/views/link/AccessConfig/Detail/index.vue b/src/views/link/AccessConfig/Detail/index.vue index f15fcdf3..1c8ee150 100644 --- a/src/views/link/AccessConfig/Detail/index.vue +++ b/src/views/link/AccessConfig/Detail/index.vue @@ -9,8 +9,10 @@ >
-
返回
- + 返回 +
+ diff --git a/src/views/link/AccessConfig/components/Channel/index.vue b/src/views/link/AccessConfig/components/Channel/index.vue index 08340b9b..f4e5d0d9 100644 --- a/src/views/link/AccessConfig/components/Channel/index.vue +++ b/src/views/link/AccessConfig/components/Channel/index.vue @@ -39,12 +39,16 @@ /> - 保存 + 保存 + @@ -86,10 +90,9 @@ diff --git a/src/views/link/AccessConfig/components/Network/index.vue b/src/views/link/AccessConfig/components/Network/index.vue new file mode 100644 index 00000000..6d72b9e7 --- /dev/null +++ b/src/views/link/AccessConfig/components/Network/index.vue @@ -0,0 +1,701 @@ + + + + + diff --git a/src/views/link/AccessConfig/components/Provider/index.vue b/src/views/link/AccessConfig/components/Provider/index.vue index 3412f3f2..04390ba4 100644 --- a/src/views/link/AccessConfig/components/Provider/index.vue +++ b/src/views/link/AccessConfig/components/Provider/index.vue @@ -1,6 +1,6 @@ diff --git a/src/views/link/DashBoard/components/Jvm.vue b/src/views/link/DashBoard/components/Jvm.vue new file mode 100644 index 00000000..f876e0ae --- /dev/null +++ b/src/views/link/DashBoard/components/Jvm.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/src/views/link/DashBoard/components/Network.vue b/src/views/link/DashBoard/components/Network.vue new file mode 100644 index 00000000..2db01cc6 --- /dev/null +++ b/src/views/link/DashBoard/components/Network.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/src/views/link/DashBoard/components/TopCard.vue b/src/views/link/DashBoard/components/TopCard.vue new file mode 100644 index 00000000..9ff956cd --- /dev/null +++ b/src/views/link/DashBoard/components/TopCard.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/src/views/link/DashBoard/components/TopEchartsItemNode.vue b/src/views/link/DashBoard/components/TopEchartsItemNode.vue new file mode 100644 index 00000000..dafbad67 --- /dev/null +++ b/src/views/link/DashBoard/components/TopEchartsItemNode.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/src/views/link/DashBoard/components/tool.ts b/src/views/link/DashBoard/components/tool.ts new file mode 100644 index 00000000..cb337a31 --- /dev/null +++ b/src/views/link/DashBoard/components/tool.ts @@ -0,0 +1,220 @@ +import moment from 'moment'; +import * as echarts from 'echarts'; + +export const getInterval = (type) => { + switch (type) { + case 'year': + return '30d'; + case 'month': + case 'week': + return '1d'; + case 'hour': + return '1m'; + default: + return '1h'; + } +}; +export const getTimeFormat = (type) => { + switch (type) { + case 'year': + return 'YYYY-MM-DD'; + case 'month': + case 'week': + return 'MM-DD'; + case 'hour': + return 'HH:mm'; + default: + return 'HH'; + } +}; + +export const getTimeByType = (type) => { + switch (type) { + case 'hour': + return moment().subtract(1, 'hours'); + case 'week': + return moment().subtract(6, 'days'); + case 'month': + return moment().subtract(29, 'days'); + case 'year': + return moment().subtract(365, 'days'); + default: + return moment().startOf('day'); + } +}; + +export const arrayReverse = (data) => { + const newArray = []; + for (let i = data.length - 1; i >= 0; i--) { + newArray.push(data[i]); + } + return newArray; +}; + +export const networkParams = (val) => [ + { + dashboard: 'systemMonitor', + object: 'network', + measurement: 'traffic', + dimension: 'agg', + group: 'network', + params: { + type: val.type, + interval: getInterval(val.time.type), + from: moment(val.time.time[0]).valueOf(), + to: moment(val.time.time[1]).valueOf(), + }, + }, +]; +export const defulteParamsData = (group, val) => [ + { + dashboard: 'systemMonitor', + object: 'stats', + measurement: 'info', + dimension: 'history', + group, + params: { + from: moment(val.time[0]).valueOf(), + to: moment(val.time[1]).valueOf(), + }, + }, +]; + +export const areaStyle = { + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 1, + color: 'rgba(151, 154, 255, 0)', + }, + { + offset: 0, + color: 'rgba(151, 154, 255, .24)', + }, + ]), +}; +export const areaStyleCpu = { + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 1, + color: 'rgba(44, 182, 224, 0)', + }, + { + offset: 0, + color: 'rgba(44, 182, 224, .24)', + }, + ]), +}; +export const areaStyleJvm = { + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 1, + color: 'rgba(96, 223, 199, 0)', + }, + { + offset: 0, + color: 'rgba(96, 223, 199, .24)', + }, + ]), +}; + +export const typeDataLine = [ + { + data: [], + type: 'line', + }, +]; + +export const topOptionsSeries = { + type: 'gauge', + min: 0, + startAngle: 200, + endAngle: -20, + center: ['50%', '67%'], + title: { + show: false, + }, + axisTick: { + distance: -20, + lineStyle: { + width: 1, + color: 'rgba(0,0,0,0.15)', + }, + }, + splitLine: { + distance: -22, + length: 9, + lineStyle: { + width: 1, + color: '#000', + }, + }, + pointer: { + length: '80%', + width: 4, + itemStyle: { + color: 'auto', + }, + }, + anchor: { + show: true, + showAbove: true, + size: 20, + itemStyle: { + borderWidth: 3, + borderColor: '#fff', + shadowBlur: 20, + shadowColor: 'rgba(0, 0, 0, .25)', + color: 'auto', + }, + }, + axisLine: { + lineStyle: { + width: 10, + color: [ + [0.25, 'rgba(36, 178, 118, 1)'], + [ + 0.4, + new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: 'rgba(66, 147, 255, 1)', + }, + { + offset: 1, + color: 'rgba(36, 178, 118, 1)', + }, + ]), + ], + [ + 0.5, + new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: 'rgba(250, 178, 71, 1)', + }, + { + offset: 1, + color: 'rgba(66, 147, 255, 1)', + }, + ]), + ], + [ + 1, + new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: 'rgba(250, 178, 71, 1)', + }, + { + offset: 1, + color: 'rgba(247, 111, 93, 1)', + }, + ]), + ], + ], + }, + }, + detail: { + show: false, + }, +}; diff --git a/src/views/link/DashBoard/index.vue b/src/views/link/DashBoard/index.vue new file mode 100644 index 00000000..010bafd0 --- /dev/null +++ b/src/views/link/DashBoard/index.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/src/views/link/Protocol/index.vue b/src/views/link/Protocol/index.vue index 03e34035..6a772dcb 100644 --- a/src/views/link/Protocol/index.vue +++ b/src/views/link/Protocol/index.vue @@ -159,7 +159,7 @@ import _ from 'lodash'; const tableRef = ref>({}); const params = ref>({}); - +const route = useRoute(); const visible = ref(false); const current = ref({}); @@ -276,6 +276,14 @@ const saveChange = (value: object) => { } }; +watch( + () => route.query?.save, + (value) => { + value === 'true' && handlAdd(); + }, + { deep: true, immediate: true }, +); + /** * 搜索 * @param params diff --git a/src/views/link/Type/Detail/index.vue b/src/views/link/Type/Detail/index.vue index 6150e5ae..c56ded01 100644 --- a/src/views/link/Type/Detail/index.vue +++ b/src/views/link/Type/Detail/index.vue @@ -1032,11 +1032,10 @@ import { Store } from 'jetlinks-store'; import MonacoEditor from '@/components/MonacoEditor/index.vue'; const route = useRoute(); -const view = route.query.view as string; +const NetworkType = route.query.type as string; +const view = NetworkType ? 'false' : (route.query.view as string); const id = route.params.id as string; - const activeKey = ref(['1']); - const loading = ref(false); const formRef1 = ref(); const formRef2 = ref(); @@ -1250,7 +1249,6 @@ watch( } }, { deep: true }, - // { deep: true, immediate: true }, ); watch( @@ -1263,7 +1261,6 @@ watch( updateClustersListIndex(); }, { deep: true }, - // { deep: true, immediate: true }, ); watch( () => dynamicValidateForm.cluster?.length, @@ -1272,6 +1269,17 @@ watch( }, { deep: true, immediate: true }, ); +watch( + () => NetworkType, + (value) => { + if (value) { + const { cluster } = dynamicValidateForm; + formData.value.type = value; + cluster[0].configuration.host = '0.0.0.0'; + } + }, + { deep: true, immediate: true }, +);