From de1998a9a8990c6ee2ebb296c5c1768999e4ab51 Mon Sep 17 00:00:00 2001 From: mmc <1556375442@qq.com> Date: Wed, 6 May 2026 16:49:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Layout.tsx | 113 ++++++++++++++++++++++++------------ src/pages/Organization.tsx | 18 +++--- src/pages/StationManage.tsx | 10 ++-- src/pages/UserPage.tsx | 2 +- src/store/index.ts | 2 + src/store/stationSlice.ts | 42 ++++++++++++++ 6 files changed, 135 insertions(+), 52 deletions(-) create mode 100644 src/store/stationSlice.ts diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx index 9b66dbb..31b8e1b 100644 --- a/src/components/Layout.tsx +++ b/src/components/Layout.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from 'react'; import { Outlet, useNavigate, useLocation } from 'react-router-dom'; import { - Layout, Menu, Button, Space, ConfigProvider, theme + Layout, Menu, Button, Space, ConfigProvider, theme, Select } from 'antd'; import zhCN from 'antd/locale/zh_CN'; import { @@ -13,37 +13,68 @@ import logo from '../assets/logo.png'; import { useSelector } from 'react-redux'; import { RootState, useAppDispatch } from '../store'; import { logout } from '../store/userSlice'; +import { setCurrentStation, clearStation } from '../store/stationSlice'; // 👈 引入 import { getMenuList } from '../api/mune'; +import { getStationList } from '../api/stationManage'; const { Header, Sider, Content } = Layout; export default function AppLayout() { const [collapsed, setCollapsed] = useState(false); const [time, setTime] = useState(new Date().toLocaleString()); - const [menuList, setMenuList] = useState([]); // 一级菜单列表 + const [menuList, setMenuList] = useState([]); + const [stationList, setStationList] = useState([]); + const navigate = useNavigate(); const location = useLocation(); - const { userInfo } = useSelector((state: RootState) => state.user); const dispatch = useAppDispatch(); - // ====================== - // 只取一级菜单(parentId=0) - // ====================== + // 全局用户信息 + const { userInfo } = useSelector((state: RootState) => state.user); + // 全局场站信息 + const { currentStation, stationId } = useSelector((state: RootState) => state.station); + + // 获取场站列表 + const getStationData = () => { + const params = { + pageNum: 1, + pageSize: 9999, + orgId: userInfo?.orgId, + }; + getStationList(params).then(res => { + if (res.code === 200) { + const list = res.rows || []; + setStationList(list); + + // 如果没有选中任何场站,默认选第一个 + if (!currentStation && list.length > 0) { + dispatch(setCurrentStation(list[0])); + } + } + }); + }; + + // 切换场站 + const handleStationChange = (id: number) => { + const station = stationList.find(s => s.id === id); + if (station) { + dispatch(setCurrentStation(station)); // 👈 存全局 + } + }; + + // 获取菜单 const getMenu = () => { const data = { pageNum: 1, pageSize: 10000 }; getMenuList(data).then(res => { if (res.code == 200) { const rawList = res.rows || []; - // 只保留 parentId=0 的一级菜单 const topMenus = rawList.filter(item => item.parentId === 0); setMenuList(topMenus); } }); }; - // ====================== - // 菜单图标映射 - // ====================== + // 图标映射 const getIcon = (path) => { if (path.includes('overview')) return ; if (path.includes('device')) return ; @@ -55,25 +86,26 @@ export default function AppLayout() { return ; }; - // ====================== - // 构造 antd menu items(纯平铺,无children) - // ====================== + // 菜单 const menuItems = menuList.map(item => ({ key: item.path || `/menu/${item.menuId}`, icon: getIcon(item.path), label: item.menuName, })); + // 退出登录时清空场站 + const handleLogout = async () => { + await dispatch(logout()); + dispatch(clearStation()); // 👈 清空 + navigate('/login', { replace: true }); + }; + useEffect(() => { const timer = setInterval(() => setTime(new Date().toLocaleString()), 1000); getMenu(); + getStationData(); return () => clearInterval(timer); - }, []); - - const handleLogout = async () => { - await dispatch(logout()); - navigate('/login', { replace: true }); - }; + }, [userInfo]); return ( - - Logo - {!collapsed && ( - - 光伏电站智能监控与运维系统 - - )} + + + Logo + {!collapsed && ( + + 光伏电站智能监控与运维系统 + + )} + + + {/* 全局场站选择器 */} +