[ISSUE #319] Store the username in localStorage

This commit is contained in:
Crazylychee
2025-06-24 15:21:10 +08:00
committed by GitHub
parent 31d8086db3
commit bfd0e26737
4 changed files with 24 additions and 20 deletions

View File

@@ -15,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
import React, { useState } from 'react'; import React, {useEffect, useState} from 'react';
import { Layout, Menu, Dropdown, Button, Drawer, Grid, Space } from 'antd'; import { Layout, Menu, Dropdown, Button, Drawer, Grid, Space } from 'antd';
import {GlobalOutlined, DownOutlined, UserOutlined, MenuOutlined, BgColorsOutlined} from '@ant-design/icons'; import {GlobalOutlined, DownOutlined, UserOutlined, MenuOutlined, BgColorsOutlined} from '@ant-design/icons';
import { useLocation, useNavigate } from 'react-router-dom'; import { useLocation, useNavigate } from 'react-router-dom';
@@ -26,13 +26,13 @@ import {remoteApi} from "../api/remoteApi/remoteApi";
const { Header } = Layout; const { Header } = Layout;
const { useBreakpoint } = Grid; // Used to determine screen breakpoints const { useBreakpoint } = Grid; // Used to determine screen breakpoints
const Navbar = ({ username, rmqVersion = true, showAcl = true}) => { const Navbar = ({ rmqVersion = true, showAcl = true}) => {
const location = useLocation(); const location = useLocation();
const navigate = useNavigate(); const navigate = useNavigate();
const { lang, setLang, t } = useLanguage(); const { lang, setLang, t } = useLanguage();
const screens = useBreakpoint(); // Get current screen size breakpoints const screens = useBreakpoint(); // Get current screen size breakpoints
const { currentThemeName, setCurrentThemeName } = useTheme(); const { currentThemeName, setCurrentThemeName } = useTheme();
const [userName, setUserName] = useState(null);
const [drawerVisible, setDrawerVisible] = useState(false); // Controls drawer visibility const [drawerVisible, setDrawerVisible] = useState(false); // Controls drawer visibility
// Get selected menu item key based on current route path // Get selected menu item key based on current route path
@@ -46,10 +46,10 @@ const Navbar = ({ username, rmqVersion = true, showAcl = true}) => {
const onLogout = () => { const onLogout = () => {
remoteApi.logout().then(res => { remoteApi.logout().then(res => {
if (res.status === 0) { if (res.status === 0) {
window.sessionStorage.removeItem("username"); window.localStorage.removeItem("username");
window.sessionStorage.removeItem("userRole"); window.localStorage.removeItem("userRole");
window.sessionStorage.removeItem("token"); window.localStorage.removeItem("token");
window.sessionStorage.removeItem("rmqVersion"); window.localStorage.removeItem("rmqVersion");
navigate('/login'); navigate('/login');
} else { } else {
console.error('Logout failed:', res.message) console.error('Logout failed:', res.message)
@@ -59,6 +59,15 @@ const Navbar = ({ username, rmqVersion = true, showAcl = true}) => {
}; };
useEffect(() => {
const storedUsername = window.localStorage.getItem("username");
if (storedUsername) {
setUserName(storedUsername);
}else {
setUserName(null);
}
}, []);
const langMenu = ( const langMenu = (
<Menu onClick={({ key }) => setLang(key)}> <Menu onClick={({ key }) => setLang(key)}>
<Menu.Item key="en">{t.ENGLISH}</Menu.Item> <Menu.Item key="en">{t.ENGLISH}</Menu.Item>
@@ -66,13 +75,6 @@ const Navbar = ({ username, rmqVersion = true, showAcl = true}) => {
</Menu> </Menu>
); );
const versionMenu = (
<Menu onClick={({ key }) => alert(t.version.switchVersion + ': ' + key)}>
<Menu.Item key="5">RocketMQ v5</Menu.Item>
<Menu.Item key="4">RocketMQ v4</Menu.Item>
</Menu>
);
const userMenu = ( const userMenu = (
<Menu> <Menu>
<Menu.Item key="logout" onClick={onLogout}>{t.LOGOUT}</Menu.Item> <Menu.Item key="logout" onClick={onLogout}>{t.LOGOUT}</Menu.Item>
@@ -159,12 +161,12 @@ const Navbar = ({ username, rmqVersion = true, showAcl = true}) => {
</Button> </Button>
</Dropdown> </Dropdown>
{username && ( {userName && (
<Dropdown overlay={userMenu}> <Dropdown overlay={userMenu}>
{/* 使用一个可点击的元素作为 Dropdown 的唯一子元素 */} {/* 使用一个可点击的元素作为 Dropdown 的唯一子元素 */}
<a onClick={e => e.preventDefault()} style={{ display: 'flex', alignItems: 'center' }}> <a onClick={e => e.preventDefault()} style={{ display: 'flex', alignItems: 'center' }}>
<UserOutlined style={{ marginRight: 8 }} /> {/* 添加一些间距 */} <UserOutlined style={{ marginRight: 8 }} /> {/* 添加一些间距 */}
{username} {userName}
<DownOutlined style={{ marginLeft: 8 }} /> <DownOutlined style={{ marginLeft: 8 }} />
</a> </a>
</Dropdown> </Dropdown>

View File

@@ -278,7 +278,7 @@ export const translations = {
"PLEASE_ADD_RESOURCE": "请添加资源!", "PLEASE_ADD_RESOURCE": "请添加资源!",
"ENTER_IP_HINT": "请输入 IP 地址,按回车键添加,支持 IPv4、IPv6 和 CIDR", "ENTER_IP_HINT": "请输入 IP 地址,按回车键添加,支持 IPv4、IPv6 和 CIDR",
"PLEASE_ENTER_DECISION": "请输入决策!", "PLEASE_ENTER_DECISION": "请输入决策!",
"MENU": "菜单",
}, },
en: { en: {
"DEFAULT": "Default", "DEFAULT": "Default",
@@ -535,6 +535,8 @@ export const translations = {
"PLEASE_ADD_RESOURCE": "Please add resource!", "PLEASE_ADD_RESOURCE": "Please add resource!",
"ENTER_IP_HINT": "Please enter IP address, press Enter to add. Supports IPv4, IPv6, and CIDR.", "ENTER_IP_HINT": "Please enter IP address, press Enter to add. Supports IPv4, IPv6, and CIDR.",
"PLEASE_ENTER_DECISION": "Please enter decision!", "PLEASE_ENTER_DECISION": "Please enter decision!",
"MENU": "Menu",
} }
}; };

View File

@@ -30,8 +30,8 @@ const Login = () => {
remoteApi.login(username, password).then((res) => { remoteApi.login(username, password).then((res) => {
if (res.status === 0) { if (res.status === 0) {
messageApi.success('登录成功'); messageApi.success('登录成功');
window.sessionStorage.setItem("username", res.data.loginUserName); window.localStorage.setItem("username", res.data.loginUserName);
window.sessionStorage.setItem("userrole", res.data.loginUserRole); window.localStorage.setItem("userrole", res.data.loginUserRole);
window.location.href = '/'; window.location.href = '/';
} else { } else {
messageApi.error(res.message || '登录失败,请检查用户名和密码'); messageApi.error(res.message || '登录失败,请检查用户名和密码');

View File

@@ -71,7 +71,7 @@ const AppRouter = () => {
return ( return (
<Layout style={{minHeight: '100vh'}}> <Layout style={{minHeight: '100vh'}}>
<Header style={{padding: 0, height: 'auto', lineHeight: 'normal'}}> <Header style={{padding: 0, height: 'auto', lineHeight: 'normal'}}>
<Navbar username={window.sessionStorage.getItem("username")}/> <Navbar/>
</Header> </Header>
<Content style={{padding: '24px'}}> <Content style={{padding: '24px'}}>