chore: customize branding for Baihua

This commit is contained in:
汤学会
2026-06-14 21:05:49 +08:00
parent df9a4b485d
commit e90d296047
68 changed files with 173 additions and 280 deletions
+4 -4
View File
@@ -3,10 +3,10 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg?v=4" />
<link rel="alternate icon" type="image/png" href="/logo.png" />
<link rel="apple-touch-icon" href="/logo.png" />
<title>嘉恒智能五金 ERP</title>
<link rel="icon" type="image/png" href="/logo-mark.png" />
<link rel="alternate icon" type="image/png" href="/logo-mark.png" />
<link rel="apple-touch-icon" href="/logo-mark.png" />
<title>百华智能五金 ERP</title>
</head>
<body>
<div id="app"></div>
-54
View File
@@ -1,54 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="238 65 828 828" role="img" aria-label="嘉恒智能">
<defs>
<linearGradient id="logoBlue" x1="258" y1="166" x2="1047" y2="748" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#12a6df"/>
<stop offset="0.48" stop-color="#087fc3"/>
<stop offset="1" stop-color="#005ba8"/>
</linearGradient>
<linearGradient id="logoBlueDark" x1="313" y1="279" x2="936" y2="688" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#0d8ed0"/>
<stop offset="1" stop-color="#004f9c"/>
</linearGradient>
</defs>
<g fill="none" fill-rule="evenodd">
<path
fill="url(#logoBlueDark)"
d="M651 53l22 67 70 1-57 41 21 68-56-42-57 42 22-68-57-41 70-1z"
/>
<path stroke="#087fc3" stroke-width="18" stroke-linecap="round" d="M651 188v88"/>
<path
fill="url(#logoBlue)"
d="M650 244 516 167 238 328v314l278 160 134-77V613L516 691 332 585V385l184-106 134 77z"
/>
<path
fill="url(#logoBlue)"
d="M654 244 788 167l278 161v314L788 802l-134-77V613l134 78 184-106V385L788 279l-134 77z"
/>
<path
fill="url(#logoBlueDark)"
d="M574 179c0-26 28-43 51-30l108 62c16 9 26 26 26 44v142l122 70c23 13 23 47 0 60l-122 70v142c0 18-10 35-26 44l-108 62c-23 13-51-4-51-30V597L452 527c-23-13-23-47 0-60l122-70z"
/>
<path
stroke="#fff"
stroke-width="50"
stroke-linecap="round"
stroke-linejoin="round"
d="M651 275v204M651 479 512 398M651 479l139-81M651 479v205M651 684l-139-81M651 684l139-81"
/>
<path
stroke="#fff"
stroke-width="42"
stroke-linecap="round"
stroke-linejoin="round"
d="M390 433v119l126 73M914 433v119l-126 73"
/>
<path
fill="#087fc3"
d="M229 883c181-76 665-76 846 0-220-38-626-38-846 0z"
/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 509 KiB

After

Width:  |  Height:  |  Size: 120 KiB

-54
View File
@@ -1,54 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1304" height="1028" viewBox="0 0 1304 1028" role="img" aria-label="宁波嘉恒智能科技有限公司 logo">
<defs>
<linearGradient id="logoBlue" x1="258" y1="166" x2="1047" y2="748" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#12a6df"/>
<stop offset="0.48" stop-color="#087fc3"/>
<stop offset="1" stop-color="#005ba8"/>
</linearGradient>
<linearGradient id="logoBlueDark" x1="313" y1="279" x2="936" y2="688" gradientUnits="userSpaceOnUse">
<stop offset="0" stop-color="#0d8ed0"/>
<stop offset="1" stop-color="#004f9c"/>
</linearGradient>
</defs>
<g fill="none" fill-rule="evenodd">
<path
fill="url(#logoBlueDark)"
d="M651 53l22 67 70 1-57 41 21 68-56-42-57 42 22-68-57-41 70-1z"
/>
<path stroke="#087fc3" stroke-width="18" stroke-linecap="round" d="M651 188v88"/>
<path
fill="url(#logoBlue)"
d="M650 244 516 167 238 328v314l278 160 134-77V613L516 691 332 585V385l184-106 134 77z"
/>
<path
fill="url(#logoBlue)"
d="M654 244 788 167l278 161v314L788 802l-134-77V613l134 78 184-106V385L788 279l-134 77z"
/>
<path
fill="url(#logoBlueDark)"
d="M574 179c0-26 28-43 51-30l108 62c16 9 26 26 26 44v142l122 70c23 13 23 47 0 60l-122 70v142c0 18-10 35-26 44l-108 62c-23 13-51-4-51-30V597L452 527c-23-13-23-47 0-60l122-70z"
/>
<path
stroke="#fff"
stroke-width="50"
stroke-linecap="round"
stroke-linejoin="round"
d="M651 275v204M651 479 512 398M651 479l139-81M651 479v205M651 684l-139-81M651 684l139-81"
/>
<path
stroke="#fff"
stroke-width="42"
stroke-linecap="round"
stroke-linejoin="round"
d="M390 433v119l126 73M914 433v119l-126 73"
/>
<path
fill="#087fc3"
d="M229 883c181-76 665-76 846 0-220-38-626-38-846 0z"
/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

