Browse Source

应用管理页面完成

release_1.1.2
wenlele 3 years ago
parent
commit
8efcd2a77b
  1. 4
      code/VideoAccess-VCMP/web/client/src/components/index.js
  2. 2
      code/VideoAccess-VCMP/web/client/src/components/skeletonScreen.jsx
  3. 80
      code/VideoAccess-VCMP/web/client/src/sections/application/components/applyModal.jsx
  4. 370
      code/VideoAccess-VCMP/web/client/src/sections/application/containers/applicationCenter.jsx
  5. 6
      code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/camera.jsx
  6. 5
      code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/nvr.jsx
  7. 2
      code/VideoAccess-VCMP/web/package.json

4
code/VideoAccess-VCMP/web/client/src/components/index.js

@ -5,6 +5,7 @@ import ReminderBox from './reminderBox'
import VideoPlay from './videoPlayer/videoPlay' import VideoPlay from './videoPlayer/videoPlay'
import VideoPlayModal from './videoPlayer/videoPlayModal' import VideoPlayModal from './videoPlayer/videoPlayModal'
import Setup from './setup' import Setup from './setup'
import {SkeletonScreen} from './skeletonScreen'
export { export {
SimpleFileDownButton, SimpleFileDownButton,
@ -12,5 +13,6 @@ export {
ReminderBox, ReminderBox,
VideoPlay, VideoPlay,
VideoPlayModal, VideoPlayModal,
Setup Setup,
SkeletonScreen,
}; };

2
code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/components/skeletonScreen.jsx → code/VideoAccess-VCMP/web/client/src/components/skeletonScreen.jsx

@ -2,7 +2,7 @@ import React, { useState, useEffect } from "react";
import { Skeleton } from "@douyinfe/semi-ui"; import { Skeleton } from "@douyinfe/semi-ui";
export function skeletonScreen() { export function SkeletonScreen() {
return <> return <>
<Skeleton.Title style={{width: "95%",height:24,margin:"8px 20px"}} /> <Skeleton.Title style={{width: "95%",height:24,margin:"8px 20px"}} />
<Skeleton.Title style={{width: "80%",height:28,margin:"16px 20px"}} /> <Skeleton.Title style={{width: "80%",height:28,margin:"16px 20px"}} />

80
code/VideoAccess-VCMP/web/client/src/sections/application/components/applyModal.jsx

@ -0,0 +1,80 @@
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 handleOk = () => {
form.current
.validate()
.then((values) => {
console.log(values);
// close()
})
}
return <Modal
title={modalName ? "修改应用" : "创建应用"}
visible={visible}
width={610}
onCancel={() => close()}
onOk={handleOk}
>
<Form
allowEmpty
labelPosition="left"
labelAlign="left"
labelWidth="90px"
onValueChange={(values) => console.log(values)}
getFormApi={(formApi) => (form.current = formApi)}
>
<Form.Input
maxLength="36"
field="name"
label="应用名称:"
allowEmpty={false}
initValue={'' || ""}
placeholder="建议命名方式: [应用名 + 应用场景] 如:智慧昌南-消防,不超过15个字符"
style={{ width: 466 }}
rules={[
{
required: true,
message: "建议命名方式: [应用名 + 应用场景] 如:智慧昌南-消防,不超过15个字符",
},
]}
/>
<Form.Select
label="设备厂家:"
field="venderId"
initValue={'' || null}
placeholder="请选择应用类型"
allowEmpty={false}
style={{ width: 150 }}
rules={[{ required: true, message: "请选择应用类型" }]}
>
{[{ name: 'web', id: 'web' }, { name: 'app', id: 'app' }, { name: '小程序', id: '小程序' }, { name: '其他', id: '其他' }].map((item, index) => (
<Form.Select.Option key={index} value={item.id}>
{item.name}
</Form.Select.Option>
))}
</Form.Select>
</Form>
</Modal>
}
function mapStateToProps (state) {
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);

370
code/VideoAccess-VCMP/web/client/src/sections/application/containers/applicationCenter.jsx

@ -1,20 +1,370 @@
import React, { useEffect } from 'react'; import React, { useState, useEffect, useRef } from "react";
import { connect } from 'react-redux'; import { connect } from "react-redux";
import { Coming } from '$components' import moment from "moment";
import qs from "qs";
import {
Button,
Form,
Table,
Pagination,
Popover,
Tag,
Skeleton,
Popconfirm,
Row,
} from "@douyinfe/semi-ui";
import { SimpleFileDownButton, VideoPlayModal, SkeletonScreen, Setup } from "$components";
// import "../style.less";
import ApplyModal from "../components/applyModal";
// import RemarksModal from "../components/remarksModal";
// import SideSheets from "../components/sideSheet";
// import { accessType } from "./nvr";
import '../style.less' import '../style.less'
const ApplicationCenter = (props) => { 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); //nvrNVR
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";
return (
<Coming />
) 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 (
<div style={{ display: "flex" }}>
<Button
theme="borderless"
onClick={() => {
setApplyModal(true)
setModalName(true)
}}
>
修改
</Button>
{row.forbidden ? (
<Button
theme="borderless"
onClick={() => {
}}
>
启用
</Button>
) : (
<Popconfirm
title="禁用后,应用系统引入的页面及能力将会暂时失效,请谨慎操作。"
arrowPointAtCenter={false}
showArrow={true}
position="topRight"
onConfirm={() => {
}}
>
<Button theme="borderless">禁用</Button>
</Popconfirm>
)}
<Popconfirm
title="删除后,应用系统引入的页面及能力将会永久失效,请谨慎操作。"
arrowPointAtCenter={false}
showArrow={true}
position="topRight"
onConfirm={() => {
}}
>
<Button theme="borderless">删除</Button>
</Popconfirm>
</div>
);
},
}
];
//
function attribute () {
const arr = localStorage.getItem(APPLICATION)
? JSON.parse(localStorage.getItem(APPLICATION))
: [];
const column = [
{
title: "创建时间",
dataIndex: "createTime",
key: "createTime",
},
{
title: "创建账号",
dataIndex: "account",
key: "account",
},
{
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" },
]
},
];
useEffect(() => {
//
localStorage.getItem(APPLICATION) == null
? localStorage.setItem(
APPLICATION,
JSON.stringify(["createTime",])
)
: "";
attribute();
}, [])
return (
<>
<div style={{ position: "" }}>
<video
id="cameraBanner"
autoPlay
loop
muted
style={{ width: "100%", objectFit: "cover", height: 171 }}
src="/assets/video/camera_banner.mp4"
type="video/mp4"
/>
<div style={{ position: "absolute", top: 12 }}>
<div
style={{
fontSize: 22,
paddingTop: 15,
marginLeft: 21,
}}
>
应用管理
</div>
<div
style={{
fontSize: 14,
paddingTop: 18,
marginLeft: 20,
}}
>
创建接口对应子系统的APPID及能力调用时所需的秘钥
</div>
<div
style={{
fontSize: 14,
marginTop: 28,
marginLeft: 21,
width: 89,
height: 32,
lineHeight: 32 + "px",
textAlign: "center",
backgroundColor: "#D9EAFF",
color: "#1859C1",
cursor: "pointer",
}}
onClick={() => {
setApplyModal(true)
}}
>
创建应用
</div>
</div>
</div>
<div style={{ background: "#FFFFFF", marginTop: 5 }}>
<div
style={{
width: "100%",
display: "flex",
justifyContent: "space-between",
padding: "13px 20px",
}}
>
<div
style={{
width: 64,
height: 22,
fontSize: 16,
fontfAmily: "PingFangSC-Medium, PingFang SC",
fontWeight: "bold",
color: "rgba(0, 0, 0, 0.85)",
lineHeight: "22px",
}}
>
应用列表
</div>
<div>
<Button
style={{
width: 32,
height: 32,
background: "#D9D9D9",
borderadius: 3,
marginRight: 20,
}}
type="primary"
key="primary"
onClick={() => {
setSetup(true);
// setcameraSetup(true);
}}
>
<img
src="/assets/images/background/setup.png"
alt="设置"
style={{ width: 18, height: 18 }}
/>
</Button>
{/* <SimpleFileDownButton src="camera/export" /> */}
</div>
</div>
<Skeleton
loading={false}
active={true}
placeholder={SkeletonScreen()}
>
<Table
columns={setupp.filter((s) => s)}
dataSource={[{ name: 'csadca', }]}
bordered={false}
empty="暂无数据"
style={{
padding: "0px 20px",
}}
pagination={false}
/>
</Skeleton>
<div
style={{
display: "flex",
justifyContent: "flex-end",
padding: "20px 20px",
}}
>
<span style={{ lineHeight: "30px" }}>
{100}个设备
</span>
<Pagination
className="22"
total={100}
showSizeChanger
currentPage={query.page + 1}
pageSizeOpts={[10, 20, 30, 40]}
onChange={(currentPage, pageSize) => {
setQuery({ limit: pageSize, page: currentPage - 1 });
page.current = currentPage - 1
}}
/>
</div>
</div>
{/*表格设置*/}
{setup ? (
<Setup
tableType={APPLICATION}
tableList={tableList}
close={() => {
setSetup(false);
attribute();
}}
/>
) : (
""
)}
{applyModal ? (
<ApplyModal
visible={true}
modalName={modalName}
close={() => {
setApplyModal(false)
setModalName(false)
}}
/>
) : (
""
)}
</>
)
} }
function mapStateToProps (state) { function mapStateToProps (state) {
const { auth } = state; const { auth } = state;
return { return {
user: auth.user, user: auth.user,
}; };
} }
export default connect(mapStateToProps)(ApplicationCenter); export default connect(mapStateToProps)(ApplicationCenter);

