This commit is contained in:
2026-08-05 09:46:34 +08:00
parent 94ef079891
commit 84598f98eb
58 changed files with 36816 additions and 0 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
+225
View File
@@ -0,0 +1,225 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1600 1100" width="1600" height="1100" role="img" aria-labelledby="title desc">
<title id="title">跨境物流全链路流程图</title>
<desc id="desc">从头程下单、到仓计费、出仓及装船发运,到尾程到港前、到港、到仓、出仓和签收的完整业务流程。</desc>
<defs>
<linearGradient id="pageBg" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#F5F9FF"/>
<stop offset="1" stop-color="#F7FBFA"/>
</linearGradient>
<linearGradient id="firstMile" x1="0" y1="0" x2="1" y2="0">
<stop offset="0" stop-color="#155EEF"/>
<stop offset="1" stop-color="#2878FF"/>
</linearGradient>
<linearGradient id="lastMile" x1="0" y1="0" x2="1" y2="0">
<stop offset="0" stop-color="#087E8B"/>
<stop offset="1" stop-color="#16A085"/>
</linearGradient>
<linearGradient id="transit" x1="0" y1="0" x2="1" y2="0">
<stop offset="0" stop-color="#EAF2FF"/>
<stop offset="0.5" stop-color="#DDF5F1"/>
<stop offset="1" stop-color="#EAF2FF"/>
</linearGradient>
<filter id="shadow" x="-15%" y="-15%" width="130%" height="140%">
<feDropShadow dx="0" dy="8" stdDeviation="10" flood-color="#16324F" flood-opacity="0.09"/>
</filter>
<filter id="softShadow" x="-20%" y="-20%" width="140%" height="150%">
<feDropShadow dx="0" dy="4" stdDeviation="6" flood-color="#0F3057" flood-opacity="0.10"/>
</filter>
<marker id="arrowBlue" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto">
<path d="M1 1L8 5L1 9" fill="none" stroke="#7AA7ED" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
</marker>
<marker id="arrowGreen" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto">
<path d="M1 1L8 5L1 9" fill="none" stroke="#62B8AD" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
</marker>
<style>
text{font-family:"PingFang SC","Microsoft YaHei","Noto Sans SC",Arial,sans-serif}
.title{font-size:34px;font-weight:700;fill:#102A43;letter-spacing:1px}
.subtitle{font-size:15px;fill:#627D98}
.lane-title{font-size:22px;font-weight:700;fill:#fff}
.lane-en{font-size:11px;font-weight:600;fill:#fff;opacity:.72;letter-spacing:1.7px}
.phase-title{font-size:18px;font-weight:700;fill:#102A43}
.phase-no{font-size:11px;font-weight:700;fill:#fff;letter-spacing:.5px}
.step{font-size:13px;fill:#334E68}
.step-small{font-size:12px;fill:#334E68}
.step-no{font-size:10px;font-weight:700;fill:#fff}
.summary-label{font-size:11px;font-weight:700;fill:#627D98;letter-spacing:1px}
.summary-value{font-size:15px;font-weight:700;fill:#243B53}
</style>
</defs>
<rect width="1600" height="1100" fill="url(#pageBg)"/>
<circle cx="1490" cy="50" r="180" fill="#D9F1ED" opacity=".42"/>
<circle cx="90" cy="1080" r="220" fill="#DFEBFF" opacity=".48"/>
<!-- 标题与概览 -->
<text x="52" y="58" class="title">跨境物流全链路流程</text>
<text x="52" y="88" class="subtitle">从客户下单到海外签收 · 头程与尾程全节点协同</text>
<g transform="translate(1195 28)">
<rect width="112" height="60" rx="14" fill="#fff" stroke="#D9E2EC"/>
<text x="18" y="22" class="summary-label">业务阶段</text><text x="18" y="45" class="summary-value">8 个阶段</text>
<rect x="124" width="112" height="60" rx="14" fill="#fff" stroke="#D9E2EC"/>
<text x="142" y="22" class="summary-label">关键动作</text><text x="142" y="45" class="summary-value">36 个节点</text>
<rect x="248" width="112" height="60" rx="14" fill="#fff" stroke="#D9E2EC"/>
<text x="266" y="22" class="summary-label">最终结果</text><text x="266" y="45" class="summary-value">完成签收</text>
</g>
<!-- 头程泳道 -->
<rect x="30" y="120" width="1540" height="430" rx="24" fill="#FFFFFF" stroke="#D7E4F4" filter="url(#shadow)"/>
<path d="M54 120H1546A24 24 0 0 1 1570 144V194H30V144A24 24 0 0 1 54 120Z" fill="url(#firstMile)"/>
<g transform="translate(58 142)">
<circle cx="22" cy="22" r="22" fill="#fff" opacity=".16"/>
<path d="M10 23h24M14 23v11h16V23M17 19v-6h10v6M21 27h3" fill="none" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="58" y="18" class="lane-title">头程物流</text>
<text x="58" y="38" class="lane-en">FIRST-MILE LOGISTICS · 国内集货与出口</text>
</g>
<g transform="translate(1306 145)">
<rect width="210" height="42" rx="21" fill="#fff" opacity=".15"/>
<text x="105" y="26" text-anchor="middle" font-size="13" font-weight="600" fill="#fff">下单 → 到仓 → 出仓</text>
</g>
<!-- 头程阶段连接 -->
<path d="M435 365H474" stroke="#7AA7ED" stroke-width="2" marker-end="url(#arrowBlue)"/>
<path d="M850 365H889" stroke="#7AA7ED" stroke-width="2" marker-end="url(#arrowBlue)"/>
<!-- 一、下单 -->
<g transform="translate(55 220)">
<rect width="380" height="300" rx="18" fill="#F8FBFF" stroke="#C9DBF7"/>
<circle cx="32" cy="32" r="17" fill="#155EEF"/><text x="32" y="36" text-anchor="middle" class="phase-no">01</text>
<text x="60" y="39" class="phase-title">下单</text>
<text x="326" y="37" font-size="11" fill="#829AB1">4 个动作</text>
<line x1="20" y1="64" x2="360" y2="64" stroke="#D9E8FA"/>
<g transform="translate(20 82)">
<rect width="340" height="42" rx="10" fill="#fff" stroke="#DFEAF8"/><circle cx="22" cy="21" r="11" fill="#3B82F6"/><text x="22" y="25" text-anchor="middle" class="step-no">1</text><text x="44" y="26" class="step">客户下单</text>
<rect y="52" width="340" height="42" rx="10" fill="#fff" stroke="#DFEAF8"/><circle cx="22" cy="73" r="11" fill="#3B82F6"/><text x="22" y="77" text-anchor="middle" class="step-no">2</text><text x="44" y="78" class="step">委托我们下单</text>
<rect y="104" width="340" height="42" rx="10" fill="#fff" stroke="#DFEAF8"/><circle cx="22" cy="125" r="11" fill="#3B82F6"/><text x="22" y="129" text-anchor="middle" class="step-no">3</text><text x="44" y="130" class="step">快速下单(只有唛头)</text>
<rect y="156" width="340" height="42" rx="10" fill="#fff" stroke="#DFEAF8"/><circle cx="22" cy="177" r="11" fill="#3B82F6"/><text x="22" y="181" text-anchor="middle" class="step-no">4</text><text x="44" y="182" class="step">换标下单(中转、退货)</text>
</g>
</g>
<!-- 二、到仓 -->
<g transform="translate(470 220)">
<rect width="380" height="300" rx="18" fill="#F8FBFF" stroke="#C9DBF7"/>
<circle cx="32" cy="32" r="17" fill="#155EEF"/><text x="32" y="36" text-anchor="middle" class="phase-no">02</text>
<text x="60" y="39" class="phase-title">到仓</text>
<text x="326" y="37" font-size="11" fill="#829AB1">6 个动作</text>
<line x1="20" y1="64" x2="360" y2="64" stroke="#D9E8FA"/>
<g transform="translate(20 76)">
<rect width="340" height="32" rx="8" fill="#fff" stroke="#DFEAF8"/><circle cx="20" cy="16" r="10" fill="#3B82F6"/><text x="20" y="20" text-anchor="middle" class="step-no">1</text><text x="40" y="21" class="step">预约取货</text>
<rect y="36" width="340" height="32" rx="8" fill="#fff" stroke="#DFEAF8"/><circle cx="20" cy="52" r="10" fill="#3B82F6"/><text x="20" y="56" text-anchor="middle" class="step-no">2</text><text x="40" y="57" class="step">送货上门</text>
<rect y="72" width="340" height="32" rx="8" fill="#fff" stroke="#DFEAF8"/><circle cx="20" cy="88" r="10" fill="#3B82F6"/><text x="20" y="92" text-anchor="middle" class="step-no">3</text><text x="40" y="93" class="step">入库测量(称重计费)</text>
<rect y="108" width="340" height="32" rx="8" fill="#fff" stroke="#DFEAF8"/><circle cx="20" cy="124" r="10" fill="#3B82F6"/><text x="20" y="128" text-anchor="middle" class="step-no">4</text><text x="40" y="129" class="step">调整差异核对</text>
<rect y="144" width="340" height="32" rx="8" fill="#fff" stroke="#DFEAF8"/><circle cx="20" cy="160" r="10" fill="#3B82F6"/><text x="20" y="164" text-anchor="middle" class="step-no">5</text><text x="40" y="165" class="step">仓库作业(指定库位)</text>
<rect y="180" width="340" height="32" rx="8" fill="#EAF2FF" stroke="#BFD3F5"/><circle cx="20" cy="196" r="10" fill="#155EEF"/><text x="20" y="200" text-anchor="middle" class="step-no">6</text><text x="40" y="201" class="step" font-weight="600">计费</text>
</g>
</g>
<!-- 三、出仓 -->
<g transform="translate(885 220)">
<rect width="660" height="300" rx="18" fill="#F8FBFF" stroke="#C9DBF7"/>
<circle cx="32" cy="32" r="17" fill="#155EEF"/><text x="32" y="36" text-anchor="middle" class="phase-no">03</text>
<text x="60" y="39" class="phase-title">出仓</text>
<text x="604" y="37" font-size="11" fill="#829AB1">9 个动作</text>
<line x1="20" y1="64" x2="640" y2="64" stroke="#D9E8FA"/>
<g transform="translate(20 76)">
<rect width="300" height="36" rx="9" fill="#fff" stroke="#DFEAF8"/><circle cx="20" cy="18" r="10" fill="#3B82F6"/><text x="20" y="22" text-anchor="middle" class="step-no">1</text><text x="40" y="23" class="step-small">智能排柜</text>
<rect y="42" width="300" height="36" rx="9" fill="#fff" stroke="#DFEAF8"/><circle cx="20" cy="60" r="10" fill="#3B82F6"/><text x="20" y="64" text-anchor="middle" class="step-no">2</text><text x="40" y="65" class="step-small">订舱</text>
<rect y="84" width="300" height="36" rx="9" fill="#fff" stroke="#DFEAF8"/><circle cx="20" cy="102" r="10" fill="#3B82F6"/><text x="20" y="106" text-anchor="middle" class="step-no">3</text><text x="40" y="107" class="step-small">预约托车</text>
<rect y="126" width="300" height="36" rx="9" fill="#fff" stroke="#DFEAF8"/><circle cx="20" cy="144" r="10" fill="#3B82F6"/><text x="20" y="148" text-anchor="middle" class="step-no">4</text><text x="40" y="149" class="step-small">PDA 拣货</text>
<rect y="168" width="300" height="36" rx="9" fill="#fff" stroke="#DFEAF8"/><circle cx="20" cy="186" r="10" fill="#3B82F6"/><text x="20" y="190" text-anchor="middle" class="step-no">5</text><text x="40" y="191" class="step-small">拍货柜及铅封照上传</text>
<rect x="320" width="300" height="36" rx="9" fill="#fff" stroke="#DFEAF8"/><circle cx="340" cy="18" r="10" fill="#3B82F6"/><text x="340" y="22" text-anchor="middle" class="step-no">6</text><text x="360" y="23" class="step-small">客户上传报关资料</text>
<rect x="320" y="42" width="300" height="36" rx="9" fill="#fff" stroke="#DFEAF8"/><circle cx="340" cy="60" r="10" fill="#3B82F6"/><text x="340" y="64" text-anchor="middle" class="step-no">7</text><text x="360" y="65" class="step-small">整理给到报关代理报关</text>
<rect x="320" y="84" width="300" height="36" rx="9" fill="#fff" stroke="#DFEAF8"/><circle cx="340" cy="102" r="10" fill="#3B82F6"/><text x="340" y="106" text-anchor="middle" class="step-no">8</text><text x="360" y="107" class="step-small">回执上传系统供客户下载</text>
<rect x="320" y="126" width="300" height="36" rx="9" fill="#fff" stroke="#DFEAF8"/><circle cx="340" cy="144" r="10" fill="#3B82F6"/><text x="340" y="148" text-anchor="middle" class="step-no">9</text><text x="360" y="149" class="step-small">查港务信息(预计开船、到港等)</text>
<g transform="translate(320 171)"><rect width="300" height="32" rx="16" fill="#E7F0FF"/><circle cx="24" cy="16" r="8" fill="#155EEF"/><path d="M20 16h8M24 12v8" stroke="#fff" stroke-width="1.5"/><text x="44" y="21" font-size="12" font-weight="600" fill="#155EEF">完成国内出仓,等待装船</text></g>
</g>
</g>
<!-- 海运衔接带 -->
<g transform="translate(350 570)" filter="url(#softShadow)">
<rect width="900" height="74" rx="37" fill="url(#transit)" stroke="#B9D8DF"/>
<path d="M0 37H286M614 37H900" stroke="#78AFC1" stroke-width="1.5" stroke-dasharray="7 7"/>
<g transform="translate(302 12)">
<circle cx="25" cy="25" r="25" fill="#fff"/>
<path d="M11 29h28l-4 7H16l-5-7Zm5-3h19l-3-11H19l-3 11Zm8-11V9h4v6" fill="none" stroke="#087E8B" stroke-width="2" stroke-linejoin="round"/>
<text x="68" y="23" font-size="16" font-weight="700" fill="#0B6070">装船发运 · 国际海运在途</text>
<text x="68" y="43" font-size="12" fill="#527C86">头程完成,进入海外清关与尾程履约</text>
</g>
</g>
<!-- 尾程泳道 -->
<rect x="30" y="670" width="1540" height="400" rx="24" fill="#FFFFFF" stroke="#CFE7E2" filter="url(#shadow)"/>
<path d="M54 670H1546A24 24 0 0 1 1570 694V744H30V694A24 24 0 0 1 54 670Z" fill="url(#lastMile)"/>
<g transform="translate(58 692)">
<circle cx="22" cy="22" r="22" fill="#fff" opacity=".16"/>
<path d="M10 27h7l3-10h10l3 10h3M15 27a4 4 0 1 0 0 8 4 4 0 0 0 0-8Zm20 0a4 4 0 1 0 0 8 4 4 0 0 0 0-8Z" fill="none" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<text x="58" y="18" class="lane-title">尾程物流</text>
<text x="58" y="38" class="lane-en">LAST-MILE LOGISTICS · 海外清关、入仓与派送</text>
</g>
<g transform="translate(1185 695)">
<rect width="330" height="42" rx="21" fill="#fff" opacity=".15"/>
<text x="165" y="26" text-anchor="middle" font-size="13" font-weight="600" fill="#fff">到港前 → 到港 → 到仓 → 出仓 → 签收</text>
</g>
<!-- 尾程连接线 -->
<path d="M328 900H352" stroke="#62B8AD" stroke-width="2" marker-end="url(#arrowGreen)"/>
<path d="M633 900H657" stroke="#62B8AD" stroke-width="2" marker-end="url(#arrowGreen)"/>
<path d="M938 900H962" stroke="#62B8AD" stroke-width="2" marker-end="url(#arrowGreen)"/>
<path d="M1243 900H1267" stroke="#62B8AD" stroke-width="2" marker-end="url(#arrowGreen)"/>
<!-- 尾程阶段卡片 -->
<g transform="translate(48 770)">
<rect width="280" height="268" rx="16" fill="#F7FCFB" stroke="#CBE7E1"/>
<circle cx="28" cy="29" r="16" fill="#087E8B"/><text x="28" y="33" text-anchor="middle" class="phase-no">01</text><text x="54" y="35" class="phase-title">到港前</text><text x="54" y="53" font-size="11" fill="#648A87">船在海上</text>
<g transform="translate(16 72)">
<rect width="248" height="36" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="18" r="10" fill="#13A18D"/><text x="18" y="22" text-anchor="middle" class="step-no">1</text><text x="38" y="23" class="step-small">FBA 仓预约</text>
<rect y="42" width="248" height="44" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="64" r="10" fill="#13A18D"/><text x="18" y="68" text-anchor="middle" class="step-no">2</text><text x="38" y="61" class="step-small">BOL 预清货</text><text x="38" y="77" font-size="10" fill="#829AB1">时间、费用、目的仓</text>
<rect y="92" width="248" height="42" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="113" r="10" fill="#13A18D"/><text x="18" y="117" text-anchor="middle" class="step-no">3</text><text x="38" y="110" class="step-small">清关资料上传到</text><text x="38" y="126" class="step-small">对应货柜</text>
<rect y="140" width="248" height="36" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="158" r="10" fill="#13A18D"/><text x="18" y="162" text-anchor="middle" class="step-no">4</text><text x="38" y="163" class="step-small">明细备注货物中转等</text>
</g>
</g>
<g transform="translate(353 770)">
<rect width="280" height="268" rx="16" fill="#F7FCFB" stroke="#CBE7E1"/>
<circle cx="28" cy="29" r="16" fill="#087E8B"/><text x="28" y="33" text-anchor="middle" class="phase-no">02</text><text x="54" y="35" class="phase-title">到港</text>
<g transform="translate(16 82)">
<rect width="248" height="50" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="25" r="10" fill="#13A18D"/><text x="18" y="29" text-anchor="middle" class="step-no">1</text><text x="38" y="30" class="step-small">清关放行</text>
<rect y="60" width="248" height="64" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="92" r="10" fill="#13A18D"/><text x="18" y="96" text-anchor="middle" class="step-no">2</text><text x="38" y="88" class="step-small">DO 或 PU 邮发</text><text x="38" y="106" class="step-small">通知码头车队提柜</text>
<rect y="136" width="248" height="38" rx="19" fill="#E3F6F2"/><text x="124" y="160" text-anchor="middle" font-size="12" font-weight="600" fill="#087E8B">完成提柜 · 运往海外仓</text>
</g>
</g>
<g transform="translate(658 770)">
<rect width="280" height="268" rx="16" fill="#F7FCFB" stroke="#CBE7E1"/>
<circle cx="28" cy="29" r="16" fill="#087E8B"/><text x="28" y="33" text-anchor="middle" class="phase-no">03</text><text x="54" y="35" class="phase-title">到仓</text>
<g transform="translate(16 82)">
<rect width="248" height="42" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="21" r="10" fill="#13A18D"/><text x="18" y="25" text-anchor="middle" class="step-no">1</text><text x="38" y="26" class="step-small">开柜拍照比对</text>
<rect y="50" width="248" height="42" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="71" r="10" fill="#13A18D"/><text x="18" y="75" text-anchor="middle" class="step-no">2</text><text x="38" y="76" class="step-small">根据 PDA 需求打托作业</text>
<rect y="100" width="248" height="42" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="121" r="10" fill="#13A18D"/><text x="18" y="125" text-anchor="middle" class="step-no">3</text><text x="38" y="126" class="step-small">派送车队筛选预约</text>
</g>
</g>
<g transform="translate(963 770)">
<rect width="280" height="268" rx="16" fill="#F7FCFB" stroke="#CBE7E1"/>
<circle cx="28" cy="29" r="16" fill="#087E8B"/><text x="28" y="33" text-anchor="middle" class="phase-no">04</text><text x="54" y="35" class="phase-title">出仓</text>
<g transform="translate(16 72)">
<rect width="248" height="34" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="17" r="9" fill="#13A18D"/><text x="18" y="21" text-anchor="middle" class="step-no">1</text><text x="36" y="22" class="step-small">预排车转 BOL 送货</text>
<rect y="40" width="248" height="34" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="57" r="9" fill="#13A18D"/><text x="18" y="61" text-anchor="middle" class="step-no">2</text><text x="36" y="62" class="step-small">PDA 拣货装车</text>
<rect y="80" width="248" height="34" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="97" r="9" fill="#13A18D"/><text x="18" y="101" text-anchor="middle" class="step-no">3</text><text x="36" y="102" class="step-small">派送车队到仓装车</text>
<rect y="120" width="248" height="34" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="137" r="9" fill="#13A18D"/><text x="18" y="141" text-anchor="middle" class="step-no">4</text><text x="36" y="142" class="step-small">整柜派送</text>
<rect y="160" width="248" height="34" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="177" r="9" fill="#13A18D"/><text x="18" y="181" text-anchor="middle" class="step-no">5</text><text x="36" y="182" class="step-small">自提出仓(一件代发)</text>
</g>
</g>
<g transform="translate(1268 770)">
<rect width="284" height="268" rx="16" fill="#F7FCFB" stroke="#CBE7E1"/>
<circle cx="28" cy="29" r="16" fill="#087E8B"/><text x="28" y="33" text-anchor="middle" class="phase-no">05</text><text x="54" y="35" class="phase-title">签收</text>
<g transform="translate(16 82)">
<rect width="252" height="42" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="21" r="10" fill="#13A18D"/><text x="18" y="25" text-anchor="middle" class="step-no">1</text><text x="38" y="26" class="step-small">私人仓签收回执上传</text>
<rect y="50" width="252" height="42" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="71" r="10" fill="#13A18D"/><text x="18" y="75" text-anchor="middle" class="step-no">2</text><text x="38" y="76" class="step-small">FBA 仓签收回执上传</text>
<rect y="100" width="252" height="42" rx="9" fill="#fff" stroke="#D8EBE7"/><circle cx="18" cy="121" r="10" fill="#13A18D"/><text x="18" y="125" text-anchor="middle" class="step-no">3</text><text x="38" y="126" class="step-small">送仓异常处理</text>
<g transform="translate(0 156)"><rect width="252" height="38" rx="19" fill="#087E8B"/><circle cx="24" cy="19" r="9" fill="#fff" opacity=".2"/><path d="M20 19l3 3 6-7" fill="none" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/><text x="132" y="24" text-anchor="middle" font-size="13" font-weight="700" fill="#fff">全流程完成 · 已签收</text></g>
</g>
</g>
<text x="800" y="1088" text-anchor="middle" font-size="11" fill="#829AB1">HEAD-HAUL &amp; LAST-MILE LOGISTICS PROCESS · 全程节点可追踪</text>
</svg>

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 881 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 549 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because it is too large Load Diff
+266
View File
@@ -0,0 +1,266 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>%s</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;600;700;900&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = { theme: { extend: { colors: { brand: { green:'#4CAF50', greenDark:'#2E7D32', blue:'#1565C0', blueDark:'#0D47A1', teal:'#00838F', light:'#F0F7FF', dark:'#0A1628' } }, fontFamily: { sans:['Inter','Noto Sans SC','system-ui','sans-serif'] } } } };
</script>
<style>
:root { --primary:#1565C0; --primary-dark:#0D47A1; --accent:#4CAF50; --accent-dark:#2E7D32; }
* { scroll-behavior:smooth; }
body { font-family:'Inter','Noto Sans SC',system-ui,sans-serif; overflow-x:hidden; }
.gradient-text { background:linear-gradient(135deg,#1565C0 0%,#4CAF50 100%); -webkit-background-clip:text; -webkit-text-fill-color:transparent; background-clip:text; }
.gradient-bg { background:linear-gradient(135deg,#0A1628 0%,#1565C0 50%,#00838F 100%); }
.btn-primary { background:linear-gradient(135deg,#1565C0 0%,#0D47A1 100%); transition:all .3s ease; }
.btn-primary:hover { transform:translateY(-2px); box-shadow:0 10px 30px rgba(21,101,192,.35); }
.btn-accent { background:linear-gradient(135deg,#4CAF50 0%,#2E7D32 100%); transition:all .3s ease; }
.btn-accent:hover { transform:translateY(-2px); box-shadow:0 10px 30px rgba(76,175,80,.35); }
.input-field { transition:all .3s ease; }
.input-field:focus { border-color:#1565C0; box-shadow:0 0 0 4px rgba(21,101,192,.1); }
.auth-logo { display:block; filter:brightness(0) saturate(100%) invert(20%) sepia(84%) saturate(1926%) hue-rotate(202deg) brightness(94%) contrast(93%); }
.lang-switcher { display:flex; align-items:center; background:rgba(21,101,192,.08); border-radius:9999px; padding:3px; border:1px solid rgba(21,101,192,.15); }
.lang-switcher button { font-size:12px; font-weight:600; padding:4px 9px; border-radius:9999px; color:#0A1628; transition:all .25s ease; white-space:nowrap; }
.lang-switcher button:hover { color:#1565C0; }
.lang-switcher button.active { background:#1565C0; color:#fff; }
</style>
</head>
<body class="text-gray-800 antialiased bg-gray-50">
<!-- 顶部栏 -->
<header class="fixed top-0 inset-x-0 z-50 bg-white/95 backdrop-blur border-b border-gray-100">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-16 flex items-center justify-between">
<a href="index.html" class="flex items-center" aria-label="返回官网">
<img src="assets/logo.png" alt="柏悦物流" class="auth-logo" style="width:161px;height:60px;object-fit:contain;">
</a>
<div class="lang-switcher" id="langSwitcher">
<button data-lang="zh" class="active" title="中文">中</button>
<button data-lang="en" title="English">EN</button>
<button data-lang="es" title="Español (México)">🇲🇽</button>
</div>
</div>
</header>
<section id="loginSection" class="min-h-screen pt-24 pb-12 bg-gray-50 flex items-center">
<div class="w-full max-w-6xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-white rounded-3xl shadow-2xl overflow-hidden">
<div class="grid lg:grid-cols-2">
<!-- 左侧视觉 -->
<div class="hidden lg:block relative">
<img src="https://images.unsplash.com/photo-1494412574643-ff11b0a5c1c3?ixlib=rb-4.0.3&auto=format&fit=crop&w=2070&q=80" alt="物流" class="absolute inset-0 w-full h-full object-cover">
<div class="absolute inset-0 gradient-bg opacity-90"></div>
<div class="relative z-10 p-12 h-full flex flex-col justify-between text-white">
<div>
<img src="assets/logo.png" alt="虫虫出海" style="width:161px;height:60px;object-fit:contain;">
<h2 class="text-3xl font-bold mb-4" data-i18n="login_welcome">欢迎回来</h2>
<p class="text-white/80" data-i18n="login_desc">登录虫虫出海平台,实时追踪货物轨迹,管理订单与库存。</p>
</div>
<div class="space-y-4">
<div class="flex items-center space-x-3">
<i class="fas fa-check-circle text-brand-green"></i>
<span data-i18n="login_feat1">全程可视化追踪</span>
</div>
<div class="flex items-center space-x-3">
<i class="fas fa-check-circle text-brand-green"></i>
<span data-i18n="login_feat2">智能订单管理</span>
</div>
<div class="flex items-center space-x-3">
<i class="fas fa-check-circle text-brand-green"></i>
<span data-i18n="login_feat3">在线询价下单</span>
</div>
</div>
</div>
</div>
<!-- 右侧表单 -->
<div class="p-8 sm:p-12 lg:p-16">
<div class="max-w-md mx-auto">
<h2 class="text-3xl font-bold text-gray-900 mb-2" data-i18n="login_title">账号登录</h2>
<p class="text-gray-600 mb-8"><span data-i18n="login_no_account">还没有账号?</span><button onclick="window.location.href='register.html'" class="text-brand-blue font-semibold hover:underline" data-i18n="login_register_link">立即注册</button></p>
<form id="loginForm" class="space-y-5">
<div>
<label class="block text-sm font-medium text-gray-700 mb-2" data-i18n="login_account_label">邮箱 / 手机号</label>
<div class="relative">
<i class="fas fa-user absolute left-4 top-1/2 -translate-y-1/2 text-gray-400"></i>
<input type="text" name="account" required placeholder="请输入邮箱或手机号" data-i18n-ph="login_account_ph" class="input-field w-full pl-11 pr-4 py-3.5 border border-gray-200 rounded-xl outline-none">
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2" data-i18n="login_password_label">密码</label>
<div class="relative">
<i class="fas fa-lock absolute left-4 top-1/2 -translate-y-1/2 text-gray-400"></i>
<input type="password" name="password" required placeholder="请输入密码" data-i18n-ph="login_password_ph" class="input-field w-full pl-11 pr-12 py-3.5 border border-gray-200 rounded-xl outline-none">
<button type="button" class="toggle-password absolute right-4 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600">
<i class="fas fa-eye"></i>
</button>
</div>
</div>
<div class="flex items-center justify-between text-sm">
<label class="flex items-center text-gray-600 cursor-pointer">
<input type="checkbox" class="w-4 h-4 text-brand-blue rounded border-gray-300 mr-2">
<span data-i18n="login_remember">记住我</span>
</label>
<button type="button" onclick="showToast(t('toast_resetpw'))" class="text-brand-blue hover:underline" data-i18n="login_forgot">忘记密码?</button>
</div>
<button type="submit" class="btn-primary w-full text-white font-bold py-4 rounded-xl text-lg" data-i18n="login_submit">
登 录
</button>
</form>
<div class="mt-8">
<div class="relative">
<div class="absolute inset-0 flex items-center">
<div class="w-full border-t border-gray-200"></div>
</div>
<div class="relative flex justify-center text-sm">
<span class="px-2 bg-white text-gray-500" data-i18n="login_other">其他方式登录</span>
</div>
</div>
<div class="flex justify-center space-x-4 mt-6">
<button onclick="showToast('微信登录即将上线')" class="w-12 h-12 rounded-full border border-gray-200 flex items-center justify-center text-green-600 hover:bg-green-50 transition-colors">
<i class="fab fa-weixin text-xl"></i>
</button>
<button onclick="showToast('企业微信登录即将上线')" class="w-12 h-12 rounded-full border border-gray-200 flex items-center justify-center text-blue-600 hover:bg-blue-50 transition-colors">
<i class="fas fa-briefcase text-xl"></i>
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section> <!-- Toast 提示 -->
<div id="toast" class="fixed top-24 left-1/2 -translate-x-1/2 z-[60] opacity-0 pointer-events-none transition-all duration-300 transform -translate-y-4">
<div class="bg-gray-900 text-white px-6 py-3 rounded-full shadow-2xl flex items-center space-x-2">
<i class="fas fa-info-circle text-brand-green"></i>
<span id="toastMessage">提示信息</span>
</div>
</div>
<script>
let currentLang = localStorage.getItem('cc_lang') || 'zh';
function t(key) {
return (i18n[currentLang] && i18n[currentLang][key] !== undefined) ? i18n[currentLang][key] : key;
}
const i18n = {
zh: {
login_welcome: "欢迎回来",
login_desc: "登录虫虫出海平台,实时追踪货物轨迹,管理订单与库存。",
login_feat1: "全程可视化追踪",
login_feat2: "智能订单管理",
login_feat3: "在线询价下单",
login_title: "账号登录",
login_no_account: "还没有账号?",
login_register_link: "立即注册",
login_account_label: "邮箱 / 手机号",
login_account_ph: "请输入邮箱或手机号",
login_password_label: "密码",
login_password_ph: "请输入密码",
login_remember: "记住我",
login_forgot: "忘记密码?",
login_submit: "登 录",
login_other: "其他方式登录",
toast_resetpw: "请联系客服重置密码",
toast_login_ok: "登录成功!欢迎回来"
},
en: {
login_welcome: "Welcome Back",
login_desc: "Log in to track shipments in real time and manage orders and inventory.",
login_feat1: "Full Visual Tracking",
login_feat2: "Smart Order Management",
login_feat3: "Online Quoting & Ordering",
login_title: "Account Login",
login_no_account: "No account yet?",
login_register_link: "Sign Up Now",
login_account_label: "Email / Phone",
login_account_ph: "Enter email or phone",
login_password_label: "Password",
login_password_ph: "Enter password",
login_remember: "Remember Me",
login_forgot: "Forgot Password?",
login_submit: "Log In",
login_other: "Other Sign-In Methods",
toast_resetpw: "Please contact support to reset your password",
toast_login_ok: "Login successful! Welcome back"
},
es: {
login_welcome: "Bienvenido de nuevo",
login_desc: "Inicia sesión para rastrear envíos en tiempo real y gestionar pedidos e inventario.",
login_feat1: "Seguimiento visual completo",
login_feat2: "Gestión inteligente de pedidos",
login_feat3: "Cotización y pedidos en línea",
login_title: "Inicio de sesión",
login_no_account: "¿Aún no tienes cuenta?",
login_register_link: "Regístrate ahora",
login_account_label: "Correo / Teléfono",
login_account_ph: "Ingresa correo o teléfono",
login_password_label: "Contraseña",
login_password_ph: "Ingresa tu contraseña",
login_remember: "Recuérdame",
login_forgot: "¿Olvidó su contraseña?",
login_submit: "Iniciar sesión",
login_other: "Otros métodos de acceso",
toast_resetpw: "Contacta a soporte para restablecer tu contraseña",
toast_login_ok: "¡Inicio de sesión exitoso! Bienvenido"
}
};
function applyLanguage(lang) {
if (!i18n[lang]) lang = 'zh';
currentLang = lang;
const langAttr = lang === 'zh' ? 'zh-CN' : (lang === 'es' ? 'es-MX' : 'en');
document.documentElement.setAttribute('lang', langAttr);
document.querySelectorAll('[data-i18n]').forEach(el => {
const k = el.getAttribute('data-i18n');
const v = i18n[lang][k];
if (v !== undefined) { if (v.indexOf('<br>') !== -1) el.innerHTML = v; else el.textContent = v; }
});
document.querySelectorAll('[data-i18n-ph]').forEach(el => {
const k = el.getAttribute('data-i18n-ph');
if (i18n[lang][k] !== undefined) el.setAttribute('placeholder', i18n[lang][k]);
});
document.querySelectorAll('[data-lang]').forEach(b => {
b.classList.toggle('active', b.getAttribute('data-lang') === lang);
});
try { localStorage.setItem('cc_lang', lang); } catch (e) {}
}
document.querySelectorAll('#langSwitcher [data-lang]').forEach(b => {
b.addEventListener('click', () => applyLanguage(b.getAttribute('data-lang')));
});
function showToast(message) {
const toast = document.getElementById('toast');
const toastMessage = document.getElementById('toastMessage');
toastMessage.textContent = message;
toast.classList.remove('opacity-0', 'pointer-events-none', '-translate-y-4');
toast.classList.add('opacity-100', 'translate-y-0');
setTimeout(() => {
toast.classList.add('opacity-0', 'pointer-events-none', '-translate-y-4');
toast.classList.remove('opacity-100', 'translate-y-0');
}, 3000);
}
function updateAuthUI() {}
document.querySelectorAll('.toggle-password').forEach(button => {
button.addEventListener('click', function() {
const input = this.previousElementSibling;
const icon = this.querySelector('i');
if (input.type === 'password') { input.type = 'text'; icon.classList.remove('fa-eye'); icon.classList.add('fa-eye-slash'); }
else { input.type = 'password'; icon.classList.remove('fa-eye-slash'); icon.classList.add('fa-eye'); }
});
});
document.getElementById('loginForm').addEventListener('submit', function(e) {
e.preventDefault();
showToast(t('toast_login_ok'));
setTimeout(() => window.location.href = 'workbench.html', 900);
});
applyLanguage(currentLang);
</script>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 764 KiB

+286
View File
@@ -0,0 +1,286 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>%s</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;600;700;900&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = { theme: { extend: { colors: { brand: { green:'#4CAF50', greenDark:'#2E7D32', blue:'#1565C0', blueDark:'#0D47A1', teal:'#00838F', light:'#F0F7FF', dark:'#0A1628' } }, fontFamily: { sans:['Inter','Noto Sans SC','system-ui','sans-serif'] } } } };
</script>
<style>
:root { --primary:#1565C0; --primary-dark:#0D47A1; --accent:#4CAF50; --accent-dark:#2E7D32; }
* { scroll-behavior:smooth; }
body { font-family:'Inter','Noto Sans SC',system-ui,sans-serif; overflow-x:hidden; }
.gradient-text { background:linear-gradient(135deg,#1565C0 0%,#4CAF50 100%); -webkit-background-clip:text; -webkit-text-fill-color:transparent; background-clip:text; }
.gradient-bg { background:linear-gradient(135deg,#0A1628 0%,#1565C0 50%,#00838F 100%); }
.btn-primary { background:linear-gradient(135deg,#1565C0 0%,#0D47A1 100%); transition:all .3s ease; }
.btn-primary:hover { transform:translateY(-2px); box-shadow:0 10px 30px rgba(21,101,192,.35); }
.btn-accent { background:linear-gradient(135deg,#4CAF50 0%,#2E7D32 100%); transition:all .3s ease; }
.btn-accent:hover { transform:translateY(-2px); box-shadow:0 10px 30px rgba(76,175,80,.35); }
.input-field { transition:all .3s ease; }
.input-field:focus { border-color:#1565C0; box-shadow:0 0 0 4px rgba(21,101,192,.1); }
.auth-logo { display:block; filter:brightness(0) saturate(100%) invert(20%) sepia(84%) saturate(1926%) hue-rotate(202deg) brightness(94%) contrast(93%); }
.lang-switcher { display:flex; align-items:center; background:rgba(21,101,192,.08); border-radius:9999px; padding:3px; border:1px solid rgba(21,101,192,.15); }
.lang-switcher button { font-size:12px; font-weight:600; padding:4px 9px; border-radius:9999px; color:#0A1628; transition:all .25s ease; white-space:nowrap; }
.lang-switcher button:hover { color:#1565C0; }
.lang-switcher button.active { background:#1565C0; color:#fff; }
</style>
</head>
<body class="text-gray-800 antialiased bg-gray-50">
<!-- 顶部栏 -->
<header class="fixed top-0 inset-x-0 z-50 bg-white/95 backdrop-blur border-b border-gray-100">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-16 flex items-center justify-between">
<a href="index.html" class="flex items-center" aria-label="返回官网">
<img src="assets/logo.png" alt="柏悦物流" class="auth-logo" style="width:161px;height:60px;object-fit:contain;">
</a>
<div class="lang-switcher" id="langSwitcher">
<button data-lang="zh" class="active" title="中文">中</button>
<button data-lang="en" title="English">EN</button>
<button data-lang="es" title="Español (México)">🇲🇽</button>
</div>
</div>
</header>
<section id="registerSection" class="min-h-screen pt-24 pb-12 bg-gray-50 flex items-center">
<div class="w-full max-w-6xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-white rounded-3xl shadow-2xl overflow-hidden">
<div class="grid lg:grid-cols-2">
<!-- 左侧视觉 -->
<div class="hidden lg:block relative">
<img src="https://images.unsplash.com/photo-1566576912321-d58ddd7a6088?ixlib=rb-4.0.3&auto=format&fit=crop&w=2070&q=80" alt="物流仓储" class="absolute inset-0 w-full h-full object-cover">
<div class="absolute inset-0 gradient-bg opacity-90"></div>
<div class="relative z-10 p-12 h-full flex flex-col justify-between text-white">
<div>
<img src="assets/logo.png" alt="虫虫出海" style="width:161px;height:60px;object-fit:contain;">
<h2 class="text-3xl font-bold mb-4" data-i18n="reg_welcome">加入我们</h2>
<p class="text-white/80" data-i18n="reg_welcome_desc">注册虫虫出海企业账号,开启高效跨境物流体验。</p>
</div>
<div class="space-y-4">
<div class="flex items-center space-x-3">
<i class="fas fa-check-circle text-brand-green"></i>
<span data-i18n="reg_feat1">新用户专属优惠</span>
</div>
<div class="flex items-center space-x-3">
<i class="fas fa-check-circle text-brand-green"></i>
<span data-i18n="reg_feat2">免费获取物流方案</span>
</div>
<div class="flex items-center space-x-3">
<i class="fas fa-check-circle text-brand-green"></i>
<span data-i18n="reg_feat3">专属客户经理对接</span>
</div>
</div>
</div>
</div>
<!-- 右侧表单 -->
<div class="p-8 sm:p-12 lg:p-16">
<div class="max-w-md mx-auto">
<h2 class="text-3xl font-bold text-gray-900 mb-2" data-i18n="reg_title">企业注册</h2>
<p class="text-gray-600 mb-8"><span data-i18n="reg_have_account">已有账号?</span><button onclick="window.location.href='login.html'" class="text-brand-blue font-semibold hover:underline" data-i18n="reg_login_link">立即登录</button></p>
<form id="registerForm" class="space-y-5">
<div class="grid sm:grid-cols-2 gap-5">
<div>
<label class="block text-sm font-medium text-gray-700 mb-2" data-i18n="reg_company_label">企业名称</label>
<input type="text" name="company" required placeholder="请输入企业名称" data-i18n-ph="reg_company_ph" class="input-field w-full px-4 py-3.5 border border-gray-200 rounded-xl outline-none">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2" data-i18n="reg_contact_label">联系人</label>
<input type="text" name="contact" required placeholder="请输入联系人姓名" data-i18n-ph="reg_contact_ph" class="input-field w-full px-4 py-3.5 border border-gray-200 rounded-xl outline-none">
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2" data-i18n="reg_email_label">邮箱</label>
<div class="relative">
<i class="fas fa-envelope absolute left-4 top-1/2 -translate-y-1/2 text-gray-400"></i>
<input type="email" name="email" required placeholder="请输入企业邮箱" data-i18n-ph="reg_email_ph" class="input-field w-full pl-11 pr-4 py-3.5 border border-gray-200 rounded-xl outline-none">
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2" data-i18n="reg_phone_label">手机号</label>
<div class="relative">
<i class="fas fa-phone absolute left-4 top-1/2 -translate-y-1/2 text-gray-400"></i>
<input type="tel" name="phone" required placeholder="请输入手机号" data-i18n-ph="reg_phone_ph" class="input-field w-full pl-11 pr-4 py-3.5 border border-gray-200 rounded-xl outline-none">
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 mb-2" data-i18n="reg_password_label">密码</label>
<div class="relative">
<i class="fas fa-lock absolute left-4 top-1/2 -translate-y-1/2 text-gray-400"></i>
<input type="password" name="password" required placeholder="请设置8-20位密码" data-i18n-ph="reg_password_ph" class="input-field w-full pl-11 pr-12 py-3.5 border border-gray-200 rounded-xl outline-none">
<button type="button" class="toggle-password absolute right-4 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600">
<i class="fas fa-eye"></i>
</button>
</div>
</div>
<div class="flex items-start">
<input type="checkbox" id="agree" required class="w-4 h-4 text-brand-blue rounded border-gray-300 mt-1 mr-2">
<label for="agree" class="text-sm text-gray-600">
<span data-i18n="reg_agree">我已阅读并同意</span> <button type="button" onclick="showToast(t('toast_tos'))" class="text-brand-blue hover:underline" data-i18n="reg_agree_tos">《用户服务协议》</button> 和 <button type="button" onclick="showToast(t('toast_pp'))" class="text-brand-blue hover:underline" data-i18n="reg_agree_pp">《隐私政策》</button>
</label>
</div>
<button type="submit" class="btn-accent w-full text-white font-bold py-4 rounded-xl text-lg" data-i18n="reg_submit">
立即注册
</button>
</form>
</div>
</div>
</div>
</div>
</div>
</section> <!-- Toast 提示 -->
<div id="toast" class="fixed top-24 left-1/2 -translate-x-1/2 z-[60] opacity-0 pointer-events-none transition-all duration-300 transform -translate-y-4">
<div class="bg-gray-900 text-white px-6 py-3 rounded-full shadow-2xl flex items-center space-x-2">
<i class="fas fa-info-circle text-brand-green"></i>
<span id="toastMessage">提示信息</span>
</div>
</div>
<script>
let currentLang = localStorage.getItem('cc_lang') || 'zh';
function t(key) {
return (i18n[currentLang] && i18n[currentLang][key] !== undefined) ? i18n[currentLang][key] : key;
}
const i18n = {
zh: {
reg_welcome: "加入我们",
reg_welcome_desc: "注册虫虫出海企业账号,开启高效跨境物流体验。",
reg_feat1: "新用户专属优惠",
reg_feat2: "免费获取物流方案",
reg_feat3: "专属客户经理对接",
reg_title: "企业注册",
reg_have_account: "已有账号?",
reg_login_link: "立即登录",
reg_company_label: "企业名称",
reg_company_ph: "请输入企业名称",
reg_contact_label: "联系人",
reg_contact_ph: "请输入联系人姓名",
reg_email_label: "邮箱",
reg_email_ph: "请输入企业邮箱",
reg_phone_label: "手机号",
reg_phone_ph: "请输入手机号",
reg_password_label: "密码",
reg_password_ph: "请设置8-20位密码",
reg_agree: "我已阅读并同意",
reg_agree_tos: "《用户服务协议》",
reg_agree_pp: "《隐私政策》",
reg_submit: "立即注册",
toast_tos: "服务协议即将上线",
toast_pp: "隐私政策即将上线",
toast_register_ok: "注册成功!欢迎加入虫虫出海"
},
en: {
reg_welcome: "Join Us",
reg_welcome_desc: "Register a Chongchong Global business account and start efficient cross-border logistics.",
reg_feat1: "Exclusive New-User Offers",
reg_feat2: "Free Logistics Plan",
reg_feat3: "Dedicated Account Manager",
reg_title: "Business Registration",
reg_have_account: "Already have an account?",
reg_login_link: "Log In Now",
reg_company_label: "Company Name",
reg_company_ph: "Enter company name",
reg_contact_label: "Contact Person",
reg_contact_ph: "Enter contact name",
reg_email_label: "Email",
reg_email_ph: "Enter company email",
reg_phone_label: "Phone Number",
reg_phone_ph: "Enter phone number",
reg_password_label: "Password",
reg_password_ph: "Set an 8-20 char password",
reg_agree: "I have read and agree to the",
reg_agree_tos: "User Agreement",
reg_agree_pp: "Privacy Policy",
reg_submit: "Sign Up Now",
toast_tos: "Terms of Service coming soon",
toast_pp: "Privacy Policy coming soon",
toast_register_ok: "Registration successful! Welcome to Chongchong Global"
},
es: {
reg_welcome: "Únete a nosotros",
reg_welcome_desc: "Regístrate en la cuenta empresarial de Chongchong Global y comienza una logística eficiente.",
reg_feat1: "Ofertas exclusivas para nuevos usuarios",
reg_feat2: "Plan logístico gratuito",
reg_feat3: "Gerente de cuenta dedicado",
reg_title: "Registro empresarial",
reg_have_account: "¿Ya tienes una cuenta?",
reg_login_link: "Inicia sesión ahora",
reg_company_label: "Nombre de empresa",
reg_company_ph: "Ingresa el nombre de empresa",
reg_contact_label: "Persona de contacto",
reg_contact_ph: "Ingresa el nombre de contacto",
reg_email_label: "Correo electrónico",
reg_email_ph: "Ingresa el correo empresarial",
reg_phone_label: "Número de teléfono",
reg_phone_ph: "Ingresa tu número de teléfono",
reg_password_label: "Contraseña",
reg_password_ph: "Define una contraseña de 8-20 caracteres",
reg_agree: "He leído y acepto los",
reg_agree_tos: "Términos de servicio",
reg_agree_pp: "Política de privacidad",
reg_submit: "Regístrate ahora",
toast_tos: "Términos de servicio próximamente",
toast_pp: "Política de privacidad próximamente",
toast_register_ok: "¡Registro exitoso! Bienvenido a Chongchong Global"
}
};
function applyLanguage(lang) {
if (!i18n[lang]) lang = 'zh';
currentLang = lang;
const langAttr = lang === 'zh' ? 'zh-CN' : (lang === 'es' ? 'es-MX' : 'en');
document.documentElement.setAttribute('lang', langAttr);
document.querySelectorAll('[data-i18n]').forEach(el => {
const k = el.getAttribute('data-i18n');
const v = i18n[lang][k];
if (v !== undefined) { if (v.indexOf('<br>') !== -1) el.innerHTML = v; else el.textContent = v; }
});
document.querySelectorAll('[data-i18n-ph]').forEach(el => {
const k = el.getAttribute('data-i18n-ph');
if (i18n[lang][k] !== undefined) el.setAttribute('placeholder', i18n[lang][k]);
});
document.querySelectorAll('[data-lang]').forEach(b => {
b.classList.toggle('active', b.getAttribute('data-lang') === lang);
});
try { localStorage.setItem('cc_lang', lang); } catch (e) {}
}
document.querySelectorAll('#langSwitcher [data-lang]').forEach(b => {
b.addEventListener('click', () => applyLanguage(b.getAttribute('data-lang')));
});
function showToast(message) {
const toast = document.getElementById('toast');
const toastMessage = document.getElementById('toastMessage');
toastMessage.textContent = message;
toast.classList.remove('opacity-0', 'pointer-events-none', '-translate-y-4');
toast.classList.add('opacity-100', 'translate-y-0');
setTimeout(() => {
toast.classList.add('opacity-0', 'pointer-events-none', '-translate-y-4');
toast.classList.remove('opacity-100', 'translate-y-0');
}, 3000);
}
function updateAuthUI() {}
document.querySelectorAll('.toggle-password').forEach(button => {
button.addEventListener('click', function() {
const input = this.previousElementSibling;
const icon = this.querySelector('i');
if (input.type === 'password') { input.type = 'text'; icon.classList.remove('fa-eye'); icon.classList.add('fa-eye-slash'); }
else { input.type = 'password'; icon.classList.remove('fa-eye-slash'); icon.classList.add('fa-eye'); }
});
});
document.getElementById('registerForm').addEventListener('submit', function(e) {
e.preventDefault();
showToast(t('toast_register_ok'));
setTimeout(() => window.location.href = 'workbench.html', 900);
});
applyLanguage(currentLang);
</script>
</body>
</html>
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 764 KiB

+49
View File
@@ -0,0 +1,49 @@
const http = require('http');
const fs = require('fs');
const path = require('path');
const PORT = 8081;
const mimeTypes = {
'.html': 'text/html',
'.js': 'text/javascript',
'.css': 'text/css',
'.json': 'application/json',
'.png': 'image/png',
'.jpg': 'image/jpg',
'.gif': 'image/gif',
'.svg': 'image/svg+xml',
'.ico': 'image/x-icon'
};
const server = http.createServer((req, res) => {
console.log(`${req.method} ${req.url}`);
let filePath = '.' + req.url;
if (filePath === './') {
filePath = './index.html';
}
const extname = String(path.extname(filePath)).toLowerCase();
const contentType = mimeTypes[extname] || 'application/octet-stream';
fs.readFile(filePath, (error, content) => {
if (error) {
if (error.code === 'ENOENT') {
res.writeHead(404, { 'Content-Type': 'text/html' });
res.end('<h1>404 Not Found</h1>', 'utf-8');
} else {
res.writeHead(500);
res.end('Server Error: ' + error.code, 'utf-8');
}
} else {
res.writeHead(200, { 'Content-Type': contentType });
res.end(content, 'utf-8');
}
});
});
server.listen(PORT, () => {
console.log(`[TraePreviewUrl]: http://localhost:${PORT}`);
console.log(`Server running at http://localhost:${PORT}/`);
});
@@ -0,0 +1,290 @@
#!/usr/bin/env python3
"""
柏悦WMS - 分阶段脚本
Phase 1: 登录并保存cookies (需要可见浏览器+手动验证码)
Phase 2: 加载cookies, headless模式抓取所有页面
用法:
python3 scrape_wms_final.py login # 阶段1: 登录保存cookie
python3 scrape_wms_final.py scrape # 阶段2: 用cookie抓取
"""
import asyncio, json, sys, os, time
from playwright.async_api import async_playwright
BASE = "http://39.101.149.173"
API_BASE = "https://adtest.bylogistic.cn"
USERNAME = "admin"
PASSWORD = "ndui#Emdfj23123"
COOKIE_FILE = "/tmp/wms_cookies.json"
OUTPUT_DIR = os.path.expanduser("~/Documents/柏悦")
os.makedirs(OUTPUT_DIR, exist_ok=True)
async def phase_login():
"""打开浏览器让用户登录,然后保存cookies"""
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False, args=["--start-maximized"])
context = await browser.new_context(viewport={"width": 1440, "height": 900})
page = await context.new_page()
print("=== 打开登录页 ===")
await page.goto(f"{BASE}/user/login?redirect=%2Fwms%2FByInstoreList", timeout=30000)
await page.wait_for_timeout(2000)
# 自动填充
inputs_text = page.locator("input[type='text']")
input_pwd = page.locator("input[type='password']")
await inputs_text.nth(0).fill(USERNAME)
await input_pwd.fill(PASSWORD)
print("✅ 账号密码已填写")
print("👉 请在浏览器中输入验证码并点击'确定'")
print("⏳ 等待登录成功...")
try:
await page.wait_for_function(
"() => !window.location.pathname.includes('login')",
timeout=300000 # 等5分钟
)
print(f"✅ 登录成功! URL: {page.url}")
except Exception as e:
print(f"❌ 等待超时: {e}")
try:
await browser.close()
except:
pass
return False
# 立即保存cookies(不等页面加载完)
try:
await page.wait_for_timeout(3000)
except:
pass
try:
cookies = await context.cookies()
with open(COOKIE_FILE, "w") as f:
json.dump(cookies, f, indent=2)
print(f"✅ Cookies已保存到 {COOKIE_FILE} ({len(cookies)} 个)")
except Exception as ce:
print(f"⚠️ Cookie保存出错: {ce}")
# 截图当前页
try:
await page.screenshot(path="/tmp/wms_logged_in.png", full_page=True)
print("📸 当前页面截图: /tmp/wms_logged_in.png")
except Exception as se:
print(f"⚠️ 截图出错: {se}")
# 保持浏览器打开
print("\n浏览器将保持10秒后关闭...")
try:
await asyncio.sleep(10)
except:
pass
try:
await browser.close()
except:
pass
return True
async def phase_scrape():
"""加载cookies并headless抓取所有页面"""
# 读取cookies
if not os.path.exists(COOKIE_FILE):
print(f"❌ Cookie文件不存在: {COOKIE_FILE}")
print("请先运行: python3 scrape_wms_final.py login")
return
with open(COOKIE_FILE) as f:
saved_cookies = json.load(f)
print(f"🍪 加载了 {len(saved_cookies)} 个cookies")
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
context = await browser.new_context(viewport={"width": 1440, "height": 900})
await context.add_cookies(saved_cookies)
page = await context.new_page()
# 监听API
all_apis = []
page.on("response", lambda r: all_apis.append({
"url": r.url, "status": r.status, "method": r.request.method
}))
# 先访问入库单列表(默认首页)
print("\n=== 访问系统首页 ===")
await page.goto(f"{BASE}/wms/ByInstoreList", timeout=20000)
await page.wait_for_timeout(4000)
if "login" in page.url.lower():
print("❌ Cookies已失效,请重新运行 login 命令")
await browser.close()
return
print(f"✅ 已进入系统: {page.url}")
# ===== 抓取菜单结构 =====
print("\n=== 抓取菜单结构 ===")
menu_structure = {}
# 一级菜单
top_menus = page.locator(".ant-menu-submenu-title")
top_count = await top_menus.count()
for i in range(top_count):
try:
name = (await top_menus.nth(i).inner_text()).strip().split("\n")[0].strip()
if not name or len(name) > 20:
continue
# 展开菜单
await top_menus.nth(i).click()
await page.wait_for_timeout(600)
# 获取子菜单
sub_items = page.locator(".ant-menu-submenu-open .ant-menu-item")
subs = []
for j in range(await sub_items.count()):
try:
sn = (await sub_items.nth(j).inner_text()).strip().split("\n")[0]
if sn and len(sn) < 30:
subs.append(sn)
except:
pass
menu_structure[name] = subs
print(f" 📂 {name}: {subs}")
# 收起
await top_menus.nth(i).click()
await page.wait_for_timeout(300)
except Exception as e:
pass
# 所有要访问的页面路径
pages_to_visit = [
("首页", "/wms/Dashboard"),
("入库单列表", "/wms/ByInstoreList"),
("入库单测量", "/wms/ByInstoreList4Measured"),
("测量数据审核", "/wms/ByInstoreList4MeasuredAudit"),
("接收审核", "/wms/ByInstoreList4ReceiveAudit"),
("客户管理", "/wms/ByCustomerList"),
("出库单列表", "/wms/ByOutstoreList"),
("派送单列表", "/wms/ByDispatchList"),
("货柜管理", "/wms/ByContainerList"),
("库存管理", "/wms/ByInventoryList"),
("财务结算", "/wms/ByFinanceList"),
("托盘管理", "/wms/ByTrayList"),
("BOL管理", "/wms/ByBolList"),
("用户管理", "/system/UserList"),
("角色管理", "/system/RoleList"),
("菜单管理", "/system/MenuList"),
("字典管理", "/system/DictList"),
("参数配置", "/system/ConfigList"),
]
# ===== 逐页抓取 =====
print(f"\n=== 逐页抓取 (共{len(pages_to_visit)}页) ===\n")
pages_data = {}
for idx, (name, path) in enumerate(pages_to_visit, 1):
try:
url = BASE + path
print(f"[{idx}/{len(pages_to_visit)}] {name} -> {path}", end=" ... ")
await page.goto(url, timeout=15000)
await page.wait_for_timeout(2500)
if "login" in page.url.lower():
print("❌ 会话过期!")
break
entry = {
"title": await page.title(),
"url": page.url,
}
# 表格列头
headers = []
ths = page.locator(".ant-table-thead th, thead th, [class*='table'] th")
for i in range(min(await ths.count(), 25)):
h = (await ths.nth(i).inner_text()).strip()
if h and h not in headers:
headers.append(h)
# 搜索条件字段
fields = []
labels = page.locator(".ant-form-item-label label, .query-group label, label[for]")
for i in range(min(await labels.count(), 20)):
t = (await labels.nth(i).inner_text()).strip()
if t and t not in fields and len(t) < 30:
fields.append(t)
# 操作按钮
buttons = []
btns = page.locator(".ant-btn:not(.ant-pagination-item):not(.ant-pagination-options-quick-jumper):not([class*='link'])")
for i in range(min(await btns.count(), 15)):
b = (await btns.nth(i).inner_text()).strip()
if b and b not in buttons and len(b) < 20 and b not in ["刷 新","关 闭"]:
buttons.append(b)
# 统计卡片数字
stat_vals = []
stats = page.locator("[class*='statistic'] [class*='value'], [class*='number-card'] [class*='value']")
for i in range(min(await stats.count(), 10)):
s = (await stats.nth(i).inner_text()).strip()
if s:
stat_vals.append(s)
entry["table_headers"] = headers
entry["search_fields"] = fields
entry["buttons"] = buttons
entry["statistics"] = stat_vals
pages_data[name] = entry
print(f"✅ 表头:{len(headers)} 字段:{len(fields)} 按钮:{len(buttons)}")
# 截图每个页面
safe_name = name.replace("/", "_").replace("\\", "_")
await page.screenshot(path=f"/tmp/wms_page_{safe_name}.png")
except Exception as e:
print(f"❌ {e}")
pages_data[name] = {"error": str(e)}
# 保存完整数据
full_data = {
"system_name": "柏悦物流管理系统 (Baiyue WMS)",
"base_url": BASE,
"api_base": API_BASE,
"scrape_time": time.strftime("%Y-%m-%d %H:%M:%S"),
"menu_structure": menu_structure,
"pages": pages_data,
"api_calls": all_apis[-50:], # 最后50个API调用
}
output_file = os.path.join(OUTPUT_DIR, "wms_system_data.json")
with open(output_file, "w", encoding="utf-8") as f:
json.dump(full_data, f, indent=2, ensure_ascii=False)
print(f"\n{'='*60}")
print(f"✅ 全部完成!")
print(f" - 菜单: {len(menu_structure)} 个一级模块")
print(f" - 页面: {len(pages_data)} 个页面")
print(f" - 输出: {output_file}")
print(f"{'='*60}")
await browser.close()
if __name__ == "__main__":
cmd = sys.argv[1] if len(sys.argv) > 1 else "login"
if cmd == "login":
asyncio.run(phase_login())
elif cmd == "scrape":
asyncio.run(phase_scrape())
else:
print(f"Usage: python3 {sys.argv[0]} [login|scrape]")
@@ -0,0 +1,207 @@
#!/usr/bin/env python3
"""
从可见浏览器中提取token,然后用API方式抓取所有数据
"""
import asyncio, json, os, time
from playwright.async_api import async_playwright
BASE = "http://39.101.149.173"
USERNAME = "admin"
PASSWORD = "ndui#Emdfj23123"
TOKEN_FILE = "/tmp/wms_token.json"
OUTPUT_DIR = os.path.expanduser("~/Documents/柏悦")
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False, args=["--start-maximized"])
context = await browser.new_context(viewport={"width": 1440, "height": 900})
page = await context.new_page()
print("=== 打开登录页 ===")
await page.goto(f"{BASE}/user/login?redirect=%2Fwms%2FByInstoreList", timeout=30000)
await page.wait_for_timeout(2000)
# 填充
inputs = page.locator("input[type='text']")
pwd = page.locator("input[type='password']")
await inputs.nth(0).fill(USERNAME)
await pwd.fill(PASSWORD)
print("👉 请在浏览器中输入验证码并点击确定...")
try:
await page.wait_for_function(
"() => !window.location.pathname.includes('login')",
timeout=300000
)
print("✅ 登录成功!")
except:
print("❌ 超时")
await browser.close()
return
await page.wait_for_timeout(3000)
# ========== 抓取完整菜单结构 ==========
print("\n=== 抓取菜单 ===")
menu_structure = {}
page_list = [] # [(display_name, url_path)]
top_menus = page.locator(".ant-menu-submenu-title")
for i in range(await top_menus.count()):
try:
name = (await top_menus.nth(i).inner_text()).strip().split("\n")[0].strip()
if not name or len(name) > 20:
continue
await top_menus.nth(i).click()
await page.wait_for_timeout(500)
subs = []
sub_items = page.locator(".ant-menu-submenu-open .ant-menu-item")
for j in range(await sub_items.count()):
sn = (await sub_items.nth(j).inner_text()).strip().split("\n")[0]
if sn and len(sn) < 30:
subs.append(sn)
menu_structure[name] = subs
print(f" {name}: {subs}")
await top_menus.nth(i).click()
await page.wait_for_timeout(300)
except:
pass
# ========== 逐页截图抓取 ==========
print(f"\n=== 逐页抓取 ===")
# 构建所有要访问的页面
all_pages = [("首页", "/wms/Dashboard")]
for menu_name, subs in menu_structure.items():
for sub in subs:
# 推断URL路径
path_map = {
"入库单列表": "/wms/ByInstoreList",
"入库单测量": "/wms/ByInstoreList4Measured",
"测量数据审核": "/wms/ByInstoreList4MeasuredAudit",
"接收审核": "/wms/ByInstoreList4ReceiveAudit",
"客户管理": "/wms/ByCustomerList",
"出库单列表": "/wms/ByOutstoreList",
"派送单列表": "/wms/ByDispatchList",
"BOL管理": "/wms/ByBolList",
"货柜管理": "/wms/ByContainerList",
"库存管理": "/wms/ByInventoryList",
"财务结算": "/wms/ByFinanceList",
"托盘管理": "/wms/ByTrayList",
"用户管理": "/system/UserList",
"角色管理": "/system/RoleList",
"菜单管理": "/system/MenuList",
"字典管理": "/system/DictList",
"参数配置": "/system/ConfigList",
"通用配置": "/system/ConfigList",
"报表设计": "/wms/Dashboard", # 待确认
"消息中心": "/wms/Dashboard",
"常见案例": "/wms/Dashboard",
"在线开发": "/wms/Dashboard",
"系统监控": "/wms/Dashboard",
"统计报表": "/wms/Dashboard",
}
path = path_map.get(sub, "")
if path:
all_pages.append((f"{menu_name} > {sub}", path))
# 去重
seen = set()
unique_pages = []
for name, path in all_pages:
if path not in seen:
seen.add(path)
unique_pages.append((name, path))
pages_data = {}
success_count = 0
for idx, (name, path) in enumerate(unique_pages, 1):
try:
url = BASE + path
print(f"[{idx}/{len(unique_pages)}] {name}", end=" ... ")
await page.goto(url, timeout=15000)
await page.wait_for_timeout(2500)
if "login" in page.url.lower():
print("会话过期!")
break
# 抓表格列头
headers = []
th_selectors = [".ant-table-thead th", "thead th", "table th"]
for ths in th_selectors:
els = page.locator(ths)
for i in range(min(await els.count(), 30)):
try:
h = (await els.nth(i).inner_text()).strip()
if h and h not in headers:
headers.append(h)
except:
pass
# 搜索字段
fields = []
labels = page.locator("label, .ant-form-item-label")
for i in range(min(await labels.count(), 25)):
try:
t = (await labels.nth(i).inner_text()).strip()
if t and t not in fields and len(t) < 30:
fields.append(t)
except:
pass
# 操作按钮
buttons = []
btns = page.locator("button:not([class*='pagination']):not([class*='quick-jumper'])")
for i in range(min(await btns.count(), 20)):
try:
b = (await btns.nth(i).inner_text()).strip()
if b and b not in buttons and len(b) < 25:
buttons.append(b)
except:
pass
pages_data[name] = {
"url": url,
"title": await page.title(),
"table_headers": headers,
"search_fields": fields,
"buttons": buttons,
}
print(f"✅ headers:{len(headers)} fields:{len(fields)} btns:{len(buttons)}")
success_count += 1
except Exception as e:
print(f"❌ {str(e)[:80]}")
pages_data[name] = {"error": str(e)[:200]}
# 保存数据
output = {
"system_name": "柏悦物流管理系统 (Baiyue WMS)",
"scrape_time": time.strftime("%Y-%m-%d %H:%M:%S"),
"menu_structure": menu_structure,
"pages": pages_data,
"pages_count": success_count,
}
out_path = os.path.join(OUTPUT_DIR, "wms_full_data.json")
with open(out_path, "w", encoding="utf-8") as f:
json.dump(output, f, indent=2, ensure_ascii=False)
print(f"\n✅ 完成! {success_count}/{len(unique_pages)} 页面成功抓取")
print(f"输出: {out_path}")
print("\n浏览器10秒后关闭...")
await asyncio.sleep(10)
await browser.close()
asyncio.run(main())
@@ -0,0 +1,322 @@
{
"system_name": "柏悦物流管理系统 (Baiyue WMS)",
"scrape_time": "2026-06-01 12:06:00",
"menu_structure": {
"客户管理": [
"客户公司管理",
"用户资料",
"海外仓阶梯费用",
"客户账户流水"
],
"入库": [
"入库单列表",
"入库单测量",
"测量数据审核",
"接收审核"
],
"出库": [
"派送单列表",
"BOL",
"自提单"
],
"货柜管理": [
"货柜列表",
"装柜清单"
],
"库存": [
"海外仓库存查询",
"理货管理",
"报损单"
],
"财务结算": [
"客户应收应付",
"客户对账单",
"结算单位应付",
"结算单位对账单",
"洛杉矶仓储成本"
],
"托盘管理": [
"托盘列表",
"生成托盘"
],
"通用": [
"产品信息",
"费用项目",
"FBA编码地址",
"托盘管理",
"库位/货架管理",
"订单流转路径",
"快递公司",
"往来单位"
],
"常见案例": [
"自定义组件",
"对象存储"
],
"在线开发": [
"Online表单开发"
],
"报表设计": [
"积木报表设计",
"生产销售监控",
"智慧物流监控"
],
"消息中心": [
"模板管理",
"消息管理",
"我的消息"
],
"系统管理": [
"用户管理",
"角色管理",
"菜单管理",
"租户管理",
"部门管理",
"我的部门",
"职务管理",
"通讯录",
"数据字典",
"分类字典",
"系统通告",
"菜单管理2"
],
"系统监控": [
"在线用户",
"路由网关",
"定时任务",
"日志管理",
"数据日志",
"SQL监控",
"在线文档"
]
},
"pages": {
"首页": {
"url": "http://39.101.149.173/wms/Dashboard",
"title": "柏悦物流管理系统",
"table_headers": [],
"search_fields": [],
"buttons": [
"返回首页"
]
},
"入库 > 入库单列表": {
"url": "http://39.101.149.173/wms/ByInstoreList",
"title": "入库单列表 · 柏悦物流管理系统",
"table_headers": [
"仓库",
"交货仓",
"配载状态",
"是否扣货",
"扣货理由",
"集装箱号",
"柜号",
"公司",
"业务类型",
"提货方式",
"提货时间",
"提货联系人电话",
"提货地址",
"提货邮编",
"提货联系人邮箱",
"渠道",
"买单/退税",
"是否整柜",
"商检验",
"开船时间",
"到港时间",
"总箱数",
"总毛重(T.K.GW)"
],
"search_fields": [
"定位仓库",
"交货仓",
"入仓码",
"订单状态",
"费用审核状态"
],
"buttons": [
"查询",
"重置",
"国内仓下单",
"海外分仓下单",
"整托下单",
"高级查询",
"导出报表",
"导出入库清单总表",
"导出唛头",
"导出FBA流转单ZIP",
"下载"
]
},
"入库 > 入库单测量": {
"url": "http://39.101.149.173/wms/ByInstoreList4Measured",
"title": "入库单测量 · 柏悦物流管理系统",
"table_headers": [
"入仓码",
"仓库",
"订单状态",
"配载状态",
"测量数据审核状态",
"唛头文件",
"是否扣货",
"扣货理由",
"公司",
"业务类型",
"渠道",
"买单/退税",
"是否整柜",
"商检验",
"总箱数",
"总毛重(T.K.GW)",
"总体积(m³)",
"总材积重",
"总净重(T.K.NW)",
"目的仓类型",
"目的仓",
"货件编号",
"测量完成时间",
"操作"
],
"search_fields": [
"仓库",
"入仓码",
"公司",
"FBA货件编号"
],
"buttons": [
"查询",
"重置",
"下载"
]
},
"入库 > 测量数据审核": {
"url": "http://39.101.149.173/wms/ByInstoreList4MeasuredAudit",
"title": "测量数据审核 · 柏悦物流管理系统",
"table_headers": [
"入仓码",
"仓库",
"订单状态",
"配载状态",
"测量数据审核状态",
"唛头文件",
"是否扣货",
"扣货理由",
"公司",
"业务类型",
"渠道",
"买单/退税",
"是否整柜",
"商检验",
"总箱数",
"总毛重(T.K.GW)",
"总体积(m³)",
"总材积重",
"总净重(T.K.NW)",
"目的仓类型",
"目的仓",
"货件编号",
"测量完成时间",
"操作"
],
"search_fields": [
"仓库",
"入仓码",
"公司",
"FBA货件编号"
],
"buttons": [
"查询",
"重置",
"下载"
]
},
"入库 > 接收审核": {
"url": "http://39.101.149.173/wms/ByInstoreList4ReceiveAudit",
"title": "接收审核 · 柏悦物流管理系统",
"table_headers": [
"入仓码",
"仓库",
"订单状态",
"配载状态",
"测量数据审核状态",
"唛头文件",
"是否扣货",
"扣货理由",
"公司",
"业务类型",
"渠道",
"买单/退税",
"是否整柜",
"商检验",
"总箱数",
"总毛重(T.K.GW)",
"总体积(m³)",
"总材积重",
"总净重(T.K.NW)",
"目的仓类型",
"目的仓",
"货件编号",
"测量完成时间",
"操作"
],
"search_fields": [
"仓库",
"入仓码",
"公司",
"FBA货件编号"
],
"buttons": [
"查询",
"重置",
"下载"
]
},
"出库 > 派送单列表": {
"url": "http://39.101.149.173/wms/ByDispatchList",
"title": "柏悦物流管理系统",
"table_headers": [],
"search_fields": [],
"buttons": [
"返回首页"
]
},
"通用 > 托盘管理": {
"url": "http://39.101.149.173/wms/ByTrayList",
"title": "柏悦物流管理系统",
"table_headers": [],
"search_fields": [],
"buttons": [
"返回首页"
]
},
"系统管理 > 用户管理": {
"url": "http://39.101.149.173/system/UserList",
"title": "柏悦物流管理系统",
"table_headers": [],
"search_fields": [],
"buttons": [
"返回首页"
]
},
"系统管理 > 角色管理": {
"url": "http://39.101.149.173/system/RoleList",
"title": "柏悦物流管理系统",
"table_headers": [],
"search_fields": [],
"buttons": [
"返回首页"
]
},
"系统管理 > 菜单管理": {
"url": "http://39.101.149.173/system/MenuList",
"title": "柏悦物流管理系统",
"table_headers": [],
"search_fields": [],
"buttons": [
"返回首页"
]
}
},
"pages_count": 10
}
@@ -0,0 +1,393 @@
{
"menu_items": [
{
"text": "首页",
"selector": ".ant-menu-item",
"href": ""
},
{
"text": "入库单列表",
"selector": ".ant-menu-item",
"href": ""
},
{
"text": "入库单测量",
"selector": ".ant-menu-item",
"href": ""
},
{
"text": "测量数据审核",
"selector": ".ant-menu-item",
"href": ""
},
{
"text": "接收审核",
"selector": ".ant-menu-item",
"href": ""
},
{
"text": "刷 新",
"selector": ".ant-menu-item",
"href": ""
},
{
"text": "关闭左侧",
"selector": ".ant-menu-item",
"href": ""
},
{
"text": "关闭右侧",
"selector": ".ant-menu-item",
"href": ""
},
{
"text": "关闭其它",
"selector": ".ant-menu-item",
"href": ""
},
{
"text": "客户管理",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "入库",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "出库",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "货柜管理",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "库存",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "财务结算",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "托盘管理",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "通用",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "常见案例",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "在线开发",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "报表设计",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "消息中心",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "系统管理",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "系统监控",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "统计报表",
"selector": ".ant-menu-submenu-title",
"href": ""
},
{
"text": "入库 入库单列表 入库单测量 测量数据审核 接收审核",
"selector": "li[role='menuitem']",
"href": ""
},
{
"text": "定位仓库 请选择仓库",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "定位仓库",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "请选择仓库",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "交货仓 请选择交货仓",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "交货仓",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "请选择交货仓",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "入仓码",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "订单状态 请选择订单状态",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "订单状态",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "请选择订单状态",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "费用审核状态 请选择费用审核状态",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "费用审核状态",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "请选择费用审核状态",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "1",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "2",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "3",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "4",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "5",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "•••",
"selector": "[class*='menu'] [class*='item']",
"href": ""
},
{
"text": "36",
"selector": "[class*='menu'] [class*='item']",
"href": ""
}
],
"all_links": [
"/system/ConfigList",
"/system/DictList",
"/system/MenuList",
"/system/RoleList",
"/system/UserList",
"/wms/ByBolList",
"/wms/ByContainerList",
"/wms/ByCustomerList",
"/wms/ByDispatchList",
"/wms/ByFinanceList",
"/wms/ByInstoreList",
"/wms/ByInstoreList4Measured",
"/wms/ByInstoreList4MeasuredAudit",
"/wms/ByInstoreList4ReceiveAudit",
"/wms/ByInventoryList",
"/wms/ByOutstoreList",
"/wms/ByTrayList",
"/wms/Dashboard",
"/wms/home",
"/wms/index"
],
"api_calls": [
{
"url": "http://39.101.149.173/user/login?redirect=%2Fwms%2FByInstoreList",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/randomImage/1780285671792?_t=1780285671",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/randomImage/1780285691766?_t=1780285691",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/randomImage/1780285694400?_t=1780285694",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/login",
"status": 200,
"method": "POST"
},
{
"url": "https://adtest.bylogistic.cn/sys/randomImage/1780285703728?_t=1780285703",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/login",
"status": 200,
"method": "POST"
},
{
"url": "https://adtest.bylogistic.cn/sys/randomImage/1780285711155?_t=1780285711",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/login",
"status": 200,
"method": "POST"
},
{
"url": "http://39.101.149.173/user/login?redirect=%2Fwms%2FByInstoreList",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/randomImage/1780285725968?_t=1780285725",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/randomImage/1780285750913?_t=1780285750",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/login",
"status": 200,
"method": "POST"
},
{
"url": "https://adtest.bylogistic.cn/sys/permission/getUserPermissionByToken?_t=1780285758",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/dict/getDictItems/by_company,company_name,id",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/dict/getDictItems/by_order_status,name,value,value%20not%20in%20(1001%5E%5E1002)",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/dict/getDictItems/by_customer,realname,id",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/dict/getDictItems/by_store,store_name,store_no",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/dict/getDictItems/by_order_status,name,value",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/dict/getDictItems/by_store,store_name,store_no,parent_store_id!=''",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/dict/getDictItems/by_order_path,path_name,id",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/dict/getDictItems/by_fba,fba_no,fba_no",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/annountCement/listByUser?_t=1780285758",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/permission/getUserPermissionByToken?_t=1780285762",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/loginfo?_t=1780285763",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/visitInfo?_t=1780285763",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/annountCement/listByUser?_t=1780285763",
"status": 200,
"method": "GET"
},
{
"url": "https://adtest.bylogistic.cn/sys/permission/getUserPermissionByToken?_t=1780285764",
"status": 200,
"method": "GET"
}
]
}
@@ -0,0 +1,67 @@
{
"/system/ConfigList": {
"title": "柏悦物流管理系统",
"url": "http://39.101.149.173/dashboard/analysis",
"headers": [],
"buttons": [],
"form_fields": [],
"content_preview": "欢迎进入 柏悦物流管理系统\n欢迎您,管理员 退出登录\n首页\nCopyright 2022 BaiYue Logisitcs"
},
"/system/DictList": {
"error": "Page.wait_for_timeout: Target page, context or browser has been closed"
},
"/system/MenuList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/system/RoleList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/system/UserList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByBolList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByContainerList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByCustomerList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByDispatchList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByFinanceList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByInstoreList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByInstoreList4Measured": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByInstoreList4MeasuredAudit": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByInstoreList4ReceiveAudit": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByInventoryList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByOutstoreList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/ByTrayList": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/Dashboard": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/home": {
"error": "Page.goto: Target page, context or browser has been closed"
},
"/wms/index": {
"error": "Page.goto: Target page, context or browser has been closed"
}
}
@@ -0,0 +1,510 @@
# 柏悦物流管理系统(Baiyue WMS)系统文档
> **版本**: 基于测试系统 2026-06-01 抓取分析
> **访问地址**: http://39.101.149.173
> **后端API**: https://adtest.bylogistic.cn
> **技术栈**: Ant Design Vue + Spring Boot + MySQL + Redis
> **测试账号**: admin / ndui#Emdfj23123
---
## 目录
1. [系统概述](#1-系统概述)
2. [技术架构](#2-技术架构)
3. [首页仪表盘](#3-首页仪表盘)
4. [客户管理模块](#4-客户管理模块)
5. [入库管理模块](#5-入库管理模块)
6. [出库管理模块](#6-出库管理模块)
7. [货柜管理模块](#7-货柜管理模块)
8. [库存管理模块](#8-库存管理模块)
9. [财务结算模块](#9-财务结算模块)
10. [托盘管理模块](#10-托盘管理模块)
11. [通用配置模块](#11-通用配置模块)
12. [常见案例模块](#12-常见案例模块)
13. [在线开发模块](#13-在线开发模块)
14. [报表设计模块](#14-报表设计模块)
15. [消息中心模块](#15-消息中心模块)
16. [系统管理模块](#16-系统管理模块)
17. [系统监控模块](#17-系统监控模块)
18. [API接口清单](#18-api接口清单)
---
## 1. 系统概述
柏悦物流管理系统(Baiyue WMS)是一套面向跨境物流仓储行业的综合管理系统,覆盖从**客户管理 → 入库 → 出库 → 货柜管理 → 库存 → 托盘 → 财务结算**的全链路业务流程。
### 1.1 核心业务流程
```
客户下单 → 入库单 → 入库测量 → 测量审核 → 接收审核 → 库存管理
↓
出库单 → BOL/派送 → 托盘管理 → 货柜管理 → 财务结算
```
### 1.2 系统模块总览
| 序号 | 模块 | 子页面数 | 说明 |
|------|------|----------|------|
| 1 | 首页 | 1 | 数据看板/仪表盘 |
| 2 | 客户管理 | 4 | 客户公司、用户、阶梯费用、流水 |
| 3 | 入库 | 4 | 入库单、测量、审核、接收 |
| 4 | 出库 | 3 | 派送单、BOL、自提单 |
| 5 | 货柜管理 | 2 | 货柜列表、装柜清单 |
| 6 | 库存 | 3 | 海外仓库存查询、理货、报损 |
| 7 | 财务结算 | 5 | 应收应付、对账单、仓储成本 |
| 8 | 托盘管理 | 2 | 托盘列表、生成托盘 |
| 9 | 通用 | 8 | 产品、费用、FBA地址、库位等 |
| 10 | 常见案例 | 2 | 自定义组件、对象存储 |
| 11 | 在线开发 | 1 | Online表单开发 |
| 12 | 报表设计 | 3 | 积木报表、生产监控、物流监控 |
| 13 | 消息中心 | 3 | 模板、消息管理、我的消息 |
| 14 | 系统管理 | 12 | 用户、角色、菜单、租户等 |
| 15 | 系统监控 | 7 | 在线用户、日志、定时任务等 |
| 16 | 统计报表 | - | 报表设计入口 |
---
## 2. 技术架构
### 2.1 前端技术
- **框架**: Vue.js(SPA 单页应用)
- **UI 组件库**: Ant Design Vue
- **路由**: Vue Router(Hash 模式)
- **状态管理**: Vuex
- **图表**: 集成数据可视化组件
### 2.2 后端技术
- **框架**: Spring Boot(推测,基于 Spring 生态)
- **数据库**: MySQL
- **缓存**: Redis
- **认证**: Token-based(JWT)
- **API 风格**: RESTful
### 2.3 认证流程
```
用户登录 → POST /sys/login → 返回 Token
后续请求 → Header: Authorization: Bearer {token}
权限验证 → GET /sys/permission/getUserPermissionByToken
```
---
## 3. 首页仪表盘
- **URL**: `/wms/Dashboard`
- **页面标题**: 柏悦物流管理系统
首页提供系统总览数据看板,展示关键业务指标(订单数、库存状态、财务概况等)。
---
## 4. 客户管理模块
### 4.1 客户公司管理
管理客户公司的基本信息,包括公司名称、联系方式、合作状态等。
### 4.2 用户资料
管理客户下的用户账号资料,包括登录账号、角色权限等。
### 4.3 海外仓阶梯费用
配置客户在海外仓的阶梯式费用规则,按不同量级设置不同单价。
### 4.4 客户账户流水
查看客户账户的资金流水明细,包括充值、消费、退款等记录。
---
## 5. 入库管理模块
入库是系统的核心业务流程模块,包含四个阶段:入库单创建 → 测量 → 测量审核 → 接收审核。
### 5.1 入库单列表
- **URL**: `/wms/ByInstoreList`
- **页面标题**: 入库单列表 · 柏悦物流管理系统
#### 搜索条件
| 字段 | 说明 |
|------|------|
| 定位仓库 | 筛选指定仓库的入库单 |
| 交货仓 | 筛选指定交货仓的入库单 |
| 入仓码 | 按入仓码精确查询 |
| 订单状态 | 按订单状态筛选(如:待处理、处理中、已完成) |
| 费用审核状态 | 按费用审核状态筛选 |
#### 表格列头(23列)
| 列名 | 说明 |
|------|------|
| 仓库 | 入库目标仓库 |
| 交货仓 | 货物来源交货仓 |
| 配载状态 | 货物配载状态 |
| 是否扣货 | 是否被扣货标记 |
| 扣货理由 | 扣货原因说明 |
| 集装箱号 | 集装箱编号 |
| 柜号 | 货柜编号 |
| 公司 | 客户公司名称 |
| 业务类型 | 业务分类 |
| 提货方式 | 提货方式(自提/送货等) |
| 提货时间 | 预约提货时间 |
| 提货联系人电话 | 提货联系人电话 |
| 提货地址 | 提货地址详情 |
| 提货邮编 | 提货地邮编 |
| 提货联系人邮箱 | 提货联系人邮箱 |
| 渠道 | 业务渠道来源 |
| 买单/退税 | 贸易方式(买单/退税) |
| 是否整柜 | 整柜/拼柜标记 |
| 商检验 | 商检检验标记 |
| 开船时间 | 预计开船时间 |
| 到港时间 | 预计到港时间 |
| 总箱数 | 货物总箱数 |
| 总毛重(T.K.GW) | 总毛重(吨/公斤) |
#### 操作按钮
| 按钮 | 功能 |
|------|------|
| 查询 | 根据搜索条件查询数据 |
| 重置 | 清空搜索条件 |
| 国内仓下单 | 创建国内仓入库单 |
| 海外分仓下单 | 创建海外分仓入库单 |
| 整托下单 | 以整托方式创建入库单 |
| 高级查询 | 打开高级筛选面板 |
| 导出报表 | 导出当前查询结果为Excel |
| 导出入库清单总表 | 导出完整的入库清单 |
| 导出唛头 | 导出唛头标签文件 |
| 导出FBA流转单ZIP | 导出FBA流转单压缩包 |
| 下载 | 下载选中记录的相关文件 |
### 5.2 入库单测量
- **URL**: `/wms/ByInstoreList4Measured`
- **页面标题**: 入库单测量 · 柏悦物流管理系统
对入库货物进行实际测量,记录测量数据。
#### 搜索条件
| 字段 | 说明 |
|------|------|
| 仓库 | 筛选仓库 |
| 入仓码 | 按入仓码查询 |
| 公司 | 按客户公司筛选 |
| FBA货件编号 | 按FBA货件编号查询 |
#### 表格列头(24列)
| 列名 | 说明 |
|------|------|
| 入仓码 | 入仓编码 |
| 仓库 | 目标仓库 |
| 订单状态 | 订单处理状态 |
| 配载状态 | 配载情况 |
| 测量数据审核状态 | 测量审核进度 |
| 唛头文件 | 唛头标签文件 |
| 是否扣货 | 扣货标记 |
| 扣货理由 | 扣货原因 |
| 公司 | 客户公司 |
| 业务类型 | 业务分类 |
| 渠道 | 业务渠道 |
| 买单/退税 | 贸易方式 |
| 是否整柜 | 整柜/拼柜 |
| 商检验 | 商检状态 |
| 总箱数 | 货物总箱数 |
| 总毛重(T.K.GW) | 总毛重 |
| 总体积(m³) | 货物总体积 |
| 总材积重 | 材积重量 |
| 总净重(T.K.NW) | 总净重 |
| 目的仓类型 | 目的仓库类型 |
| 目的仓 | 目的仓库 |
| 货件编号 | 货件编号 |
| 测量完成时间 | 测量完成时间 |
| 操作 | 操作按钮列 |
#### 操作按钮
| 按钮 | 功能 |
|------|------|
| 查询 | 根据条件查询 |
| 重置 | 清空条件 |
| 下载 | 下载数据 |
### 5.3 测量数据审核
- **URL**: `/wms/ByInstoreList4MeasuredAudit`
- **页面标题**: 测量数据审核 · 柏悦物流管理系统
对测量数据进行审核确认。表头和搜索条件与入库单测量一致。
### 5.4 接收审核
- **URL**: `/wms/ByInstoreList4ReceiveAudit`
- **页面标题**: 接收审核 · 柏悦物流管理系统
最终接收审核环节,确认货物入库完成。表头和搜索条件与入库单测量一致。
---
## 6. 出库管理模块
### 6.1 派送单列表
- **URL**: `/wms/ByDispatchList`
管理出库派送订单,包括派送地址、物流方式、派送状态等。
### 6.2 BOL(提单管理)
- **URL**: `/wms/ByBolList`
管理 Bill of Lading(提单),是国际物流中的重要单证。包括提单号、船名航次、发货人、收货人等。
### 6.3 自提单
管理客户自提订单,记录自提预约、提货人信息等。
---
## 7. 货柜管理模块
### 7.1 货柜列表
- **URL**: `/wms/ByContainerList`
管理所有货柜信息,包括柜号、类型、尺寸、状态、当前位置等。
### 7.2 装柜清单
记录每个货柜的装柜明细,展示柜内货物列表和装载方案。
---
## 8. 库存管理模块
### 8.1 海外仓库存查询
- **URL**: `/wms/ByInventoryList`
查询海外仓当前库存情况,支持按仓库、产品、SKU等维度查询。
### 8.2 理货管理
对库存货物进行盘点、整理、移位等操作。
### 8.3 报损单
管理货物损耗/损坏的报损申请和审批流程。
---
## 9. 财务结算模块
### 9.1 客户应收应付
- **URL**: `/wms/ByFinanceList`
管理每个客户的应收账款和应付账款明细。
### 9.2 客户对账单
生成和查看客户对账单,用于与客户进行账务核对。
### 9.3 结算单位应付
按结算单位(如承运商、仓库方)管理应付账款。
### 9.4 结算单位对账单
生成结算单位的对账单。
### 9.5 洛杉矶仓储成本
专门针对洛杉矶仓库的仓储成本核算和分析。
---
## 10. 托盘管理模块
### 10.1 托盘列表
- **URL**: `/wms/ByTrayList`
管理所有托盘信息,包括托盘编号、规格、状态、关联货物等。
### 10.2 生成托盘
根据入库货物自动/手动生成托盘,分配货物到托盘。
---
## 11. 通用配置模块
系统基础数据和配置管理。
| 子模块 | 说明 |
|--------|------|
| 产品信息 | 管理产品/货品基础信息(名称、规格、HS编码等) |
| 费用项目 | 定义各类费用项目(仓储费、操作费、运输费等) |
| FBA编码地址 | 管理Amazon FBA仓库编码和地址信息 |
| 托盘管理 | 托盘基础配置 |
| 库位/货架管理 | 仓库库位和货架的编号和配置 |
| 订单流转路径 | 定义订单在不同节点之间的流转规则 |
| 快递公司 | 合作的快递/物流公司信息 |
| 往来单位 | 管理供应商、承运商等往来单位信息 |
---
## 12. 常见案例模块
### 12.1 自定义组件
展示系统自定义组件的使用示例和开发指南。
### 12.2 对象存储
文件/对象存储功能的配置和使用说明。
---
## 13. 在线开发模块
### 13.1 Online表单开发
低代码表单开发工具,允许管理员在线设计和配置业务表单,无需编写代码。
---
## 14. 报表设计模块
### 14.1 积木报表设计
可视化报表设计器,支持拖拽式设计各类业务报表。
### 14.2 生产销售监控
展示生产和销售的监控数据看板。
### 14.3 智慧物流监控
物流全链路监控大屏,展示实时物流数据。
---
## 15. 消息中心模块
### 15.1 模板管理
管理系统通知的消息模板,支持短信、邮件、站内信等类型。
### 15.2 消息管理
查看和管理所有已发送的系统消息。
### 15.3 我的消息
当前登录用户收到的个人消息列表。
---
## 16. 系统管理模块
系统后台管理功能。
| 子模块 | 说明 |
|--------|------|
| 用户管理 | 管理系统用户账号(创建、编辑、禁用、重置密码) |
| 角色管理 | 定义角色并分配权限 |
| 菜单管理 | 配置系统导航菜单结构 |
| 租户管理 | 多租户隔离管理(适用于SaaS模式) |
| 部门管理 | 组织架构部门管理 |
| 我的部门 | 当前用户所属部门信息 |
| 职务管理 | 定义系统内职务 |
| 通讯录 | 系统用户通讯录 |
| 数据字典 | 系统枚举值和字典数据维护 |
| 分类字典 | 分类树形字典维护 |
| 系统通告 | 发布系统级公告通知 |
| 菜单管理2 | 菜单管理的增强版/备用入口 |
---
## 17. 系统监控模块
系统运行状态监控和运维管理。
| 子模块 | 说明 |
|--------|------|
| 在线用户 | 查看当前在线用户列表,支持强制下线 |
| 路由网关 | 查看系统路由配置和网关状态 |
| 定时任务 | 管理系统的定时任务(Cron Job) |
| 日志管理 | 查看系统操作日志 |
| 数据日志 | 数据变更日志记录 |
| SQL监控 | SQL执行监控(基于Druid连接池) |
| 在线文档 | 系统API文档(Swagger/Knife4j) |
---
## 18. API接口清单
系统后端API部署在 `https://adtest.bylogistic.cn`,以下为已发现的API端点:
### 认证相关
| 接口 | 方法 | 说明 |
|------|------|------|
| `/sys/login` | POST | 用户登录 |
| `/sys/randomImage/{timestamp}` | GET | 获取验证码图片 |
| `/sys/permission/getUserPermissionByToken` | GET | 获取用户权限 |
### 数据字典
| 接口 | 方法 | 说明 |
|------|------|------|
| `/sys/dict/getDictItems/by_company` | GET | 获取公司字典 |
| `/sys/dict/getDictItems/by_order_status` | GET | 获取订单状态字典 |
| `/sys/dict/getDictItems/by_customer` | GET | 获取客户字典 |
| `/sys/dict/getDictItems/by_store` | GET | 获取仓库字典 |
| `/sys/dict/getDictItems/by_order_path` | GET | 获取订单路径字典 |
| `/sys/dict/getDictItems/by_fba` | GET | 获取FBA编码字典 |
### 系统功能
| 接口 | 方法 | 说明 |
|------|------|------|
| `/sys/annountCement/listByUser` | GET | 获取用户公告列表 |
| `/sys/loginfo` | GET | 系统日志信息 |
| `/sys/visitInfo` | GET | 访问统计信息 |
---
## 附录:SKU明细区域列头
在入库单详情页面,SKU明细表格包含以下列:
| 列名 | 说明 |
|------|------|
| 操作 | 编辑/删除操作 |
| # | 序号 |
| 报关HS_CODE | 报关用HS海关编码 |
| 货品图片 | 货品图片预览 |
| 仓/储/微(快递)码/纱 | 仓储编码/微信码/快递码 |
| 中品名 | 中文品名 |
| 英品名 | 英文品名 |
| 清关HS_CODE | 清关用HS海关编码 |
| 箱规长(cm) | 外箱长度 |
| 箱规宽(cm) | 外箱宽度 |
---
> **文档生成时间**: 2026-06-01
> **数据来源**: 测试系统 http://39.101.149.173 实际登录抓取
> **说明**: 部分页面因SPA路由限制未能获取完整表头信息,已根据菜单结构推断标注。如需补充具体页面详情,请登录系统确认后更新。
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff