Compare commits

..

1 Commits

Author SHA1 Message Date
linkeyu 66823d876d 优化:修复侧栏滚动与权限管理位置 2026-07-26 19:47:13 +08:00
3 changed files with 18 additions and 29 deletions
+4 -22
View File
@@ -122,31 +122,13 @@ const renderReview = (f: Feedback) => {
// 机型 / OS版本(提交反馈时的端环境;改版前历史反馈无 → -) // 机型 / OS版本(提交反馈时的端环境;改版前历史反馈无 → -)
const renderDeviceOs = (f: Feedback) => { const renderDeviceOs = (f: Feedback) => {
const modelName = f.device_model_name || f.device_model; const os = [f.android_version ? `Android ${f.android_version}` : null, f.rom_name]
const rawModel =
f.device_model_name && f.device_model_name !== f.device_model ? f.device_model : null;
const romHasVersion = /\d/.test(f.rom_name || '');
const vendorOs = [
f.rom_name,
f.rom_version && !romHasVersion ? f.rom_version : null,
]
.filter(Boolean)
.join(' ');
const os = [
vendorOs || null,
f.android_version ? `Android ${f.android_version}` : null,
]
.filter(Boolean) .filter(Boolean)
.join(' · '); .join(' · ');
if (!modelName && !os) return <Text type="secondary">-</Text>; if (!f.device_model && !os) return <Text type="secondary">-</Text>;
return ( return (
<Space direction="vertical" size={0}> <Space direction="vertical" size={0}>
<Text>{modelName || '-'}</Text> <Text>{f.device_model || '-'}</Text>
{rawModel ? (
<Text type="secondary" style={{ fontSize: 12 }}>
{[f.device_manufacturer, rawModel].filter(Boolean).join(' · ')}
</Text>
) : null}
{os ? ( {os ? (
<Text type="secondary" style={{ fontSize: 12 }}> <Text type="secondary" style={{ fontSize: 12 }}>
{os} {os}
@@ -370,7 +352,7 @@ export default function FeedbacksPage() {
{ {
title: '机型 / OS版本', title: '机型 / OS版本',
key: 'device', key: 'device',
width: 180, width: 150,
render: (_: unknown, f: Feedback) => renderDeviceOs(f), render: (_: unknown, f: Feedback) => renderDeviceOs(f),
}, },
{ {
+14 -4
View File
@@ -91,6 +91,7 @@ const NAV_GROUPS: NavGroup[] = [
{ key: '/users', icon: <UserOutlined />, label: '用户管理' }, { key: '/users', icon: <UserOutlined />, label: '用户管理' },
], ],
}, },
{ key: '/admins', icon: <TeamOutlined />, label: '权限管理' },
{ {
key: 'monitoring-audit', key: 'monitoring-audit',
icon: <FileSearchOutlined />, icon: <FileSearchOutlined />,
@@ -103,7 +104,6 @@ const NAV_GROUPS: NavGroup[] = [
{ key: '/audit-logs', icon: <FileSearchOutlined />, label: '审计日志' }, { key: '/audit-logs', icon: <FileSearchOutlined />, label: '审计日志' },
], ],
}, },
{ key: '/admins', icon: <TeamOutlined />, label: '权限管理' },
]; ];
// 导航项 key(/dashboard)→ 权限页 key(dashboard),与后端 permissions.py 目录对齐 // 导航项 key(/dashboard)→ 权限页 key(dashboard),与后端 permissions.py 目录对齐
@@ -223,8 +223,7 @@ export default function MainLayout({ children }: { children: React.ReactNode })
position: 'sticky', position: 'sticky',
top: 0, top: 0,
height: '100vh', height: '100vh',
overflowY: 'auto', overflow: 'hidden',
overflowX: 'hidden',
}} }}
> >
<nav className={`side-nav${collapsed ? ' side-nav-collapsed' : ''}`} aria-label="后台导航"> <nav className={`side-nav${collapsed ? ' side-nav-collapsed' : ''}`} aria-label="后台导航">
@@ -314,8 +313,19 @@ export default function MainLayout({ children }: { children: React.ReactNode })
.side-nav { .side-nav {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
box-sizing: border-box;
gap: 4px; gap: 4px;
padding: 0 10px 14px; height: calc(100vh - 48px);
min-height: 0;
overflow-x: hidden;
overflow-y: auto;
overscroll-behavior: contain;
padding: 0 10px 20px;
scrollbar-gutter: stable;
-webkit-overflow-scrolling: touch;
}
.side-nav:focus-within {
scroll-behavior: smooth;
} }
.nav-group { .nav-group {
padding: 6px 0 8px; padding: 6px 0 8px;
-3
View File
@@ -377,10 +377,7 @@ export interface Feedback {
// 提交端环境快照:提交版本号 / 机型OS版本;改版前的历史反馈为 null // 提交端环境快照:提交版本号 / 机型OS版本;改版前的历史反馈为 null
app_version: string | null; app_version: string | null;
device_model: string | null; device_model: string | null;
device_model_name: string | null;
device_manufacturer: string | null;
rom_name: string | null; rom_name: string | null;
rom_version: number | null;
android_version: string | null; android_version: string | null;
// 联表瞬态:展示完整手机号(点手机号查该用户全部反馈) // 联表瞬态:展示完整手机号(点手机号查该用户全部反馈)
phone: string | null; phone: string | null;