1
@@ -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 & LAST-MILE LOGISTICS PROCESS · 全程节点可追踪</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 881 KiB |
|
After Width: | Height: | Size: 549 KiB |
|
After Width: | Height: | Size: 835 KiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 492 KiB |
|
After Width: | Height: | Size: 26 KiB |
@@ -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>
|
||||
|
After Width: | Height: | Size: 764 KiB |
@@ -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>
|
||||
|
After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 764 KiB |
@@ -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路由限制未能获取完整表头信息,已根据菜单结构推断标注。如需补充具体页面详情,请登录系统确认后更新。
|
||||