Browse Source

导航

release_0.0.1
deartibers 3 years ago
parent
commit
f5bda27f5e
  1. 226
      web/client/src/layout/components/sider/index.jsx
  2. 461
      web/client/src/layout/containers/layout/index.jsx
  3. 4
      web/client/src/sections/auth/containers/login.jsx
  4. 12
      web/client/src/sections/example/nav-item.jsx
  5. 12
      web/client/src/sections/example1/nav-item.jsx

226
web/client/src/layout/components/sider/index.jsx

@ -9,133 +9,117 @@ import "./index.less";
let scrollbar = null let scrollbar = null
const homePath = '/example/e1/c1' const homePath = '/example/e1/c1'
const Sider = (props) => { const Sider = (props) => {
const { collapsed, clientHeight, dispatch, pathname,leftItems,leftChange } = props const { collapsed, clientHeight, dispatch, pathname, leftItems, leftChange } = props
const [items, setItems] = useState([]) const [items, setItems] = useState([])
const [selectedKeys, setSelectedKeys] = useState([]) const [selectedKeys, setSelectedKeys] = useState([])
const [openKeys, setOpenKeys] = useState([]) const [openKeys, setOpenKeys] = useState([])
useEffect(() => { useEffect(() => {
const { sections, dispatch, user } = props; const { sections, dispatch, user } = props;
let nextItems = leftItems let nextItems = leftItems
let pathname_ = pathname == '/' ? homePath : pathname // let pathname_ = pathname == '/' ? homePath : pathname
const initKeys = (items, lastKeys) => { // const initKeys = (items, lastKeys) => {
console.log('1111111',items); // // console.log('1111111',items);
for (let it of items) { // for (let it of items) {
if (it.to && it.to == pathname_) { // if (it.to && it.to == pathname_) {
lastKeys.selectedKeys.push(it.itemKey) // // console.log('22222222222',it.itemKey);
return lastKeys // lastKeys.selectedKeys.push(it.itemKey)
} else if (it.items && it.items.length) { // return lastKeys
const preLastKeys = JSON.parse(JSON.stringify(lastKeys)) // } else if (it.items && it.items.length) {
preLastKeys.openKeys.push(it.itemKey) // const preLastKeys = JSON.parse(JSON.stringify(lastKeys))
const nextKeys = initKeys(it.items, JSON.parse(JSON.stringify(preLastKeys))) // preLastKeys.openKeys.push(it.itemKey)
if (nextKeys.selectedKeys.length > preLastKeys.selectedKeys.length || nextKeys.openKeys.length > preLastKeys.openKeys.length) { // const nextKeys = initKeys(it.items, JSON.parse(JSON.stringify(preLastKeys)))
return nextKeys // if (nextKeys.selectedKeys.length > preLastKeys.selectedKeys.length || nextKeys.openKeys.length > preLastKeys.openKeys.length) {
} // return nextKeys
} // }
} // }
return lastKeys // }
return { // return lastKeys
selectedKeys: [], // return {
openKeys: [] // selectedKeys: [],
} // openKeys: []
} // }
setItems(nextItems) // }
const { selectedKeys, openKeys } = initKeys( setItems(nextItems)
nextItems, // const { selectedKeys, openKeys } = initKeys(
{ // nextItems,
selectedKeys: [], // {
openKeys: [] // selectedKeys: [],
} // openKeys: []
) // }
if (selectedKeys.length || openKeys.length) { // )
setSelectedKeys(selectedKeys) // if (selectedKeys.length || openKeys.length) {
setOpenKeys(openKeys) // setSelectedKeys(selectedKeys)
} else { // setOpenKeys(openKeys)
const lastSelectedKeys = localStorage.getItem('vcmp_selected_sider') // } else {
if (lastSelectedKeys) { // const lastSelectedKeys = localStorage.getItem('vcmp_selected_sider')
setSelectedKeys(JSON.parse(lastSelectedKeys)) // if (lastSelectedKeys) {
} // setSelectedKeys(JSON.parse(lastSelectedKeys))
const lastOpenKeys = localStorage.getItem('vcmp_open_sider') // }
if (lastOpenKeys) { // const lastOpenKeys = localStorage.getItem('vcmp_open_sider')
// if (lastOpenKeys) {
// setOpenKeys(JSON.parse(lastOpenKeys))
// }
// }
scrollbar = new PerfectScrollbar('#page-slider', { suppressScrollX: true });
if (pathname == '/') {
dispatch(push(homePath))
}
}, [leftItems])
let routeSelectedKey = [useLocation().pathname.split('/')[1]]//
let routeSelectedKeys = [useLocation().pathname.split('/')[2]]//
let routeSelectedKeyss = [useLocation().pathname.split('/')[3]]//
useEffect(() => {
if (routeSelectedKeyss[0]) {
setSelectedKeys(routeSelectedKeyss)
}
else if (routeSelectedKeys[0]) {
setSelectedKeys(routeSelectedKeys)
}
else {
setSelectedKeys(routeSelectedKey)
}
const lastOpenKeys = localStorage.getItem('vcmp_open_sider')
if (lastOpenKeys) {
setOpenKeys(JSON.parse(lastOpenKeys)) setOpenKeys(JSON.parse(lastOpenKeys))
} }
} }, [window.localStorage.vcmp_open_sider, window.localStorage.vcmp_selected_sider, leftChange])
scrollbar = new PerfectScrollbar('#page-slider', { suppressScrollX: true }); useEffect(() => {
if (pathname == '/') { if (scrollbar) {
dispatch(push(homePath)) scrollbar.update();
} }
}, [leftItems]) })
let routeSelectedKey = [useLocation().pathname.split('/')[1]]// return (
let routeSelectedKeys = [useLocation().pathname.split('/')[2]]// <div id={'page-slider'} style={{ height: clientHeight, position: 'relative', background: '#101531', width: 180 }}>
let routeSelectedKeyss = [useLocation().pathname.split('/')[3]]// <Nav
useEffect(()=>{ style={{ background: '#101531', width: 180, padding: 0 }}
let pathname_ = pathname == '/' ? homePath : pathname selectedKeys={selectedKeys}
const initKeys = (items, lastKeys) => {
for (let it of items) {
if (it.to && it.to == pathname_) {
lastKeys.selectedKeys.push(it.itemKey)
return lastKeys
} else if (it.items && it.items.length) {
const preLastKeys = JSON.parse(JSON.stringify(lastKeys))
preLastKeys.openKeys.push(it.itemKey)
const nextKeys = initKeys(it.items, JSON.parse(JSON.stringify(preLastKeys)))
if (nextKeys.selectedKeys.length > preLastKeys.selectedKeys.length || nextKeys.openKeys.length > preLastKeys.openKeys.length) {
return nextKeys
}
}
}
return lastKeys
}
if(routeSelectedKeyss[0]){
setSelectedKeys(routeSelectedKeyss)
}
else if(routeSelectedKeys[0]){
setSelectedKeys(routeSelectedKeys)
}
else{
setSelectedKeys(routeSelectedKey)
}
const lastOpenKeys = localStorage.getItem('vcmp_open_sider')
if (lastOpenKeys) {
setOpenKeys(JSON.parse(lastOpenKeys))
}
},[window.localStorage.vcmp_open_sider,window.localStorage.vcmp_selected_sider,leftChange])
useEffect(() => { openKeys={openKeys}
if (scrollbar) { onSelect={({ selectedItems, selectedKeys, }) => {
scrollbar.update(); const selectItem = selectedItems[0]
} if (selectItem.to) {
}) dispatch(push(selectItem.to))
return ( }
<div id={'page-slider'} style={{ height: clientHeight, position: 'relative',background:'#101531',width:180 }}> setSelectedKeys(selectedKeys)
<Nav localStorage.setItem('vcmp_selected_sider', JSON.stringify(selectedKeys))
style={{background:'#101531',width:180,padding:0}} }}
selectedKeys={selectedKeys} onOpenChange={({ openKeys }) => {
setOpenKeys(openKeys)
openKeys={openKeys} localStorage.setItem('vcmp_open_sider', JSON.stringify(openKeys))
onSelect={({ selectedItems, selectedKeys, }) => { }}
const selectItem = selectedItems[0] items={items}
if (selectItem.to) { />
dispatch(push(selectItem.to)) </div>
} )
setSelectedKeys(selectedKeys)
localStorage.setItem('vcmp_selected_sider', JSON.stringify(selectedKeys))
}}
onOpenChange={({ openKeys }) => {
setOpenKeys(openKeys)
localStorage.setItem('vcmp_open_sider', JSON.stringify(openKeys))
}}
items={items}
/>
</div>
)
} }
function mapStateToProps (state) { function mapStateToProps (state) {
const { global } = state; const { global } = state;
return { return {
clientHeight: global.clientHeight, clientHeight: global.clientHeight,
}; };
} }
export default connect(mapStateToProps)(Sider); export default connect(mapStateToProps)(Sider);

