diff --git a/code/VideoAccess-VCMP/api/app/lib/controllers/application/index.js b/code/VideoAccess-VCMP/api/app/lib/controllers/application/index.js
index 0e0130f..3594158 100644
--- a/code/VideoAccess-VCMP/api/app/lib/controllers/application/index.js
+++ b/code/VideoAccess-VCMP/api/app/lib/controllers/application/index.js
@@ -29,19 +29,29 @@ async function check (ctx) {
}
async function edit (ctx, next) {
- let errMsg = '创建应用失败'
const transaction = await ctx.fs.dc.orm.transaction();
try {
const { models } = ctx.fs.dc;
const { userId } = ctx.fs.api
const data = ctx.request.body;
- if (data.id) {
+ let findOption = { where: { name: data.name } }
+
+ if (data.appId) {
+ findOption.where.id = { $ne: data.appId }
+ }
+
+ const applicationRes = await models.Application.findOne(findOption)
+ if (applicationRes) {
+ throw '已有相同应用名称'
+ }
+
+ if (data.appId) {
// 修改
const storageData = Object.assign({}, data,)
await models.Application.update(storageData, {
where: {
- id: data.id
+ id: data.appId
},
transaction
})
@@ -66,13 +76,125 @@ async function edit (ctx, next) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
- message: errMsg
+ message: typeof error == 'string' ? error : undefined
+ }
+ }
+}
+
+async function get (ctx) {
+ try {
+ const models = ctx.fs.dc.models;
+ const { userId, token } = ctx.fs.api
+ const { limit, page, orderBy, orderDirection } = ctx.query
+ let findOption = {
+ where: {
+ // createUserId: userId,
+ },
+ order: [
+ [orderBy || 'id', orderDirection || 'DESC'] //查询排序
+ ],
+ }
+
+ if (limit) {
+ findOption.limit = limit
+ }
+ if (page && limit) {
+ findOption.offset = page * limit
+ }
+ const applicationRes = await models.Application.findAndCountAll(findOption)
+
+
+ let createUserIds = new Set()
+ let cameraIds = []
+ for (let c of applicationRes.rows) {
+ cameraIds.push(c.id)
+ createUserIds.add(c.createUserId)
+ }
+
+ // 查用户信息
+ const createUserRes = await ctx.app.fs.authRequest.get(`user/${[...createUserIds].join(',') || -1}/message`, { query: { token } })
+
+ for (let { dataValues: n } of applicationRes.rows) {
+ const corCreateUser = createUserRes.find(u => u.id == n.createUserId)
+ n.createUser = {
+ name: corCreateUser ? corCreateUser.username : ''
+ }
+ }
+
+ ctx.status = 200;
+ ctx.body = {
+ total: applicationRes.count,
+ data: applicationRes.rows
}
+ } catch (error) {
+ ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
+ ctx.status = 400;
+ ctx.body = {}
}
}
+async function put (ctx) {
+ try {
+ const { models } = ctx.fs.dc;
+ const data = ctx.request.body;
+
+ // TODO 向视频服务发送通知
+
+ // 库记录
+ await models.Application.update({
+ forbidden: data.forbidden
+ }, {
+ where: {
+ id: data.appId
+ }
+ })
+
+ ctx.status = 204;
+ } catch (error) {
+ ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
+ ctx.status = 400;
+ ctx.body = {}
+ }
+}
+
+async function del (ctx, next) {
+ const transaction = await ctx.fs.dc.orm.transaction();
+ try {
+ const models = ctx.fs.dc.models;
+ const { token } = ctx.fs.api
+ const { appId } = ctx.params
+
+ const { appKey } = await models.Application.findOne({
+ where: {
+ id: appId
+ },
+ }) || {}
+
+ await models.Application.destroy({
+ where: {
+ id: appId
+ },
+ transaction
+ })
+
+ await ctx.app.fs.authRequest.delete(`oauth2/token/invalidate_all`, {
+ query: { token, appKey }
+ })
+
+ await transaction.commit();
+ ctx.status = 204;
+ } catch (error) {
+ await transaction.rollback();
+ ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
+ ctx.status = 400;
+ ctx.body = {}
+ }
+}
module.exports = {
- check,
edit,
+ get,
+ put,
+ del,
+ check,
};
\ No newline at end of file
diff --git a/code/VideoAccess-VCMP/api/app/lib/routes/application/index.js b/code/VideoAccess-VCMP/api/app/lib/routes/application/index.js
index cdd1d63..3cb99b3 100644
--- a/code/VideoAccess-VCMP/api/app/lib/routes/application/index.js
+++ b/code/VideoAccess-VCMP/api/app/lib/routes/application/index.js
@@ -5,12 +5,21 @@ const application = require('../../controllers/application');
module.exports = function (app, router, opts) {
+ app.fs.api.logAttr['GET/application'] = { content: '获取应用信息', visible: false };
+ router.get('/application', application.get);
+
+ app.fs.api.logAttr['POST/application'] = { content: '创建/修改应用', visible: false };
+ router.post('/application', application.edit);
+
+ app.fs.api.logAttr['PUT/application'] = { content: '禁用应用', visible: false }
+ router.put('/application', application.put);
+
+ app.fs.api.logAttr['DEL/application/:appId'] = { content: '删除应用', visible: false };
+ router.del('/application/:appId', application.del);
+
app.fs.api.logAttr['GET/application/check'] = { content: '检查应用状态', visible: false };
router.get('/application/check', application.check);
- // app.fs.api.logAttr['GET/application'] = { content: '获取应用信息', visible: false };
- // router.get('/application', application.get);
-
app.fs.api.logAttr['POST/application'] = { content: '创建/修改应用', visible: false };
router.post('/application', application.edit);
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/copy.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/copy.png
new file mode 100644
index 0000000..6a3771a
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/copy.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/del.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/del.png
new file mode 100644
index 0000000..ff9d808
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/del.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/detail_icon.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/detail_icon.png
new file mode 100644
index 0000000..0059b3f
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/detail_icon.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/idCopy.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/idCopy.png
new file mode 100644
index 0000000..c502758
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/idCopy.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/nextStep.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/nextStep.png
new file mode 100644
index 0000000..87c6714
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/nextStep.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/question.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/question.png
new file mode 100644
index 0000000..ccf2986
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/question.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/release.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/release.png
new file mode 100644
index 0000000..34c0664
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/release.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/stepfour.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/stepfour.png
new file mode 100644
index 0000000..52f3378
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/stepfour.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/stepone.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/stepone.png
new file mode 100644
index 0000000..5f8d4d6
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/stepone.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/stepthree.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/stepthree.png
new file mode 100644
index 0000000..24ffef9
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/stepthree.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/steptwo.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/steptwo.png
new file mode 100644
index 0000000..3a01d05
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/steptwo.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/text.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/text.png
new file mode 100644
index 0000000..cb6fb6d
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/text.png differ
diff --git a/code/VideoAccess-VCMP/web/client/assets/images/imageImg/图科技蓝_小@2x.png b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/图科技蓝_小@2x.png
new file mode 100644
index 0000000..b6eb491
Binary files /dev/null and b/code/VideoAccess-VCMP/web/client/assets/images/imageImg/图科技蓝_小@2x.png differ
diff --git a/code/VideoAccess-VCMP/web/client/src/sections/application/actions/application.js b/code/VideoAccess-VCMP/web/client/src/sections/application/actions/application.js
new file mode 100644
index 0000000..e0fb457
--- /dev/null
+++ b/code/VideoAccess-VCMP/web/client/src/sections/application/actions/application.js
@@ -0,0 +1,54 @@
+"use strict";
+
+import { basicAction } from "@peace/utils";
+import { ApiTable } from "$utils";
+
+export function getApplication (query) {
+ return (dispatch) =>
+ basicAction({
+ type: "get",
+ dispatch: dispatch,
+ actionType: "GET_APPLICATION",
+ query: query,
+ url: `${ApiTable.getApplication}`,
+ msg: { option: "获取应用信息" },
+ reducer: { name: "applicationData", params: { noClear: true } },
+ });
+}
+
+export function putApplication (data) {
+ return (dispatch) =>
+ basicAction({
+ type: "put",
+ dispatch: dispatch,
+ actionType: "PUT_APPLICATION",
+ data,
+ url: `${ApiTable.putApplication}`,
+ msg: { option: data?.forbidden ? "禁用" : "启用" }, //禁用摄像头
+ reducer: {},
+ });
+}
+
+export function delApplication (orgId) {
+ return (dispatch) =>
+ basicAction({
+ type: "del",
+ dispatch: dispatch,
+ actionType: "DEL_APPLICATION",
+ url: `${ApiTable.delApplication.replace("{appId}", orgId)}`,
+ msg: { option: "删除" }, //删除应用
+ reducer: {},
+ });
+}
+
+export function postApplication (data) {
+ return (dispatch) =>
+ basicAction({
+ type: "post",
+ dispatch: dispatch,
+ data,
+ actionType: "POST_CHANGE_NVR",
+ msg: { option: data?.appId ? "修改" : "添加" },
+ url: `${ApiTable.postApplication}`,
+ });
+}
\ No newline at end of file
diff --git a/code/VideoAccess-VCMP/web/client/src/sections/application/actions/index.js b/code/VideoAccess-VCMP/web/client/src/sections/application/actions/index.js
index 7ed1088..0a0ac1f 100644
--- a/code/VideoAccess-VCMP/web/client/src/sections/application/actions/index.js
+++ b/code/VideoAccess-VCMP/web/client/src/sections/application/actions/index.js
@@ -1,5 +1,8 @@
'use strict';
-export default {
+import * as application from './application'
+
+export default {
+ ...application
}
\ No newline at end of file
diff --git a/code/VideoAccess-VCMP/web/client/src/sections/application/components/applyModal.jsx b/code/VideoAccess-VCMP/web/client/src/sections/application/components/applyModal.jsx
index a363bb5..e7ed4b9 100644
--- a/code/VideoAccess-VCMP/web/client/src/sections/application/components/applyModal.jsx
+++ b/code/VideoAccess-VCMP/web/client/src/sections/application/components/applyModal.jsx
@@ -2,79 +2,85 @@ import React, { useState, useEffect, useRef } from "react";
import { connect } from "react-redux";
import { Button, Form, Modal, } from "@douyinfe/semi-ui";
-const ApplyModal = ({ close, modalName, visible }) => {
- const form = useRef();
+const ApplyModal = ({ dispatch, actions, close, modalName, visible, appData }) => {
+ const { applicationCenter } = actions;
+ const appDatas = appData || {}
+ const form = useRef();
-
- const handleOk = () => {
- form.current
- .validate()
- .then((values) => {
- console.log(values);
- // close()
+ const handleOk = () => {
+ form.current
+ .validate()
+ .then((values) => {
+ if (appDatas?.id) {
+ values.appId = appDatas?.id
+ }
+ dispatch(applicationCenter.postApplication(values)).then((res) => {
+ console.log(res);
+ if (res.success) {
+ close()
+ form.current.reset()
+ }
})
+ })
+ }
- }
-
- return close()}
- onOk={handleOk}
- >
-
-
- {[{ name: 'web', id: 'web' }, { name: 'app', id: 'app' }, { name: '小程序', id: '小程序' }, { name: '其他', id: '其他' }].map((item, index) => (
-
- {item.name}
-
- ))}
-
-
-
+ return { close(); form.current.reset() }}
+ onOk={handleOk}
+ >
+
+
+ {[{ name: 'web', value: 'web' }, { name: 'app', value: 'app' }, { name: '小程序', value: 'wxapp' }, { name: '其他', value: 'other' }].map((item, index) => (
+
+ {item.name}
+
+ ))}
+
+
+
}
function mapStateToProps (state) {
- const { auth, global, members } = state;
- return {
- loading: members.isRequesting,
- user: auth.user,
- actions: global.actions,
- global: global,
- members: members.data,
- };
+ const { auth, global, members } = state;
+ return {
+ loading: members.isRequesting,
+ user: auth.user,
+ actions: global.actions,
+ global: global,
+ members: members.data,
+ };
}
export default connect(mapStateToProps)(ApplyModal);
diff --git a/code/VideoAccess-VCMP/web/client/src/sections/application/containers/applicationCenter.jsx b/code/VideoAccess-VCMP/web/client/src/sections/application/containers/applicationCenter.jsx
index 73bffbd..a9b28ab 100644
--- a/code/VideoAccess-VCMP/web/client/src/sections/application/containers/applicationCenter.jsx
+++ b/code/VideoAccess-VCMP/web/client/src/sections/application/containers/applicationCenter.jsx
@@ -3,15 +3,15 @@ import { connect } from "react-redux";
import moment from "moment";
import qs from "qs";
import {
- Button,
- Form,
- Table,
- Pagination,
- Popover,
- Tag,
- Skeleton,
- Popconfirm,
- Row,
+ Button,
+ Form,
+ Table,
+ Pagination,
+ Popover,
+ Tag,
+ Skeleton,
+ Popconfirm,
+ Row,
} from "@douyinfe/semi-ui";
import { SimpleFileDownButton, VideoPlayModal, SkeletonScreen, Setup } from "$components";
// import "../style.less";
@@ -22,349 +22,377 @@ import ApplyModal from "../components/applyModal";
import '../style.less'
const ApplicationCenter = (props) => {
- const { dispatch, actions, user, loading, equipmentWarehouseCamera } = props;
- // const { equipmentWarehouse } = actions;
- const [cameraModal, setCameraModal] = useState(false);
- const [remarksModal, setRemarksModal] = useState(false);
- const [videoPlay, setVideoPlay] = useState(false);
- const [modalName, setModalName] = useState(false); //创建或修改
- const [setup, setSetup] = useState(false); //表格设置是否显现
- const [applyModal, setApplyModal] = useState(false);
- const [cameraSetup, setcameraSetup] = useState(false);
- const [setupp, setSetupp] = useState([]);
- const [venderList, setvenderList] = useState([]); //厂商信息
- const [query, setQuery] = useState({ limit: 10, page: 0 }); //页码信息
- const [search, setSearch] = useState({}); //搜索条件
- const [rowId, setRowId] = useState(); //表格数据id
- const [cameraData, setCameraData] = useState({}); //表格传递数据
- const [modify, setModify] = useState(false); //修改
- const [parentCamera, setParentCamera] = useState(""); //级联摄像头父级设备
- const [addNvr, setAddNvr] = useState(false); //nvr页面传递参数打开NVR摄像头添加弹框
- const [nvrNumber, setNvrNumber] = useState();
- const [videoObj, setVideoObj] = useState(); //播放条件
- const [axyData, setAxyData] = useState();
- const [cameraRemarks, setCameraRemarks] = useState([]);//备注
- const api = useRef();
- const searchData = useRef({})
- const limits = useRef(); //每页实际条数
- const page = useRef(query.page);
- const deviceClickb = useRef(true)
- const APPLICATION = "application";
+ const { dispatch, actions, user, loading, applicationData } = props;
+ const { applicationCenter } = actions;
+ const [modalName, setModalName] = useState(false); //创建或修改
+ const [setup, setSetup] = useState(false); //表格设置是否显现
+ const [applyModal, setApplyModal] = useState(false);
+ const [setupp, setSetupp] = useState([]);
+ const [query, setQuery] = useState({ limit: 10, page: 0 }); //页码信息
+ const [appData, setAppData] = useState(null); //应用id
+ const APPLICATION = 'application'
+ const pageLimit = useRef({ limit: 10, page: 0 });
+ const limits = useRef(); //每页实际条数
+ const columns = [
+ {
+ title: "序号",
+ dataIndex: "",
+ render: (text, r, index) => {
+ return index + 1;
+ },
+ },
+ {
+ title: "应用名称",
+ dataIndex: "name",
+ key: "name",
+ render: (text, r, index) => {
+ return r?.name.length > 8 ?
+ {r?.name}
+
+ }
+ >{
+ `${r?.name.substr(0, 8)}...`}
+ : r?.name
+ },
+ },
+ {
+ title: "APPID",
+ dataIndex: "appKey",
+ key: "appId",
- const columns = [
- {
- title: "序号",
- dataIndex: "",
- render: (text, r, index) => {
- return index + 1;
- },
- },
- {
- title: "应用名称",
- dataIndex: "name",
- key: "name",
- },
- {
- title: "APPID",
- dataIndex: "appId",
- key: "appId",
-
- },
- {
- title: "Secret Key",
- dataIndex: "secretKey",
- key: "secretKey",
-
- },
- {
- title: "操作",
- width: "20%",
- dataIndex: "",
- render: (_, row) => {
- return (
-
-
- {row.forbidden ? (
-
- ) : (
-
{
+ },
+ {
+ title: "操作",
+ width: "20%",
+ dataIndex: "",
+ render: (_, row) => {
+ return (
+
+
+ {row?.forbidden ? (
+
+ ) : (
+
禁用后,应用系统引入的页面及能力将会暂时失效,请谨慎操作。 }
+ arrowPointAtCenter={false}
+ showArrow={true}
+ position="topRight"
+ onConfirm={() => {
+ dispatch(applicationCenter.putApplication({ appId: row?.id, forbidden: !row?.forbidden })).then(() => {
+ setQuery({ limit: pageLimit.current.limit, page: pageLimit.current.page })
+ })
+ }}
+ >
+
+
+ )}
+
删除后,应用系统引入的页面及能力将会永久失效,请谨慎操作。 }
+ arrowPointAtCenter={false}
+ width={300}
+ showArrow={true}
+ position="topRight"
+ onConfirm={() => {
+ dispatch(applicationCenter.delApplication(row?.id)).then(() => {
+ if (pageLimit.current.page > 0 && limits.current < 2) {
+ setQuery({ limit: pageLimit.current.limit, page: pageLimit.current.page - 1 })
+ } else {
+ setQuery({ limit: pageLimit.current.limit, page: pageLimit.current.page })
+ }
+ })
+ }}
+ >
+
+
- }}
- >
-
-
- )}
- {
+
+ );
+ },
+ }
+ ];
- }}
- >
-
-
+ //获取表格属性设置
+ function attribute () {
+ const arr = localStorage.getItem(APPLICATION)
+ ? JSON.parse(localStorage.getItem(APPLICATION))
+ : [];
-
- );
+ const column = [
+ {
+ title: "创建时间",
+ dataIndex: "createTime",
+ key: "createTime",
+ render: (_, r, index) => {
+ return moment(r.createTime).format("YYYY-MM-DD HH:mm:ss");
},
- }
- ];
-
- //获取表格属性设置
- function attribute () {
- const arr = localStorage.getItem(APPLICATION)
- ? JSON.parse(localStorage.getItem(APPLICATION))
- : [];
-
- const column = [
- {
- title: "创建时间",
- dataIndex: "createTime",
- key: "createTime",
+ },
+ {
+ title: "创建账号",
+ dataIndex: "createUserId",
+ key: "account",
+ render: (_, r, index) => {
+ return r?.createUser?.name
},
- {
- title: "创建账号",
- dataIndex: "account",
- key: "account",
+ },
+ {
+ title: "应用类型",
+ dataIndex: "type",
+ key: "applicationType",
+ render: (_, r, index) => {
+ const types = { web: 'web', app: 'app', wxapp: '小程序', other: '其他' }
+ return r?.type?.map((item, index) => types[item] + ';')
},
- {
- title: "应用类型",
- dataIndex: "applicationType",
- key: "applicationType",
+ },
+ ];
- },
- ];
+ for (let i = 0; i < arr.length; i++) {
+ let colum = column.filter((item) => {
+ return item.key === arr[i];
+ });
+ columns.splice(i + 4, 0, colum[0]);
+ }
+ setSetupp(columns);
+ }
+ const tableList = [//表格属性
+ {
+ title: '详情信息',
+ list: [
+ { name: "创建时间", value: "createTime" },
+ { name: "创建账号", value: "account" },
+ { name: "应用类型", value: "applicationType" },
+ ]
+ },
+ ];
- for (let i = 0; i < arr.length; i++) {
- let colum = column.filter((item) => {
- return item.key === arr[i];
- });
- columns.splice(i + 4, 0, colum[0]);
- }
- setSetupp(columns);
- }
- const tableList = [//表格属性
- {
- title: '详情信息',
- list: [
- { name: "创建时间", value: "createTime" },
- { name: "创建账号", value: "account" },
- { name: "应用类型", value: "applicationType" },
- ]
- },
- ];
+ //获取应用信息
+ const details = (data) => {
+ pageLimit.current = query
+ dispatch(applicationCenter.getApplication(pageLimit.current)).then((res) => {
+ limits.current = res.payload.data.data.length
+ });
+ }
+ useEffect(() => {
+ details()
+ }, [query])
- useEffect(() => {
- //初始化表格显示设置
- localStorage.getItem(APPLICATION) == null
- ? localStorage.setItem(
- APPLICATION,
- JSON.stringify(["createTime",])
- )
- : "";
- attribute();
- }, [])
- return (
- <>
-
-
-
-
- 应用管理
-
-
- 创建接口对应子系统的APPID及能力调用时所需的秘钥。
-
-
{
- setApplyModal(true)
- }}
- >
- 创建应用
-
-
+ useEffect(() => {
+ //初始化表格显示设置
+ localStorage.getItem(APPLICATION) == null
+ ? localStorage.setItem(
+ APPLICATION,
+ JSON.stringify(["createTime",])
+ )
+ : "";
+ attribute();
+ }, [])
+ return (
+ <>
+
+
+
+
+ 应用管理
+
+
+ 创建接口对应子系统的APPID及能力调用时所需的秘钥。
+
+
{
+ setApplyModal(true)
+ }}
+ >
+ 创建应用
+
-
-
-
- 应用列表
-
-
-
- {/*
*/}
-
-
-
- s)}
- dataSource={[{ name: 'csadca', }]}
- bordered={false}
- empty="暂无数据"
- style={{
- padding: "0px 20px",
- }}
- pagination={false}
- />
-
-
-
- 共{100}个设备
-
-
{
- setQuery({ limit: pageSize, page: currentPage - 1 });
- page.current = currentPage - 1
- }}
- />
-
-
+
+
+
+
+ 应用列表
+
+
+
+ {/*
*/}
+
+
+ s)}
+ dataSource={applicationData.data}
+ bordered={false}
+ empty="暂无数据"
+ style={{
+ padding: "0px 20px",
+ }}
+ pagination={false}
+ />
+
+
+
+ 共{applicationData.total}个设备
+
+
{
+ setQuery({ limit: pageSize, page: currentPage - 1 });
+ pageLimit.current = { limit: pageSize, page: currentPage - 1 }
+ }}
+ />
+
+
+
- {/*表格设置*/}
- {setup ? (
- {
- setSetup(false);
- attribute();
- }}
- />
- ) : (
- ""
- )}
+ {/*表格设置*/}
+ {setup ? (
+ {
+ setSetup(false);
+ attribute();
+ }}
+ />
+ ) : (
+ ""
+ )}
- {applyModal ? (
- {
- setApplyModal(false)
- setModalName(false)
- }}
- />
- ) : (
- ""
- )}
+ {applyModal ? (
+ {
+ setApplyModal(false)
+ setModalName(false)
+ setAppData(null)
+ details()
+ }}
+ />
+ ) : (
+ ""
+ )}
- >
- )
+ >
+ )
}
function mapStateToProps (state) {
- const { auth } = state;
- return {
- user: auth.user,
- };
+ const { global, applicationData } = state;
+ return {
+ actions: global.actions,
+ applicationData: applicationData.data || {}
+ };
}
export default connect(mapStateToProps)(ApplicationCenter);
diff --git a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/nvrModal.jsx b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/nvrModal.jsx
index 9947708..ebee457 100644
--- a/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/nvrModal.jsx
+++ b/code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/nvrModal.jsx
@@ -43,7 +43,6 @@ function nvrModal(props) {
.validate()
.then((values) => {
//表单校验
- console.log(values)
let valuesObj = JSON.parse(JSON.stringify(values));
valuesObj.longitude = values.position.split(",")[0];
valuesObj.latitude = values.position.split(",")[1];
diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.jsx b/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.jsx
index 6ac96dd..38dc967 100644
--- a/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.jsx
+++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/components/pushSideSheet.jsx
@@ -1,6 +1,6 @@
import React, { useState, useRef, useEffect } from "react";
import { connect } from "react-redux";
-import { Modal, Spin,Tag, Space,Collapse ,SideSheet,Tabs, TabPane,Popover} from "@douyinfe/semi-ui";
+import { Modal, Spin, Tag, Space, Collapse, SideSheet, Tabs, TabPane, Popover } from "@douyinfe/semi-ui";
import moment from "moment";
import './pushSideSheet.less'
import PerfectScrollbar from "perfect-scrollbar";
@@ -13,74 +13,87 @@ function pushSideSheet (props) {
close,
actions,
pushData,//表格信息
- journal//日志信息
+ rowId,
+ dispatch
} = props;
const { offline } = actions;
const [logList, setLogList] = useState([]);//日志列表
const [noticeTest, setNoticeTest] = useState([]);//通知列表
const [equipmentTest, setEquipmentTest] = useState([]);//设备列表
-
+ const journal = useRef([]);
+ const [isloading, setloading] = useState(false);
+
//初始化
useEffect(() => {
- let timeList = []
- for (let index = 0; index < journal.length; index++) {
- let receiverTest=journal[index].receiver.join(';');
- let camerTest=''
- for (let j = 0; j < journal[index].camera.length; j++) {
- camerTest=camerTest+journal[index].camera[j].name+';'
+ setloading(true)
+ setTimeout(() => {
+ dispatch(offline.getPushLog(rowId)).then((res) => {
+ if (res.success) {
+ journal.current=res.payload.data
+ }
+ else {
+ journal.current=[]
}
- timeList.push(
- {
- title:getTimeTitle(journal[index].time),
- time:getTimeData(journal[index].time),
- cameraList:camerTest,
- receiverList:receiverTest,
- noticeWay:journal[index].noticeWay[0],
+ let timeList = []
+ for (let index = 0; index < journal.current.length; index++) {
+ let receiverTest = journal.current[index].receiver.join(';');
+ let camerTest = ''
+ for (let j = 0; j < journal.current[index].camera.length; j++) {
+ camerTest = camerTest + journal.current[index].camera[j].name + ';'
}
- )
- }
- let yearList=[]
- for (let index = 0; index < journal.length; index++) {
- yearList.push(
- {
- title:getTimeTitle(journal[index].time),
+ timeList.push(
+ {
+ title: getTimeTitle(journal.current[index].time),
+ time: getTimeData(journal.current[index].time),
+ cameraList: camerTest,
+ receiverList: receiverTest,
+ noticeWay: journal.current[index].noticeWay[0],
+ }
+ )
+ }
+ let yearList = []
+ for (let index = 0; index < journal.current.length; index++) {
+ yearList.push(
+ {
+ title: getTimeTitle(journal.current[index].time),
+ }
+ )
+ }
+ let showList = []
+ let obj = {};
+ for (let i = 0; i < yearList.length; i++) {
+ if (!obj[yearList[i].title]) {
+ showList.push(yearList[i]);
+ obj[yearList[i].title] = true;
}
- )
- }
- let showList=[]
- let obj = {};
- for (let i = 0; i < yearList.length; i++) {
- if (!obj[yearList[i].title]) {
- showList.push(yearList[i]);
- obj[yearList[i].title] = true;
- }
- }
- for (let index = 0; index < showList.length; index++) {
- showList[index].timeList=[]
- }
- for (let j = 0; j < showList.length; j++) {
- for (let i = 0; i < timeList.length; i++) {
- if(timeList[i].title==showList[j].title){
- showList[j].timeList.push({time:timeList[i].time,cameraList:timeList[i].cameraList,receiverList:timeList[i].receiverList,noticeWay:timeList[i].noticeWay,})
+ }
+ for (let index = 0; index < showList.length; index++) {
+ showList[index].timeList = []
+ }
+ for (let j = 0; j < showList.length; j++) {
+ for (let i = 0; i < timeList.length; i++) {
+ if (timeList[i].title == showList[j].title) {
+ showList[j].timeList.push({ time: timeList[i].time, cameraList: timeList[i].cameraList, receiverList: timeList[i].receiverList, noticeWay: timeList[i].noticeWay, })
+ }
}
}
- }
- setLogList(showList)
- let noticeList =[]
- for (let i = 0; i < pushData.cameraStatusPushReceivers.length; i++) {
- noticeList.push(pushData.cameraStatusPushReceivers[i].receiver)
- }
- setNoticeTest(noticeList)
- let equipmentList=[]
- for (let i = 0; i < pushData.cameraStatusPushMonitors.length; i++) {
- equipmentList.push(pushData.cameraStatusPushMonitors[i].camera.name)
- }
- setEquipmentTest(equipmentList)
- setTimeout(() => {
+ setLogList(showList)
+ let noticeList = []
+ for (let i = 0; i < pushData.cameraStatusPushReceivers.length; i++) {
+ noticeList.push(pushData.cameraStatusPushReceivers[i].receiver)
+ }
+ setNoticeTest(noticeList)
+ let equipmentList = []
+ for (let i = 0; i < pushData.cameraStatusPushMonitors.length; i++) {
+ equipmentList.push(pushData.cameraStatusPushMonitors[i].camera.name)
+ }
+ setEquipmentTest(equipmentList)
equipmentScrollbar = new PerfectScrollbar("#collapse_test", {
suppressScrollX: true,
});
- }, 100);
+ setloading(false)
+ });
+ }, 0);
}, []);
useEffect(() => {
const videoStreaming = document.getElementById("collapse_test");
@@ -88,19 +101,19 @@ function pushSideSheet (props) {
equipmentScrollbar.update();
}
});
- function getTimeTitle(date){
- let year = moment(date).year()+'年'
- let month = (moment(date).month()+1)>10?(moment(date).month()+1)+'月':'0'+(moment(date).month()+1)+'月'
- return year+month
+ function getTimeTitle (date) {
+ let year = moment(date).year() + '年'
+ let month = (moment(date).month() + 1) > 10 ? (moment(date).month() + 1) + '月' : '0' + (moment(date).month() + 1) + '月'
+ return year + month
}
- function getTimeData(date){
- let day=moment(date).date()>10?moment(date).date()+'日':'0'+moment(date).date()+'日';
- let hour=moment(date).hour()>10?moment(date).hour():'0'+moment(date).hour();
- let minute=moment(date).minute()>10?moment(date).minute():'0'+moment(date).minute();
- let second=moment(date).second()>10?moment(date).second():'0'+moment(date).second();
- return day+' '+hour+':'+minute+':'+second
+ function getTimeData (date) {
+ let day = moment(date).date() > 10 ? moment(date).date() + '日' : '0' + moment(date).date() + '日';
+ let hour = moment(date).hour() > 10 ? moment(date).hour() : '0' + moment(date).hour();
+ let minute = moment(date).minute() > 10 ? moment(date).minute() : '0' + moment(date).minute();
+ let second = moment(date).second() > 10 ? moment(date).second() : '0' + moment(date).second();
+ return day + ' ' + hour + ':' + minute + ':' + second
}
- function sideSheetChange(){
+ function sideSheetChange () {
close()
}
return (
@@ -108,55 +121,64 @@ function pushSideSheet (props) {
+
+ {
+ isloading?(
+
+
+ ):''
+ }
+
-
- {logList.map((item, index) => {
- return (
- {item.title}
} itemKey={String(index)} key={index}>
- {item.timeList.map((itm,idx)=>{
- return(
-
-
{itm.time}
-
- {itm.receiverList}
-
- }>
- {itm.receiverList}
-
-
- {itm.cameraList}
-
- }>
- {itm.cameraList}
-
- {itm.noticeWay=='online'?'上线及时通知':itm.noticeWay=='offline'?'离线即时通知':'24时定时统计'}
-
+
+ {logList.map((item, index) => {
+ return (
+ {item.title}} itemKey={String(index)} key={index}>
+ {item.timeList.map((itm, idx) => {
+ return (
+
+
{itm.time}
+
+ {itm.receiverList}
+
+ }>
+ {itm.receiverList}
+
+
+ {itm.cameraList}
+
+ }>
+ {itm.cameraList}
+
+ {itm.noticeWay == 'online' ? '上线及时通知' : itm.noticeWay == 'offline' ? '离线即时通知' : '24时定时统计'}
+
+ )
+ })}
+
)
})}
-
- )})}
-
+
-
+

-
+
{equipmentTest.map((item, index) => {
- return(
- {item}
+ return (
+ {item}
)
})}
@@ -164,17 +186,17 @@ function pushSideSheet (props) {
-
+

-
+
{noticeTest.map((item, index) => {
- return(
- {item}
+ return (
+ {item}
)
})}
diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx b/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx
index 5f26d57..fbd509b 100644
--- a/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx
+++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/carrierpigeon.jsx
@@ -34,7 +34,6 @@ const Carrierpigeon = (props) => {
const cameraList = useRef([]);//第三阶段监听范围摄像头列表
const [sideSheetVisible, setSideSheetVisible] = useState(false);
const [pushData, setPushData] = useState({});
- const [journal, setJournal] = useState([]);
const tableList = [//表格属性
{
title: '推送信息',
@@ -97,6 +96,11 @@ const Carrierpigeon = (props) => {
limits.current = res.payload.data.length
});
}
+ function banned(row){
+ dispatch(offline.putPushBanned({configId: row.id,forbidden: !row.forbidden})).then(() => {
+ dispatch(offline.getStatusPush(searchData.current))
+ });
+ }
const columns = [
{
title: "序号",
@@ -133,19 +137,7 @@ const Carrierpigeon = (props) => {
{row.forbidden ? (
@@ -155,19 +147,7 @@ const Carrierpigeon = (props) => {
arrowPointAtCenter={false}
showArrow={true}
position="topRight"
- onConfirm={() => {
- dispatch(
- offline.putPushBanned(
- {
- configId: row.id,
- forbidden: !row.forbidden,
- },
- row.forbidden
- )
- ).then(() => {
- equipmentGetStatusPush();
- });
- }}
+ onConfirm={() =>banned(row)}
>
@@ -197,16 +177,9 @@ const Carrierpigeon = (props) => {
复制
@@ -540,10 +513,11 @@ const Carrierpigeon = (props) => {
/>}
{sideSheetVisible&&
{
setSideSheetVisible(false);
- setPushData({})
+ setPushData({});
+ setRowId();
}}
/>}
diff --git a/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/statuscode.jsx b/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/statuscode.jsx
index f8036a9..1c9314d 100644
--- a/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/statuscode.jsx
+++ b/code/VideoAccess-VCMP/web/client/src/sections/offline/containers/statuscode.jsx
@@ -62,7 +62,11 @@ const Statuscode = (props) => {
const codegetStatus = () => {
searchData.current = { ...query, ...search }
dispatch(offline.getStatus(searchData.current)).then((res) => {
-
+ });
+ }
+ function banned(row){
+ dispatch(offline.putStatueBanned({statusId: row.id,forbidden: !row.forbidden,})).then(() => {
+ dispatch(offline.getStatus(searchData.current))
});
}
const columns = [
@@ -114,19 +118,7 @@ const Statuscode = (props) => {
{row.forbidden ? (
@@ -136,19 +128,7 @@ const Statuscode = (props) => {
arrowPointAtCenter={false}
showArrow={true}
position="topRight"
- onConfirm={() => {
- dispatch(
- offline.putStatueBanned(
- {
- statusId: row.id,
- forbidden: !row.forbidden,
- },
- row.forbidden
- )
- ).then(() => {
- codegetStatus();
- });
- }}
+ onConfirm={() => banned(row)}
>
diff --git a/code/VideoAccess-VCMP/web/client/src/sections/openness/containers/mirroring.jsx b/code/VideoAccess-VCMP/web/client/src/sections/openness/containers/mirroring.jsx
index 3db569e..9356dcf 100644
--- a/code/VideoAccess-VCMP/web/client/src/sections/openness/containers/mirroring.jsx
+++ b/code/VideoAccess-VCMP/web/client/src/sections/openness/containers/mirroring.jsx
@@ -1,20 +1,270 @@
-import React, { useEffect } from 'react';
+import React, { useEffect, useState, useRef } from 'react';
import { connect } from 'react-redux';
import { Coming } from '$components'
import '../style.less'
const Mirroring = (props) => {
-
- return (
-
- )
+ const detailList = useRef([
+ {
+ title: '科技蓝',
+ img: '/assets/images/imageImg/text.png',
+ color: 'blue'
+ }, {
+ title: '白',
+ img: '/assets/images/imageImg/text.png',
+ color: 'blue'
+ }, {
+ title: '黑色(深灰)',
+ img: '/assets/images/imageImg/text.png',
+ color: 'blue'
+ }, {
+ title: '灰色',
+ img: '/assets/images/imageImg/text.png',
+ color: 'blue'
+ },
+ ]);
+ const myCustomList = useRef([
+ {
+ title: '智慧小蓝视频融合中心实例实例实例实例',
+ img: '/assets/images/imageImg/text.png',
+ color: 'blue',
+ lastEditTime:'2022-12-22 16:00:57',
+ lastReleaseTime:'2022-12-22 19:20:57',
+ typeId:'1511444S4545'
+ }, {
+ title: '智慧小蓝视频融合',
+ img: '/assets/images/imageImg/text.png',
+ color: 'blue',
+ lastEditTime:'2022-12-22 16:00:57',
+ lastReleaseTime:'2022-12-22 19:20:57',
+ typeId:'1511444S4545'
+ }, {
+ title: '智慧小蓝视频融合小蓝视频融合',
+ img: '/assets/images/imageImg/text.png',
+ color: 'blue',
+ lastEditTime:'2022-12-22 16:00:57',
+ lastReleaseTime:'2022-12-22 19:20:57',
+ typeId:'1511444S4545'
+ }, {
+ title: '智慧小蓝视频融合小蓝视频融合是的阿三打阿三打',
+ img: '/assets/images/imageImg/text.png',
+ color: 'blue',
+ lastEditTime:'2022-12-22 16:00:57',
+ lastReleaseTime:'2022-12-22 19:20:57',
+ typeId:'1511444S4545'
+ },
+ ]);
+ const [maskNum, setMaskNum] = useState(100);
+ function mouseOver (index) {
+ setMaskNum(index)
+ }
+ function mouseOut () {
+ setMaskNum(100)
+ }
+ return (
+ <>
+
+
创建步骤
+
+
+

+
+
+
+

+
+
+

+
+
+
+

+
+
+

+
+
+
发布镜像
+
发布成功后,获取镜像服务ID
+
+
+

+
+
+

+
+
+
调用服务
+
通过服务ID调用镜像服务
+
API调用镜像服务方法
+

+
+
+
+
+
+
应用详情
+
+ {detailList.current.map((item, index) => {
+ return (
+
+
mouseOver(index)}>
+

+ {maskNum == index ? (
mouseOut()} style={{ position: 'absolute', width: '100%', height: '100%', background: 'rgba(0,0,0,0.3)', top: 0, display: 'flex', justifyContent: 'center', alignItems: 'center', cursor: 'pointer' }}>
+
+ 使用该模版
+
+
) : ''}
+
+
+
+

+
+
+ {item.title}
+
+
+
+ )
+ })}
+
+
+
+
+
+ {myCustomList.current.map((item,index)=>{
+ return(
+
+
+

+
+ {item.title}
+
+
+
+
+

+
+
+ 发布
+
+
+
+
+

+
+
+ 复制
+
+
+
+
+

+
+
+ 删除
+
+
+
+
+ 最后编辑于:{item.lastEditTime}
+
+
+ 最后发布于:{item.lastReleaseTime}
+
+
+
+

+
+
+ ID:{item.typeId}
+
+
+
+ )
+ })}
+
+
+ >
+ )
}
function mapStateToProps (state) {
- const { auth } = state;
- return {
- user: auth.user,
- };
+ const { auth } = state;
+ return {
+ user: auth.user,
+ };
}
export default connect(mapStateToProps)(Mirroring);
diff --git a/code/VideoAccess-VCMP/web/client/src/utils/webapi.js b/code/VideoAccess-VCMP/web/client/src/utils/webapi.js
index efc5a40..af5543e 100644
--- a/code/VideoAccess-VCMP/web/client/src/utils/webapi.js
+++ b/code/VideoAccess-VCMP/web/client/src/utils/webapi.js
@@ -38,20 +38,27 @@ export const ApiTable = {
postVerifyCascade: "camera/verify/cascade", //验证级联摄像头信息
getCascadeStream: "camera/cascade_stream", //获取级联视频流
uploadYingshiVoice: 'camera/yingshi_voice/upload', //上传萤石语音
- postCameraRemark: 'camera/remark',//编辑摄像头备注
+ postCameraRemark: 'camera/remark',//编辑摄像头备注
//获取状态码
- getStatus: 'status',//获取状态码
- putStatueBanned:'status/banned',//禁用状态码自定义
- postStatusResolve:'status/resolve',//编辑解决方案
- postStatusCustom:'status/custom',//自定义状态码释义
- getStatusSimpleAll:'status/simple_all',//获取全部状态码简略信息
- getCameraListAll:'camera/listAll',//获取所有摄像头信息
- getStatusPush:'status/push',//获取推送配置
- putSasdtatusPush:'status/push',//编辑推送配置
- delPush:'status/push/{configId}',//删除推送配置
- putPushBanned:'status/push/banned',//禁用推送配置
- getPushCopy:'status/push/{configId}/copy',//复制推送配置
- getPushLog:'/status/push/{configId}/log',//获取推送记录
+ getStatus: 'status',//获取状态码
+ putStatueBanned: 'status/banned',//禁用状态码自定义
+ postStatusResolve: 'status/resolve',//编辑解决方案
+ postStatusCustom: 'status/custom',//自定义状态码释义
+ getStatusSimpleAll: 'status/simple_all',//获取全部状态码简略信息
+ getCameraListAll: 'camera/listAll',//获取所有摄像头信息
+ getStatusPush: 'status/push',//获取推送配置
+ putSasdtatusPush: 'status/push',//编辑推送配置
+ delPush: 'status/push/{configId}',//删除推送配置
+ putPushBanned: 'status/push/banned',//禁用推送配置
+ getPushCopy: 'status/push/{configId}/copy',//复制推送配置
+ getPushLog: '/status/push/{configId}/log',//获取推送记录
+
+
+ //应用管理
+ getApplication: '/application', //获取应用信息
+ putApplication: '/application', //禁用应用
+ delApplication: '/application/{appId}', //删除应用
+ postApplication: '/application', //创建/修改应用
};
export const VideoServeApi = {
diff --git a/code/VideoAccess-VCMP/web/package.json b/code/VideoAccess-VCMP/web/package.json
index 98da2dd..e26013d 100644
--- a/code/VideoAccess-VCMP/web/package.json
+++ b/code/VideoAccess-VCMP/web/package.json
@@ -7,7 +7,7 @@
"test": "mocha",
"start-vite": "cross-env NODE_ENV=developmentVite npm run start-params",
"start": "cross-env NODE_ENV=development npm run start-params",
- "start-params": "node server -p 5000 -u http://localhost:4000 --apiVcmpUrl http://localhost:4000 --apiAuthUrl http://localhost:4200 --apiAnxinyunUrl http://localhost:4100 --iotAuthWeb http://localhost:5200 --iotVideoServer http://221.230.55.27:8081",
+ "start-params": "node server -p 5000 -u http://10.8.30.112:4000 --apiVcmpUrl http://localhost:4000 --apiAuthUrl http://10.8.30.112:4200 --apiAnxinyunUrl http://10.8.30.112:4100 --iotAuthWeb http://localhost:5200 --iotVideoServer http://221.230.55.27:8081",
"deploy": "export NODE_ENV=production&& npm run build && node server",
"build-dev": "cross-env NODE_ENV=development&&webpack --config webpack.config.js",
"build": "cross-env NODE_ENV=production&&webpack --config webpack.config.prod.js"