From 4cb212cbcf157afd07cde60ab94206d7afa4343e Mon Sep 17 00:00:00 2001 From: wenlele Date: Fri, 17 Jun 2022 08:38:11 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BA=A7=E8=81=94=E6=91=84=E5=83=8F=E5=A4=B4?= =?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B9=EF=BC=8C=E8=A1=A8=E6=A0=BC=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/client/src/components/reminderBox.jsx | 80 +- .../equipmentWarehouse/actions/camera.js | 12 + .../components/cameraModal.jsx | 960 +++++++++--------- .../components/cascadeCamera.jsx | 222 ++-- .../equipmentWarehouse/containers/camera.jsx | 104 +- .../equipmentWarehouse/containers/nvr.jsx | 95 +- .../web/client/src/utils/webapi.js | 1 + 7 files changed, 730 insertions(+), 744 deletions(-) diff --git a/code/VideoAccess-VCMP/web/client/src/components/reminderBox.jsx b/code/VideoAccess-VCMP/web/client/src/components/reminderBox.jsx index 162c4a4..90a42e8 100644 --- a/code/VideoAccess-VCMP/web/client/src/components/reminderBox.jsx +++ b/code/VideoAccess-VCMP/web/client/src/components/reminderBox.jsx @@ -1,45 +1,47 @@ import { Button, Checkbox, Modal } from "@douyinfe/semi-ui"; import React from "react"; -const ReminderBox = ({title, wait, toadd,visible,onOk}) => { - return ( - - {title} - - } - icon={ - - } - footer={ -
- console.log(checked)} - aria-label="Checkbox 示例" - style={{ width: 100 }} - > - 不在提醒 - -
- - -
-
- } - // visible={false} - visible={visible} - >
- ); +const ReminderBox = ({ title, wait, toadd, visible, onOk }) => { + return ( + + {title} + + } + icon={ + + } + footer={ +
+ console.log(checked)} + aria-label="Checkbox 示例" + style={{ width: 100 }} + > + 不在提醒 + +
+ + +
+
+ } + // visible={true} + visible={visible} + >
+ ); }; export default ReminderBox; diff --git a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/actions/camera.js b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/actions/camera.js index dd35adf..5d8b967 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/actions/camera.js +++ b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/actions/camera.js @@ -149,3 +149,15 @@ export function postAddCascade(data) { msg: { option: "" }, //添加级联摄像头 }); } + +export function getParentCamera(query) { + return (dispatch) => + basicAction({ + type: "get", + dispatch: dispatch, + query, + actionType: "GET_PARENT_CASCADE", + url: `${ApiTable.getParentCamera}`, + msg: { option: "" }, //获取级联摄像头父级设备 + }); + } diff --git a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cameraModal.jsx b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cameraModal.jsx index 91bccc3..6b863cc 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cameraModal.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cameraModal.jsx @@ -8,495 +8,515 @@ import IpcCamera from "./ipcCamera"; import CascadeCamera from "./cascadeCamera"; import "./cameraModal.less"; -function cameraModal(props) { - const { - dispatch, - actions, - modalName, - visible, - close, - venderList, - CameraKind, - CameraAbility, - cameraData, //修改时传来的值 - } = props; - const { equipmentWarehouse } = actions; - const fluoriteRef = useRef(); - const ipcRef = useRef(); - const cascadeRef = useRef(); - const nvrRef = useRef(); - const [isloading, setloading] = useState(false); //是否显示loading - const [loadingTip, setloadingTip] = useState("获取中...请稍后..."); //loading tip的值 - const [okText, setokText] = useState("确定"); //ok弹框text 右边 - const [cancelText, setcancelText] = useState("取消"); //取消弹框text 左边 - const [clickNum, setclickNum] = useState( - cameraData.type == "yingshi" - ? 1 - : cameraData.type == "ipc" - ? 3 - : cameraData.type == "nvr" - ? 2 - : cameraData.type == "cascade" - ? 4 - : 1 - ); //点击的第几个 +function cameraModal (props) { + const { + dispatch, + actions, + modalName, + visible, + close, + venderList, + CameraKind, + CameraAbility, + cameraData, //修改时传来的值 + modify, + parentCamera + } = props; + const { equipmentWarehouse } = actions; + const fluoriteRef = useRef(); + const ipcRef = useRef(); + const cascadeRef = useRef(); + const nvrRef = useRef(); + const [isloading, setloading] = useState(false); //是否显示loading + const [loadingTip, setloadingTip] = useState("获取中...请稍后..."); //loading tip的值 + const [okText, setokText] = useState("确定"); //ok弹框text 右边 + const [cancelText, setcancelText] = useState("取消"); //取消弹框text 左边 + + const [clickNum, setclickNum] = useState( + cameraData.type == "yingshi" + ? 1 + : cameraData.type == "ipc" + ? 3 + : cameraData.type == "nvr" + ? 2 + : cameraData.type == "cascade" + ? 4 + : 1 + ); //点击的第几个 - useEffect(() => { - dispatch(equipmentWarehouse.getCameraKind()); - dispatch(equipmentWarehouse.getAbility()); - cameraData.type == "nvr" ? setcameraList(cameraList.slice(1, 4)) : ""; - }, []); - const cameraList = [ - //循环摄像头列表 - { - id: 1, - img: "/assets/images/background/ysy.png", - title: "萤石云平台摄像头", - text: "通过萤石云平台rtmp地址配置完成推流的平台摄像头。", - }, - { - id: 3, - img: "/assets/images/background/ipc.png", - title: "IPC网络摄像头", - text: "通过网络与监控设备直连完成视频流推送的摄像头设备", - }, - { - id: 4, - img: "/assets/images/background/cascade.png", - title: "级联摄像头", - text: "通过GB/T28181协议级联的平台摄像头,常用于平台对接推送", - }, - { - id: 2, - img: "/assets/images/background/nvr.png", - title: "NVR摄像头", - text: "通过连接NVR(网络硬盘录像机)进行视频流推送的摄像头", - }, - ]; - const [showcameraList, setcameraList] = useState(cameraList.slice(0, 3)); //轮播图 - function handleOk() { - //点击弹框确定 右边按钮 - if (clickNum == 1) { - //萤石云平台摄像头 - fluoriteRef.current.fluoriteCameraForm().then((values) => { - values = JSON.parse(JSON.stringify(values)); - values.longitude = values.position.split(",")[0]; - values.latitude = values.position.split(",")[1]; - delete values.position; - if (cameraData.id) { - values.id = cameraData.id; + useEffect(() => { + dispatch(equipmentWarehouse.getCameraKind()); + dispatch(equipmentWarehouse.getAbility()); + cameraData.type == "nvr" ? setcameraList(cameraList.slice(1, 4)) : ""; + }, []); + const cameraList = [ + //循环摄像头列表 + { + id: 1, + img: "/assets/images/background/ysy.png", + title: "萤石云平台摄像头", + text: "通过萤石云平台rtmp地址配置完成推流的平台摄像头。", + }, + { + id: 3, + img: "/assets/images/background/ipc.png", + title: "IPC网络摄像头", + text: "通过网络与监控设备直连完成视频流推送的摄像头设备", + }, + { + id: 4, + img: "/assets/images/background/cascade.png", + title: "级联摄像头", + text: "通过GB/T28181协议级联的平台摄像头,常用于平台对接推送", + }, + { + id: 2, + img: "/assets/images/background/nvr.png", + title: "NVR摄像头", + text: "通过连接NVR(网络硬盘录像机)进行视频流推送的摄像头", + }, + ]; + const [showcameraList, setcameraList] = useState(cameraList.slice(0, 3)); //轮播图 + function handleOk () { + //点击弹框确定 右边按钮 + if (clickNum == 1) { + //萤石云平台摄像头 + fluoriteRef.current.fluoriteCameraForm().then((values) => { + values = JSON.parse(JSON.stringify(values)); + values.longitude = values.position.split(",")[0]; + values.latitude = values.position.split(",")[1]; + delete values.position; + if (cameraData.id) { + values.id = cameraData.id; + } + dispatch(equipmentWarehouse.postCameraYingshi(values)).then((res) => { + if (res.success) { + onReset(); + } + }); + }); + } else if (clickNum == 2) { + //NVR摄像头 + let data = nvrRef.current.NVRcameraList.map((v) => { + return { streamid: v.streamid, name: v.name, cloudControl: v.support }; + }); + dispatch( + equipmentWarehouse.postCameraNvr({ + serialNo: nvrRef.current.equipmentNum, + data: data, + }) + ).then((res) => { + if (res.success) { + onReset(); + } + }); + } else if (clickNum == 3) { + //IPC网络摄像头 + ipcRef.current.ipcCameraForm().then((values) => { + values = JSON.parse(JSON.stringify(values)); + values.longitude = values.position.split(",")[0]; + values.latitude = values.position.split(",")[1]; + delete values.position; + if (cameraData.id) { + values.id = cameraData.id; + } + console.log(values); + dispatch(equipmentWarehouse.postCameraIpc(values)).then((res) => { + if (res.success) { + onReset(); + } + }); + }); + } else if (clickNum == 4) { + //级联摄像头 + cascadeRef.current.cascadeCameraForm().then((values) => { + console.log(values); + dispatch(equipmentWarehouse.postAddCascade(values)).then((res) => { + console.log(res); + if (res.success) { + onReset(); + } + }); + }); } - dispatch(equipmentWarehouse.postCameraYingshi(values)).then((res) => { - if (res.success) { - onReset(); - } - }); - }); - } else if (clickNum == 2) { - //NVR摄像头 - let data = nvrRef.current.NVRcameraList.map((v) => { - return { streamid: v.streamid, name: v.name, cloudControl: v.support }; - }); - dispatch( - equipmentWarehouse.postCameraNvr({ - serialNo: nvrRef.current.equipmentNum, - data: data, - }) - ).then((res) => { - if (res.success) { - onReset(); + } + function handleAfterClose () { + //在关闭之后 + } + function handleCancel () { + onReset(); + //点击弹框取消 左边按钮 + } + function handleChoose (id) { + //选择摄像头接入类型 + if (!modify) { + setclickNum(id); + } + + } + function turnLift () { + //轮播图向左 + if (!modify) { + setcameraList(cameraList.slice(0, 3)); } - }); - } else if (clickNum == 3) { - //IPC网络摄像头 - ipcRef.current.ipcCameraForm().then((values) => { - values = JSON.parse(JSON.stringify(values)); - values.longitude = values.position.split(",")[0]; - values.latitude = values.position.split(",")[1]; - delete values.position; - if (cameraData.id) { - values.id = cameraData.id; + } + function turnRight () { + //轮播图向右 + if (!modify) { + setcameraList(cameraList.slice(1, 4)); } - console.log(values); - dispatch(equipmentWarehouse.postCameraIpc(values)).then((res) => { - if (res.success) { - onReset(); - } - }); - }); - } else if (clickNum == 4) { - //级联摄像头 - cascadeRef.current.cascadeCameraForm().then((values) => { - console.log(values); - dispatch(equipmentWarehouse.postAddCascade(values)).then((res) => { - console.log(res); - if (res.success) { - onReset(); - } - }); - }); } - } - function handleAfterClose() { - //在关闭之后 - } - function handleCancel() { - onReset(); - //点击弹框取消 左边按钮 - } - function handleChoose(id) { - //选择摄像头接入类型 - setclickNum(id); - } - function turnLift() { - //轮播图向左 - setcameraList(cameraList.slice(0, 3)); - } - function turnRight() { - //轮播图向右 - setcameraList(cameraList.slice(1, 4)); - } - function onReset() { - if (clickNum == 1) { - fluoriteRef.current.resetFluoriteCamera(); - fluoriteRef.current.toempty(); - close(); - } else if (clickNum == 3) { - ipcRef.current.resetIpcCamera(); - ipcRef.current.toempty(); - close(); - } else if (clickNum == 4) { - cascadeRef.current.resetCascadeCamera(); - close(); - } else { - nvrRef.current.resetFluoriteCamera(); - close(); + function onReset () { + if (clickNum == 1) { + fluoriteRef.current.resetFluoriteCamera(); + fluoriteRef.current.toempty(); + close(); + } else if (clickNum == 3) { + ipcRef.current.resetIpcCamera(); + ipcRef.current.toempty(); + close(); + } else if (clickNum == 4) { + cascadeRef.current.resetCascadeCamera(); + close(); + } else { + nvrRef.current.resetFluoriteCamera(); + close(); + } } - } - //重置 - function reset() { - if (clickNum == 1) { - fluoriteRef.current.resetFluoriteCamera(); - fluoriteRef.current.toempty(); - } else if (clickNum == 3) { - ipcRef.current.resetIpcCamera(); - ipcRef.current.toempty(); - } else if (clickNum == 4) { - cascadeRef.current.resetCascadeCamera(); - } else { - nvrRef.current.resetFluoriteCamera(); + //重置 + function reset () { + if (clickNum == 1) { + fluoriteRef.current.resetFluoriteCamera(); + fluoriteRef.current.toempty(); + } else if (clickNum == 3) { + ipcRef.current.resetIpcCamera(); + ipcRef.current.toempty(); + } else if (clickNum == 4) { + cascadeRef.current.resetCascadeCamera(); + } else { + nvrRef.current.resetFluoriteCamera(); + } } - } - function toTest() { - if (clickNum == 1) { - fluoriteRef.current - .fluoriteCameraForm() - .then((values) => { - //表单校验成功 - console.log("111111111", values); - }) - .catch((errors) => { - //表单校验失败 - console.log("errors", errors); - }); - } else if (clickNum == 3) { - ipcRef.current - .ipcCameraForm() - .then((values) => { - //表单校验成功 - console.log("111111111", values); - }) - .catch((errors) => { - //表单校验失败 - console.log("errors", errors); - }); - } else if (clickNum == 4) { - cascadeRef.current - .cascadeCameraForm() - .then((values) => { - //表单校验成功 - let chooseList = []; - let nvrCameraList = [ - { - id: 10, - name: "南昌县1", - number: "111111111111111111", - support: false, - change: false, - }, - { - id: 20, - name: "南昌县2", - number: "222222222222222222", - support: false, - change: false, - }, - { - id: 30, - name: "南昌县3", - number: "333333333333333333", - support: false, - change: false, - }, - { - id: 40, - name: "南昌县4", - number: "444444444444444444", - support: false, - change: false, - }, - ]; - cascadeRef.current.setNVRcameraList(nvrCameraList); - for (let index = 0; index < nvrCameraList.length; index++) { - chooseList.push(nvrCameraList[index].id); - } - cascadeRef.current.setNvrCheckList(chooseList); - cascadeRef.current.setIsAllChoose(true); - }) - .catch((errors) => { - //表单校验失败 - console.log("errors", errors); - }); + function toTest () { + if (clickNum == 1) { + fluoriteRef.current + .fluoriteCameraForm() + .then((values) => { + //表单校验成功 + console.log("111111111", values); + }) + .catch((errors) => { + //表单校验失败 + console.log("errors", errors); + }); + } else if (clickNum == 3) { + ipcRef.current + .ipcCameraForm() + .then((values) => { + //表单校验成功 + console.log("111111111", values); + }) + .catch((errors) => { + //表单校验失败 + console.log("errors", errors); + }); + } else if (clickNum == 4) { + cascadeRef.current + .cascadeCameraForm() + .then((values) => { + //表单校验成功 + let chooseList = []; + let nvrCameraList = [ + { + id: 10, + name: "南昌县1", + number: "111111111111111111", + support: false, + change: false, + }, + { + id: 20, + name: "南昌县2", + number: "222222222222222222", + support: false, + change: false, + }, + { + id: 30, + name: "南昌县3", + number: "333333333333333333", + support: false, + change: false, + }, + { + id: 40, + name: "南昌县4", + number: "444444444444444444", + support: false, + change: false, + }, + ]; + cascadeRef.current.setNVRcameraList(nvrCameraList); + for (let index = 0; index < nvrCameraList.length; index++) { + chooseList.push(nvrCameraList[index].id); + } + cascadeRef.current.setNvrCheckList(chooseList); + cascadeRef.current.setIsAllChoose(true); + }) + .catch((errors) => { + //表单校验失败 + console.log("errors", errors); + }); + } } - } - return ( - <> - - -
-
+ - 接入类型 -
-
- -
- {showcameraList.map((item, index) => ( -
handleChoose(item.id)} - > +
- 设置 +
+ 接入类型 +
+
+ +
+ {showcameraList.map((item, index) => ( +
handleChoose(item.id)} + > + {modify ? item.id == clickNum ? "" :
: ""} +
+ 设置 +
+
+ {item.title} +
+
+ {item.text} +
+ {clickNum === item.id ? ( +
+ 1 +
+ ) : ( + "" + )} +
+ + ))} + +
+ +
- {item.title} +
+ 配置属性 +
+ {clickNum !== 2 ? ( +
+
+ 1 + 重置 +
+
+ 1 + 测试 +
+
+ ) : ( + "" + )}
-
- {item.text} +
+ {clickNum == 1 ? ( + + ) : clickNum == 2 ? ( + + ) : clickNum == 3 ? ( + + ) : ( + + )}
- {clickNum === item.id ? ( -
- 1 -
- ) : ( - "" - )} -
- ))} -
- -
-
-
-
- 配置属性 -
- {clickNum !== 2 ? ( -
-
- 1 - 重置 -
-
- 1 - 测试 -
-
- ) : ( - "" - )} -
-
- {clickNum == 1 ? ( - - ) : clickNum == 2 ? ( - - ) : clickNum == 3 ? ( - - ) : ( - - )} -
- - - - ); + + + + ); } -function mapStateToProps(state) { - const { auth, global, members, CameraKind, CameraAbility } = state; - return { - loading: members.isRequesting, - user: auth.user, - actions: global.actions, - CameraKind: CameraKind.data || [], - CameraAbility: CameraAbility.data || [], - }; +function mapStateToProps (state) { + const { auth, global, members, CameraKind, CameraAbility } = state; + return { + loading: members.isRequesting, + user: auth.user, + actions: global.actions, + CameraKind: CameraKind.data || [], + CameraAbility: CameraAbility.data || [], + }; } export default connect(mapStateToProps)(cameraModal); diff --git a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cascadeCamera.jsx b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cascadeCamera.jsx index d22382f..b7a3c03 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cascadeCamera.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/cascadeCamera.jsx @@ -3,122 +3,122 @@ import { connect } from "react-redux"; import { Form, Row, Col } from "@douyinfe/semi-ui"; import "./cameraModal.less"; -function cascadeCamera({ dRef, dispatch, actions ,cameraData}) { - const form = useRef(); - const { equipmentWarehouse } = actions; - const [sip, setSip] = useState([]); +function cascadeCamera ({ dRef, dispatch, actions, cameraData ,parentCamera}) { + const form = useRef(); + const { equipmentWarehouse } = actions; + const [sip, setSip] = useState([]); - useEffect(() => { - dispatch(equipmentWarehouse.getCascadeSIP()).then((res) => { - console.log(res) - setSip(res.payload.data); - }); - }, []); + useEffect(() => { + dispatch(equipmentWarehouse.getCascadeSIP()).then((res) => { + setSip(res.payload.data); + }); + + }, []); - //内存卡列表 - const memoryList = [ - { - id: 1, - value: "8g", - }, - { - id: 2, - value: "16g", - }, - { - id: 3, - value: "32g", - }, - { - id: 4, - value: "64g", - }, - { - id: 5, - value: "128g", - }, - { - id: 6, - value: "256g", - }, - { - id: 7, - value: ">256g", - }, - ]; + //内存卡列表 + const memoryList = [ + { + id: 1, + value: "8g", + }, + { + id: 2, + value: "16g", + }, + { + id: 3, + value: "32g", + }, + { + id: 4, + value: "64g", + }, + { + id: 5, + value: "128g", + }, + { + id: 6, + value: "256g", + }, + { + id: 7, + value: ">256g", + }, + ]; - useImperativeHandle(dRef, () => ({ - //传给父组件方法 - //子组件暴露给父组件的方法 - cascadeCameraForm: form.current.validate, - resetCascadeCamera: form.current.reset, - })); - return ( - <> -
{ - console.log(values); - - }} - getFormApi={(formApi) => (form.current = formApi)} - > - - - - - - - - 上级域 - - - - - ({ + //传给父组件方法 + //子组件暴露给父组件的方法 + cascadeCameraForm: form.current.validate, + resetCascadeCamera: form.current.reset, + })); + return ( + <> + { + console.log(values); + + }} + getFormApi={(formApi) => (form.current = formApi)} > - {sip.map((item, index) => ( - - {item.sipip} - - ))} - - - -
- - ); + + + + + + + + 上级域 + + + + + + {sip.map((item, index) => ( + + {item.sipip} + + ))} + + + + + + ); } -function mapStateToProps(state) { - const { auth, global, members } = state; - return { - loading: members.isRequesting, - user: auth.user, - actions: global.actions, - members: members.data, - }; +function mapStateToProps (state) { + const { auth, global, members } = state; + return { + loading: members.isRequesting, + user: auth.user, + actions: global.actions, + members: members.data, + }; } export default connect(mapStateToProps)(cascadeCamera); diff --git a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/camera.jsx b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/camera.jsx index f3b3d09..523c90e 100644 --- a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/camera.jsx +++ b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/camera.jsx @@ -35,6 +35,8 @@ const CameraHeader = (props) => { const [search, setearch] = useState({}); //搜索条件 const [rowId, setRowId] = useState(); //表格数据id const [cameraData, setCameraData] = useState({}); //表格数据 + const [modify, setModify] = useState(false); //修改 + const [parentCamera, setParentCamera] = useState(""); //级联摄像头父级设备 const { equipmentWarehouse } = actions; const api = useRef(); const searchb = useRef(search) @@ -42,6 +44,8 @@ const CameraHeader = (props) => { const CAMERAS = "cameras"; useEffect(() => { + + console.log(props) dispatch(actions.equipmentWarehouse.getVender()).then((res) => { setvenderList(res.payload.data); attribute(res.payload.data); @@ -53,7 +57,6 @@ const CameraHeader = (props) => { JSON.stringify(["state", "type", "manufactor"]) ) : ""; - console.log(equipmentWarehouseCamera); }, []); useEffect(() => { @@ -89,14 +92,14 @@ const CameraHeader = (props) => { } else { setearch({ ...searchb.current, externalDomain: row.externalDomain }) } - deviceClickb.current=false + deviceClickb.current = false } else { if (row.type == "nvr") { setearch({ ...searchb.current, nvrId: null }) } else { setearch({ ...searchb.current, externalDomain: null }) } - deviceClickb.current=true + deviceClickb.current = true } }} > @@ -118,8 +121,19 @@ const CameraHeader = (props) => {
); diff --git a/code/VideoAccess-VCMP/web/client/src/utils/webapi.js b/code/VideoAccess-VCMP/web/client/src/utils/webapi.js index 066960d..6881681 100644 --- a/code/VideoAccess-VCMP/web/client/src/utils/webapi.js +++ b/code/VideoAccess-VCMP/web/client/src/utils/webapi.js @@ -30,6 +30,7 @@ export const ApiTable = { postCameraNvr: "camera/create/nvr", //记录NVR摄像头 getCascadeSIP: "camera/sip_list/cascade", //获取级联摄像头sip列表 postAddCascade: "camera/create/cascade", //添加级联摄像头 + getParentCamera:"camera/cascade_device", //获取级联摄像头父级设备 };