461
web/client/src/layout/containers/layout/index.jsx

@ -11,7 +11,7 @@ import * as NProgress from 'nprogress';
import PerfectScrollbar from 'perfect-scrollbar'; import PerfectScrollbar from 'perfect-scrollbar';
NProgress.configure({ NProgress.configure({
template: ` template: `
<div class="bar" style="height:2px" role="bar"> <div class="bar" style="height:2px" role="bar">
<div class="peg"></div> <div class="peg"></div>
</div> </div>
@ -24,250 +24,251 @@ NProgress.configure({
let scrollbar let scrollbar
const LayoutContainer = props => { const LayoutContainer = props => {
const { const {
dispatch, msg, user, copyright, children, sections, clientWidth, clientHeight, dispatch, msg, user, copyright, children, sections, clientWidth, clientHeight,
location, match, routes, history, socket, location, match, routes, history, socket,
} = props } = props
const [collapsed, setCollapsed] = useState(false) const [collapsed, setCollapsed] = useState(false)
NProgress.start(); NProgress.start();
const resize_ = () => { const resize_ = () => {
dispatch(resize( dispatch(resize(
document.getElementById('PomsApp').clientHeight, document.getElementById('PomsApp').clientHeight,
document.getElementById('PomsApp').clientWidth - (collapsed ? 120 : 240) document.getElementById('PomsApp').clientWidth - (collapsed ? 120 : 240)
)); ));
}
function deepCopy(data) {//
//string,number,bool,null,undefined,symbol
//object,array,date
if (data && typeof data === "object") {
//
if (typeof data === "function") {
let tempFunc = data.bind(null);
tempFunc.prototype = deepCopy(data.prototype);
return tempFunc;
}
switch (Object.prototype.toString.call(data)) {
case "[object String]":
return data.toString();
case "[object Number]":
return Number(data.toString());
case "[object Boolean]":
return new Boolean(data.toString());
case "[object Date]":
return new Date(data.getTime());
case "[object Array]":
var arr = [];
for (let i = 0; i < data.length; i++) {
arr[i] = deepCopy(data[i]);
}
return arr;
//js
case "[object Object]":
var obj = {};
for (let key in data) {
//hasOwnProperty obj.hasOwnProperty(prop)
obj[key] = deepCopy(data[key]);
}
return obj;
}
} else {
//string,number,bool,null,undefined,symbol
return data;
} }
} function deepCopy (data) {//
const [allItems, setAllItems] = useState([]) //string,number,bool,null,undefined,symbol
const [headerItems, setHeaderItems] = useState([]) //object,array,date
const [leftItems, setLeftItems] = useState([]) if (data && typeof data === "object") {
const [leftChange, setLeftChange] = useState(true) //
const [leftShow, setLeftShow] = useState(false) if (typeof data === "function") {
useEffect(() => { let tempFunc = data.bind(null);
let topItems = []// tempFunc.prototype = deepCopy(data.prototype);
// let siderItems = []// return tempFunc;
let nextItems = []//
for (let c of sections) {
if (typeof c.getNavItem == 'function') {
let item = c.getNavItem(user, dispatch);
if (item) {
nextItems.push.apply(nextItems, item)
if (item.length > 0) {
let itm = deepCopy(item[0]);
let itms=deepCopy(item[0]);
if (itm.hasOwnProperty('items')) {
// siderItems.push.apply(siderItems, itms.items)
for (let i = 0; i < itm.items.length; i++) {
delete itm.items[i].items
}
topItems.push(itm)
}
else {
topItems.push.apply(topItems, item)
}
}
} }
}
}
setLeftShow(false)
setAllItems(nextItems)
setHeaderItems(topItems)
// setLeftItems(siderItems)
window.addEventListener('resize', resize_); switch (Object.prototype.toString.call(data)) {
return () => { case "[object String]":
window.removeEventListener('resize', resize_); return data.toString();
} case "[object Number]":
}, []) return Number(data.toString());
case "[object Boolean]":
return new Boolean(data.toString());
case "[object Date]":
return new Date(data.getTime());
case "[object Array]":
var arr = [];
for (let i = 0; i < data.length; i++) {
arr[i] = deepCopy(data[i]);
}
return arr;
useEffect(() => { //js
NProgress.done(); case "[object Object]":
if ((!user || !user.authorized)) { var obj = {};
history.push('/signin'); for (let key in data) {
} //hasOwnProperty obj.hasOwnProperty(prop)
if (msg) { obj[key] = deepCopy(data[key]);
if (msg.done) { }
Notification.success({ return obj;
// title: msg.done, }
content: msg.done, } else {
duration: 2, //string,number,bool,null,undefined,symbol
}) return data;
} }
if (msg.error) { }
Notification.error({ const [allItems, setAllItems] = useState([])
// title: msg.error, const [headerItems, setHeaderItems] = useState([])
content: msg.error, const [leftItems, setLeftItems] = useState([])
duration: 2, const [leftChange, setLeftChange] = useState(true)
}) const [leftShow, setLeftShow] = useState(false)
} useEffect(() => {
} let topItems = []//
const dom = document.getElementById('page-content'); // let siderItems = []//
if (dom) { let nextItems = []//
if (!scrollbar) { for (let c of sections) {
scrollbar = new PerfectScrollbar('#page-content', { suppressScrollX: true }); if (typeof c.getNavItem == 'function') {
scrollbar.update(); let item = c.getNavItem(user, dispatch);
} else { if (item) {
scrollbar.update(); nextItems.push.apply(nextItems, item)
dom.scrollTop = 0; if (item.length > 0) {
} for (let j = 0; j < item.length; j++) {
} let itm = deepCopy(item[j]);
}) if (itm.hasOwnProperty('items')) {
for (let i = 0; i < itm.items.length; i++) {
itm.items[i].fatherKey=itm.itemKey
delete itm.items[i].items
}
topItems.push(itm)
}
else {
topItems.push.apply(topItems, item)
}
}
}
}
}
}
setLeftShow(false)
setAllItems(nextItems)
setHeaderItems(topItems)
// setLeftItems(siderItems)
window.addEventListener('resize', resize_);
return () => {
window.removeEventListener('resize', resize_);
}
}, [])
// websocket 使 useEffect(() => {
useEffect(() => { NProgress.done();
console.log(socket) if ((!user || !user.authorized)) {
if (socket) { history.push('/signin');
socket.on('CAMERA_ONLINE', function (msg) { }
console.info(msg); if (msg) {
if (msg.online == 'ON') { if (msg.done) {
Notification.success({ Notification.success({
title: 'Hi', // title: msg.done,
content: (<div><div>{msg.name}</div><div style={{ marginTop: 5 }}>已上线</div></div>), content: msg.done,
duration: 2, duration: 2,
}) })
}
if (msg.error) {
Notification.error({
// title: msg.error,
content: msg.error,
duration: 2,
})
} }
if (msg.online == 'OFF') { }
Notification.error({ const dom = document.getElementById('page-content');
title: 'Hi', if (dom) {
content: (<div><div>{msg.name}</div><div style={{ marginTop: 5 }}>发生离线</div></div>), if (!scrollbar) {
duration: 2, scrollbar = new PerfectScrollbar('#page-content', { suppressScrollX: true });
}) scrollbar.update();
} else {
scrollbar.update();
dom.scrollTop = 0;
} }
}); }
return () => { })
socket.off("CAMERA_ONLINE");
}
}
}, [socket])
return (
<Layout id="layout" style={{ height: '100%' }}> // websocket 使
{ useEffect(() => {
<> console.log(socket)
<Layout.Header> if (socket) {
<Header socket.on('CAMERA_ONLINE', function (msg) {
headerItems={headerItems} console.info(msg);
user={user} if (msg.online == 'ON') {
pathname={location.pathname} Notification.success({
toggleCollapsed={() => { title: 'Hi',
setCollapsed(!collapsed); content: (<div><div>{msg.name}</div><div style={{ marginTop: 5 }}>已上线</div></div>),
}} duration: 2,
collapsed={collapsed} })
history={history} }
tochange={(val) => { if (msg.online == 'OFF') {
setLeftChange(!leftChange) Notification.error({
if(val.fatherKey){ title: 'Hi',
for (let i = 0; i < allItems.length; i++) { content: (<div><div>{msg.name}</div><div style={{ marginTop: 5 }}>发生离线</div></div>),
if(val.fatherKey==allItems[i].itemKey){ duration: 2,
setLeftItems(allItems[i].items) })
}
});
return () => {
socket.off("CAMERA_ONLINE");
}
}
}, [socket])
return (
<Layout id="layout" style={{ height: '100%' }}>
{
<>
<Layout.Header>
<Header
headerItems={headerItems}
user={user}
pathname={location.pathname}
toggleCollapsed={() => {
setCollapsed(!collapsed);
}}
collapsed={collapsed}
history={history}
tochange={(val) => {
setLeftChange(!leftChange)
if (val.fatherKey) {
for (let i = 0; i < allItems.length; i++) {
if (val.fatherKey == allItems[i].itemKey) {
setLeftItems(allItems[i].items)
}
}
setLeftShow(true)
} }
} else {
setLeftShow(true) setLeftShow(false)
} }
else{ history.push(val.to);
setLeftShow(false) }}
} />
history.push(val.to); </Layout.Header>
}} <Layout style={{ height: 'calc(100% - 60px)' }}>
/> {leftShow ? (<Layout.Sider>
</Layout.Header> <Sider
<Layout style={{ height: 'calc(100% - 60px)' }}> sections={sections}
{leftShow?(<Layout.Sider> leftItems={leftItems}
<Sider dispatch={dispatch}
sections={sections} user={user}
leftItems={leftItems} leftChange={leftChange}
dispatch={dispatch} pathname={location.pathname}
user={user} collapsed={collapsed}
leftChange={leftChange} />
pathname={location.pathname} </Layout.Sider>) : ('')}
collapsed={collapsed} <Layout.Content>
/> <div style={{
</Layout.Sider>):('')} margin: '12px 12px 0px',
<Layout.Content> background: "#F6FAFF",
<div style={{ }}>
margin: '12px 12px 0px', <div id="page-content" style={{
background: "#F6FAFF", height: clientHeight - 12,
}}> minWidth: 520,
<div id="page-content" style={{ position: 'relative',
height: clientHeight - 12, }}>
minWidth: 520, <div style={{
position: 'relative', minHeight: clientHeight - 32 - 12,
}}> position: 'relative',
<div style={{ padding: '12px 8px',
minHeight: clientHeight - 32 - 12, }}>
position: 'relative', {children}
padding: '12px 8px', </div>
}}> <Layout.Footer>
{children} <Footer />
</div> </Layout.Footer>
<Layout.Footer> </div>
<Footer /> </div>
</Layout.Footer> </Layout.Content>
</div> </Layout>
</div> </>
</Layout.Content> }
</Layout> </Layout >
</> )
}
</Layout >
)
} }
function mapStateToProps (state) { function mapStateToProps (state) {
const { global, auth, ajaxResponse, webSocket } = state; const { global, auth, ajaxResponse, webSocket } = state;
return { return {
title: global.title, title: global.title,
copyright: global.copyright, copyright: global.copyright,
sections: global.sections, sections: global.sections,
actions: global.actions, actions: global.actions,
clientWidth: global.clientWidth, clientWidth: global.clientWidth,
clientHeight: global.clientHeight, clientHeight: global.clientHeight,
msg: ajaxResponse.msg, msg: ajaxResponse.msg,
user: auth.user, user: auth.user,
socket: webSocket.socket socket: webSocket.socket
}; };
} }
export default connect(mapStateToProps)(LayoutContainer); export default connect(mapStateToProps)(LayoutContainer);

4
web/client/src/sections/auth/containers/login.jsx

@ -20,9 +20,7 @@ const Login = props => {
useEffect(() => { useEffect(() => {
if (user && user.authorized) { if (user && user.authorized) {
dispatch(push('/example/e1/c1')); dispatch(push('/console'));
localStorage.setItem('vcmp_selected_sider', JSON.stringify(['nvr']))
localStorage.setItem('vcmp_open_sider', JSON.stringify(['equipmentWarehouse']))
} }
}, [user]) }, [user])

12
web/client/src/sections/example/nav-item.jsx

@ -14,7 +14,6 @@ export function getNavItem (user, dispatch) {
text: '举个棒子1', text: '举个棒子1',
icon: <IconCode />, icon: <IconCode />,
to: '/example/e1/c1', to: '/example/e1/c1',
fatherKey:'example',
items: [{ items: [{
itemKey: 'c1', to: '/example/e1/c1', text: '举个锤子1' itemKey: 'c1', to: '/example/e1/c1', text: '举个锤子1'
}] }]
@ -23,7 +22,6 @@ export function getNavItem (user, dispatch) {
text: '举个棒子2', text: '举个棒子2',
icon: <IconCode />, icon: <IconCode />,
to: '/example/e2/c2', to: '/example/e2/c2',
fatherKey:'example',
items: [{ items: [{
itemKey: 'c2', to: '/example/e2/c2', text: '举个锤子2' itemKey: 'c2', to: '/example/e2/c2', text: '举个锤子2'
}] }]
@ -31,15 +29,5 @@ export function getNavItem (user, dispatch) {
] ]
}, },
] ]
// ,[
// {
// itemKey: 'equipmentWarehouse', text: '', icon:<iconpark-icon style={{width:20,height:20}} name="she-1"></iconpark-icon>,
// items: [
// { itemKey: 'nvr', to: '/equipmentWarehouse/nvr', text: 'NVR' },
// { itemKey: 'camera', to: '/equipmentWarehouse/camera', text: '' },
// { itemKey: 'recycle', to: '/equipmentWarehouse/recycle', text: '' },
// ]
// },
// ]
); );
} }

