From f1dc23c54ced37fa86eda8afb24b33db4fa50c01 Mon Sep 17 00:00:00 2001 From: jacy <18049821889@163.com> Date: Thu, 16 Jul 2026 15:04:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E4=BC=99=E4=BA=BA=20H5=20=E6=94=B9?= =?UTF-8?q?=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/h5-partner/src/PartnerAppRoutes.tsx | 30 +- .../src/contexts/PartnerSessionContext.tsx | 2 + .../src/layouts/SubAccountLayout.tsx | 25 +- apps/h5-partner/src/lib/api.ts | 4 +- apps/h5-partner/src/lib/contact.ts | 17 + apps/h5-partner/src/lib/partnerAccess.ts | 30 +- apps/h5-partner/src/pages/CenterPage.tsx | 211 ++++--- apps/h5-partner/src/pages/HomePage.tsx | 554 ++++++++++-------- apps/h5-partner/src/pages/OrderDetailPage.tsx | 113 ++-- apps/h5-partner/src/pages/OrderListPage.tsx | 108 ++-- apps/h5-partner/src/pages/PartnerMePage.tsx | 137 +---- apps/h5-partner/src/pages/StoreListPage.tsx | 15 +- apps/h5-partner/src/styles.css | 62 ++ packages/shared-types/src/partner.ts | 3 + .../partner-permission.decorator.ts | 7 + .../common/guards/partner-permission.guard.ts | 45 ++ .../dukang-api/src/modules/iam/iam.module.ts | 3 + .../settlement/settlement.controller.ts | 2 + .../src/modules/store/store.controller.ts | 5 +- .../src/modules/store/store.service.ts | 53 +- .../src/modules/trade/trade.controller.ts | 5 +- 21 files changed, 817 insertions(+), 614 deletions(-) create mode 100644 apps/h5-partner/src/lib/contact.ts create mode 100644 server/dukang-api/src/common/decorators/partner-permission.decorator.ts create mode 100644 server/dukang-api/src/common/guards/partner-permission.guard.ts diff --git a/apps/h5-partner/src/PartnerAppRoutes.tsx b/apps/h5-partner/src/PartnerAppRoutes.tsx index 4b4f3d4..3c0f461 100644 --- a/apps/h5-partner/src/PartnerAppRoutes.tsx +++ b/apps/h5-partner/src/PartnerAppRoutes.tsx @@ -1,6 +1,6 @@ import { Navigate, Route, Routes } from 'react-router-dom'; import { usePartnerSession } from './contexts/PartnerSessionContext'; -import { isSubAccount } from './lib/partnerAccess'; +import { getPartnerNavKind, isSubAccount } from './lib/partnerAccess'; import TabLayout from './layouts/TabLayout'; import SubAccountLayout from './layouts/SubAccountLayout'; import HomePage from './pages/HomePage'; @@ -26,7 +26,6 @@ function PrimaryRoutes() { }> } /> } /> - } /> } /> } /> @@ -39,6 +38,7 @@ function PrimaryRoutes() { } /> } /> } /> + } /> } /> } /> @@ -46,16 +46,30 @@ function PrimaryRoutes() { } function SubAccountRoutes() { + const { account } = usePartnerSession(); + const navKind = getPartnerNavKind(account); + const isWarehouse = navKind === 'warehouse_staff'; + return ( - }> - } /> - } /> + }> + } /> + {isWarehouse ? ( + } /> + ) : ( + } /> + )} } /> - {/* 与主账号一致:录入门店全屏,避免 sticky 底栏被 TabBar 挡住 */} - } /> - } /> + {!isWarehouse && ( + <> + } /> + } /> + } /> + + )} + {isWarehouse && } />} + } /> ); } diff --git a/apps/h5-partner/src/contexts/PartnerSessionContext.tsx b/apps/h5-partner/src/contexts/PartnerSessionContext.tsx index 81428af..dd20eb2 100644 --- a/apps/h5-partner/src/contexts/PartnerSessionContext.tsx +++ b/apps/h5-partner/src/contexts/PartnerSessionContext.tsx @@ -50,6 +50,8 @@ function accountFromProfile(profile: PartnerSessionProfile): PartnerAccount { staffRole: profile.staffRole, permissions: profile.permissions, primaryAccountId: profile.primaryAccountId, + primaryPhone: profile.primaryPhone, + primaryName: profile.primaryName, hasWechat: profile.hasWechat, }; } diff --git a/apps/h5-partner/src/layouts/SubAccountLayout.tsx b/apps/h5-partner/src/layouts/SubAccountLayout.tsx index f1cf4f3..69a0f9e 100644 --- a/apps/h5-partner/src/layouts/SubAccountLayout.tsx +++ b/apps/h5-partner/src/layouts/SubAccountLayout.tsx @@ -1,17 +1,30 @@ import { NavLink, Outlet } from 'react-router-dom'; +import type { PartnerNavKind } from '../lib/partnerAccess'; -const TABS = [ - { to: '/stores', end: true, icon: 'store', label: '门店管理' }, - { to: '/stores/new', icon: 'add_business', label: '录入门店' }, - { to: '/me', icon: 'person', label: '我的' }, +const STORE_STAFF_TABS = [ + { to: '/', end: true, icon: 'dashboard', label: '首页' }, + { to: '/stores', icon: 'store', label: '门店管理' }, + { to: '/me', icon: 'person', label: '个人中心' }, ] as const; -export default function SubAccountLayout() { +const WAREHOUSE_STAFF_TABS = [ + { to: '/', end: true, icon: 'dashboard', label: '首页' }, + { to: '/orders', icon: 'receipt_long', label: '订单管理' }, + { to: '/me', icon: 'person', label: '个人中心' }, +] as const; + +type SubAccountLayoutProps = { + navKind: PartnerNavKind; +}; + +export default function SubAccountLayout({ navKind }: SubAccountLayoutProps) { + const tabs = navKind === 'warehouse_staff' ? WAREHOUSE_STAFF_TABS : STORE_STAFF_TABS; + return ( <>