diff --git a/distribution-admin/index.html b/distribution-admin/index.html index 5da73cf..f9b2a43 100644 --- a/distribution-admin/index.html +++ b/distribution-admin/index.html @@ -3,7 +3,9 @@ - 分销网管理后台 + + + 解忧商行 · 分销管理后台
diff --git a/distribution-admin/package-lock.json b/distribution-admin/package-lock.json index 96b3c81..eeccdc1 100644 --- a/distribution-admin/package-lock.json +++ b/distribution-admin/package-lock.json @@ -1,11 +1,11 @@ { - "name": "hfb-distribution-admin", + "name": "jieyou-distribution-admin", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "hfb-distribution-admin", + "name": "jieyou-distribution-admin", "version": "0.1.0", "dependencies": { "@ant-design/icons": "^6.0.0", diff --git a/distribution-admin/package.json b/distribution-admin/package.json index d5ed216..76b98af 100644 --- a/distribution-admin/package.json +++ b/distribution-admin/package.json @@ -1,5 +1,5 @@ { - "name": "hfb-distribution-admin", + "name": "jieyou-distribution-admin", "private": true, "version": "0.1.0", "type": "module", diff --git a/distribution-admin/public/favicon.svg b/distribution-admin/public/favicon.svg new file mode 100644 index 0000000..c18f85f --- /dev/null +++ b/distribution-admin/public/favicon.svg @@ -0,0 +1,8 @@ + + 解忧商行印章 + 解忧商行方形朱砂印章 + + + 解 + 忧 + diff --git a/distribution-admin/src/AppShell.tsx b/distribution-admin/src/AppShell.tsx index a6ef972..23f8729 100644 --- a/distribution-admin/src/AppShell.tsx +++ b/distribution-admin/src/AppShell.tsx @@ -20,6 +20,7 @@ import { TeamOutlined, } from '@ant-design/icons' import { getMe, logout, type CurrentMember, getStoredToken } from './api' +import { BrandLogo } from './BrandLogo' import { MemberContext } from './MemberContext' import Dashboard from './pages/Dashboard' import Sites from './pages/Sites' @@ -89,11 +90,12 @@ function MainLayout({ member, onLogout }: { member: CurrentMember; onLogout: () return ( - +
- - HFB 分销后台 + + 分销台
+
JIEYOU DISTRIBUTION
) : ( - + {member.site_name || '当前分销站点'} · {member.domain || member.site_code} )} - 主站 zuhaoc.com · 分销管理系统 + 解忧商行 · 主站 zuhaoc.com · 分销运营台
@@ -134,13 +136,13 @@ function MainLayout({ member, onLogout }: { member: CurrentMember; onLogout: () : `/?site=${member.site_code}` window.open(targetUrl, '_blank') }} - style={{ borderColor: '#1677ff', color: '#1677ff' }} + style={{ borderColor: 'var(--brand-ink)', color: 'var(--brand-ink)' }} > 预览分销前台商城 ↗ )}
- + {member.nickname || member.username} @@ -283,8 +285,30 @@ export default function AppShell() { diff --git a/distribution-admin/src/BrandLogo.tsx b/distribution-admin/src/BrandLogo.tsx new file mode 100644 index 0000000..4537623 --- /dev/null +++ b/distribution-admin/src/BrandLogo.tsx @@ -0,0 +1,28 @@ +import logoDark from './assets/brand/logo-dark.svg' +import logoLight from './assets/brand/logo-light.svg' +import logoSeal from './assets/brand/logo-seal.svg' + +export type BrandLogoVariant = 'light' | 'dark' | 'seal' + +interface BrandLogoProps { + height?: number + variant?: BrandLogoVariant + className?: string +} + +const logoSources: Record = { + light: logoLight, + dark: logoDark, + seal: logoSeal, +} + +export function BrandLogo({ height = 36, variant = 'light', className }: BrandLogoProps) { + return ( + 解忧商行 JIEYOU TRADING HOUSE + ) +} diff --git a/distribution-admin/src/assets/brand/logo-dark.svg b/distribution-admin/src/assets/brand/logo-dark.svg new file mode 100644 index 0000000..a2954ed --- /dev/null +++ b/distribution-admin/src/assets/brand/logo-dark.svg @@ -0,0 +1,10 @@ + + 解忧商行 + 解忧商行横版 logo,深色背景反白使用 + + + 解 + 忧 + 解忧商行 + JIEYOU TRADING HOUSE + diff --git a/distribution-admin/src/assets/brand/logo-light.svg b/distribution-admin/src/assets/brand/logo-light.svg new file mode 100644 index 0000000..1ff7730 --- /dev/null +++ b/distribution-admin/src/assets/brand/logo-light.svg @@ -0,0 +1,10 @@ + + 解忧商行 + 解忧商行横版 logo,浅色背景使用 + + + 解 + 忧 + 解忧商行 + JIEYOU TRADING HOUSE + diff --git a/distribution-admin/src/assets/brand/logo-seal.svg b/distribution-admin/src/assets/brand/logo-seal.svg new file mode 100644 index 0000000..c18f85f --- /dev/null +++ b/distribution-admin/src/assets/brand/logo-seal.svg @@ -0,0 +1,8 @@ + + 解忧商行印章 + 解忧商行方形朱砂印章 + + + 解 + 忧 + diff --git a/distribution-admin/src/pages/Accounts.tsx b/distribution-admin/src/pages/Accounts.tsx index c2397d1..8fa9234 100644 --- a/distribution-admin/src/pages/Accounts.tsx +++ b/distribution-admin/src/pages/Accounts.tsx @@ -596,7 +596,7 @@ export default function Accounts() { icon={} loading={syncing} onClick={handleOpenSyncModal} - style={{ background: '#1677ff' }} + style={{ background: '#1e4d42' }} > 一键同步主站商品 @@ -660,7 +660,7 @@ export default function Accounts() { {/* Batch actions */} {selectedRowKeys.length > 0 && ( - + 已选 {selectedRowKeys.length} 项 diff --git a/distribution-admin/src/pages/Orders.tsx b/distribution-admin/src/pages/Orders.tsx index 47ff768..d14391d 100644 --- a/distribution-admin/src/pages/Orders.tsx +++ b/distribution-admin/src/pages/Orders.tsx @@ -348,7 +348,7 @@ export default function Orders({ kind }: { kind: 'all' | 'sold' | 'receive' }) { copyable={{ text: row.listing_no }} style={{ fontSize: 13, - color: '#1677ff', + color: '#1e4d42', fontWeight: 600, fontFamily: 'monospace', whiteSpace: 'nowrap', @@ -406,7 +406,7 @@ export default function Orders({ kind }: { kind: 'all' | 'sold' | 'receive' }) { const netPaid = row.net_paid_amount_cent || row.gross_paid_amount_cent || 0 return (
- + {formatMoney(netPaid)} {row.deposit_amount_cent ? ( @@ -611,7 +611,7 @@ export default function Orders({ kind }: { kind: 'all' | 'sold' | 'receive' }) { strong style={{ fontSize: 13, - color: '#1677ff', + color: '#1e4d42', fontFamily: 'monospace', whiteSpace: 'nowrap', display: 'inline-flex', @@ -908,7 +908,7 @@ export default function Orders({ kind }: { kind: 'all' | 'sold' | 'receive' }) { ).toFixed(2)} precision={2} prefix="¥" - valueStyle={{ color: '#1677ff' }} + valueStyle={{ color: '#1e4d42' }} /> @@ -952,7 +952,7 @@ export default function Orders({ kind }: { kind: 'all' | 'sold' | 'receive' }) { copyable={{ text: selectedOrder.listing_no, tooltips: ['复制商品编号', '已复制'] }} strong className="mono-code" - style={{ color: '#1677ff', fontSize: 13, whiteSpace: 'nowrap', wordBreak: 'keep-all', display: 'inline-flex', alignItems: 'center' }} + style={{ color: '#1e4d42', fontSize: 13, whiteSpace: 'nowrap', wordBreak: 'keep-all', display: 'inline-flex', alignItems: 'center' }} > {selectedOrder.listing_no} @@ -1040,7 +1040,7 @@ export default function Orders({ kind }: { kind: 'all' | 'sold' | 'receive' }) { >
1. 租客实付租金总额: - + ¥ {( (selectedOrder.net_paid_amount_cent || selectedOrder.gross_paid_amount_cent || 0) / diff --git a/distribution-admin/src/pages/Rules.tsx b/distribution-admin/src/pages/Rules.tsx index 3e618c1..23e49f6 100644 --- a/distribution-admin/src/pages/Rules.tsx +++ b/distribution-admin/src/pages/Rules.tsx @@ -146,8 +146,8 @@ export default function Rules() { >
- - + + 卖号分成 40%
diff --git a/distribution-admin/src/pages/SiteSettings.tsx b/distribution-admin/src/pages/SiteSettings.tsx index 183506a..86b63fd 100644 --- a/distribution-admin/src/pages/SiteSettings.tsx +++ b/distribution-admin/src/pages/SiteSettings.tsx @@ -625,7 +625,7 @@ export default function SiteSettings() {
- + 独立短信验证码配置 @@ -1277,8 +1277,8 @@ export default function SiteSettings() { Logo ) : ( - - {currentSite?.site_name || 'HFB 分销商城'} + + {currentSite?.site_name || '解忧分销商城'} {storefrontText.tagline.trim() || DEFAULT_STOREFRONT_TEXT.tagline} @@ -1405,7 +1405,7 @@ export default function SiteSettings() { >
{footerInfo.copyright || `© 2026 ${currentSite?.site_name || '分销网'}`}
{footerInfo.icp &&
{footerInfo.icp}
} - {footerInfo.contact &&
{footerInfo.contact}
} + {footerInfo.contact &&
{footerInfo.contact}
}
diff --git a/distribution-admin/src/pages/Sites.tsx b/distribution-admin/src/pages/Sites.tsx index b54d50b..5482c0b 100644 --- a/distribution-admin/src/pages/Sites.tsx +++ b/distribution-admin/src/pages/Sites.tsx @@ -301,7 +301,7 @@ export default function Sites({ isSuperadmin = true }: { isSuperadmin?: boolean width: 180, render: (v: string) => ( - + {v} ), diff --git a/distribution-admin/src/pages/Users.tsx b/distribution-admin/src/pages/Users.tsx index 4879568..e9910e3 100644 --- a/distribution-admin/src/pages/Users.tsx +++ b/distribution-admin/src/pages/Users.tsx @@ -155,7 +155,7 @@ export default function Users() { width: 170, render: (phone: string) => ( - + {phone} @@ -179,7 +179,7 @@ export default function Users() { size="small" src={row.avatar_url || undefined} icon={!row.avatar_url ? : undefined} - style={{ backgroundColor: '#1677ff' }} + style={{ backgroundColor: '#1e4d42' }} /> {row.nickname || '-'} @@ -351,11 +351,11 @@ export default function Users() { } + prefix={} suffix="人" - valueStyle={{ color: '#1677ff', fontWeight: 'bold' }} + valueStyle={{ color: '#1e4d42', fontWeight: 'bold' }} /> -
+
本站注册或产生过消费行为的全部用户总计
diff --git a/distribution-admin/src/pages/Wallet.tsx b/distribution-admin/src/pages/Wallet.tsx index 29c58ad..bf87712 100644 --- a/distribution-admin/src/pages/Wallet.tsx +++ b/distribution-admin/src/pages/Wallet.tsx @@ -198,7 +198,7 @@ export default function Wallet() { - + 可提现余额} value={((wallet?.available_balance_cent ?? 0) / 100).toFixed(2)} @@ -213,9 +213,9 @@ export default function Wallet() { } + prefix={} suffix="元" - valueStyle={{ color: '#1677ff' }} + valueStyle={{ color: '#1e4d42' }} /> diff --git a/distribution-admin/src/style.css b/distribution-admin/src/style.css index 2b5382f..07b890a 100644 --- a/distribution-admin/src/style.css +++ b/distribution-admin/src/style.css @@ -1,7 +1,15 @@ :root { - font-family: Inter, -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; - color: #1f2937; - background: #f5f7fa; + --brand-ink: #1e4d42; + --brand-ink-deep: #153a32; + --brand-seal: #a64332; + --brand-brass: #b08a4a; + --brand-line: #e4ded2; + --brand-paper: #f6f2e8; + --brand-paper-warm: #fffdf8; + font-family: 'Noto Sans SC', Inter, -apple-system, BlinkMacSystemFont, 'PingFang SC', + 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif; + color: #1c2521; + background: var(--brand-paper); } * { @@ -32,7 +40,8 @@ body, overflow: hidden; flex-shrink: 0; z-index: 100; - box-shadow: 2px 0 8px rgba(0, 0, 0, 0.12); + background: var(--brand-ink-deep); + box-shadow: 4px 0 24px rgba(21, 58, 50, 0.18); } .app-sider .ant-layout-sider-children { @@ -56,17 +65,38 @@ body, .brand { height: 64px; - line-height: 64px; - padding: 0 20px; - color: #fff; - font-size: 16px; + padding: 0 18px; + color: #f0f4f2; + font-size: 15px; font-weight: 600; letter-spacing: 0.5px; display: flex; align-items: center; gap: 10px; flex-shrink: 0; - border-bottom: 1px solid rgba(255, 255, 255, 0.08); + border-bottom: 1px solid rgba(236, 208, 177, 0.14); +} + +.brand__tag { + padding: 2px 7px; + border: 1px solid rgba(236, 208, 177, 0.45); + border-radius: 2px; + color: #ecd0b1; + font-size: 10px; + font-weight: 400; + letter-spacing: 0.12em; +} + +.brand__sub { + padding: 8px 20px 10px; + color: rgba(236, 208, 177, 0.5); + font-size: 9px; + letter-spacing: 0.2em; +} + +.app-sider .ant-menu { + background: transparent; + border-inline-end: 0 !important; } .app-layout { @@ -76,7 +106,7 @@ body, flex-direction: column; overflow: hidden; min-width: 0; - background: #f5f7fa; + background: var(--brand-paper); } .header { @@ -86,10 +116,10 @@ body, display: flex; align-items: center; justify-content: space-between; - background: #fff; + background: var(--brand-paper-warm); padding: 0 24px; - border-bottom: 1px solid #edf0f5; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.03); + border-bottom: 1px solid var(--brand-line); + box-shadow: 0 1px 2px rgba(30, 77, 66, 0.03); z-index: 99; } @@ -116,7 +146,7 @@ body, min-height: 0; overflow-y: auto; overflow-x: hidden; - background: #f5f7fa; + background: var(--brand-paper); } .app-content::-webkit-scrollbar { @@ -136,6 +166,8 @@ body, .page { width: 100%; + max-width: 1600px; + margin: 0 auto; padding: 24px; } @@ -172,43 +204,148 @@ body, /* Login Page Styles */ .login-container { min-height: 100vh; + display: grid; + grid-template-columns: minmax(0, 1.05fr) minmax(420px, 0.95fr); + gap: 28px; + padding: 28px; + background: + radial-gradient(circle at 16% 18%, rgba(166, 67, 50, 0.07), transparent 42%), + var(--brand-paper); +} + +.login-brand { + position: relative; + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + padding: 48px 54px; + border-radius: 14px; + background: var(--brand-ink); + color: #f0f4f2; +} + +.login-brand::after { + content: ''; + position: absolute; + inset: 14px; + border: 1px solid rgba(236, 208, 177, 0.22); + border-radius: 10px; + pointer-events: none; +} + +.login-brand__logo { + margin-bottom: 34px; +} + +.login-brand__eyebrow { + color: #ecd0b1; + font-size: 10px; + letter-spacing: 0.22em; +} + +.login-brand h1 { + margin: 12px 0 16px; + color: #f6f2e8; + font-family: 'Noto Serif SC', 'Songti SC', serif; + font-size: 38px; + font-weight: 600; + line-height: 1.28; + letter-spacing: 0.04em; +} + +.login-brand h1 span { + display: block; + margin-top: 8px; + color: #b9cbc3; + font-size: 15px; + font-weight: 400; + letter-spacing: 0.08em; +} + +.login-brand p { + max-width: 430px; + margin: 0 0 24px; + color: #b9cbc3; + font-size: 13px; + line-height: 1.9; +} + +.login-brand ul { + display: flex; + flex-direction: column; + gap: 10px; + margin: 0; + padding: 0; + color: #d9e5df; + font-size: 12px; + list-style: none; +} + +.login-brand li::before { + content: '·'; + margin-right: 8px; + color: #ecd0b1; +} + +.login-brand__seal { + position: absolute; + right: 42px; + bottom: 40px; display: flex; align-items: center; justify-content: center; - background: linear-gradient(135deg, #0f172a 0%, #1e293b 50%, #0f172a 100%); - padding: 20px; + width: 64px; + height: 64px; + border: 2px solid var(--brand-seal); + color: #ecd0b1; + font-family: 'Noto Serif SC', 'Songti SC', serif; + font-size: 15px; + transform: rotate(-4deg); } .login-card { + align-self: center; width: 100%; - max-width: 420px; - border-radius: 16px; - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.25); - background: #ffffff; - padding: 12px 8px; + max-width: 460px; + margin: 0 auto; + padding: 20px 16px; + border: 1px solid var(--brand-line); + border-radius: 14px; + background: var(--brand-paper-warm); + box-shadow: 0 24px 48px rgba(30, 77, 66, 0.08); } .login-header { + margin-bottom: 26px; text-align: center; - margin-bottom: 28px; } -.login-logo { - width: 56px; - height: 56px; - margin: 0 auto 8px; - background: #e6f4ff; - border-radius: 14px; - display: flex; - align-items: center; - justify-content: center; +.login-header__mobile-logo { + display: none; + margin-bottom: 18px; } .login-footer { text-align: center; margin-top: 24px; padding-top: 16px; - border-top: 1px solid #f0f0f0; + border-top: 1px solid var(--brand-line); +} + +@media (max-width: 980px) { + .login-container { + grid-template-columns: minmax(0, 1fr); + padding: 16px; + } + + .login-brand { + display: none; + } + + .login-header__mobile-logo { + display: block; + } } @media (max-width: 720px) { diff --git a/distribution-admin/src/vite-env.d.ts b/distribution-admin/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/distribution-admin/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/docs/Phase1-验收报告.md b/docs/Phase1-验收报告.md index a17bf1b..8bf5e3b 100644 --- a/docs/Phase1-验收报告.md +++ b/docs/Phase1-验收报告.md @@ -101,10 +101,20 @@ - `MobileHomePage`:深绿品牌首屏、搜索、快捷筛选、PullToRefresh、商品卡列表、空/错误状态。 - `MobileListingDetailPage`:商品图、价格/押金/哈夫币、账号说明、资产摘要、在线时间、固定底部操作栏。 - `MobileProfilePage`:登录状态、实名状态、订单/消息入口、退出登录。 -- `/m/orders`、`/m/messages` 先用统一占位页,下一批迁移真实业务。 +- `/m/orders`、`/m/messages` 已在后续批次接入真实接口(见 `Phase2-移动端订单与消息验收.md`)。 - 移动端 CSS 变量已接入解忧商行品牌色,不使用 Vant/旧站视觉。 +### 1.9 分销后台品牌轻改 + +- 品牌 SVG 复制到 `distribution-admin/src/assets/brand/`,新增 `BrandLogo` 组件。 +- `ConfigProvider` 主题改为深绿 `#1E4D42`,同步 Layout / Menu 深色侧栏 token。 +- 侧栏改深绿底 + 反白横版 Logo + 「分销台」印记;顶栏改暖白底。 +- 登录页改为双栏:左侧品牌介绍与印章,右侧登录表单;窄屏自动收起品牌栏。 +- `index.html` 标题、favicon、`theme-color` 改为解忧商行。 +- 全量替换旧蓝 `#1677ff` → `#1E4D42`、`#0958d9` → `#153A32`,页面结构未重写。 +- `package.json` 包名改为 `jieyou-distribution-admin`。 + --- ## 2. 验证结果 @@ -183,11 +193,11 @@ dist/assets/MobileListingDetailPage-*.js 27.31 kB │ gzip 10.70 kB 1. 移动端订单列表/详情与消息中心已接入真实接口;下单、支付、交接、归还、结账等操作仍待迁移。 2. 后台除仪表盘、订单列表与订单详情外,其余页面仍为统一占位。 -3. 分销后台尚未做品牌轻改。 +3. 分销后台已完成主题、Logo、登录页与 Shell 轻改,页面结构未重写。 4. 后台菜单权限码基于旧项目推断:订单页已核对为 `order:list`(列表)与 `order:view`(详情),其余页面仍需逐一核对。 5. SVG 中文尚未转曲。 6. 首屏包体仍偏大。 -7. 移动端批次 `ef01486`、后台订单批次 `17b985a` 已提交;移动订单与消息在后续批次提交。 +7. 移动端 `ef01486`、后台订单 `17b985a`、移动订单与消息 `e8a20eb` 已提交;分销后台轻改在后续批次提交。 ---