+8 -8
View File
@@ -4,9 +4,9 @@
<div v-else :class="shellClass">
<aside class="sidebar">
<div class="brand">
<img class="brand-logo" src="/logo.svg" alt="宁波嘉恒智能科技有限公司 logo" />
<img class="brand-logo" src="/logo-mark.png" alt="宁波百华智能科技有限公司 logo" />
<div>
<h1>嘉恒智能</h1>
<h1>百华智能</h1>
</div>
</div>
@@ -60,7 +60,7 @@
<div class="sidebar-footer">
<div class="status-chip">
<span class="status-dot"></span>
采购、嘉恒仓库、生产、发货、财务、售后、系统拓展已接入真实业务流
采购、百华仓库、生产、发货、财务、售后、系统拓展已接入真实业务流
</div>
</div>
</aside>
@@ -186,7 +186,7 @@
</span>
<div>
<p class="eyebrow">AI 助手</p>
<h3>嘉恒工艺助手</h3>
<h3>百华工艺助手</h3>
<p>当前为内置占位对话,真实 LLM 可在 08 系统拓展中配置。</p>
</div>
</div>
@@ -326,7 +326,7 @@ const chatMessages = ref([
{
id: 1,
role: "assistant",
content: "你好,我是嘉恒工艺助手。你可以问我系统操作路径、字段含义、业务流程或异常排查。"
content: "你好,我是百华工艺助手。你可以问我系统操作路径、字段含义、业务流程或异常排查。"
}
]);
const changePasswordForm = ref({
@@ -523,7 +523,7 @@ const navStages = [
key: "procurement",
step: "04",
label: "采购与库存",
desc: "采购、自家料入库、质量检验和嘉恒仓库。",
desc: "采购、自家料入库、质量检验和百华仓库。",
tail: "采购",
icon: "warehouse",
iconPaths: [
@@ -589,7 +589,7 @@ const navStages = [
},
{
key: "inventory-ledger",
label: "嘉恒仓库",
label: "百华仓库",
icon: "warehouse",
to: { name: "inventory-ledger" },
routeNames: ["inventory-ledger"],
@@ -765,7 +765,7 @@ const navStages = [
];
const isAuthLayout = computed(() => route.meta.layout === "auth");
const currentTitle = computed(() => route.meta.title || "嘉恒智能五金 ERP");
const currentTitle = computed(() => route.meta.title || "百华智能五金 ERP");
const shellClass = computed(() => ({
shell: true,
"admin-shell": true,
+1 -1
View File
@@ -4,7 +4,7 @@
<section class="stocktake-shell">
<header class="stocktake-head">
<div>
<p class="eyebrow">嘉恒仓库 · 盘库</p>
<p class="eyebrow">百华仓库 · 盘库</p>
<h3>{{ activeStocktake ? activeStocktake.stocktake_no : "新建盘库" }}</h3>
</div>
<button class="ghost-button" type="button" @click="$emit('close')">关闭</button>
@@ -46,7 +46,7 @@ const props = defineProps({
},
companyName: {
type: String,
default: "宁波嘉恒智能科技有限公司"
default: "宁波百华智能科技有限公司"
},
metaLabel: {
type: String,
@@ -66,7 +66,7 @@ const props = defineProps({
},
companyName: {
type: String,
default: "嘉恒仓库 ERP"
default: "百华仓库 ERP"
},
tone: {
type: String,
@@ -36,7 +36,7 @@ defineProps({
},
companyName: {
type: String,
default: "嘉恒仓库"
default: "百华仓库"
},
signatureLabels: {
type: Array,
+7 -6
View File
@@ -14539,11 +14539,11 @@ body .login-line-brand {
position: relative;
z-index: 2;
display: inline-grid;
grid-template-columns: 48px minmax(0, max-content);
grid-template-columns: minmax(116px, 150px) minmax(0, max-content);
gap: 12px;
align-items: center;
justify-self: start;
max-width: min(280px, 100%);
max-width: min(380px, 100%);
padding: 10px 15px 10px 10px;
border: 1px solid rgba(148, 163, 184, 0.2);
border-radius: 20px;
@@ -14558,10 +14558,11 @@ body .login-line-brand {
body .login-line-brand .login-logo,
body .login-production-layout .login-logo {
width: 48px;
width: 150px;
height: 48px;
border-radius: 16px;
border-radius: 14px;
object-fit: contain;
object-position: center;
background: rgba(255, 255, 255, 0.94);
box-shadow: 0 12px 32px rgba(2, 6, 23, 0.28);
}
@@ -15785,13 +15786,13 @@ body .login-production-layout .login-security-foot p {
}
body .login-line-brand {
grid-template-columns: 42px minmax(0, max-content);
grid-template-columns: minmax(96px, 128px) minmax(0, max-content);
border-radius: 17px;
}
body .login-line-brand .login-logo,
body .login-production-layout .login-logo {
width: 42px;
width: 128px;
height: 42px;
}
+1 -1
View File
@@ -2,7 +2,7 @@
<ProcessWorkspace
eyebrow="发货概览"
title="成品销售出库交付工作台"
description="发货概览模块只保留成品发运;客户退货、退货废料和返工出库统一到嘉恒仓库办理。"
description="发货概览模块只保留成品发运;客户退货、退货废料和返工出库统一到百华仓库办理。"
panel-tag="交付主流程"
stage-code="06"
:sections="sections"
+4 -4
View File
@@ -1,7 +1,7 @@
<template>
<section class="page-grid">
<section class="panel inventory-unified-panel">
<div class="warehouse-switchboard" role="tablist" aria-label="嘉恒仓库库存类型">
<div class="warehouse-switchboard" role="tablist" aria-label="百华仓库库存类型">
<button
v-for="tab in inventoryTabs"
:key="tab.key"
@@ -1331,7 +1331,7 @@
<FormDrawer
:open="openingImportDrawerOpen"
eyebrow="嘉恒仓库 · 期初导入"
eyebrow="百华仓库 · 期初导入"
:title="`${activeInventoryLabel}期初库存导入`"
tag="库存初始化"
wide
@@ -1899,7 +1899,7 @@
<FormDrawer
:open="warehouseLedgerDrawerOpen"
eyebrow="嘉恒仓库 · 库级流水"
eyebrow="百华仓库 · 库级流水"
:title="`${activeInventoryLabel} · 出入库流水`"
tag="库存流水"
wide
@@ -2055,7 +2055,7 @@
<FormDrawer
:open="productionWorkOrderInboundDrawerOpen"
eyebrow="嘉恒仓库 · 生产台账入库"
eyebrow="百华仓库 · 生产台账入库"
title="生产台账入库"
description="按在生产的材料库存批次号统一办理成品入库、生产余料入库和生产废料入库。"
tag="材料批次闭环"
+4 -4
View File
@@ -13,11 +13,11 @@
</div>
<main class="login-production-cockpit" @click.stop>
<section class="login-line-area" aria-label="嘉恒五金冲压产线">
<section class="login-line-area" aria-label="百华五金冲压产线">
<div class="login-line-brand">
<img class="login-logo" src="/logo.svg" alt="宁波嘉恒智能科技有限公司 logo" />
<img class="login-logo login-logo-wordmark" src="/logo.png" alt="宁波百华智能科技有限公司 logo" />
<div>
<span>嘉恒智能</span>
<span>百华智能</span>
</div>
</div>
@@ -98,7 +98,7 @@
<div class="login-console-frame">
<div class="login-control-console">
<div class="login-panel-head">
<h2>嘉恒智能五金 ERP</h2>
<h2>百华智能五金 ERP</h2>
</div>
<form class="login-form" @submit.prevent="handleLogin">
@@ -1,8 +1,8 @@
<template>
<ProcessWorkspace
eyebrow="采购与库存"
title="采购与嘉恒仓库工作台"
description="覆盖采购下单、自家料到货、质检和嘉恒仓库出入库台账。"
title="采购与百华仓库工作台"
description="覆盖采购下单、自家料到货、质检和百华仓库出入库台账。"
panel-tag="仓库主流程"
stage-code="04"
:sections="sections"
@@ -44,7 +44,7 @@ const sections = [
{
key: "inventory-ledger",
step: "04-4",
label: "嘉恒仓库",
label: "百华仓库",
desc: "统一处理原材料、半成品、成品、辅料的出入库和批次流水。",
permission: "MENU_INVENTORY_LEDGER",
component: InventoryLedgerView
+2 -2
View File
@@ -1471,7 +1471,7 @@ function renderPurchaseContractHtml(contractOrders) {
<div class="contract-no">合同编号:${escapeHtml(contractNo)}</div>
<div class="meta-grid">
<div><strong>甲方(采购方):</strong>${escapeHtml("嘉恒智能五金")}</div>
<div><strong>甲方(采购方):</strong>${escapeHtml("百华智能五金")}</div>
<div><strong>乙方(供应方):</strong>${escapeHtml(normalizeContractText(supplier?.supplier_name))}</div>
<div><strong>乙方联系人:</strong>${escapeHtml(normalizeContractText(supplier?.contact_name))}</div>
<div><strong>乙方电话:</strong>${escapeHtml(normalizeContractText(supplier?.contact_phone))}</div>
@@ -1530,7 +1530,7 @@ function renderPurchaseContractHtml(contractOrders) {
日期:
</div>
</div>
<p class="muted">注:该合同由嘉恒智能五金 ERP 按当前采购订单数据自动生成。</p>
<p class="muted">注:该合同由百华智能五金 ERP 按当前采购订单数据自动生成。</p>
</main>
</body>
</html>`;
+2 -2
View File
@@ -961,7 +961,7 @@ function renderContractHtml(orders) {
<div class="meta-grid">
<div><strong>甲方(买方):</strong>${escapeHtml(normalizeContractText(customer?.customer_name))}</div>
<div><strong>乙方(卖方):</strong>${escapeHtml("嘉恒智能五金")}</div>
<div><strong>乙方(卖方):</strong>${escapeHtml("百华智能五金")}</div>
<div><strong>甲方联系人:</strong>${escapeHtml(normalizeContractText(customer?.contact_name))}</div>
<div><strong>甲方电话:</strong>${escapeHtml(normalizeContractText(customer?.contact_phone))}</div>
<div><strong>合同日期:</strong>${escapeHtml(currentDateText())}</div>
@@ -1033,7 +1033,7 @@ function renderContractHtml(orders) {
日期:
</div>
</div>
<p class="muted">注:该合同由嘉恒智能五金 ERP 按当前销售订单数据自动生成。</p>
<p class="muted">注:该合同由百华智能五金 ERP 按当前销售订单数据自动生成。</p>
</main>
</body>
</html>`;
+4 -4
View File
@@ -419,13 +419,13 @@ function buildEmptyBroadcastForm() {
function buildEmptyAssistantForm() {
return {
assistant_name: "嘉恒工艺助手",
assistant_name: "百华工艺助手",
provider_name: "",
api_base_url: "",
api_key: "",
model_name: "",
temperature: 0.3,
system_prompt: "你是宁波嘉恒智能五金 ERP 的企业助手,优先解释业务流程、字段含义、数据异常和操作步骤。",
system_prompt: "你是宁波百华智能五金 ERP 的企业助手,优先解释业务流程、字段含义、数据异常和操作步骤。",
enabled: false
};
}
@@ -567,7 +567,7 @@ function restoreSectionSnapshot(sectionKey) {
if (sectionKey === "assistant") {
Object.assign(assistantForm, {
assistant_name: snapshot.assistant_name || "嘉恒工艺助手",
assistant_name: snapshot.assistant_name || "百华工艺助手",
provider_name: snapshot.provider_name || "",
api_base_url: snapshot.api_base_url || "",
api_key: "",
@@ -585,7 +585,7 @@ function restoreSectionSnapshot(sectionKey) {
function applyAssistantConfig(config) {
assistantConfig.value = config || {};
Object.assign(assistantForm, {
assistant_name: config?.assistant_name || "嘉恒工艺助手",
assistant_name: config?.assistant_name || "百华工艺助手",
provider_name: config?.provider_name || "",
api_base_url: config?.api_base_url || "",
api_key: "",