12
web/client/src/sections/example1/nav-item.jsx

@ -14,7 +14,6 @@ export function getNavItem (user, dispatch) {
text: '举个棒子3', text: '举个棒子3',
icon: <IconCode />, icon: <IconCode />,
to: '/example/e3/c3', to: '/example/e3/c3',
fatherKey:'example1',
items: [{ items: [{
itemKey: 'c3', to: '/example/e3/c3', text: '举个锤子3' itemKey: 'c3', to: '/example/e3/c3', text: '举个锤子3'
}] }]
@ -23,7 +22,6 @@ export function getNavItem (user, dispatch) {
text: '举个棒子4', text: '举个棒子4',
icon: <IconCode />, icon: <IconCode />,
to: '/example/e4/c4', to: '/example/e4/c4',
fatherKey:'example1',
items: [{ items: [{
itemKey: 'c4', to: '/example/e4/c4', text: '举个锤子4' itemKey: 'c4', to: '/example/e4/c4', text: '举个锤子4'
}] }]
@ -31,15 +29,5 @@ export function getNavItem (user, dispatch) {
] ]
}, },
] ]
// ,[
// {
// itemKey: 'equipmentWarehouse', text: '', icon:<iconpark-icon style={{width:20,height:20}} name="she-1"></iconpark-icon>,
// items: [
// { itemKey: 'nvr', to: '/equipmentWarehouse/nvr', text: 'NVR' },
// { itemKey: 'camera', to: '/equipmentWarehouse/camera', text: '' },
// { itemKey: 'recycle', to: '/equipmentWarehouse/recycle', text: '' },
// ]
// },
// ]
); );
} }
Loading…
Cancel
Save