chore(deploy): add same-host staging stack next to production

dev deploys to /opt/dukang-staging (819x, *-test domains); main deploys to production. Staging uses full Mock with shared WeChat app ids.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-31 11:37:18 +08:00
parent 8d6c0f9ac0
commit 6a23e79f4c
20 changed files with 793 additions and 119 deletions
+33 -4
View File
@@ -204,6 +204,8 @@ function filterMenuItems(items: MenuProps['items'], permissionKeys: string[]): M
.filter(Boolean) as MenuProps['items'];
}
const IS_STAGING = import.meta.env.VITE_APP_ENV === 'staging';
export default function AdminLayout() {
const navigate = useNavigate();
const location = useLocation();
@@ -239,16 +241,35 @@ export default function AdminLayout() {
return (
<Layout style={{ height: '100vh', overflow: 'hidden' }}>
{IS_STAGING ? (
<div
style={{
position: 'fixed',
top: 0,
left: 0,
right: 0,
zIndex: 1100,
background: '#d48806',
color: '#fff',
textAlign: 'center',
fontSize: 13,
fontWeight: 600,
lineHeight: '28px',
}}
>
· staging · · Mock
</div>
) : null}
<Sider
breakpoint="lg"
collapsedWidth={64}
theme="dark"
width={220}
style={{ height: '100vh', overflow: 'hidden' }}
style={{ height: '100vh', overflow: 'hidden', marginTop: IS_STAGING ? 28 : 0 }}
>
<div style={{ display: 'flex', flexDirection: 'column', height: '100vh' }}>
<div style={{ display: 'flex', flexDirection: 'column', height: IS_STAGING ? 'calc(100vh - 28px)' : '100vh' }}>
<div style={{ flexShrink: 0, padding: '16px', color: '#fff', fontWeight: 600 }}>
HQ
HQ{IS_STAGING ? ' · 测试' : ''}
</div>
<div className="admin-sider-menu-scroll" style={{ flex: 1, minHeight: 0, overflow: 'auto' }}>
<Menu
@@ -264,7 +285,15 @@ export default function AdminLayout() {
</div>
</div>
</Sider>
<Layout style={{ height: '100vh', overflow: 'hidden', display: 'flex', flexDirection: 'column' }}>
<Layout
style={{
height: IS_STAGING ? 'calc(100vh - 28px)' : '100vh',
marginTop: IS_STAGING ? 28 : 0,
overflow: 'hidden',
display: 'flex',
flexDirection: 'column',
}}
>
<Header
style={{
flexShrink: 0,