6
code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/camera.jsx

@ -13,13 +13,13 @@ import {
Popconfirm, Popconfirm,
Row, Row,
} from "@douyinfe/semi-ui"; } from "@douyinfe/semi-ui";
import { SimpleFileDownButton, VideoPlayModal } from "$components"; import { SimpleFileDownButton, VideoPlayModal,SkeletonScreen } from "$components";
import "../style.less"; import "../style.less";
import CameraModal from "../components/cameraModal"; import CameraModal from "../components/cameraModal";
import RemarksModal from "../components/remarksModal"; import RemarksModal from "../components/remarksModal";
import {Setup} from "$components"; import {Setup} from "$components";
import SideSheets from "../components/sideSheet"; import SideSheets from "../components/sideSheet";
import { skeletonScreen } from "../components/skeletonScreen"; import { skeletonScreen } from "../../../components/skeletonScreen";
import { accessType } from "./nvr"; import { accessType } from "./nvr";
const CameraHeader = (props) => { const CameraHeader = (props) => {
@ -756,7 +756,7 @@ const CameraHeader = (props) => {
<Skeleton <Skeleton
loading={loading} loading={loading}
active={true} active={true}
placeholder={skeletonScreen()} placeholder={SkeletonScreen()}
> >
<Table <Table
columns={setupp.filter((s) => s)} columns={setupp.filter((s) => s)}

5
code/VideoAccess-VCMP/web/client/src/sections/equipmentWarehouse/containers/nvr.jsx

@ -7,9 +7,8 @@ import { ApiTable } from "$utils";
import NvrModal from "../components/nvrModal"; import NvrModal from "../components/nvrModal";
import {Setup} from "$components"; import {Setup} from "$components";
import SideSheets from "../components/sideSheet"; import SideSheets from "../components/sideSheet";
import { skeletonScreen } from "../components/skeletonScreen";
import { ReminderBox } from "../../../components/index"; import { ReminderBox } from "../../../components/index";
import { SimpleFileDownButton } from "$components"; import { SimpleFileDownButton,SkeletonScreen } from "$components";
export const accessType = [ export const accessType = [
{ name: "萤石云", key: "yingshi" }, { name: "萤石云", key: "yingshi" },
@ -556,7 +555,7 @@ const NvrHeader = (props) => {
</div> </div>
<Skeleton <Skeleton
loading={loading} loading={loading}
placeholder={skeletonScreen()} placeholder={SkeletonScreen()}
active={true} active={true}
> >
<Table <Table

2
code/VideoAccess-VCMP/web/package.json

@ -7,7 +7,7 @@
"test": "mocha", "test": "mocha",
"start-vite": "cross-env NODE_ENV=developmentVite npm run start-params", "start-vite": "cross-env NODE_ENV=developmentVite npm run start-params",
"start": "cross-env NODE_ENV=development npm run start-params", "start": "cross-env NODE_ENV=development npm run start-params",
"start-params": "node server -p 5000 -u http://10.8.30.29:4000 --apiVcmpUrl http://localhost:4000 --apiAuthUrl http://10.8.30.29:4200 --apiAnxinyunUrl http://10.8.30.29:4100 --iotAuthWeb http://localhost:5200 --iotVideoServer ws://221.230.55.27:8081", "start-params": "node server -p 5000 -u http://10.8.30.24:4000 --apiVcmpUrl http://localhost:4000 --apiAuthUrl http://10.8.30.24:4200 --apiAnxinyunUrl http://10.8.30.24:4100 --iotAuthWeb http://localhost:5200 --iotVideoServer ws://221.230.55.27:8081",
"deploy": "export NODE_ENV=production&& npm run build && node server", "deploy": "export NODE_ENV=production&& npm run build && node server",
"build-dev": "cross-env NODE_ENV=development&&webpack --config webpack.config.js", "build-dev": "cross-env NODE_ENV=development&&webpack --config webpack.config.js",
"build": "export NODE_ENV=production&&webpack --config webpack.config.prod.js" "build": "export NODE_ENV=production&&webpack --config webpack.config.prod.js"

Loading…
Cancel
Save