feat(web): 开发账户修改、密码修改功能

This commit is contained in:
R524809
2026-09-03 16:56:53 +08:00
parent 46d98ab11e
commit 06a3a4da75
9 changed files with 435 additions and 25 deletions
+49 -11
View File
@@ -1,7 +1,14 @@
import { useEffect, useMemo, useState } from 'react';
import { Outlet, useLocation, useNavigate } from 'react-router-dom';
import { Breadcrumb, Button, Drawer, Layout } from 'antd';
import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons';
import { Avatar, Breadcrumb, Drawer, Dropdown, Layout } from 'antd';
import type { MenuProps } from 'antd';
import {
LockOutlined,
LogoutOutlined,
MenuFoldOutlined,
MenuUnfoldOutlined,
UserOutlined,
} from '@ant-design/icons';
import SidebarMenu from './SidebarMenu';
import { getBreadcrumbItems } from './menuConfig';
import { useSession } from '@/services/session';
@@ -31,6 +38,9 @@ const MainLayout = () => {
[location.pathname]
);
const userDisplayName = session ? (session.user.display_name ?? session.user.email) : '';
const userInitial = userDisplayName.charAt(0).toUpperCase();
const handleLogout = async () => {
setLoggingOut(true);
try {
@@ -41,6 +51,28 @@ const MainLayout = () => {
}
};
const handleUserMenuClick: MenuProps['onClick'] = ({ key }) => {
if (key === 'profile') {
navigate('/settings/profile');
} else if (key === 'password') {
navigate('/settings/password');
} else if (key === 'logout') {
void handleLogout();
}
};
const userMenuItems: MenuProps['items'] = [
{ key: 'profile', icon: <UserOutlined />, label: '修改资料' },
{ key: 'password', icon: <LockOutlined />, label: '修改密码' },
{ type: 'divider' },
{
key: 'logout',
icon: <LogoutOutlined />,
label: loggingOut ? '退出中…' : '退出登录',
disabled: loggingOut,
},
];
useEffect(() => {
const checkMobile = () => {
setIsMobile(window.innerWidth < 768);
@@ -124,15 +156,21 @@ const MainLayout = () => {
</div>
{session && (
<div className="header-right">
<div className="header-user">
<span className="header-user-workspace">
{session.workspace.name}
</span>
<span className="header-user-email">{session.user.email}</span>
</div>
<Button size="small" loading={loggingOut} onClick={handleLogout}>
退出登录
</Button>
<Dropdown
menu={{ items: userMenuItems, onClick: handleUserMenuClick }}
trigger={['hover']}
placement="bottomRight"
>
<div className="header-user-trigger" title={userDisplayName}>
<Avatar
size={28}
style={{ backgroundColor: 'var(--sider-bg)' }}
>
{userInitial}
</Avatar>
<span className="header-user-name">{userDisplayName}</span>
</div>
</Dropdown>
</div>
)}
</Header>