From a48a1f73c7f68cc78805bef1ada15f26103d5381 Mon Sep 17 00:00:00 2001 From: jackhoo_98 Date: Wed, 8 Mar 2023 09:27:22 +0800 Subject: [PATCH 01/19] =?UTF-8?q?feat:=20=E9=87=87=E9=9B=86=E5=99=A8=20?= =?UTF-8?q?=E5=B7=A6=E4=BE=A7=E6=A0=91=E5=85=A8=E9=83=A8=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E5=8F=B3=E4=BE=A7=E5=8D=A1=E7=89=87=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E9=83=A8=E5=88=86=E8=A1=A8=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/data-collect/collector.ts | 19 + src/components/AIcon/index.tsx | 3 +- .../Collector/Point/Save/SaveModBus.vue | 472 +++++++++++++++++ .../Point/components/PointCardBox/index.vue | 415 +++++++++++++++ .../DataCollect/Collector/Point/index.vue | 484 ++++++++++++++++++ .../DataCollect/Collector/Tree/Save/index.vue | 278 ++++++++++ .../DataCollect/Collector/Tree/index.vue | 197 +++---- src/views/DataCollect/Collector/data.ts | 18 + src/views/DataCollect/Collector/index.vue | 12 +- src/views/device/Firmware/Task/index.vue | 1 - 10 files changed, 1801 insertions(+), 98 deletions(-) create mode 100644 src/views/DataCollect/Collector/Point/Save/SaveModBus.vue create mode 100644 src/views/DataCollect/Collector/Point/components/PointCardBox/index.vue create mode 100644 src/views/DataCollect/Collector/Point/index.vue create mode 100644 src/views/DataCollect/Collector/Tree/Save/index.vue create mode 100644 src/views/DataCollect/Collector/data.ts diff --git a/src/api/data-collect/collector.ts b/src/api/data-collect/collector.ts index 0a971056..01a4dd9e 100644 --- a/src/api/data-collect/collector.ts +++ b/src/api/data-collect/collector.ts @@ -2,3 +2,22 @@ import server from '@/utils/request'; export const queryCollector = (data: any) => server.post(`/data-collect/collector/_query/no-paging?paging=false`, data); + +export const queryChannelNoPaging = () => + server.post(`/data-collect/channel/_query/no-paging?paging=false`, {}); + +export const save = (data: any) => server.post(`/data-collect/collector`, data); + +export const update = (id: string, data: any) => + server.put(`/data-collect/collector/${id}`, data); + +export const remove = (id: string) => + server.remove(`/data-collect/collector/${id}`); + +export const queryPoint = (data: any) => + server.post(`/data-collect/point/_query`, data); + +export const _validateField = (id: string, data?: any) => + server.get(`/data-collect/point/${id}/_validate`, data); + +export const queryCodecProvider = () => server.get(`/things/collector/codecs`); diff --git a/src/components/AIcon/index.tsx b/src/components/AIcon/index.tsx index dd5e389f..1cb04122 100644 --- a/src/components/AIcon/index.tsx +++ b/src/components/AIcon/index.tsx @@ -73,7 +73,8 @@ const iconKeys = [ 'BellOutlined', 'UserOutlined', 'LogoutOutlined', - 'ReadIconOutlined' + 'ReadIconOutlined', + 'FormOutlined', ] const Icon = (props: {type: string}) => { diff --git a/src/views/DataCollect/Collector/Point/Save/SaveModBus.vue b/src/views/DataCollect/Collector/Point/Save/SaveModBus.vue new file mode 100644 index 00000000..d56586a0 --- /dev/null +++ b/src/views/DataCollect/Collector/Point/Save/SaveModBus.vue @@ -0,0 +1,472 @@ + + + + diff --git a/src/views/DataCollect/Collector/Point/components/PointCardBox/index.vue b/src/views/DataCollect/Collector/Point/components/PointCardBox/index.vue new file mode 100644 index 00000000..cb1aa934 --- /dev/null +++ b/src/views/DataCollect/Collector/Point/components/PointCardBox/index.vue @@ -0,0 +1,415 @@ + + + + + diff --git a/src/views/DataCollect/Collector/Point/index.vue b/src/views/DataCollect/Collector/Point/index.vue new file mode 100644 index 00000000..2576cdcd --- /dev/null +++ b/src/views/DataCollect/Collector/Point/index.vue @@ -0,0 +1,484 @@ + + + diff --git a/src/views/DataCollect/Collector/Tree/Save/index.vue b/src/views/DataCollect/Collector/Tree/Save/index.vue new file mode 100644 index 00000000..7e2619a1 --- /dev/null +++ b/src/views/DataCollect/Collector/Tree/Save/index.vue @@ -0,0 +1,278 @@ + + + + diff --git a/src/views/DataCollect/Collector/Tree/index.vue b/src/views/DataCollect/Collector/Tree/index.vue index abd31f28..4ed725b7 100644 --- a/src/views/DataCollect/Collector/Tree/index.vue +++ b/src/views/DataCollect/Collector/Tree/index.vue @@ -10,10 +10,12 @@
+ 新增采集器
@@ -21,18 +23,10 @@ - + > From dfdfbb30bd9774ebf81b9b36783d506e6a95af09 Mon Sep 17 00:00:00 2001 From: JiangQiming <291854119@qq.com> Date: Wed, 8 Mar 2023 14:59:21 +0800 Subject: [PATCH 08/19] =?UTF-8?q?update:=20=E8=A7=86=E9=A2=91=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E7=BB=84=E4=BB=B6=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/media/Home/index.vue | 135 +++++++++++++++++++++++- src/views/notice/Config/Log/index.vue | 3 +- src/views/notice/Template/Log/index.vue | 3 +- 3 files changed, 136 insertions(+), 5 deletions(-) diff --git a/src/views/media/Home/index.vue b/src/views/media/Home/index.vue index a6ba21cb..aa888616 100644 --- a/src/views/media/Home/index.vue +++ b/src/views/media/Home/index.vue @@ -21,6 +21,56 @@ /> + + + + + + + + @@ -33,6 +83,13 @@ import BasicCountCard from '@/views/media/Home/components/BasicCountCard.vue'; import { usePermissionStore } from '@/store/permission'; import type { bootConfig, recommendList } from '@/views/home/typing'; +import deviceApi from '@/api/media/device'; +import { message } from 'ant-design-vue'; + +import { useMenuStore } from 'store/menu'; + +const menuStory = useMenuStore(); + // 权限控制 const hasPermission = usePermissionStore().hasPermission; @@ -54,6 +111,7 @@ const deviceBootConfig: bootConfig[] = [ link: 'media/Cascade', }, ]; + const deviceStepDetails: recommendList[] = [ { title: '添加视频设备', @@ -66,8 +124,16 @@ const deviceStepDetails: recommendList[] = [ title: '查看通道', details: '查看设备下的通道数据,可以进行直播、录制等操作。', iconUrl: '/images/home/bottom-7.png', - linkUrl: 'media/Device/Channel', + // linkUrl: 'media/Device/Channel', + linkUrl: '', auth: hasPermission('media/Device:view'), + onClick: (row: any) => { + if (hasPermission('media/Device:view')) { + visible.value = true; + } else { + message.warning('暂无权限,请联系管理员'); + } + }, }, { title: '分屏展示', @@ -76,4 +142,71 @@ const deviceStepDetails: recommendList[] = [ linkUrl: 'media/SplitScreen', }, ]; + +// 选择设备 +const visible = ref(false); +const columns = [ + { + title: 'ID', + dataIndex: 'id', + key: 'id', + search: { + type: 'string', + }, + }, + { + title: '名称', + dataIndex: 'name', + key: 'name', + search: { + type: 'string', + }, + }, + { + title: '通道数量', + dataIndex: 'channelNumber', + key: 'channelNumber', + }, + { + title: '状态', + dataIndex: 'state', + key: 'state', + scopedSlots: true, + search: { + type: 'select', + options: [ + { label: '在线', value: 'online' }, + { label: '离线', value: 'offline' }, + ], + handleValue: (v: any) => { + return v; + }, + }, + }, +]; +const params = ref>({}); + +/** + * 搜索 + * @param params + */ +const handleSearch = (e: any) => { + params.value = e; +}; + +const deviceItem = ref(); +const handleSubmit = () => { + if (deviceItem.value && deviceItem.value.id) { + menuStory.jumpPage( + 'media/Device/Channel', + {}, + { + id: deviceItem.value.id, + type: deviceItem.value.provider, + }, + ); + } else { + message.warning('请选择设备'); + } +}; diff --git a/src/views/notice/Config/Log/index.vue b/src/views/notice/Config/Log/index.vue index 8865041d..c0edb899 100644 --- a/src/views/notice/Config/Log/index.vue +++ b/src/views/notice/Config/Log/index.vue @@ -1,9 +1,8 @@ - - +
- - - - + - - - + + - - - + - - - + - - +
- - - + OAuth2 - - + + 基本认证 - - + + bearer认证 - - - + + +
- - - + - - - + 请求体 - - + + 请求头 - - - + + + - - - - + - - +
- - - - + - - +
- - - +
- + - - - + - - - - + @@ -685,12 +685,12 @@ tooltip="授权完成后跳转到具体页面的回调地址" /> - - - + - + > - - + + - {{ name }} - + - +
- + - - - - + + - +
- + - @@ -815,7 +815,7 @@
- - - + - - - - + - - - + - - +
- - - +
- - - - + + -
+
-
点击上传图片
- + - - - - + - - - + - - - - + + - +
- - - + - - - + - - - + - - - +
- + - - +
- - - - + - - + - - + + > - - - + + {{ name }} - + - +
- - + + - - + - - + + - 保存 - +
@@ -1415,7 +1414,6 @@ const menuStory = useMenuStore(); const deptPermission = 'system/Department'; const rolePermission = 'system/Role'; -const dialogRef = ref(); // 初始化表单 const initForm: formType = { name: '', @@ -1584,6 +1582,12 @@ const joinOptions = computed(() => { ]; }); +const dialog = reactive({ + visible: false, + selectId: '', + selectProvider: '' as any, +}); + init(); function init() { @@ -1703,11 +1707,9 @@ function clickSave() { const isPage = params.integrationModes.includes('page'); if (isPage) { form.data = params; - dialogRef.value && - dialogRef.value.openDialog( - routeQuery.id || resp.result.id, - form.data.provider, - ); + dialog.selectId = routeQuery.id || resp.result.id; + dialog.selectProvider = form.data.provider; + dialog.visible = true; } else { message.success('保存成功'); menuStory.jumpPage('system/Apply'); @@ -1783,7 +1785,7 @@ function clearNullProp(obj: object) { max-width: 150px; max-height: 150px; - >.ant-upload { + > .ant-upload { height: 150px; } } diff --git a/src/views/system/Apply/Save/components/FormLabel.vue b/src/views/system/Apply/Save/components/FormLabel.vue index 4be698bd..e7842dcd 100644 --- a/src/views/system/Apply/Save/components/FormLabel.vue +++ b/src/views/system/Apply/Save/components/FormLabel.vue @@ -2,10 +2,10 @@
{{ props.text }} * - + - +
diff --git a/src/views/system/Apply/Save/components/RequestTable.vue b/src/views/system/Apply/Save/components/RequestTable.vue index 4c8ff9ee..7ebb7f31 100644 --- a/src/views/system/Apply/Save/components/RequestTable.vue +++ b/src/views/system/Apply/Save/components/RequestTable.vue @@ -1,52 +1,52 @@ @@ -120,7 +120,6 @@ function addRow() { label: '', value: '', }; - console.log(111); emits('update:value', [...props.value, newRow]); } diff --git a/src/views/system/Apply/Save/index.vue b/src/views/system/Apply/Save/index.vue index b18dfb58..8797e473 100644 --- a/src/views/system/Apply/Save/index.vue +++ b/src/views/system/Apply/Save/index.vue @@ -1,13 +1,13 @@ @@ -21,3 +21,10 @@ const chengeType = (newType: applyType) => { rightType.value = newType; }; + + diff --git a/src/views/system/Apply/componenets/MenuDialog.vue b/src/views/system/Apply/componenets/MenuDialog.vue index bc4a5d7a..a5c306b0 100644 --- a/src/views/system/Apply/componenets/MenuDialog.vue +++ b/src/views/system/Apply/componenets/MenuDialog.vue @@ -1,30 +1,30 @@ - - + + diff --git a/src/components/index.ts b/src/components/index.ts index a41944b2..f27cd374 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -1,5 +1,5 @@ import type { App } from 'vue' -import AIcon from './AIcon' +// import AIcon from './AIcon' import PermissionButton from './PermissionButton/index.vue' import JTable from './Table/index' import TitleComponent from "./TitleComponent/index.vue"; @@ -10,7 +10,7 @@ import NormalUpload from './NormalUpload/index.vue' import FileFormat from './FileFormat/index.vue' import JProUpload from './JUpload/index.vue' import { BasicLayoutPage, BlankLayoutPage } from './Layout' -import { PageContainer } from 'jetlinks-ui-components' +import { PageContainer, AIcon } from 'jetlinks-ui-components' import Ellipsis from './Ellipsis/index.vue' import JEmpty from './Empty/index.vue' import AMapComponent from './AMapComponent/index.vue' diff --git a/src/views/rule-engine/Scene/Save/components/DropdownButton.vue b/src/views/rule-engine/Scene/Save/components/DropdownButton.vue deleted file mode 100644 index 36de7ff3..00000000 --- a/src/views/rule-engine/Scene/Save/components/DropdownButton.vue +++ /dev/null @@ -1,153 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/DropdownButton/DropdownButton.vue b/src/views/rule-engine/Scene/Save/components/DropdownButton/DropdownButton.vue new file mode 100644 index 00000000..52992e07 --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/DropdownButton/DropdownButton.vue @@ -0,0 +1,143 @@ + + + + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/DropdownButton/Menus.vue b/src/views/rule-engine/Scene/Save/components/DropdownButton/Menus.vue new file mode 100644 index 00000000..0a48897a --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/DropdownButton/Menus.vue @@ -0,0 +1,81 @@ + + + + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/DropdownButton/Time.vue b/src/views/rule-engine/Scene/Save/components/DropdownButton/Time.vue new file mode 100644 index 00000000..ab9a7983 --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/DropdownButton/Time.vue @@ -0,0 +1,89 @@ + + + + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/DropdownButton/index.less b/src/views/rule-engine/Scene/Save/components/DropdownButton/index.less new file mode 100644 index 00000000..359d9041 --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/DropdownButton/index.less @@ -0,0 +1,44 @@ +.dropdown-button { + display: flex; + align-items: center; + padding: 6px 8px; + border: 1px solid #d9d9d9; + border-radius: 8px; + cursor: pointer; +} + +.scene-select-content { + position: relative; + min-width: 220px; + padding: 4px; + background: #fff; + border-radius: 2px; + box-shadow: 0 3px 6px -4px #0000001f, 0 6px 16px #00000014, 0 9px 28px 8px #0000000d; +} + +.column { + color: #00a4fe; + background-color: rgba(154, 219, 255, 0.3); + border-color: rgba(0, 164, 254, 0.3); +} + +.termType { + color: #2f54eb; + background-color: rgba(163, 202, 255, 0.3); + border-color: rgba(47, 84, 235, 0.3); +} + +.value { + color: #692ca7; + background-color: rgba(188, 125, 238, 0.1); + border-color: rgba(188, 125, 238, 0.5); +} + +.type { + padding: 5px 10px; +} + +.tree-title-description { + padding-left: 5px; + color: grey; +} \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/DropdownButton/index.ts b/src/views/rule-engine/Scene/Save/components/DropdownButton/index.ts new file mode 100644 index 00000000..214d6ef1 --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/DropdownButton/index.ts @@ -0,0 +1,9 @@ +import Dropdown from './DropdownButton.vue' +import DropdownMenus from './Menus.vue' +import DropdownTimePicker from './Time.vue' + +export default Dropdown + +export { + DropdownMenus, DropdownTimePicker +} \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/DropdownButton/util.ts b/src/views/rule-engine/Scene/Save/components/DropdownButton/util.ts new file mode 100644 index 00000000..ba64375e --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/DropdownButton/util.ts @@ -0,0 +1,42 @@ +export type DropdownButtonOptions = { + label: string; + value: string; + children?: DropdownButtonOptions[]; + [key: string]: any; +}; + +export const getComponent = (type: string): string => { + switch (type) { + case 'int': + case 'long': + case 'float': + case 'double': + return 'number' + case 'metric': + case 'enum': + case 'boolean': + return 'menu' + case 'date': + return 'date' + case 'tree': + return 'tree' + default: + return 'input' + } +} + +export const getOption = (data: any[], value?: string | number | boolean, key: string = 'name'): DropdownButtonOptions | any => { + let option = {} + if (!value) return option + for (let i = 0; i < data.length; i++) { + const item = data[i] + if (item[key] === value) { + option = data[i] + break + } else if (item.children && item.children.length){ + option = getOption(item.children, value, key) + if (option) break + } + } + return option +} \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/ParamsDropdown.vue b/src/views/rule-engine/Scene/Save/components/ParamsDropdown.vue deleted file mode 100644 index bc101782..00000000 --- a/src/views/rule-engine/Scene/Save/components/ParamsDropdown.vue +++ /dev/null @@ -1,13 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/ParamsDropdown/Double.vue b/src/views/rule-engine/Scene/Save/components/ParamsDropdown/Double.vue new file mode 100644 index 00000000..79c03073 --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/ParamsDropdown/Double.vue @@ -0,0 +1,49 @@ + + + + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/ParamsDropdown/index.ts b/src/views/rule-engine/Scene/Save/components/ParamsDropdown/index.ts new file mode 100644 index 00000000..dca9540f --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/ParamsDropdown/index.ts @@ -0,0 +1,8 @@ +import ParamsDropdown from './index.vue' +import DoubleParamsDropdown from './Double.vue' + +export default ParamsDropdown + +export { + DoubleParamsDropdown +} \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/ParamsDropdown/index.vue b/src/views/rule-engine/Scene/Save/components/ParamsDropdown/index.vue new file mode 100644 index 00000000..65010591 --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/ParamsDropdown/index.vue @@ -0,0 +1,159 @@ + + + + + \ No newline at end of file diff --git a/src/views/rule-engine/Scene/Save/components/ParamsDropdown/typings.ts b/src/views/rule-engine/Scene/Save/components/ParamsDropdown/typings.ts new file mode 100644 index 00000000..dfbf0a62 --- /dev/null +++ b/src/views/rule-engine/Scene/Save/components/ParamsDropdown/typings.ts @@ -0,0 +1,58 @@ +import type { PropType } from 'vue' + +export type LabelType = string | number | undefined + +export type DropdownButtonOptions = { + label: string; + value: string; + children?: DropdownButtonOptions[]; + [key: string]: any; +}; + +export type TabsOption = { + label: string; + key: string; + component: string, + options: DropdownButtonOptions[] +} +type ValueArrayType = [string, number] +export type ValueType = string | number | undefined | ValueArrayType + +export const defaultSetting = { + icon: { + type: String, + default: '' + }, + placeholder: { + type: String, + default: undefined + }, + value: { + type: [String, Number, Array] as PropType, + default: undefined + }, + valueName: { + type: String, + default: 'value' + }, + labelName: { + type: String, + default: 'label' + }, + source: { + type: String, + default: 'fixed' + }, + options: { + type: Array as PropType>, + default: () => [] + }, + metricOptions: { // 指标值 + type: Array as PropType>, + default: () => [] + }, + tabsOptions: { + type: Array as PropType>, + default: () => [] + } +} diff --git a/src/views/rule-engine/Scene/Save/components/Terms/ParamsItem.vue b/src/views/rule-engine/Scene/Save/components/Terms/ParamsItem.vue index 60c55ac2..fa8d0d84 100644 --- a/src/views/rule-engine/Scene/Save/components/Terms/ParamsItem.vue +++ b/src/views/rule-engine/Scene/Save/components/Terms/ParamsItem.vue @@ -16,8 +16,11 @@ @mouseout='mouseout' > - - - + +
-
+
@@ -48,7 +74,9 @@