From 9cecea613e29bb152bb6ea69a3cca94aa537c621 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期三, 20 五月 2026 14:56:34 +0800
Subject: [PATCH] bom同一层级只能选一样的工序,增加提示

---
 src/views/index.vue | 3153 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 2,173 insertions(+), 980 deletions(-)

diff --git a/src/views/index.vue b/src/views/index.vue
index 7783b4e..3b9182b 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -1,980 +1,2173 @@
-<template>
-  <div class="app-container home">
-    <el-row :gutter="20">
-      <el-col :sm="24" :lg="24">
-        <blockquote class="text-warning" style="font-size: 14px">
-          棰嗗彇闃块噷浜戦�氱敤浜戜骇鍝�1888浼樻儬鍒�
-          <br />
-          <el-link
-            href="https://www.aliyun.com/minisite/goods?userCode=brki8iof"
-            type="primary"
-            target="_blank"
-            >https://www.aliyun.com/minisite/goods?userCode=brki8iof</el-link
-          >
-          <br />
-          棰嗗彇鑵捐浜戦�氱敤浜戜骇鍝�2860浼樻儬鍒�
-          <br />
-          <el-link
-            href="https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console"
-            type="primary"
-            target="_blank"
-            >https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console</el-link
-          >
-          <br />
-          闃块噷浜戞湇鍔″櫒鎶樻墸鍖�
-          <el-link href="http://aly.ruoyi.vip" type="primary" target="_blank"
-            >>鈽涒槢鐐规垜杩涘叆鈽氣槡</el-link
-          >
-          &nbsp;&nbsp;&nbsp; 鑵捐浜戞湇鍔″櫒绉掓潃鍖�
-          <el-link href="http://txy.ruoyi.vip" type="primary" target="_blank"
-            >>鈽涒槢鐐规垜杩涘叆鈽氣槡</el-link
-          ><br />
-          <h4 class="text-danger">
-            浜戜骇鍝侀�氱敤绾㈠寘锛屽彲鍙犲姞瀹樼綉甯歌浼樻儬浣跨敤銆�(浠呴檺鏂扮敤鎴�)
-          </h4>
-        </blockquote>
-
-        <hr />
-      </el-col>
-    </el-row>
-    <el-row :gutter="20">
-      <el-col :sm="24" :lg="12" style="padding-left: 20px">
-        <h2>鑻ヤ緷鍚庡彴绠$悊妗嗘灦</h2>
-        <p>
-          涓�鐩存兂鍋氫竴娆惧悗鍙扮鐞嗙郴缁燂紝鐪嬩簡寰堝浼樼鐨勫紑婧愰」鐩絾鏄彂鐜版病鏈夊悎閫傝嚜宸辩殑銆備簬鏄埄鐢ㄧ┖闂蹭紤鎭椂闂村紑濮嬭嚜宸卞啓涓�濂楀悗鍙扮郴缁熴�傚姝ゆ湁浜嗚嫢渚濈鐞嗙郴缁燂紝濂瑰彲浠ョ敤浜庢墍鏈夌殑Web搴旂敤绋嬪簭锛屽缃戠珯绠$悊鍚庡彴锛岀綉绔欎細鍛樹腑蹇冿紝CMS锛孋RM锛孫A绛夌瓑锛屽綋鐒讹紝鎮ㄤ篃鍙互瀵瑰ス杩涜娣卞害瀹氬埗锛屼互鍋氬嚭鏇村己绯荤粺銆傛墍鏈夊墠绔悗鍙颁唬鐮佸皝瑁呰繃鍚庡崄鍒嗙簿绠�鏄撲笂鎵嬶紝鍑洪敊姒傜巼浣庛�傚悓鏃舵敮鎸佺Щ鍔ㄥ鎴风璁块棶銆傜郴缁熶細闄嗙画鏇存柊涓�浜涘疄鐢ㄥ姛鑳姐��
-        </p>
-        <p>
-          <b>褰撳墠鐗堟湰:</b> <span>v{{ version }}</span>
-        </p>
-        <p>
-          <el-tag type="danger">&yen;鍏嶈垂寮�婧�</el-tag>
-        </p>
-        <p>
-          <el-button
-            type="primary"
-            icon="Cloudy"
-            plain
-            @click="goTarget('https://gitee.com/y_project/RuoYi-Vue')"
-            >璁块棶鐮佷簯</el-button
-          >
-          <el-button
-            icon="HomeFilled"
-            plain
-            @click="goTarget('http://ruoyi.vip')"
-            >璁块棶涓婚〉</el-button
-          >
-        </p>
-      </el-col>
-
-      <el-col :sm="24" :lg="12" style="padding-left: 50px">
-        <el-row>
-          <el-col :span="12">
-            <h2>鎶�鏈�夊瀷</h2>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="6">
-            <h4>鍚庣鎶�鏈�</h4>
-            <ul>
-              <li>SpringBoot</li>
-              <li>Spring Security</li>
-              <li>JWT</li>
-              <li>MyBatis</li>
-              <li>Druid</li>
-              <li>Fastjson</li>
-              <li>...</li>
-            </ul>
-          </el-col>
-          <el-col :span="6">
-            <h4>鍓嶇鎶�鏈�</h4>
-            <ul>
-              <li>Vue</li>
-              <li>Vuex</li>
-              <li>Element-ui</li>
-              <li>Axios</li>
-              <li>Sass</li>
-              <li>Quill</li>
-              <li>...</li>
-            </ul>
-          </el-col>
-        </el-row>
-      </el-col>
-    </el-row>
-    <el-divider />
-    <el-row :gutter="20">
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <template v-slot:header>
-            <div class="clearfix">
-              <span>鑱旂郴淇℃伅</span>
-            </div>
-          </template>
-          <div class="body">
-            <p>
-              <i class="el-icon-s-promotion"></i> 瀹樼綉锛�<el-link
-                href="http://www.ruoyi.vip"
-                target="_blank"
-                >http://www.ruoyi.vip</el-link
-              >
-            </p>
-            <p>
-              <i class="el-icon-user-solid"></i> QQ缇わ細<s> 婊�937441 </s> <s> 婊�887144332 </s>
-              <s> 婊�180251782 </s> <s> 婊�104180207 </s> <s> 婊�186866453 </s> <s> 婊�201396349 </s>
-              <s> 婊�101456076 </s> <s> 婊�101539465 </s> <s> 婊�264312783 </s> <s> 婊�167385320 </s> 
-              <s> 婊�104748341 </s> <s> 婊�160110482 </s> <s> 婊�170801498 </s> <s> 婊�108482800 </s> 
-              <s> 婊�101046199 </s> <a href="https://jq.qq.com/?_wv=1027&k=tKEt51dz" target="_blank">136919097</a>
-            </p>
-            <p>
-              <i class="el-icon-chat-dot-round"></i> 寰俊锛�<a
-                href="javascript:;"
-                >/ *鑻ヤ緷</a
-              >
-            </p>
-            <p>
-              <i class="el-icon-money"></i> 鏀粯瀹濓細<a
-                href="javascript:;"
-                class="鏀粯瀹濅俊鎭�"
-                >/ *鑻ヤ緷</a
-              >
-            </p>
-          </div>
-        </el-card>
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <template v-slot:header>
-            <div class="clearfix">
-              <span>鏇存柊鏃ュ織</span>
-            </div>
-          </template>
-          <el-collapse accordion>
-            <el-collapse-item title="v3.8.5 - 2023-01-01">
-              <ol>
-                <li>瀹氭椂浠诲姟杩濊鐨勫瓧绗�</li>
-                <li>閲嶇疆鏃跺彇娑堥儴闂ㄩ�変腑</li>
-                <li>鏂板杩斿洖璀﹀憡娑堟伅鎻愮ず</li>
-                <li>蹇界暐涓嶅繀瑕佺殑灞炴�ф暟鎹繑鍥�</li>
-                <li>淇敼鍙傛暟閿悕鏃剁Щ闄ゅ墠缂撳瓨閰嶇疆</li>
-                <li>瀵煎叆鏇存柊鐢ㄦ埛鏁版嵁鍓嶆牎楠屾暟鎹潈闄�</li>
-                <li>鍏煎Excel涓嬫媺妗嗗唴瀹硅繃澶氭棤娉曟樉绀虹殑闂</li>
-                <li>鍗囩骇echarts鍒版渶鏂扮増鏈�5.4.0</li>
-                <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.25.3</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.4.0</li>
-                <li>鍗囩骇kaptcha鍒版渶鏂扮増2.3.3</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.15</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.20</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.6</li>
-                <li>浼樺寲寮圭獥鍐呭杩囧灞曠ず涓嶅叏闂</li>
-                <li>浼樺寲swagger-ui闈欐�佽祫婧愪娇鐢ㄧ紦瀛�</li>
-                <li>寮�鍚疶opNav娌℃湁瀛愯彍鍗曢殣钘忎晶杈规爮</li>
-                <li>鍒犻櫎fuse鏃犳晥閫夐」maxPatternLength</li>
-                <li>浼樺寲瀵煎嚭瀵硅薄鐨勫瓙鍒楄〃涓虹┖浼氬嚭鐜癧]闂</li>
-                <li>浼樺寲缂栬緫澶村儚鏃堕�忔槑閮ㄥ垎浼氬彉鎴愰粦鑹查棶棰�</li>
-                <li>浼樺寲灏忓睆骞曚笂淇敼澶村儚鐣岄潰甯冨眬閿欎綅鐨勯棶棰�</li>
-                <li>淇浠g爜鐢熸垚鍕鹃�夊睘鎬ф棤鏁堥棶棰�</li>
-                <li>淇鏂囦欢涓婁紶缁勪欢鏍煎紡楠岃瘉闂</li>
-                <li>淇鍥炴樉鏁版嵁瀛楀吀鏁扮粍寮傚父闂</li>
-                <li>淇sheet瓒呭嚭鏈�澶ц鏁板紓甯搁棶棰�</li>
-                <li>淇Log娉ㄨВGET璇锋眰璁板綍涓嶅埌鍙傛暟闂</li>
-                <li>淇璋冨害鏃ュ織鐐瑰嚮澶氭鏁版嵁涓嶅彉鍖栫殑闂</li>
-                <li>淇涓婚棰滆壊鍦―rawer缁勪欢涓嶄細鍔犺浇闂</li>
-                <li>淇鏂囦欢鍚嶅寘鍚壒娈婂瓧绗︾殑鏂囦欢鏃犳硶涓嬭浇闂</li>
-                <li>淇table涓洿澶氭寜閽垏鎹富棰樿壊鏈敓鏁堜慨澶嶉棶棰�</li>
-                <li>淇鏌愪簺鐗规�х殑鐜鐢熸垚浠g爜鍙樹贡鐮乀XT鏂囦欢闂</li>
-                <li>淇浠g爜鐢熸垚鍥剧墖/鏂囦欢/鍗曢�夋椂閫夋嫨蹇呭~鏃犳硶鏍¢獙闂</li>
-                <li>淇鏌愪簺鐗规�х殑鎯呭喌鐢ㄦ埛缂栬緫瀵硅瘽妗嗕腑瑙掕壊鍜岄儴闂ㄦ棤娉曚慨鏀归棶棰�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.4 - 2022-09-26">
-              <ol>
-                <li>鏁版嵁閫昏緫鍒犻櫎涓嶈繘琛屽敮涓�楠岃瘉</li>
-                <li>Excel娉ㄨВ鏀寔瀵煎嚭瀵硅薄鐨勫瓙鍒楄〃鏂规硶</li>
-                <li>Excel娉ㄨВ鏀寔鑷畾涔夐殣钘忓睘鎬у垪</li>
-                <li>Excel娉ㄨВ鏀寔backgroundColor灞炴�ц缃儗鏅壊</li>
-                <li>鏀寔閰嶇疆瀵嗙爜鏈�澶ч敊璇鏁�/閿佸畾鏃堕棿</li>
-                <li>鐧诲綍鏃ュ織鏂板瑙i攣璐︽埛鍔熻兘</li>
-                <li>閫氱敤涓嬭浇鏂规硶鏂板config閰嶇疆閫夐」</li>
-                <li>鏀寔澶氭潈闄愬瓧绗﹀尮閰嶈鑹叉暟鎹潈闄�</li>
-                <li>椤甸潰鍐呭祵iframe鍒囨崲tab涓嶅埛鏂版暟鎹�</li>
-                <li>鎿嶄綔鏃ュ織璁板綍鏀寔鎺掗櫎鏁忔劅灞炴�у瓧娈�</li>
-                <li>淇澶氭枃浠朵笂浼犳姤閿欏嚭鐜扮殑寮傚父闂</li>
-                <li>淇鍥剧墖棰勮缁勪欢src灞炴�т负null鍊兼帶鍒跺彴鎶ラ敊闂</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.2.2</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.14</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.3</li>
-                <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.25.2</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.10</li>
-                <li>浼樺寲浠诲姟杩囨湡涓嶆墽琛岃皟搴�</li>
-                <li>浼樺寲瀛楀吀鏁版嵁浣跨敤store瀛樺彇</li>
-                <li>浼樺寲淇敼璧勬枡澶村儚琚鐩栫殑闂</li>
-                <li>浼樺寲淇敼鐢ㄦ埛鐧诲綍璐﹀彿閲嶅楠岃瘉</li>
-                <li>浼樺寲浠g爜鐢熸垚鍚屾鍚庡�糔ULL闂</li>
-                <li>浼樺寲瀹氭椂浠诲姟鏀寔鎵ц鐖剁被鏂规硶</li>
-                <li>浼樺寲鐢ㄦ埛涓汉淇℃伅鎺ュ彛闃叉淇敼閮ㄩ棬</li>
-                <li>浼樺寲甯冨眬璁剧疆浣跨敤el-drawer鎶藉眽鏄剧ず</li>
-                <li>浼樺寲娌℃湁鏉冮檺鐨勭敤鎴风紪杈戦儴闂ㄧ己灏戞暟鎹�</li>
-                <li>浼樺寲鏃ュ織娉ㄨВ璁板綍闄愬埗璇锋眰鍦板潃鐨勯暱搴�</li>
-                <li>浼樺寲excel/scale灞炴�у鍑哄崟鍏冩牸鏁板�肩被鍨�</li>
-                <li>浼樺寲鏃ュ織鎿嶄綔涓噸缃寜閽椂閲嶅鏌ヨ鐨勯棶棰�</li>
-                <li>浼樺寲澶氫釜鐩稿悓瑙掕壊鏁版嵁瀵艰嚧鏉冮檺SQL閲嶅闂</li>
-                <li>浼樺寲琛ㄦ牸涓婂彸渚у伐鍏锋潯锛堟悳绱㈡寜閽樉闅�&鍙充晶鏍峰紡鍑稿嚭锛�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.3 - 2022-06-27">
-              <ol>
-                <li>鏂板缂撳瓨鍒楄〃鑿滃崟鍔熻兘</li>
-                <li>浠g爜鐢熸垚鏍戣〃鏂板(灞曞紑/鎶樺彔)</li>
-                <li>Excel娉ㄨВ鏀寔color瀛椾綋棰滆壊</li>
-                <li>鏂板Anonymous鍖垮悕璁块棶涓嶉壌鏉冩敞瑙�</li>
-                <li>鐢ㄦ埛澶村儚涓婁紶闄愬埗鍙兘涓哄浘鐗囨牸寮�</li>
-                <li>鎺ュ彛浣跨敤娉涘瀷浣垮叾鐪嬪埌鍝嶅簲灞炴�у瓧娈�</li>
-                <li>妫�鏌ュ畾鏃朵换鍔ean鎵�鍦ㄥ寘鍚嶆槸鍚︿负鐧藉悕鍗曢厤缃�</li>
-                <li>娣诲姞椤电openPage鏀寔浼犻�掑弬鏁�</li>
-                <li>鐢ㄦ埛缂撳瓨淇℃伅娣诲姞閮ㄩ棬ancestors绁栫骇鍒楄〃</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.8</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.1.6</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈�1.2.11</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増2.0.8</li>
-                <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.14</li>
-                <li>闄嶇骇jsencrypt鐗堟湰鍏煎IE娴忚鍣�</li>
-                <li>鍒犻櫎澶氫綑鐨剆alt瀛楁</li>
-                <li>鏂板鑾峰彇涓嶅甫鍚庣紑鏂囦欢鍚嶇О鏂规硶</li>
-                <li>鏂板鑾峰彇閰嶇疆鏂囦欢涓殑灞炴�у�兼柟娉�</li>
-                <li>鏂板鍐呭缂栫爜/瑙g爜鏂逛究鎻掍欢闆嗘垚浣跨敤</li>
-                <li>瀛楀吀绫诲瀷蹇呴』浠ュ瓧姣嶅紑澶达紝涓斿彧鑳戒负锛堝皬鍐欏瓧姣嶏紝鏁板瓧锛屼笅婊戠嚎锛�</li>
-                <li>浼樺寲璁剧疆鍒嗛〉鍙傛暟榛樿鍊�</li>
-                <li>浼樺寲瀵圭┖瀛楃涓插弬鏁板鐞嗙殑杩囨护</li>
-                <li>浼樺寲鏄剧ず椤哄簭orderNum绫诲瀷涓烘暣鍨�</li>
-                <li>浼樺寲琛ㄥ崟鏋勫缓鎸夐挳涓嶆樉绀烘鍒欐牎楠�</li>
-                <li>浼樺寲瀛楀吀鏁版嵁鍥炴樉鏍峰紡涓嬫媺妗嗘樉绀哄��</li>
-                <li>浼樺寲R鍝嶅簲鎴愬姛鐘舵�佺爜涓庡叏灞�淇濇寔涓�鑷�</li>
-                <li>浼樺寲druid寮�鍚痺all杩囨护鍣ㄥ嚭鐜扮殑寮傚父闂</li>
-                <li>浼樺寲鐢ㄦ埛绠$悊宸︿晶鏍戝瀷缁勪欢澧炲姞閫変腑楂樹寒淇濇寔</li>
-                <li>浼樺寲鏂板鐢ㄦ埛涓庤鑹蹭俊鎭�&鐢ㄦ埛涓庡矖浣嶄俊鎭�昏緫</li>
-                <li>浼樺寲榛樿涓嶅惎鐢ㄥ帇缂╂枃浠剁紦瀛橀槻姝ode_modules杩囧ぇ</li>
-                <li>淇瀛楀吀鏁版嵁鏄剧ず涓嶅叏闂</li>
-                <li>淇鎿嶄綔鏃ュ織鏌ヨ绫诲瀷鏉′欢涓�0鏃朵細鏌ュ埌鎵�鏈夋暟鎹�</li>
-                <li>淇Excel娉ㄨВprompt/combo鍚屾椂浣跨敤涓嶇敓鏁堥棶棰�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.2 - 2022-04-01">
-              <ol>
-                <li>鍓嶇鏀寔璁剧疆鏄惁闇�瑕侀槻姝㈡暟鎹噸澶嶆彁浜�</li>
-                <li>寮�鍚疶opNav娌℃湁瀛愯彍鍗曟儏鍐甸殣钘忎晶杈规爮</li>
-                <li>渚ц竟鏍忚彍鍗曞悕绉拌繃闀挎偓鍋滄樉绀烘爣棰�</li>
-                <li>鐢ㄦ埛璁块棶鎺у埗鏃舵牎楠屾暟鎹潈闄愶紝闃叉瓒婃潈</li>
-                <li>瀵煎嚭Excel鏃跺睆钄藉叕寮忥紝闃叉CSV娉ㄥ叆椋庨櫓</li>
-                <li>缁勪欢ImagePreview鏀寔澶氬浘棰勮鏄剧ず</li>
-                <li>缁勪欢ImageUpload鏀寔澶氬浘鍚屾椂閫夋嫨涓婁紶</li>
-                <li>缁勪欢FileUpload鏀寔澶氭枃浠跺悓鏃堕�夋嫨涓婁紶</li>
-                <li>鏈嶅姟鐩戞帶鏂板杩愯鍙傛暟淇℃伅鏄剧ず</li>
-                <li>瀹氭椂浠诲姟鐩爣瀛楃涓茶繃婊ょ壒娈婂瓧绗�</li>
-                <li>瀹氭椂浠诲姟鐩爣瀛楃涓查獙璇佸寘鍚嶇櫧鍚嶅崟</li>
-                <li>浠g爜鐢熸垚鍒楄〃鍥剧墖鏀寔棰勮</li>
-                <li>浠g爜鐢熸垚缂栬緫淇敼鎵撳紑鏂伴〉绛�</li>
-                <li>浠g爜鐢熸垚鏂板Java绫诲瀷Boolean</li>
-                <li>浠g爜鐢熸垚瀛愯〃鏀寔鏃ユ湡/瀛楀吀閰嶇疆</li>
-                <li>浠g爜鐢熸垚鍚屾淇濈暀蹇呭~/绫诲瀷閫夐」</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈�6.1.2</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.80</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.1</li>
-                <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.11</li>
-                <li>鍗囩骇spring-boot-mybatis鍒版渶鏂扮増2.2.2</li>
-                <li>娣诲姞閬楁紡鐨勫垎椤靛弬鏁板悎鐞嗗寲灞炴��</li>
-                <li>淇敼npm鍗冲皢杩囨湡鐨勬敞鍐屾簮鍦板潃</li>
-                <li>淇鍒嗛〉缁勪欢璇锋眰涓ゆ闂</li>
-                <li>淇閫氱敤鏂囦欢涓嬭浇鎺ュ彛璺ㄥ煙闂</li>
-                <li>淇Xss娉ㄨВ瀛楁鍊间负绌烘椂鐨勫紓甯搁棶棰�</li>
-                <li>淇閫夐」鍗$偣鍑诲彸閿埛鏂颁涪澶卞弬鏁伴棶棰�</li>
-                <li>淇琛ㄥ崟娓呴櫎鍏冪礌浣嶇疆鏈瀭鐩村眳涓棶棰�</li>
-                <li>淇鏈嶅姟鐩戞帶涓繍琛屽弬鏁版樉绀烘潯浠堕敊璇�</li>
-                <li>淇瀵煎叆Excel鏃跺瓧鍏稿瓧娈电被鍨嬩负Long杞箟涓虹┖闂</li>
-                <li>淇鐧诲綍瓒呮椂鍒锋柊椤甸潰璺宠浆鐧诲綍椤甸潰杩樻彁绀洪噸鏂扮櫥褰曢棶棰�</li>
-                <li>浼樺寲鍔犺浇瀛楀吀缂撳瓨鏁版嵁</li>
-                <li>浼樺寲IP鍦板潃鑾峰彇鍒板涓殑闂</li>
-                <li>浼樺寲浠诲姟闃熷垪婊℃椂浠诲姟鎷掔粷绛栫暐</li>
-                <li>浼樺寲鏂囦欢涓婁紶鍏煎Weblogic鐜</li>
-                <li>浼樺寲瀹氭椂浠诲姟榛樿淇濆瓨鍒板唴瀛樹腑鎵ц</li>
-                <li>浼樺寲閮ㄩ棬淇敼缂╂斁鍚庡嚭鐜扮殑閿欎綅闂</li>
-                <li>浼樺寲Excel鏍煎紡鍖栦笉鍚岀被鍨嬬殑鏃ユ湡瀵硅薄</li>
-                <li>浼樺寲鑿滃崟琛ㄥ叧閿瓧瀵艰嚧鐨勬彃浠舵姤閿欓棶棰�</li>
-                <li>浼樺寲Oracle鐢ㄦ埛澶村儚鍒椾负绌烘椂涓嶆樉绀洪棶棰�</li>
-                <li>浼樺寲椤甸潰鑻ユ湭鍖归厤鍒板瓧鍏告爣绛惧垯杩斿洖鍘熷瓧鍏稿��</li>
-                <li>浼樺寲淇鐧诲綍澶辨晥鍚庡娆¤姹傛彁绀哄娆″脊绐楅棶棰�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.1 - 2022-01-01">
-              <ol>
-                <li>鏂板Vue3鍓嶇浠g爜鐢熸垚妯℃澘</li>
-                <li>鏂板鍥剧墖棰勮缁勪欢</li>
-                <li>鏂板鍘嬬缉鎻掍欢瀹炵幇鎵撳寘Gzip</li>
-                <li>鑷畾涔墄ss鏍¢獙娉ㄨВ瀹炵幇</li>
-                <li>鑷畾涔夋枃瀛楀鍒跺壀璐存寚浠�</li>
-                <li>浠g爜鐢熸垚棰勮鏀寔澶嶅埗鍐呭</li>
-                <li>璺敱鏀寔鍗曠嫭閰嶇疆鑿滃崟鎴栬鑹叉潈闄�</li>
-                <li>鐢ㄦ埛绠$悊閮ㄩ棬鏌ヨ閫夋嫨鑺傜偣鍚庡垎椤靛弬鏁板垵濮�</li>
-                <li>淇鐢ㄦ埛鍒嗛厤瑙掕壊灞炴�ч敊璇�</li>
-                <li>淇鎵撳寘鍚庡瓧浣撳浘鏍囧伓鐜扮殑涔辩爜闂</li>
-                <li>淇鑿滃崟绠$悊閲嶇疆琛ㄥ崟鍑虹幇鐨勯敊璇�</li>
-                <li>淇鐗堟湰宸紓瀵艰嚧鐨勬噿鍔犺浇鎶ラ敊闂</li>
-                <li>淇Cron缁勪欢涓懆鍥炴樉闂</li>
-                <li>淇瀹氭椂浠诲姟澶氬弬鏁伴�楀彿鍒嗛殧鐨勯棶棰�</li>
-                <li>淇鏍规嵁ID鏌ヨ鍒楄〃鍙兘鍑虹幇鐨勪富閿孩鍑洪棶棰�</li>
-                <li>淇tomcat閰嶇疆鍙傛暟宸茶繃鏈熼棶棰�</li>
-                <li>鍗囩骇clipboard鍒版渶鏂扮増鏈�2.0.8</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.6</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.79</li>
-                <li>鍗囩骇spring-boot鍒版渶鏂扮増鏈�2.5.8</li>
-                <li>鍗囩骇log4j2鍒�2.17.1锛岄槻姝㈡紡娲為闄�</li>
-                <li>浼樺寲涓嬭浇瑙f瀽blob寮傚父鎻愮ず</li>
-                <li>浼樺寲浠g爜鐢熸垚瀛楀吀缁勯噸澶嶉棶棰�</li>
-                <li>浼樺寲鏌ヨ鐢ㄦ埛鐨勮鑹茬粍&宀椾綅缁勪唬鐮�</li>
-                <li>浼樺寲瀹氭椂浠诲姟cron琛ㄨ揪寮忓皬鏃惰缃�24</li>
-                <li>浼樺寲鐢ㄦ埛瀵煎叆鎻愮ず婧㈠嚭鍒欐樉绀烘粴鍔ㄦ潯</li>
-                <li>浼樺寲闃查噸澶嶆彁浜ゆ爣璇嗙粍鍚堜负(key+url+header)</li>
-                <li>浼樺寲鍒嗛〉鏂规硶璁剧疆鎴愰�氱敤鏂逛究鐏垫椿璋冪敤</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.8.0 - 2021-12-01">
-              <ol>
-                <li>鏂板閰嶅骞跺悓姝ョ殑Vue3鍓嶇鐗堟湰</li>
-                <li>鏂板閫氱敤鏂规硶绠�鍖栨ā鎬�/缂撳瓨/涓嬭浇/鏉冮檺/椤电浣跨敤</li>
-                <li>浼樺寲瀵煎嚭鏁版嵁/浣跨敤閫氱敤涓嬭浇鏂规硶</li>
-                <li>Excel娉ㄨВ鏀寔鑷畾涔夋暟鎹鐞嗗櫒</li>
-                <li>Excel娉ㄨВ鏀寔瀵煎叆瀵煎嚭鏍囬淇℃伅</li>
-                <li>Excel瀵煎叆鏀寔@Excels娉ㄨВ</li>
-                <li>鏂板缁勪欢data-dict锛岀畝鍖栨暟鎹瓧鍏镐娇鐢�</li>
-                <li>鏂板Jaxb渚濊禆锛岄槻姝dk8浠ヤ笂鍑虹幇鐨勫吋瀹归敊璇�</li>
-                <li>鐢熶骇鐜浣跨敤璺敱鎳掑姞杞芥彁鍗囬〉闈㈠搷搴旈�熷害</li>
-                <li>淇浜旂骇浠ヤ笂鑿滃崟鍑虹幇鐨�404闂</li>
-                <li>闃查噸鎻愪氦娉ㄨВ鏀寔閰嶇疆闂撮殧鏃堕棿/鎻愮ず娑堟伅</li>
-                <li>鏃ュ織娉ㄨВ鏂板鏄惁淇濆瓨鍝嶅簲鍙傛暟</li>
-                <li>浠诲姟灞忚斀杩濊瀛楃&鍙傛暟蹇界暐鍙屽紩鍙蜂腑鐨勯�楀彿</li>
-                <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.5.6</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.4.0</li>
-                <li>鍗囩骇spring-boot-mybatis鍒版渶鏂扮増2.2.0</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.2</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増1.2.8</li>
-                <li>鍗囩骇velocity鍒版渶鏂扮増鏈�2.3</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.78</li>
-                <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.24.0</li>
-                <li>鍗囩骇dart-sass鍒扮増鏈�1.32.13</li>
-                <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.19.1</li>
-                <li>鍗囩骇jsencrypt鍒版渶鏂扮増鏈�3.2.1</li>
-                <li>鍗囩骇js-cookie鍒版渶鏂扮増鏈�3.0.1</li>
-                <li>鍗囩骇file-saver鍒版渶鏂扮増鏈�2.0.5</li>
-                <li>鍗囩骇sass-loader鍒版渶鏂扮増鏈�10.1.1</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.6</li>
-                <li>鏂板sendGet鏃犲弬璇锋眰鏂规硶</li>
-                <li>绂佺敤el-tag缁勪欢鐨勬笎鍙樺姩鐢�</li>
-                <li>浠g爜鐢熸垚鐐瑰嚮棰勮閲嶇疆婵�娲籺ab</li>
-                <li>AjaxResult閲嶅啓put鏂规硶锛屼互鏂逛究閾惧紡璋冪敤</li>
-                <li>浼樺寲鐧诲綍/楠岃瘉鐮佽姹俬eaders涓嶈缃畉oken</li>
-                <li>浼樺寲鐢ㄦ埛涓汉淇℃伅鎺ュ彛闃叉淇敼鐢ㄦ埛鍚�</li>
-                <li>浼樺寲Cron琛ㄨ揪寮忕敓鎴愬櫒鍏抽棴鏃堕攢姣侀伩鍏嶇紦瀛�</li>
-                <li>浼樺寲娉ㄥ唽鎴愬姛鎻愮ず娑堟伅绫诲瀷success</li>
-                <li>浼樺寲aop璇硶锛屼娇鐢╯pring鑷姩娉ㄥ叆娉ㄨВ</li>
-                <li>浼樺寲璁板綍鐧诲綍淇℃伅锛岀Щ闄や笉蹇呰鐨勪慨鏀�</li>
-                <li>浼樺寲mybatis鍏ㄥ眬榛樿鐨勬墽琛屽櫒</li>
-                <li>浼樺寲Excel瀵煎叆鍥剧墖鍙兘鍑虹幇鐨勫紓甯�</li>
-                <li>淇浠g爜鐢熸垚妯℃澘涓诲瓙琛ㄥ垹闄ょ己灏戜簨鍔�</li>
-                <li>淇鏃ュ織璁板綍鍙兘鍑虹幇鐨勮浆鎹㈠紓甯�</li>
-                <li>淇浠g爜鐢熸垚澶嶉�夋瀛楀吀閬楁紡闂</li>
-                <li>淇鍏抽棴xss鍔熻兘瀵艰嚧鍙噸澶嶈RepeatableFilter澶辨晥</li>
-                <li>淇瀛楃涓叉棤娉曡鍙嶈浆涔夐棶棰�</li>
-                <li>淇鍚庣涓诲瓙琛ㄤ唬鐮佹ā鏉挎柟娉曞悕鐢熸垚閿欒闂</li>
-                <li>淇xss杩囨护鍚庢牸寮忓嚭鐜扮殑寮傚父</li>
-                <li>淇swagger娌℃湁鎸囧畾dataTypeClass瀵艰嚧鍚姩鍑虹幇warn鏃ュ織</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.7.0 - 2021-09-13">
-              <ol>
-                <li>鍙傛暟绠$悊鏀寔閰嶇疆楠岃瘉鐮佸紑鍏�</li>
-                <li>鏂板鏄惁寮�鍚敤鎴锋敞鍐屽姛鑳�</li>
-                <li>瀹氭椂浠诲姟鏀寔鍦ㄧ嚎鐢熸垚cron琛ㄨ揪寮�</li>
-                <li>鑿滃崟绠$悊鏀寔閰嶇疆璺敱鍙傛暟</li>
-                <li>鏀寔鑷畾涔夋敞瑙e疄鐜版帴鍙i檺娴�</li>
-                <li>Excel娉ㄨВ鏀寔Image鍥剧墖瀵煎叆</li>
-                <li>鑷畾涔夊脊灞傛孩鍑烘粴鍔ㄦ牱寮�</li>
-                <li>鑷畾涔夊彲鎷栧姩寮圭獥瀹藉害鎸囦护</li>
-                <li>鑷畾涔夊彲鎷栧姩寮圭獥楂樺害鎸囦护</li>
-                <li>淇浠绘剰璐︽埛瓒婃潈闂</li>
-                <li>淇敼鏃舵鏌ョ敤鎴锋暟鎹潈闄愯寖鍥�</li>
-                <li>淇淇濆瓨閰嶇疆涓婚棰滆壊澶辨晥闂</li>
-                <li>鏂板鏆楄壊鑿滃崟椋庢牸涓婚</li>
-                <li>鑿滃崟&閮ㄩ棬鏂板灞曞紑/鎶樺彔鍔熻兘</li>
-                <li>椤电鏂板鍏抽棴宸︿晶&娣诲姞鍥炬爣</li>
-                <li>椤堕儴鑿滃崟鎺掗櫎闅愯棌鐨勯粯璁よ矾鐢�</li>
-                <li>椤堕儴鑿滃崟鍚屾绯荤粺涓婚鏍峰紡</li>
-                <li>璺宠浆璺敱楂樹寒鐩稿搴旂殑鑿滃崟鏍�</li>
-                <li>浠g爜鐢熸垚涓诲瓙琛ㄥ閫夎鏁版嵁</li>
-                <li>鏃ユ湡鑼冨洿鏀寔娣诲姞澶氱粍</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.5</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.8.0</li>
-                <li>鍗囩骇commons.io鍒版渶鏂扮増鏈瑅2.11.0</li>
-                <li>瀹氭椂浠诲姟灞忚斀ldap杩滅▼璋冪敤</li>
-                <li>瀹氭椂浠诲姟灞忚斀http(s)杩滅▼璋冪敤</li>
-                <li>琛ュ厖瀹氭椂浠诲姟琛ㄥ瓧娈垫敞閲�</li>
-                <li>瀹氭椂浠诲姟瀵规鏌ュ紓甯歌繘琛屼簨鍔″洖婊�</li>
-                <li>鍚敤鐖堕儴闂ㄧ姸鎬佹帓闄ら《绾ц妭鐐�</li>
-                <li>瀵屾枃鏈柊澧炰笂浼犳枃浠跺ぇ灏忛檺鍒�</li>
-                <li>榛樿棣栭〉浣跨敤keep-alive缂撳瓨</li>
-                <li>淇敼浠g爜鐢熸垚瀛楀吀鍥炴樉鏍峰紡</li>
-                <li>鑷畾涔夊垎椤靛悎鐞嗗寲浼犲叆鍙傛暟</li>
-                <li>淇瀛楀吀缁勪欢鍊间负鏁村舰涓嶆樉绀洪棶棰�</li>
-                <li>淇瀹氭椂浠诲姟鏃ュ織鎵ц鐘舵�佹樉绀�</li>
-                <li>瑙掕壊&鑿滃崟鏂板瀛楁灞炴�ф彁绀轰俊鎭�</li>
-                <li>淇瑙掕壊鍒嗛厤鐢ㄦ埛椤甸潰鍙傛暟绫诲瀷閿欒鎻愰啋</li>
-                <li>浼樺寲甯冨眬璁剧疆鍔ㄧ敾鐗规晥</li>
-                <li>浼樺寲寮傚父澶勭悊淇℃伅</li>
-                <li>浼樺寲閿欒token瀵艰嚧鐨勮В鏋愬紓甯�</li>
-                <li>瀵嗙爜妗嗘柊澧炴樉绀哄垏鎹㈠瘑鐮佸浘鏍�</li>
-                <li>瀹氭椂浠诲姟鏂板鏇村鎿嶄綔</li>
-                <li>鏇村鎿嶄綔鎸夐挳娣诲姞鏉冮檺鎺у埗</li>
-                <li>瀵煎叆鐢ㄦ埛鏍峰紡浼樺寲</li>
-                <li>鎻愬彇閫氱敤鏂规硶鍒板熀绫绘帶鍒跺櫒</li>
-                <li>浼樺寲浣跨敤鏉冮檺宸ュ叿鑾峰彇鐢ㄦ埛淇℃伅</li>
-                <li>浼樺寲鐢ㄦ埛涓嶈兘鍒犻櫎鑷繁</li>
-                <li>浼樺寲XSS璺ㄧ珯鑴氭湰杩囨护</li>
-                <li>浼樺寲浠g爜鐢熸垚妯℃澘</li>
-                <li>楠岃瘉鐮侀粯璁�20s瓒呮椂</li>
-                <li>BLOB涓嬭浇鏃舵竻闄RL瀵硅薄寮曠敤</li>
-                <li>浠g爜鐢熸垚瀵煎叆琛ㄦ寜鍒涘缓鏃堕棿鎺掑簭</li>
-                <li>淇浠g爜鐢熸垚椤甸潰鏁版嵁缂栬緫淇濆瓨涔嬪悗鎬绘槸璺宠浆绗竴椤电殑闂</li>
-                <li>淇甯afari娴忚鍣ㄦ棤娉曟牸寮忓寲utc鏃ユ湡鏍煎紡yyyy-MM-dd'T'HH:mm:ss.SSS闂</li>
-                <li>澶氬浘涓婁紶缁勪欢绉婚櫎澶氫綑鐨刟pi鍦板潃&楠岃瘉澶辫触瀵艰嚧鍥剧墖鍒犻櫎闂&鏃犳硶鍒犻櫎鐩稿簲鍥剧墖淇</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.6.0 - 2021-07-12">
-              <ol>
-                <li>瑙掕壊绠$悊鏂板鍒嗛厤鐢ㄦ埛鍔熻兘</li>
-                <li>鐢ㄦ埛绠$悊鏂板鍒嗛厤瑙掕壊鍔熻兘</li>
-                <li>鏃ュ織鍒楄〃鏀寔鎺掑簭鎿嶄綔</li>
-                <li>浼樺寲鍙傛暟&瀛楀吀缂撳瓨鎿嶄綔</li>
-                <li>绯荤粺甯冨眬閰嶇疆鏀寔鍔ㄦ�佹爣棰樺紑鍏�</li>
-                <li>鑿滃崟璺敱閰嶇疆鏀寔鍐呴摼璁块棶</li>
-                <li>榛樿璁块棶鍚庣棣栭〉鏂板鎻愮ず璇�</li>
-                <li>瀵屾枃鏈粯璁や笂浼犺繑鍥瀠rl绫诲瀷</li>
-                <li>鏂板鑷畾涔夊脊绐楁嫋鎷芥寚浠�</li>
-                <li>鍏ㄥ眬娉ㄥ唽甯哥敤閫氱敤缁勪欢</li>
-                <li>鍏ㄥ眬鎸傝浇瀛楀吀鏍囩缁勪欢</li>
-                <li>ImageUpload缁勪欢鏀寔澶氬浘鐗囦笂浼�</li>
-                <li>FileUpload缁勪欢鏀寔澶氭枃浠朵笂浼�</li>
-                <li>鏂囦欢涓婁紶缁勪欢娣诲姞鏁伴噺闄愬埗灞炴��</li>
-                <li>瀵屾枃鏈紪杈戠粍浠舵坊鍔犵被鍨嬪睘鎬�</li>
-                <li>瀵屾枃鏈粍浠跺伐鍏锋爮閰嶇疆瑙嗛</li>
-                <li>灏佽閫氱敤iframe缁勪欢</li>
-                <li>闄愬埗瓒呯骇绠$悊鍛樹笉鍏佽鎿嶄綔</li>
-                <li>鐢ㄦ埛淇℃伅闀垮害鏍¢獙闄愬埗</li>
-                <li>鍒嗛〉缁勪欢鏂板pagerCount灞炴��</li>
-                <li>娣诲姞bat鑴氭湰鎵ц搴旂敤</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.7.4</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.2</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.3.1</li>
-                <li>鍗囩骇commons.io鍒版渶鏂扮増鏈瑅2.10.0</li>
-                <li>鍗囩骇commons.fileupload鍒版渶鏂扮増鏈瑅1.4</li>
-                <li>鍗囩骇swagger鍒版渶鏂扮増鏈瑅3.0.0</li>
-                <li>淇鍏抽棴confirm鎻愮ず妗嗘帶鍒跺彴鎶ラ敊闂</li>
-                <li>淇瀛樺湪鐨凷QL娉ㄥ叆婕忔礊闂</li>
-                <li>瀹氭椂浠诲姟灞忚斀rmi杩滅▼璋冪敤</li>
-                <li>淇鐢ㄦ埛鎼滅储鍒嗛〉鍙橀噺閿欒</li>
-                <li>淇瀵煎嚭瑙掕壊鏁版嵁鑼冨洿缈昏瘧缂哄皯浠呮湰浜�</li>
-                <li>淇琛ㄥ崟鏋勫缓閫夋嫨涓嬫媺閫夋嫨鎺у埗鍙版姤閿欓棶棰�</li>
-                <li>浼樺寲鍥剧墖宸ュ叿绫昏鍙栨枃浠�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.5.0 - 2021-05-25">
-              <ol>
-                <li>鏂板鑿滃崟瀵艰埅鏄剧ず椋庢牸TopNav锛坒alse涓哄乏渚у鑸彍鍗曪紝true涓洪《閮ㄥ鑸彍鍗曪級</li>
-                <li>甯冨眬璁剧疆鏀寔淇濆瓨&閲嶇疆閰嶇疆</li>
-                <li>淇鏍戣〃鏁版嵁鏄剧ず涓嶅叏&鍔犺浇鎱㈤棶棰�</li>
-                <li>鏂板IE娴忚鍣ㄧ増鏈繃浣庢彁绀洪〉闈�</li>
-                <li>鐢ㄦ埛鐧诲綍鍚庤褰曟渶鍚庣櫥褰旾P&鏃堕棿</li>
-                <li>椤甸潰瀵煎嚭鎸夐挳鐐瑰嚮涔嬪悗娣诲姞閬僵</li>
-                <li>瀵屾枃鏈紪杈戝櫒鏀寔鑷畾涔変笂浼犲湴鍧�</li>
-                <li>瀵屾枃鏈紪杈戠粍浠舵柊澧瀝eadOnly灞炴��</li>
-                <li>椤电TagsView鏂板鍏抽棴鍙充晶鍔熻兘</li>
-                <li>鏄鹃殣鍒楃粍浠跺姞杞藉垵濮嬮粯璁ら殣钘忓垪</li>
-                <li>鍏抽棴澶村儚涓婁紶绐楀彛杩樺師榛樿鍥剧墖</li>
-                <li>涓汉淇℃伅娣诲姞鎵嬫満&閭閲嶅楠岃瘉</li>
-                <li>浠g爜鐢熸垚妯℃澘瀵煎嚭鎸夐挳鐐瑰嚮鍚庢坊鍔犻伄缃�</li>
-                <li>浠g爜鐢熸垚妯℃澘鏍戣〃鎿嶄綔鍒楁坊鍔犳柊澧炴寜閽�</li>
-                <li>浠g爜鐢熸垚妯℃澘淇涓诲瓙琛ㄥ瓧娈甸噸鍚嶉棶棰�</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.76</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.6</li>
-                <li>鍗囩骇mybatis鍒版渶鏂扮増3.5.6 闃绘杩滅▼浠g爜鎵ц婕忔礊</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.6.0</li>
-                <li>velocity鍓旈櫎commons-collections鐗堟湰锛岄槻姝�3.2.1鐗堟湰鐨勫弽搴忓垪鍖栨紡娲�</li>
-                <li>鏁版嵁鐩戞帶椤甸粯璁よ处鎴峰瘑鐮侀槻姝㈣秺鏉冭闂�</li>
-                <li>淇firefox涓嬭〃鍗曟瀯寤烘嫋鎷戒細鏂版墦鍗′竴涓�夐」鍗�</li>
-                <li>淇鍚庣瀵煎叆琛ㄦ潈闄愭爣璇�</li>
-                <li>淇鍓嶇鎿嶄綔鏃ュ織&鐧诲綍鏃ュ織鏉冮檺鏍囪瘑</li>
-                <li>璁剧疆Redis閰嶇疆HashKey搴忓垪鍖�</li>
-                <li>鍒犻櫎鎿嶄綔鏃ュ織璁板綍淇℃伅</li>
-                <li>涓婁紶濯掍綋绫诲瀷娣诲姞瑙嗛鏍煎紡</li>
-                <li>淇璇锋眰褰㈠弬鏈紶鍊艰褰曟棩蹇楀紓甯搁棶棰�</li>
-                <li>浼樺寲xss鏍¢獙json璇锋眰鏉′欢</li>
-                <li>鏍戠骇缁撴瀯鏇存柊瀛愯妭鐐逛娇鐢╮eplaceFirst</li>
-                <li>浼樺寲ExcelUtil绌哄�煎鐞�</li>
-                <li>鏃ュ織璁板綍杩囨护BindingResult瀵硅薄锛岄槻姝㈠紓甯�</li>
-                <li>淇敼涓婚鍚巑ini绫诲瀷鎸夐挳鏃犳晥闂</li>
-                <li>浼樺寲閫氱敤涓嬭浇瀹屾垚鍚庡垹闄よ妭鐐�</li>
-                <li>閫氱敤Controller娣诲姞鍝嶅簲杩斿洖娑堟伅</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.4.0 - 2021-02-22">
-              <ol>
-                <li>浠g爜鐢熸垚妯℃澘鏀寔涓诲瓙琛�</li>
-                <li>琛ㄦ牸鍙充晶宸ュ叿鏍忕粍浠舵敮鎸佹樉闅愬垪</li>
-                <li>鍥剧墖缁勪欢娣诲姞棰勮&绉婚櫎鍔熻兘</li>
-                <li>Excel娉ㄨВ鏀寔Image鍥剧墖瀵煎嚭</li>
-                <li>鎿嶄綔鎸夐挳缁勮皟鏁翠负鏈寸礌鎸夐挳鏍峰紡</li>
-                <li>浠g爜鐢熸垚鏀寔鏂囦欢涓婁紶缁勪欢</li>
-                <li>浠g爜鐢熸垚鏃ユ湡鎺т欢鍖哄垎鑼冨洿</li>
-                <li>浠g爜鐢熸垚鏁版嵁搴撴枃鏈被鍨嬬敓鎴愯〃鍗曟枃鏈煙</li>
-                <li>鐢ㄦ埛鎵嬫満閭&鑿滃崟缁勪欢淇敼鍏佽绌哄瓧绗︿覆</li>
-                <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.2.13 鎻愬崌鍚姩閫熷害</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.4</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.75</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.15.0</li>
-                <li>淇IE11娴忚鍣ㄦ姤閿欓棶棰�</li>
-                <li>浼樺寲澶氱骇鑿滃崟涔嬮棿鍒囨崲鏃犳硶缂撳瓨鐨勯棶棰�</li>
-                <li>淇鍥涚骇鑿滃崟鏃犳硶鏄剧ず闂</li>
-                <li>淇渚ц竟鏍忛潤鎬佽矾鐢变涪澶遍棶棰�</li>
-                <li>淇瑙掕壊绠$悊-缂栬緫瑙掕壊-鍔熻兘鏉冮檺鏄剧ず寮傚父</li>
-                <li>閰嶇疆鏂囦欢鏂板redis鏁版嵁搴撶储寮曞睘鎬�</li>
-                <li>鏉冮檺宸ュ叿绫诲鍔燼dmin鍒ゆ柇</li>
-                <li>瑙掕壊闈炶嚜瀹氫箟鏉冮檺鑼冨洿娓呯┖閫夋嫨鍊�</li>
-                <li>淇瀵煎叆鏁版嵁涓鸿礋娴偣鏁版椂涓㈠け绮惧害闂</li>
-                <li>绉婚櫎path-to-regexp姝e垯鍖归厤鎻掍欢</li>
-                <li>淇鐢熸垚鏍戣〃浠g爜寮傚父</li>
-                <li>淇敼ip瀛楁闀垮害闃叉ipv6鍦板潃闀垮害涓嶅</li>
-                <li>闃叉get璇锋眰鍙傛暟鍊间负false鎴�0绛夌壒娈婂�间細瀵艰嚧鏃犳硶姝g‘鐨勪紶鍙�</li>
-                <li>鐧诲綍鍚巔ush娣诲姞catch闃叉鍑虹幇妫�鏌ラ敊璇�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.3.0 - 2020-12-14">
-              <ol>
-                <li>鏂板缂撳瓨鐩戞帶鍔熻兘</li>
-                <li>鏀寔涓婚椋庢牸閰嶇疆</li>
-                <li>淇澶氱骇鑿滃崟涔嬮棿鍒囨崲鏃犳硶缂撳瓨鐨勯棶棰�</li>
-                <li>澶氱骇鑿滃崟鑷姩閰嶇疆缁勪欢</li>
-                <li>浠g爜鐢熸垚棰勮鏀寔楂樹寒鏄剧ず</li>
-                <li>鏀寔Get璇锋眰鏄犲皠Params鍙傛暟</li>
-                <li>鍒犻櫎鐢ㄦ埛鍜岃鑹茶В缁戝叧鑱�</li>
-                <li>鍘婚櫎鐢ㄦ埛鎵嬫満閭閮ㄩ棬蹇呭~楠岃瘉</li>
-                <li>Excel鏀寔娉ㄨВalign瀵归綈鏂瑰紡</li>
-                <li>Excel鏀寔瀵煎叆Boolean鍨嬫暟鎹�</li>
-                <li>浼樺寲澶村儚鏍峰紡锛岄紶鏍囩Щ鍏ユ偓鍋滈伄缃�</li>
-                <li>浠g爜鐢熸垚棰勮鎻愪緵婊氬姩鏈哄埗</li>
-                <li>浠g爜鐢熸垚鍒犻櫎澶氫綑鐨勬暟瀛梖loat绫诲瀷</li>
-                <li>淇杞崲瀛楃涓茬殑鐩爣瀛楃闆嗗睘鎬�</li>
-                <li>鍥炴樉鏁版嵁瀛楀吀闃叉绌哄�兼姤閿�</li>
-                <li>鏃ュ織璁板綍澧炲姞杩囨护澶氭枃浠跺満鏅�</li>
-                <li>淇敼缂撳瓨Set鏂规硶鍙兘瀵艰嚧宓屽鐨勯棶棰�</li>
-                <li>绉婚櫎鍓嶇涓�浜涘浣欑殑渚濊禆</li>
-                <li>闃叉瀹夊叏鎵弿YUI鍑虹幇鐨勯闄╂彁绀�</li>
-                <li>淇敼node-sass涓篸art-sass</li>
-                <li>鍗囩骇SpringBoot鍒版渶鏂扮増鏈�2.1.18</li>
-                <li>鍗囩骇poi鍒版渶鏂扮増鏈�4.1.2</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.3.6</li>
-                <li>鍗囩骇bitwalker鍒版渶鏂扮増鏈�1.21</li>
-                <li>鍗囩骇axios鍒版渶鏂扮増鏈�0.21.0</li>
-                <li>鍗囩骇element-ui鍒版渶鏂扮増鏈�2.14.1</li>
-                <li>鍗囩骇vue鍒版渶鏂扮増鏈�2.6.12</li>
-                <li>鍗囩骇vuex鍒版渶鏂扮増鏈�3.6.0</li>
-                <li>鍗囩骇vue-cli鍒扮増鏈�4.5.9</li>
-                <li>鍗囩骇vue-router鍒版渶鏂扮増鏈�3.4.9</li>
-                <li>鍗囩骇vue-cli鍒版渶鏂扮増鏈�4.4.6</li>
-                <li>鍗囩骇vue-cropper鍒版渶鏂扮増鏈�0.5.5</li>
-                <li>鍗囩骇clipboard鍒版渶鏂扮増鏈�2.0.6</li>
-                <li>鍗囩骇core-js鍒版渶鏂扮増鏈�3.8.1</li>
-                <li>鍗囩骇echarts鍒版渶鏂扮増鏈�4.9.0</li>
-                <li>鍗囩骇file-saver鍒版渶鏂扮増鏈�2.0.4</li>
-                <li>鍗囩骇fuse.js鍒版渶鏂扮増鏈�6.4.3</li>
-                <li>鍗囩骇js-beautify鍒版渶鏂扮増鏈�1.13.0</li>
-                <li>鍗囩骇js-cookie鍒版渶鏂扮増鏈�2.2.1</li>
-                <li>鍗囩骇path-to-regexp鍒版渶鏂扮増鏈�6.2.0</li>
-                <li>鍗囩骇quill鍒版渶鏂扮増鏈�1.3.7</li>
-                <li>鍗囩骇screenfull鍒版渶鏂扮増鏈�5.0.2</li>
-                <li>鍗囩骇sortablejs鍒版渶鏂扮増鏈�1.10.2</li>
-                <li>鍗囩骇vuedraggable鍒版渶鏂扮増鏈�2.24.3</li>
-                <li>鍗囩骇chalk鍒版渶鏂扮増鏈�4.1.0</li>
-                <li>鍗囩骇eslint鍒版渶鏂扮増鏈�7.15.0</li>
-                <li>鍗囩骇eslint-plugin-vue鍒版渶鏂扮増鏈�7.2.0</li>
-                <li>鍗囩骇lint-staged鍒版渶鏂扮増鏈�10.5.3</li>
-                <li>鍗囩骇runjs鍒版渶鏂扮増鏈�4.4.2</li>
-                <li>鍗囩骇sass-loader鍒版渶鏂扮増鏈�10.1.0</li>
-                <li>鍗囩骇script-ext-html-webpack-plugin鍒版渶鏂扮増鏈�2.1.5</li>
-                <li>鍗囩骇svg-sprite-loader鍒版渶鏂扮増鏈�5.1.1</li>
-                <li>鍗囩骇vue-template-compiler鍒版渶鏂扮増鏈�2.6.12</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.2.1 - 2020-11-18">
-              <ol>
-                <li>闃绘浠绘剰鏂囦欢涓嬭浇婕忔礊</li>
-                <li>浠g爜鐢熸垚鏀寔涓婁紶鎺т欢</li>
-                <li>鏂板鍥剧墖涓婁紶缁勪欢</li>
-                <li>璋冩暣榛樿棣栭〉</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.2</li>
-                <li>mapperLocations閰嶇疆鏀寔鍒嗛殧绗�</li>
-                <li>鏉冮檺淇℃伅璋冩暣</li>
-                <li>璋冩暣sql榛樿鏃堕棿</li>
-                <li>瑙e喅浠g爜鐢熸垚娌℃湁bit绫诲瀷鐨勯棶棰�</li>
-                <li>鍗囩骇pagehelper鍒版渶鏂扮増1.3.0</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v3.2.0 - 2020-10-10">
-              <ol>
-                <li>鍗囩骇springboot鐗堟湰鍒�2.1.17 鎻愬崌瀹夊叏鎬�</li>
-                <li>鍗囩骇oshi鍒版渶鏂扮増鏈瑅5.2.5</li>
-                <li>鍗囩骇druid鍒版渶鏂扮増鏈瑅1.2.1</li>
-                <li>鍗囩骇jjwt鍒扮増鏈�0.9.1</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.74</li>
-                <li>淇敼sass涓簄ode-sass锛岄伩鍏峞l-icon鍥炬爣涔辩爜</li>
-                <li>浠g爜鐢熸垚鏀寔鍚屾鏁版嵁搴�</li>
-                <li>浠g爜鐢熸垚鏀寔瀵屾枃鏈帶浠�</li>
-                <li>浠g爜鐢熸垚椤甸潰鏃朵笉蹇界暐remark灞炴��</li>
-                <li>浠g爜鐢熸垚娣诲姞select蹇呭~閫夐」</li>
-                <li>Excel瀵煎嚭绫诲瀷NUMERIC鏀寔绮惧害娴偣绫诲瀷</li>
-                <li>Excel瀵煎嚭targetAttr浼樺寲鑾峰彇鍊硷紝闃叉get鏂规硶涓嶈鑼�</li>
-                <li>Excel娉ㄨВ鏀寔鑷姩缁熻鏁版嵁鎬诲拰</li>
-                <li>Excel娉ㄨВ鏀寔璁剧疆BigDecimal绮惧害&鑸嶅叆瑙勫垯</li>
-                <li>鑿滃崟&鏁版嵁鏉冮檺鏂板锛堝睍寮�/鎶樺彔 鍏ㄩ��/鍏ㄤ笉閫� 鐖跺瓙鑱斿姩锛�</li>
-                <li>鍏佽鐢ㄦ埛鍒嗛厤鍒伴儴闂ㄧ埗鑺傜偣</li>
-                <li>鑿滃崟鏂板鏄惁缂撳瓨keep-alive</li>
-                <li>琛ㄦ牸鎿嶄綔鍒楅棿璺濊皟鏁�</li>
-                <li>闄愬埗绯荤粺鍐呯疆鍙傛暟涓嶅厑璁稿垹闄�</li>
-                <li>瀵屾枃鏈粍浠朵紭鍖栵紝鏀寔鑷畾涔夐珮搴�&鍥剧墖鍐茬獊闂</li>
-                <li>瀵屾枃鏈伐鍏锋爮鏍峰紡瀵归綈</li>
-                <li>瀵煎叆excel鏁村舰鍊兼牎楠屼紭鍖�</li>
-                <li>淇椤电鍏抽棴鎵�鏈夋椂鍥哄畾鏍囩璺敱涓嶅埛鏂伴棶棰�</li>
-                <li>琛ㄥ崟鏋勫缓甯冨眬鍨嬬粍浠舵柊澧炴寜閽�</li>
-                <li>宸︿晶鑿滃崟鏂囧瓧杩囬暱鏄剧ず鐪佺暐鍙�</li>
-                <li>淇鏍硅妭鐐逛负瀛愰儴闂ㄦ椂锛屾爲鐘剁粨鏋勬樉绀洪棶棰�</li>
-                <li>淇璋冪敤鐩爣瀛楃涓叉渶澶ч暱搴�</li>
-                <li>淇鑿滃崟鎻愮ず淇℃伅閿欒</li>
-                <li>淇瀹氭椂浠诲姟鎵ц涓�娆℃潈闄愭爣璇�</li>
-                <li>淇鏁版嵁搴撳瓧绗︿覆绫诲瀷nvarchar</li>
-                <li>浼樺寲閫掑綊瀛愯妭鐐�</li>
-                <li>浼樺寲鏁版嵁鏉冮檺鍒ゆ柇</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v3.1.0 - 2020-08-13">
-              <ol>
-                <li>琛ㄦ牸宸ュ叿鏍忓彸渚ф坊鍔犲埛鏂�&鏄鹃殣鏌ヨ缁勪欢</li>
-                <li>鍚庣鏀寔CORS璺ㄥ煙璇锋眰</li>
-                <li>浠g爜鐢熸垚鏀寔閫夋嫨涓婄骇鑿滃崟</li>
-                <li>浠g爜鐢熸垚鏀寔鑷畾涔夎矾寰�</li>
-                <li>浠g爜鐢熸垚鏀寔澶嶉�夋</li>
-                <li>Excel瀵煎嚭瀵煎叆鏀寔dictType瀛楀吀绫诲瀷</li>
-                <li>Excel鏀寔鍒嗗壊瀛楃涓茬粍鍐呭</li>
-                <li>楠岃瘉鐮佺被鍨嬫敮鎸侊紙鏁扮粍璁$畻銆佸瓧绗﹂獙璇侊級</li>
-                <li>鍗囩骇vue-cli鐗堟湰鍒�4.4.4</li>
-                <li>淇敼 node-sass 涓� dart-sass</li>
-                <li>琛ㄥ崟绫诲瀷涓篒nteger/Long璁剧疆鏁村舰榛樿鍊�</li>
-                <li>浠g爜鐢熸垚鍣ㄩ粯璁apper璺緞涓庨粯璁apperScan璺緞涓嶄竴鑷�</li>
-                <li>浼樺寲闃查噸澶嶆彁浜ゆ嫤鎴櫒</li>
-                <li>浼樺寲涓婄骇鑿滃崟涓嶈兘閫夋嫨鑷繁</li>
-                <li>淇瑙掕壊鐨勬潈闄愬垎閰嶅悗锛屾湭瀹炴椂鐢熸晥闂</li>
-                <li>淇鍦ㄧ嚎鐢ㄦ埛鏃ュ織璁板綍绫诲瀷</li>
-                <li>淇瀵屾枃鏈┖鏍煎拰缂╄繘淇濆瓨鍚庝笉鐢熸晥闂</li>
-                <li>淇鍦ㄧ嚎鐢ㄦ埛鍒ゆ柇閫昏緫</li>
-                <li>鍞竴闄愬埗鏉′欢鍙繑鍥炲崟鏉℃暟鎹�</li>
-                <li>娣诲姞鑾峰彇褰撳墠鐨勭幆澧冮厤缃柟娉�</li>
-                <li>瓒呮椂鐧诲綍鍚庨〉闈㈣烦杞埌棣栭〉</li>
-                <li>鍏ㄥ眬寮傚父鐘舵�佹眽鍖栨嫤鎴鐞�</li>
-                <li>HTML杩囨护鍣ㄦ敼涓哄皢html杞箟</li>
-                <li>妫�鏌ュ瓧绗︽敮鎸佸皬鏁扮偣&闄嶇骇鏀规垚寮傚父鎻愰啋</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v3.0.0 - 2020-07-20">
-              <ol>
-                <li>鍗曞簲鐢ㄨ皟鏁翠负澶氭ā鍧楅」鐩�</li>
-                <li>鍗囩骇element-ui鐗堟湰鍒�2.13.2</li>
-                <li>鍒犻櫎babel锛屾彁楂樼紪璇戦�熷害銆�</li>
-                <li>鏂板鑿滃崟榛樿涓荤被鐩�</li>
-                <li>缂栫爜鏂囦欢鍚嶄慨鏀逛负uuid鏂瑰紡</li>
-                <li>瀹氭椂浠诲姟cron琛ㄨ揪寮忛獙璇�</li>
-                <li>瑙掕壊鏉冮檺淇敼鏃跺凡鏈夋潈闄愭湭鑷姩鍕鹃�夊紓甯镐慨澶�</li>
-                <li>闃叉鍒囨崲鏉冮檺鐢ㄦ埛鍚庣櫥褰曞嚭鐜�404</li>
-                <li>Excel鏀寔sort瀵煎嚭鎺掑簭</li>
-                <li>鍒涘缓鐢ㄦ埛涓嶅厑璁搁�夋嫨瓒呯骇绠$悊鍛樿鑹�</li>
-                <li>淇浠g爜鐢熸垚瀵煎叆琛ㄧ粨鏋勫嚭鐜板紓甯搁〉闈笉鎻愰啋闂</li>
-                <li>淇浠g爜鐢熸垚鐐瑰嚮澶氭琛ㄤ慨鏀规暟鎹笉鍙樺寲鐨勯棶棰�</li>
-                <li>淇澶村儚涓婁紶鎴愬姛浜屾鎵撳紑鏃犳硶鏀瑰彉瑁佸壀妗嗗ぇ灏忓拰浣嶇疆闂</li>
-                <li>淇甯冨眬涓簊mall鑰卪ini鐢ㄦ埛琛ㄥ崟鏄剧ず閿欎綅闂</li>
-                <li>淇鐑儴缃插鑷寸殑寮烘崲寮傚父闂</li>
-                <li>淇敼鐢ㄦ埛绠$悊澶嶉�夋瀹藉害锛岄槻姝㈤儴鍒嗘祻瑙堝櫒鍑虹幇鐪佺暐鍙�</li>
-                <li>IpUtils宸ュ叿锛屾竻闄ss鐗规畩瀛楃锛岄槻姝ff娉ㄥ叆鏀诲嚮</li>
-                <li>鐢熸垚domain 濡傛灉鏄诞鐐瑰瀷 缁熶竴鐢˙igDecimal</li>
-                <li>瀹氭椂浠诲姟璋冩暣label-width锛岄槻姝㈤儴缃插嚭鐜伴敊浣�</li>
-                <li>璋冩暣琛ㄥご鍥哄畾鍒楅粯璁ゆ牱寮�</li>
-                <li>浠g爜鐢熸垚妯℃澘璋冩暣锛屽瓧娈典负String骞朵笖蹇呭~鍒欏姞绌轰覆鏉′欢</li>
-                <li>浠g爜鐢熸垚瀛楀吀Integer/Long浣跨敤parseInt</li>
-                <li>
-                  淇dict_sort涓嶅彲update涓�0鐨勯棶棰�&鏌ヨ杩斿洖澧炲姞dict_sort鍗囧簭鎺掑簭
-                </li>
-                <li>淇宀椾綅瀵煎嚭鏉冮檺娉ㄨВ</li>
-                <li>绂佹鍔犲瘑瀵嗘枃杩斿洖鍓嶇</li>
-                <li>淇浠g爜鐢熸垚椤甸潰涓殑鏌ヨ鏉′欢鍒涘缓鏃堕棿鏈敓鏁堢殑闂</li>
-                <li>淇棣栭〉鎼滅储鑿滃崟澶栭摼鏃犳硶鐐瑰嚮璺宠浆闂</li>
-                <li>淇鑿滃崟绠$悊閫夋嫨鍥炬爣锛宐ackspace鍒犻櫎鏃朵笉杩囨护鏁版嵁</li>
-                <li>鐢ㄦ埛绠$悊閮ㄩ棬鍒嗘敮鑺傜偣涓嶅彲妫�鏌�&鏄剧ず璁℃暟</li>
-                <li>鏁版嵁鑼冨洿杩囨护灞炴�ц皟鏁�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.3.0 - 2020-06-01">
-              <ol>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.70 淇楂樺嵄瀹夊叏婕忔礊</li>
-                <li>dev鍚姩榛樿鎵撳紑娴忚鍣�</li>
-                <li>vue-cli浣跨敤榛樿source-map</li>
-                <li>slidebar eslint鎶ラ敊浼樺寲</li>
-                <li>褰搕ags-view婊氬姩鍏抽棴鍙抽敭鑿滃崟</li>
-                <li>瀛楀吀绠$悊娣诲姞缂撳瓨璇诲彇</li>
-                <li>鍙傛暟绠$悊鏀寔缂撳瓨鎿嶄綔</li>
-                <li>鏀寔涓�绾ц彍鍗曪紙鍜屼富椤靛悓绾э級鍦╩ain鍖哄煙鏄剧ず</li>
-                <li>闄愬埗澶栭摼鍦板潃蹇呴』浠ttp(s)寮�澶�</li>
-                <li>tagview & sidebar 涓婚棰滆壊涓巈lement ui(鍏ㄥ眬)鍚屾</li>
-                <li>淇敼鏁版嵁婧愮被鍨嬩紭鍏堢骇锛屽厛鏍规嵁鏂规硶锛屽啀鏍规嵁绫�</li>
-                <li>鏀寔鏄惁闇�瑕佽缃畉oken灞炴�э紝鑷畾涔夎繑鍥炵爜娑堟伅銆�</li>
-                <li>swagger璇锋眰鍓嶇紑鍔犲叆閰嶇疆銆�</li>
-                <li>鐧诲綍鍦扮偣璁剧疆鍐呭杩囬暱鍒欓殣钘忔樉绀�</li>
-                <li>淇瀹氭椂浠诲姟鎵ц涓�娆℃寜閽悗涓嶆彁绀烘秷鎭棶棰�</li>
-                <li>淇敼涓婄骇閮ㄩ棬锛堥�夋嫨椤规帓闄ゆ湰韬拰涓嬬骇锛�</li>
-                <li>閫氱敤http鍙戦�佹柟娉曞鍔犲弬鏁� contentType 缂栫爜绫诲瀷</li>
-                <li>鏇存崲IP鍦板潃鏌ヨ鎺ュ彛</li>
-                <li>淇椤电鍙橀噺undefined</li>
-                <li>娣诲姞鏍¢獙閮ㄩ棬鍖呭惈鏈仠鐢ㄧ殑瀛愰儴闂�</li>
-                <li>淇敼瀹氭椂浠诲姟璇︽儏涓嬫鎵ц鏃堕棿鏃ユ湡鏄剧ず閿欒</li>
-                <li>瑙掕壊绠$悊鏌ヨ璁剧疆榛樿鎺掑簭瀛楁</li>
-                <li>swagger娣诲姞enable鍙傛暟鎺у埗鏄惁鍚敤</li>
-                <li>鍙json绫诲瀷璇锋眰鏋勫缓鍙噸澶嶈鍙杋nputStream鐨剅equest</li>
-                <li>淇敼浠g爜鐢熸垚瀛楀吀瀛楁int绫诲瀷娌℃湁鑷姩閫変腑闂</li>
-                <li>vuex鐢ㄦ埛鍚嶅彇鍊间慨姝�</li>
-                <li>琛ㄦ牸鏍戞ā鏉垮幓鎺夊浣欑殑)</li>
-                <li>浠g爜鐢熸垚搴忓彿淇</li>
-                <li>鍏ㄥ睆鎯呭喌涓嬩笉璋冩暣涓婂杈硅窛</li>
-                <li>浠g爜鐢熸垚Date瀛楁娣诲姞榛樿鏍煎紡</li>
-                <li>鐢ㄦ埛绠$悊瑙掕壊閫夋嫨鏉冮檺鎺у埗</li>
-                <li>淇璺敱鎳掑姞杞芥姤閿欓棶棰�</li>
-                <li>妯℃澘sql.vm娣诲姞鑿滃崟鐘舵��</li>
-                <li>璁剧疆鐢ㄦ埛鍚嶇О涓嶈兘淇敼</li>
-                <li>dialog娣诲姞append-to-body灞炴�э紝闃叉ie閬僵</li>
-                <li>鑿滃崟鍖哄垎鐘舵�佸拰鏄剧ず闅愯棌鍔熻兘</li>
-                <li>鍗囩骇fastjson鍒版渶鏂扮増1.2.68 淇瀹夊叏鍔犲浐</li>
-                <li>淇浠g爜鐢熸垚濡傛灉閫夋嫨瀛楀吀绫诲瀷缂哄け閫楀彿闂</li>
-                <li>鐧诲綍璇锋眰params鏇存崲涓篸ata锛岄槻姝㈡毚闇瞮rl</li>
-                <li>鏃ュ織杩斿洖鏃堕棿鏍煎紡澶勭悊</li>
-                <li>娣诲姞handle鎺у埗鍏佽鎷栧姩鐨勫厓绱�</li>
-                <li>甯冨眬璁剧疆鐐瑰嚮鎵╁ぇ鑼冨洿</li>
-                <li>浠g爜鐢熸垚鍒楀睘鎬ф帓搴忔煡璇�</li>
-                <li>浠g爜鐢熸垚鍒楁敮鎸佹嫋鍔ㄦ帓搴�</li>
-                <li>淇鏃堕棿鏍煎紡涓嶆敮鎸乮os闂</li>
-                <li>琛ㄥ崟鏋勫缓娣诲姞鐖剁骇class锛岄槻姝㈠啿绐�</li>
-                <li>瀹氭椂浠诲姟骞跺彂灞炴�т慨姝�</li>
-                <li>瑙掕壊绂佺敤&鑿滃崟闅愯棌涓嶆煡璇㈡潈闄�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.2.0 - 2020-03-18">
-              <ol>
-                <li>绯荤粺鐩戞帶鏂板瀹氭椂浠诲姟鍔熻兘</li>
-                <li>娣诲姞涓�涓墦鍖匴eb宸ョ▼bat</li>
-                <li>淇椤电榧犳爣婊氳疆鎸変笅鐨勬椂鍊欙紝鍙互鍏抽棴涓嶅彲鍏抽棴鐨則ag</li>
-                <li>淇鐐瑰嚮閫�鍑虹櫥褰曟湁鏃朵細鏃犳彁绀洪棶棰�</li>
-                <li>淇闃查噸澶嶆彁浜ゆ敞瑙f棤鏁堥棶棰�</li>
-                <li>淇閫氱煡鍏憡鎵归噺鍒犻櫎寮傚父闂</li>
-                <li>娣诲姞鑿滃崟鏃惰矾鐢卞湴鍧�蹇呭~闄愬埗</li>
-                <li>浠g爜鐢熸垚瀛楁鎻忚堪鍙紪杈�</li>
-                <li>淇鐢ㄦ埛淇敼涓汉淇℃伅瀵艰嚧缂撳瓨涓嶈繃鏈熼棶棰�</li>
-                <li>涓汉淇℃伅鍒涘缓鏃堕棿鑾峰彇姝g‘灞炴�у��</li>
-                <li>鎿嶄綔鏃ュ織璇︾粏鏄剧ず姝g‘绫诲瀷</li>
-                <li>瀵煎叆琛ㄥ崟鍑昏鏁版嵁鏃堕�変腑瀵瑰簲鐨勫閫夋</li>
-                <li>鎵归噺鏇挎崲琛ㄥ墠缂�閫昏緫璋冩暣</li>
-                <li>鍥哄畾閲嶅畾鍚戣矾寰勮〃杈惧紡</li>
-                <li>鍗囩骇element-ui鐗堟湰鍒�2.13.0</li>
-                <li>鎿嶄綔鏃ュ織鎺掑簭璋冩暣</li>
-                <li>淇charts鍒囨崲渚ц竟鏍忔垨鑰呯缉鏀剧獥鍙f樉绀篵ug</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.1.0 - 2020-02-24">
-              <ol>
-                <li>鏂板琛ㄥ崟鏋勫缓</li>
-                <li>浠g爜鐢熸垚鏀寔鏍戣〃缁撴瀯</li>
-                <li>鏂板鐢ㄦ埛瀵煎叆</li>
-                <li>淇鍔ㄦ�佸姞杞借矾鐢遍〉闈㈠埛鏂伴棶棰�</li>
-                <li>淇鍦板潃寮�鍏虫棤鏁堥棶棰�</li>
-                <li>姹夊寲閿欒鎻愮ず椤甸潰</li>
-                <li>浠g爜鐢熸垚宸茬煡闂淇敼</li>
-                <li>淇澶氭暟鎹簮涓嬮厤缃叧闂嚭鐜板紓甯稿鐞�</li>
-                <li>娣诲姞HTML杩囨护鍣紝鐢ㄤ簬鍘婚櫎XSS婕忔礊闅愭偅</li>
-                <li>淇涓婁紶澶村儚鎺у埗鍙板嚭鐜板紓甯�</li>
-                <li>淇敼鐢ㄦ埛绠$悊鍒嗛〉涓嶆纭殑闂</li>
-                <li>淇楠岃瘉鐮佽褰曟彁绀洪敊璇�</li>
-                <li>淇request.js缂哄皯Message寮曠敤</li>
-                <li>淇琛ㄦ牸鏃堕棿涓虹┖鍑虹幇鐨勫紓甯�</li>
-                <li>娣诲姞Jackson鏃ユ湡鍙嶅簭鍒楀寲鏃跺尯閰嶇疆</li>
-                <li>璋冩暣鏍规嵁鐢ㄦ埛鏉冮檺鍔犺浇鑿滃崟鏁版嵁鏍戝舰缁撴瀯</li>
-                <li>璋冩暣鎴愬姛鐧诲綍涓嶆仮澶嶆寜閽紝闃叉澶氭鐐瑰嚮</li>
-                <li>淇敼鐢ㄦ埛涓汉璧勬枡鍚屾缂撳瓨淇℃伅</li>
-                <li>淇椤甸潰鍚屾椂鍑虹幇el-upload鍜孍ditor涓嶆樉绀哄鐞�</li>
-                <li>淇鍦ㄨ鑹茬鐞嗛〉淇敼鑿滃崟鏉冮檺鍋跺皵鏈�変腑闂</li>
-                <li>閰嶇疆鏂囦欢鏂板redis瀵嗙爜灞炴��</li>
-                <li>璁剧疆mybatis鍏ㄥ眬鐨勯厤缃枃浠�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-
-            <el-collapse-item title="v2.0.0 - 2019-12-02">
-              <ol>
-                <li>鏂板浠g爜鐢熸垚</li>
-                <li>鏂板@RepeatSubmit娉ㄨВ锛岄槻姝㈤噸澶嶆彁浜�</li>
-                <li>鏂板鑿滃崟涓荤洰褰曟坊鍔�/鍒犻櫎鎿嶄綔</li>
-                <li>鏃ュ織璁板綍杩囨护鐗规畩瀵硅薄锛岄槻姝㈣浆鎹㈠紓甯�</li>
-                <li>淇敼浠g爜鐢熸垚璺敱鑴氭湰閿欒</li>
-                <li>鐢ㄦ埛涓婁紶澶村儚瀹炴椂鍚屾缂撳瓨锛屾棤闇�閲嶆柊鐧诲綍</li>
-                <li>璋冩暣鍒囨崲椤电鍚庝笉閲嶆柊鍔犺浇鏁版嵁</li>
-                <li>娣诲姞jsencrypt瀹炵幇鍙傛暟鐨勫墠绔姞瀵�</li>
-                <li>绯荤粺閫�鍑哄垹闄ょ敤鎴风紦瀛樿褰�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v1.1.0 - 2019-11-11">
-              <ol>
-                <li>鏂板鍦ㄧ嚎鐢ㄦ埛绠$悊</li>
-                <li>鏂板鎸夐挳缁勫姛鑳藉疄鐜帮紙鎵归噺鍒犻櫎銆佸鍑恒�佹竻绌猴級</li>
-                <li>鏂板鏌ヨ鏉′欢閲嶇疆鎸夐挳</li>
-                <li>鏂板Swagger鍏ㄥ眬Token閰嶇疆</li>
-                <li>鏂板鍚庣鍙傛暟鏍¢獙</li>
-                <li>淇瀛楀吀绠$悊椤甸潰鐨勬棩鏈熸煡璇㈠紓甯�</li>
-                <li>淇敼鏃堕棿鍑芥暟鍛藉悕闃叉鍐茬獊</li>
-                <li>鍘婚櫎鑿滃崟涓婄骇鏍¢獙锛岄粯璁や负椤剁骇</li>
-                <li>淇鐢ㄦ埛瀵嗙爜鏃犳硶淇敼闂</li>
-                <li>淇鑿滃崟绫诲瀷涓烘寜閽椂涓嶆樉绀烘潈闄愭爣璇�</li>
-                <li>鍏朵粬缁嗚妭浼樺寲</li>
-              </ol>
-            </el-collapse-item>
-            <el-collapse-item title="v1.0.0 - 2019-10-08">
-              <ol>
-                <li>鑻ヤ緷鍓嶅悗绔垎绂荤郴缁熸寮忓彂甯�</li>
-              </ol>
-            </el-collapse-item>
-          </el-collapse>
-        </el-card>
-      </el-col>
-      <el-col :xs="24" :sm="24" :md="12" :lg="8">
-        <el-card class="update-log">
-          <template v-slot:header>
-            <div class="clearfix">
-              <span>鎹愯禒鏀寔</span>
-            </div>
-          </template>
-          <div class="body">
-            <img
-              src="https://oscimg.oschina.net/oscnet/up-d6695f82666e5018f715c41cb7ee60d3b73.png"
-              alt="donate"
-              style="width:100%"
-            />
-            <span style="display: inline-block; height: 30px; line-height: 30px"
-              >浣犲彲浠ヨ浣滆�呭枬鏉挅鍟¤〃绀洪紦鍔�</span
-            >
-          </div>
-        </el-card>
-      </el-col>
-    </el-row>
-  </div>
-</template>
-
-<script setup name="Index">
-const version = ref('3.8.5')
-
-function goTarget(url) {
-  window.open(url, '__blank')
-}
-</script>
-
-<style scoped lang="scss">
-.home {
-  blockquote {
-    padding: 10px 20px;
-    margin: 0 0 20px;
-    font-size: 17.5px;
-    border-left: 5px solid #eee;
-  }
-  hr {
-    margin-top: 20px;
-    margin-bottom: 20px;
-    border: 0;
-    border-top: 1px solid #eee;
-  }
-  .col-item {
-    margin-bottom: 20px;
-  }
-
-  ul {
-    padding: 0;
-    margin: 0;
-  }
-
-  font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
-  font-size: 13px;
-  color: #676a6c;
-  overflow-x: hidden;
-
-  ul {
-    list-style-type: none;
-  }
-
-  h4 {
-    margin-top: 0px;
-  }
-
-  h2 {
-    margin-top: 10px;
-    font-size: 26px;
-    font-weight: 100;
-  }
-
-  p {
-    margin-top: 10px;
-
-    b {
-      font-weight: 700;
-    }
-  }
-
-  .update-log {
-    ol {
-      display: block;
-      list-style-type: decimal;
-      margin-block-start: 1em;
-      margin-block-end: 1em;
-      margin-inline-start: 0;
-      margin-inline-end: 0;
-      padding-inline-start: 40px;
-    }
-  }
-}
-</style>
-
+<template>
+  <div class="dashboard-cockpit">
+    <section class="cockpit-panel welcome-panel">
+      <div class="welcome-user">
+        <el-avatar :src="welcomeAvatar" class="avatar" @error="handleWelcomeAvatarError">
+          <el-icon><UserFilled /></el-icon>
+        </el-avatar>
+        <div class="welcome-text">
+          <div class="welcome-title">
+            {{ greetingText }}锛寋{ userStore.nickName || userStore.name || "瓒呯骇绠$悊鍛�" }} 馃憢
+          </div>
+          <div class="welcome-subtitle">涓撴敞宸ヤ笟鏁板瓧鍖栵紝鍔╁姏鏅洪�犲崌绾�</div>
+        </div>
+      </div>
+      <div class="welcome-meta">
+        <div class="meta-time digital-number">{{ nowTime }}</div>
+        <div class="meta-tip">MES / MOM 鐢熶骇杩愯惀椹鹃┒鑸�</div>
+      </div>
+    </section>
+
+    <section class="top-row">
+      <div class="stats-grid">
+        <article
+          v-for="card in dashboardCards"
+          :key="card.key"
+          class="stat-card"
+          :class="card.key"
+        >
+          <div class="stat-header">
+            <div class="stat-title-wrap">
+              <div class="stat-title">{{ card.title }}</div>
+              <div class="stat-desc">{{ card.desc }}</div>
+            </div>
+            <div class="stat-icon-orb">
+              <el-icon>
+                <component :is="card.icon" />
+              </el-icon>
+            </div>
+          </div>
+          <div class="stat-value digital-number">{{ card.value }}</div>
+          <div class="stat-footer">
+            <span>{{ card.subLabel }}</span>
+            <strong class="digital-number">{{ card.subValue }}</strong>
+          </div>
+          <div class="stat-trend">{{ card.trend }}</div>
+          <div class="stat-wave" aria-hidden="true"></div>
+        </article>
+      </div>
+    </section>
+
+    <section class="main-grid">
+      <div class="left-column">
+        <div class="cockpit-panel process-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">宸ュ簭鏁版嵁鐢熶骇缁熻鏄庣粏</div>
+            <div class="panel-actions">
+              <el-button type="primary" size="small" plain @click="openProcessDialog">閫夋嫨宸ュ簭</el-button>
+              <el-button size="small" plain @click="resetProcessFilter">閲嶇疆</el-button>
+              <el-radio-group v-model="processRange" size="small" @change="refreshProcessStats">
+                <el-radio-button :value="1">鏃�</el-radio-button>
+                <el-radio-button :value="2">鍛�</el-radio-button>
+                <el-radio-button :value="3">鏈�</el-radio-button>
+              </el-radio-group>
+            </div>
+          </div>
+          <div class="process-body">
+            <div class="process-chart" :class="{ empty: !hasProcessData }">
+              <Echarts
+                :options="chartBaseOptions"
+                :chartStyle="{ width: '100%', height: '100%' }"
+                :grid="processGrid"
+                :series="processSeries"
+                :tooltip="processTooltip"
+                :xAxis="processXAxis"
+                :yAxis="processYAxis"
+                :style="{ height: hasProcessData ? '340px' : '280px' }"
+                @click="handleChartClick"
+              />
+              <div v-if="!hasProcessData" class="chart-empty">
+                <el-icon><DataAnalysis /></el-icon>
+                <div class="chart-empty-title">鏆傛棤宸ュ簭鏁版嵁</div>
+                <div class="chart-empty-desc">绛夊緟鐢熶骇鎶ュ伐鏁版嵁鎺ュ叆鍚庤嚜鍔ㄧ敓鎴愮粺璁″浘琛�</div>
+                <div class="chart-empty-actions">
+                  <el-button size="small" @click="refreshProcessStats">鍒锋柊鏁版嵁</el-button>
+                  <el-button size="small" type="primary" plain @click="openProcessDialog">閫夋嫨宸ュ簭</el-button>
+                </div>
+              </div>
+            </div>
+            <div class="process-aside">
+              <div class="process-legend">
+                <div class="process-name">{{ processAside.processName }}</div>
+                <div class="process-legend-item"><span class="dot dot-blue"></span>鎶曞叆閲�</div>
+                <div class="process-legend-item"><span class="dot dot-orange"></span>鎶ュ簾閲�</div>
+                <div class="process-legend-item"><span class="dot dot-cyan"></span>浜у嚭閲�</div>
+              </div>
+              <div class="process-card">
+                <div class="process-label">绱鎬绘姇鍏�</div>
+                <div class="process-value digital-number">{{ formatAmount(processAside.totalInput) }}</div>
+              </div>
+              <div class="process-card">
+                <div class="process-label">绱鎬绘姤搴�</div>
+                <div class="process-value digital-number">{{ formatAmount(processAside.totalScrap) }}</div>
+              </div>
+              <div class="process-card">
+                <div class="process-label">绱鎬讳骇鍑�</div>
+                <div class="process-value digital-number">{{ formatAmount(processAside.totalOutput) }}</div>
+              </div>
+            </div>
+          </div>
+        </div>
+
+        <div class="cockpit-panel order-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">鐢熶骇璁㈠崟杩涘害</div>
+            <el-radio-group v-model="orderFilter" size="small">
+              <el-radio-button label="all">鍏ㄩ儴</el-radio-button>
+              <el-radio-button label="in_progress">杩涜涓�</el-radio-button>
+              <el-radio-button label="completed">宸插畬鎴�</el-radio-button>
+              <el-radio-button label="paused">宸叉殏鍋�</el-radio-button>
+            </el-radio-group>
+          </div>
+          <el-table :data="filteredOrders" stripe>
+            <el-table-column prop="orderNo" label="璁㈠崟缂栧彿" min-width="150" />
+            <el-table-column prop="productName" label="浜у搧鍚嶇О" min-width="120" />
+            <el-table-column prop="planQty" label="璁″垝鏁伴噺" min-width="90" />
+            <el-table-column prop="completedQty" label="宸插畬鎴�" min-width="90" />
+            <el-table-column label="瀹屾垚鐜�" min-width="180">
+              <template #default="{ row }">
+                <div class="table-progress">
+                  <el-progress
+                    :stroke-width="8"
+                    :percentage="row.completionRate"
+                    :show-text="false"
+                    status="success"
+                  />
+                  <span>{{ row.completionRate }}%</span>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column prop="deliveryDate" label="浜ゆ湡" min-width="110" />
+            <el-table-column label="鐘舵��" min-width="90">
+              <template #default="{ row }">
+                <el-tag :type="getOrderStatusType(row.status)" effect="light">
+                  {{ getOrderStatusText(row.status) }}
+                </el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+
+        <div class="cockpit-panel contract-panel">
+            <div class="panel-title">瀹㈡埛鍚堝悓閲戦鍒嗘瀽</div>
+            <div class="contract-summary">
+              <div class="contract-card">
+                <div class="contract-name">鎬诲悎鍚岄噾棰�(鍏�)</div>
+                <div class="contract-main digital-number">{{ formatNumber(sum) }}</div>
+                <div class="contract-compare">
+                  鍚屾瘮
+                  <span class="rise">{{ trendText(yny) }}</span>
+                  鐜瘮
+                  <span class="rise">{{ trendText(chain) }}</span>
+                </div>
+              </div>
+              <div class="contract-chart-wrap">
+                <Echarts
+                  :options="chartBaseOptions"
+                  :legend="pieLegend"
+                  :chartStyle="chartStylePie"
+                  :series="materialPieSeries"
+                  :tooltip="pieTooltip"
+                />
+              </div>
+            </div>
+            <ul class="contract-list">
+              <li v-for="item in materialPieSeries[0].data" :key="item.name">
+                <span class="legend-dot" :style="{ backgroundColor: item.itemStyle?.color }"></span>
+                <span class="contract-item-name">{{ item.name }}</span>
+                <span class="contract-item-rate">{{ item.rate }}%</span>
+                <span class="contract-item-value digital-number">楼{{ formatNumber(item.value) }}</span>
+              </li>
+            </ul>
+          </div>
+
+        <div class="cockpit-panel quality-panel">
+            <div class="panel-title-row">
+              <div class="panel-title">璐ㄩ噺缁熻</div>
+              <el-radio-group v-model="qualityRange" size="small" @change="qualityStatisticsInfo">
+                <el-radio-button :value="1">鍛�</el-radio-button>
+                <el-radio-button :value="2">鏈�</el-radio-button>
+                <el-radio-button :value="3">瀛e害</el-radio-button>
+              </el-radio-group>
+            </div>
+            <div class="quality-cards">
+              <div class="quality-card one">鍘熸潗鏂欏凡妫�鏁伴噺 <span>{{ qualityStatisticsObject.supplierNum }}浠�</span></div>
+              <div class="quality-card two">杩囩▼妫�楠屾暟閲� <span>{{ qualityStatisticsObject.processNum }}浠�</span></div>
+              <div class="quality-card three">鍑哄巶宸叉鏁伴噺 <span>{{ qualityStatisticsObject.factoryNum }}浠�</span></div>
+            </div>
+            <Echarts
+              :options="chartBaseOptions"
+              :chartStyle="chartStyle"
+              :grid="grid"
+              :legend="barLegend"
+              :series="barSeries1"
+              :tooltip="tooltip"
+              :xAxis="xAxis1"
+              :yAxis="yAxis1"
+              style="height: 270px"
+            />
+          </div>
+      </div>
+
+      <div class="right-column">
+        <div class="cockpit-panel todo-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">寰呭姙浜嬮」</div>
+            <span class="panel-more">鏇村</span>
+          </div>
+          <ul class="todo-list" v-if="todoList.length > 0">
+            <li v-for="item in todoList" :key="item.id" class="todo-item">
+              <div class="todo-head">
+                <span class="todo-no">寰呭姙缂栧彿锛歿{ item.approveId }}</span>
+                <span class="todo-time">{{ item.approveTime }}</span>
+              </div>
+              <div class="todo-desc">閮ㄩ棬锛歿{ item.approveDeptName }}</div>
+              <div class="todo-desc">浜嬬敱锛歿{ item.approveReason }}</div>
+            </li>
+          </ul>
+          <div v-else class="panel-empty">鏆傛棤鏁版嵁</div>
+        </div>
+
+        <div class="cockpit-panel realtime-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">鐢熶骇瀹炴椂鐪嬫澘</div>
+            <span class="panel-more">鏇村</span>
+          </div>
+          <div class="realtime-grid">
+            <div class="realtime-item" v-for="item in realtimeBoard" :key="item.key">
+              <el-progress
+                type="circle"
+                :percentage="item.percent"
+                :stroke-width="10"
+                :width="94"
+                :color="item.color"
+              >
+                <template #default>
+                  <div class="realtime-value digital-number">{{ item.display }}</div>
+                </template>
+              </el-progress>
+              <div class="realtime-label">{{ item.label }}</div>
+              <div class="realtime-delta" :class="item.trend">{{ item.delta }}</div>
+            </div>
+          </div>
+        </div>
+
+        <div class="cockpit-panel quick-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">蹇嵎鍔熻兘</div>
+          </div>
+          <div class="quick-grid">
+            <button
+              v-for="item in quickEntries"
+              :key="item.label"
+              class="quick-item"
+              type="button"
+              @click="goToQuick(item.path)"
+            >
+              <span class="quick-icon">
+                <el-icon>
+                  <component :is="item.icon" />
+                </el-icon>
+              </span>
+              <span>{{ item.label }}</span>
+            </button>
+          </div>
+        </div>
+
+        <div class="cockpit-panel plan-panel">
+          <div class="panel-title-row">
+            <div class="panel-title">浠婃棩鐢熶骇璁″垝</div>
+            <span class="panel-more">{{ todayPlanList.length }}椤�</span>
+          </div>
+          <ul class="plan-list">
+            <li v-for="item in todayPlanList" :key="item.orderNo" class="plan-item">
+              <div class="plan-main">
+                <span class="plan-order">{{ item.orderNo }}</span>
+                <span class="plan-name">{{ item.productName }}</span>
+              </div>
+              <div class="plan-meta">
+                <span>璁″垝 {{ item.planQty }}</span>
+                <span>浜ゆ湡 {{ item.deliveryDate }}</span>
+              </div>
+            </li>
+          </ul>
+        </div>
+
+        <div class="cockpit-panel receipt-panel">
+          <div class="panel-title">鍥炴涓庡紑绁ㄥ垎鏋�</div>
+          <Echarts
+            :options="chartBaseOptions"
+            :chartStyle="chartStyle"
+            :grid="grid"
+            :legend="lineLegend"
+            :series="lineSeries"
+            :tooltip="tooltipLine"
+            :xAxis="xAxis2"
+            :yAxis="yAxis2"
+            style="height: 300px"
+          />
+        </div>
+
+      </div>
+    </section>
+
+    <el-dialog v-model="processDialogVisible" title="閫夋嫨宸ュ簭" width="500px" append-to-body>
+      <div class="process-selection-wrapper">
+        <el-checkbox-group v-model="tempProcessIds">
+          <div class="process-grid">
+            <el-checkbox v-for="item in processOptions" :key="item.id" :label="item.id" border>
+              {{ item.name }}
+            </el-checkbox>
+          </div>
+        </el-checkbox-group>
+      </div>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="processDialogVisible = false">鍙栨秷</el-button>
+          <el-button type="primary" @click="handleProcessDialogConfirm">纭</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, onMounted, onUnmounted, computed, reactive, watch } from "vue";
+import { useRouter } from "vue-router";
+import dayjs from "dayjs";
+import * as echarts from "echarts";
+import {
+  Box,
+  Calendar,
+  Checked,
+  DataAnalysis,
+  DataLine,
+  EditPen,
+  Operation,
+  Search,
+  ShoppingCartFull,
+  Tickets,
+  Tools,
+  UserFilled,
+} from "@element-plus/icons-vue";
+import Echarts from "@/components/Echarts/echarts.vue";
+import usePermissionStore from "@/store/modules/permission";
+import useUserStore from "@/store/modules/user.js";
+import {
+  analysisCustomerContractAmounts,
+  getAmountHalfYear,
+  getBusiness,
+  homeTodos,
+  processDataProductionStatistics,
+  qualityInspectionStatistics,
+  statisticsReceivablePayable,
+} from "@/api/viewIndex.js";
+import { list } from "@/api/productionManagement/productionProcess";
+
+const router = useRouter();
+const userStore = useUserStore();
+const permissionStore = usePermissionStore();
+const defaultWelcomeAvatar = new URL("../assets/images/profile.jpg", import.meta.url).href;
+
+const nowTime = ref("");
+const welcomeAvatarLoadFailed = ref(false);
+let clockTimer = null;
+const weatherText = "澶氫簯 28掳C";
+
+const nowDate = computed(() => (nowTime.value ? nowTime.value.slice(0, 10) : dayjs().format("YYYY-MM-DD")));
+
+const greetingText = computed(() => {
+  const hour = dayjs().hour();
+  if (hour < 6) return "鍑屾櫒濂�";
+  if (hour < 9) return "鏃╀笂濂�";
+  if (hour < 12) return "涓婂崍濂�";
+  if (hour < 14) return "涓崍濂�";
+  if (hour < 18) return "涓嬪崍濂�";
+  return "鏅氫笂濂�";
+});
+
+const welcomeAvatar = computed(() =>
+  welcomeAvatarLoadFailed.value || !userStore.avatar ? defaultWelcomeAvatar : userStore.avatar
+);
+
+const handleWelcomeAvatarError = () => {
+  if (welcomeAvatar.value !== defaultWelcomeAvatar) {
+    welcomeAvatarLoadFailed.value = true;
+  }
+};
+
+watch(
+  () => userStore.avatar,
+  () => {
+    welcomeAvatarLoadFailed.value = false;
+  }
+);
+
+const axisTextColor = "#5f6f86";
+const axisLineColor = "rgba(148, 163, 184, 0.45)";
+const splitLineColor = "rgba(148, 163, 184, 0.18)";
+
+const chartBaseOptions = reactive({
+  backgroundColor: "transparent",
+  textStyle: { color: axisTextColor },
+});
+
+const processOptions = ref([]);
+const selectedProcessIds = ref([]);
+const tempProcessIds = ref([]);
+const processDialogVisible = ref(false);
+const activeProcessIndex = ref(0);
+
+const businessInfo = ref({
+  inventoryNum: 0,
+  monthPurchaseHaveMoney: 0,
+  monthPurchaseMoney: 0,
+  monthSaleHaveMoney: 0,
+  monthSaleMoney: 0,
+  todayInventoryNum: 0,
+});
+
+const qualityStatisticsObject = ref({
+  supplierNum: 0,
+  processNum: 0,
+  factoryNum: 0,
+});
+
+const sum = ref(0);
+const yny = ref(0);
+const chain = ref(0);
+
+const pieLegend = reactive({ show: false });
+const piePalette = ["#2563eb", "#14b8a6", "#7c3aed", "#f97316", "#38bdf8", "#f43f5e"];
+
+const chartStyle = {
+  width: "100%",
+  height: "100%",
+};
+
+const chartStylePie = {
+  width: "100%",
+  height: "200px",
+};
+
+const grid = {
+  left: "3%",
+  right: "4%",
+  bottom: "2%",
+  top: "12%",
+  containLabel: true,
+};
+
+const tooltip = {
+  trigger: "axis",
+  axisPointer: { type: "shadow" },
+  backgroundColor: "rgba(255, 255, 255, 0.97)",
+  borderColor: "rgba(148, 163, 184, 0.26)",
+  textStyle: { color: "#334155" },
+};
+
+const barColors2 = ["#2563eb", "#14b8a6"];
+
+const xAxis = [
+  {
+    type: "value",
+    axisLine: { lineStyle: { color: axisLineColor } },
+    splitLine: { lineStyle: { color: splitLineColor } },
+    axisLabel: { color: axisTextColor },
+  },
+];
+
+const yAxis = [
+  {
+    type: "category",
+    data: ["搴斾粯璐︽", "搴旀敹璐︽"],
+    axisTick: { show: false },
+    axisLine: { lineStyle: { color: axisLineColor } },
+    axisLabel: { color: axisTextColor },
+  },
+];
+
+const barSeries = ref([
+  {
+    type: "bar",
+    barWidth: 22,
+    itemStyle: { borderRadius: [0, 8, 8, 0] },
+    label: { show: true, position: "right", color: "#334155" },
+    data: [],
+  },
+]);
+
+const barLegend = {
+  show: true,
+  textStyle: { color: axisTextColor },
+  data: ["鍘熸潗鏂欎笉鍚堟牸鏁�", "杩囩▼涓嶅悎鏍兼暟", "鍑哄巶涓嶅悎鏍兼暟"],
+};
+
+const xAxis1 = ref([
+  {
+    type: "category",
+    axisTick: { show: false },
+    axisLine: { lineStyle: { color: axisLineColor } },
+    axisLabel: { color: axisTextColor },
+    data: [],
+  },
+]);
+
+const yAxis1 = [
+  {
+    type: "value",
+    splitLine: { lineStyle: { color: splitLineColor } },
+    axisLine: { lineStyle: { color: axisLineColor } },
+    axisLabel: { color: axisTextColor },
+  },
+];
+
+const barSeries1 = ref([
+  {
+    name: "鍘熸潗鏂欎笉鍚堟牸鏁�",
+    type: "bar",
+    barGap: 0,
+    itemStyle: { color: "#2563eb", borderRadius: [6, 6, 0, 0] },
+    emphasis: { focus: "series" },
+    data: [],
+  },
+  {
+    name: "杩囩▼涓嶅悎鏍兼暟",
+    type: "bar",
+    itemStyle: { color: "#14b8a6", borderRadius: [6, 6, 0, 0] },
+    emphasis: { focus: "series" },
+    data: [],
+  },
+  {
+    name: "鍑哄巶涓嶅悎鏍兼暟",
+    type: "bar",
+    itemStyle: { color: "#f59e0b", borderRadius: [6, 6, 0, 0] },
+    emphasis: { focus: "series" },
+    data: [],
+  },
+]);
+
+const lineLegend = {
+  show: true,
+  textStyle: { color: axisTextColor },
+  data: ["寮�绁�", "鍥炴"],
+};
+
+const xAxis2 = ref([
+  {
+    type: "category",
+    data: [],
+    axisLine: { lineStyle: { color: axisLineColor } },
+    axisLabel: {
+      color: axisTextColor,
+      interval: 0,
+      formatter: (value) => value.replace(/~/g, "\n"),
+    },
+  },
+]);
+
+const yAxis2 = ref([
+  {
+    type: "value",
+    splitLine: { lineStyle: { color: splitLineColor } },
+    axisLine: { lineStyle: { color: axisLineColor } },
+    axisLabel: { color: axisTextColor },
+  },
+]);
+
+const tooltipLine = {
+  trigger: "axis",
+  backgroundColor: "rgba(255, 255, 255, 0.97)",
+  borderColor: "rgba(148, 163, 184, 0.26)",
+  textStyle: { color: "#334155" },
+};
+
+const lineSeries = ref([
+  {
+    name: "寮�绁�",
+    type: "line",
+    data: [],
+    smooth: true,
+    itemStyle: { color: "#2563eb" },
+    lineStyle: { width: 2, color: "#2563eb" },
+    showSymbol: true,
+    areaStyle: {
+      color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+        { offset: 0, color: "rgba(37, 99, 235, 0.24)" },
+        { offset: 1, color: "rgba(37, 99, 235, 0.02)" },
+      ]),
+    },
+  },
+  {
+    name: "鍥炴",
+    type: "line",
+    data: [],
+    smooth: true,
+    itemStyle: { color: "#14b8a6" },
+    lineStyle: { width: 2, color: "#14b8a6" },
+    showSymbol: true,
+    areaStyle: {
+      color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+        { offset: 0, color: "rgba(20, 184, 166, 0.2)" },
+        { offset: 1, color: "rgba(20, 184, 166, 0.02)" },
+      ]),
+    },
+  },
+]);
+
+const pieTooltip = reactive({
+  trigger: "item",
+  backgroundColor: "rgba(255, 255, 255, 0.97)",
+  borderColor: "rgba(148, 163, 184, 0.26)",
+  textStyle: { color: "#334155" },
+  formatter: (params) => `${params.name} ${formatNumber(params.value)}鍏� ${params.percent}%`,
+});
+
+const materialPieSeries = ref([
+  {
+    type: "pie",
+    radius: ["62%", "88%"],
+    avoidLabelOverlap: false,
+    itemStyle: {
+      borderColor: "rgba(255, 255, 255, 0.95)",
+      borderWidth: 2,
+    },
+    label: { show: false },
+    data: [],
+  },
+]);
+
+const todoList = ref([]);
+const qualityRange = ref(1);
+const processRange = ref(1);
+const processChartData = ref([]);
+
+const processXAxis = ref([
+  {
+    type: "value",
+    axisLine: { lineStyle: { color: axisLineColor } },
+    splitLine: { lineStyle: { color: splitLineColor, type: "dashed" } },
+    axisLabel: { color: axisTextColor },
+  },
+]);
+
+const processYAxis = ref([
+  {
+    type: "category",
+    axisTick: { show: false },
+    axisLine: { show: false },
+    axisLabel: { color: axisTextColor },
+    data: [],
+  },
+]);
+
+const processGrid = reactive({ left: "4%", right: "4%", top: 20, bottom: 18, containLabel: true });
+
+const processTooltip = reactive({
+  trigger: "axis",
+  axisPointer: { type: "shadow" },
+  backgroundColor: "rgba(255, 255, 255, 0.97)",
+  borderColor: "rgba(148, 163, 184, 0.26)",
+  textStyle: { color: "#334155" },
+  formatter: (params) => {
+    const name = params?.[0]?.name ?? "";
+    const list = Array.isArray(params) ? params : [];
+    const lines = list
+      .map((p) => {
+        const colorBox = `<span style="display:inline-block;margin-right:6px;border-radius:2px;width:10px;height:10px;background:${p.color}"></span>`;
+        return `${colorBox}${p.seriesName}<b style="float:right;">${Number(p.value || 0).toFixed(2)}</b>`;
+      })
+      .join("<br/>");
+    return `<div style="min-width:140px;"><div style="font-weight:700;margin-bottom:6px;">${name}</div>${lines}</div>`;
+  },
+});
+
+const processSeries = computed(() => {
+  const input = processChartData.value.map((item) => item.input);
+  const scrap = processChartData.value.map((item) => item.scrap);
+  const output = processChartData.value.map((item) => item.output);
+  return [
+    {
+      name: "鎶曞叆閲�",
+      type: "bar",
+      stack: "total",
+      barWidth: 18,
+      itemStyle: { color: "#2563eb", borderRadius: [8, 0, 0, 8] },
+      data: input,
+    },
+    {
+      name: "鎶ュ簾閲�",
+      type: "bar",
+      stack: "total",
+      barWidth: 18,
+      itemStyle: { color: "#f59e0b" },
+      data: scrap,
+    },
+    {
+      name: "浜у嚭閲�",
+      type: "bar",
+      stack: "total",
+      barWidth: 18,
+      itemStyle: { color: "#14b8a6", borderRadius: [0, 8, 8, 0] },
+      data: output,
+    },
+  ];
+});
+
+const processAside = computed(() => {
+  const listData = processChartData.value;
+  const item = listData[activeProcessIndex.value] || {};
+  return {
+    processName: item.name || "鏆傛棤鏁版嵁",
+    totalInput: item.input || 0,
+    totalScrap: item.scrap || 0,
+    totalOutput: item.output || 0,
+  };
+});
+
+const processTotals = computed(() =>
+  processChartData.value.reduce(
+    (acc, cur) => {
+      acc.input += Number(cur.input || 0);
+      acc.scrap += Number(cur.scrap || 0);
+      acc.output += Number(cur.output || 0);
+      return acc;
+    },
+    { input: 0, scrap: 0, output: 0 }
+  )
+);
+
+const hasProcessData = computed(() => {
+  if (!processChartData.value.length) return false;
+  return processChartData.value.some((item) => {
+    const input = Number(item.input || 0);
+    const scrap = Number(item.scrap || 0);
+    const output = Number(item.output || 0);
+    return input > 0 || scrap > 0 || output > 0;
+  });
+});
+
+const dashboardCards = computed(() => [
+  {
+    key: "sales",
+    title: "閿�鍞暟鎹�",
+    desc: "鏈湀閿�鍞(鍏�)",
+    value: formatNumber(businessInfo.value.monthSaleMoney),
+    subLabel: "鏈紑绁ㄩ噾棰�",
+    subValue: formatNumber(businessInfo.value.monthSaleHaveMoney),
+    trend: `鍗犳瘮 ${ratioText(businessInfo.value.monthSaleHaveMoney, businessInfo.value.monthSaleMoney)}`,
+    icon: DataLine,
+  },
+  {
+    key: "purchase",
+    title: "閲囪喘鏁版嵁",
+    desc: "鏈湀閲囪喘棰�(鍏�)",
+    value: formatNumber(businessInfo.value.monthPurchaseMoney),
+    subLabel: "寰呬粯娆鹃噾棰�",
+    subValue: formatNumber(businessInfo.value.monthPurchaseHaveMoney),
+    trend: `鍗犳瘮 ${ratioText(
+      businessInfo.value.monthPurchaseHaveMoney,
+      businessInfo.value.monthPurchaseMoney
+    )}`,
+    icon: ShoppingCartFull,
+  },
+  {
+    key: "inventory",
+    title: "搴撳瓨鏁版嵁",
+    desc: "褰撳墠搴撳瓨鎬婚噺(浠�)",
+    value: formatNumber(businessInfo.value.inventoryNum),
+    subLabel: "浠婃棩鍏ュ簱",
+    subValue: formatNumber(businessInfo.value.todayInventoryNum),
+    trend: "搴撳瓨缁撴瀯鎸佺画浼樺寲",
+    icon: Box,
+  },
+  {
+    key: "production",
+    title: "鐢熶骇鎬昏",
+    desc: "绱浜у嚭(浠�)",
+    value: formatNumber(processTotals.value.output),
+    subLabel: "绱鎶ュ簾",
+    subValue: formatNumber(processTotals.value.scrap),
+    trend: `鑹巼 ${ratioText(processTotals.value.output, processTotals.value.input)}`,
+    icon: Operation,
+  },
+]);
+
+const productionOrders = ref([
+  {
+    orderNo: "MO-20260518-001",
+    productName: "鏅鸿兘鎺у埗鍣�",
+    planQty: 1000,
+    completedQty: 860,
+    completionRate: 86,
+    deliveryDate: "2026-05-20",
+    status: "in_progress",
+  },
+  {
+    orderNo: "MO-20260518-002",
+    productName: "鐢垫簮妯″潡",
+    planQty: 800,
+    completedQty: 640,
+    completionRate: 80,
+    deliveryDate: "2026-05-22",
+    status: "in_progress",
+  },
+  {
+    orderNo: "MO-20260518-003",
+    productName: "浼犳劅鍣ㄧ粍浠�",
+    planQty: 500,
+    completedQty: 150,
+    completionRate: 30,
+    deliveryDate: "2026-05-25",
+    status: "paused",
+  },
+  {
+    orderNo: "MO-20260518-004",
+    productName: "缁撴瀯浠禔",
+    planQty: 1200,
+    completedQty: 1200,
+    completionRate: 100,
+    deliveryDate: "2026-05-15",
+    status: "completed",
+  },
+]);
+
+const orderFilter = ref("all");
+const filteredOrders = computed(() => {
+  if (orderFilter.value === "all") return productionOrders.value;
+  return productionOrders.value.filter((item) => item.status === orderFilter.value);
+});
+
+const todayPlanList = computed(() =>
+  productionOrders.value
+    .slice()
+    .sort((a, b) => dayjs(a.deliveryDate).valueOf() - dayjs(b.deliveryDate).valueOf())
+    .slice(0, 5)
+);
+
+const avgCompletionRate = computed(() => {
+  if (!productionOrders.value.length) return 0;
+  const total = productionOrders.value.reduce((acc, cur) => acc + Number(cur.completionRate || 0), 0);
+  return Number((total / productionOrders.value.length).toFixed(1));
+});
+
+const realtimeBoard = computed(() => {
+  const oee = ratioNumber(processTotals.value.output, processTotals.value.input);
+  const defectRate = ratioNumber(processTotals.value.scrap, processTotals.value.input);
+  return [
+    {
+      key: "oee",
+      label: "璁惧 OEE",
+      percent: clampPercent(oee),
+      display: `${oee.toFixed(1)}%`,
+      delta: "杈冩槰鏃� 鈫� 4.0%",
+      trend: "up",
+      color: "#2d8cff",
+    },
+    {
+      key: "order",
+      label: "璁㈠崟杈炬垚鐜�",
+      percent: clampPercent(avgCompletionRate.value),
+      display: `${avgCompletionRate.value.toFixed(1)}%`,
+      delta: "杈冩槰鏃� 鈫� 2.6%",
+      trend: "up",
+      color: "#31d2ff",
+    },
+    {
+      key: "defect",
+      label: "涓嶈壇鐜�",
+      percent: clampPercent(defectRate),
+      display: `${defectRate.toFixed(1)}%`,
+      delta: "杈冩槰鏃� 鈫� 0.5%",
+      trend: "down",
+      color: "#f6a23f",
+    },
+  ];
+});
+
+const warningList = ref([
+  {
+    id: 1,
+    level: "device",
+    title: "璁惧棰勮",
+    desc: "CNC-001 璁惧鎸姩寮傚父",
+    time: "10:24:32",
+  },
+  {
+    id: 2,
+    level: "quality",
+    title: "璐ㄩ噺棰勮",
+    desc: "璁㈠崟 SO-20260517 涓嶈壇鐜囪秴鏍�",
+    time: "09:15:47",
+  },
+  {
+    id: 3,
+    level: "material",
+    title: "鐗╂枡棰勮",
+    desc: "鐗╂枡 1002001 搴撳瓨涓嶈冻",
+    time: "08:47:21",
+  },
+]);
+
+const quickEntryConfigs = [
+  { label: "涓荤敓浜ц鍒�", icon: Calendar, titles: ["涓荤敓浜ц鍒�"], fallbackPath: "/productionPlan/productionPlan" },
+  { label: "鐢熶骇璁㈠崟", icon: Tickets, titles: ["鐢熶骇璁㈠崟"], fallbackPath: "/productionManagement/productionOrder" },
+  { label: "鐢熶骇鎶ュ伐", icon: EditPen, titles: ["鐢熶骇鎶ュ伐"], fallbackPath: "/productionManagement/productionReporting" },
+  { label: "璁惧鍙拌处", icon: Tools, titles: ["璁惧鍙拌处"], fallbackPath: "/equipmentManagement/ledger" },
+  { label: "閿�鍞彴璐�", icon: DataLine, titles: ["閿�鍞彴璐�"], fallbackPath: "/salesManagement/salesLedger" },
+  { label: "閲囪喘鍙拌处", icon: ShoppingCartFull, titles: ["閲囪喘鍙拌处"], fallbackPath: "/procurementManagement/procurementLedger" },
+  { label: "鍛樺伐鍙拌处", icon: UserFilled, titles: ["鍛樺伐鍙拌处", "鍦ㄨ亴鍛樺伐鍙拌处"], fallbackPath: "/personnelManagement/employeeRecord" },
+  { label: "搴撳瓨绠$悊", icon: Box, titles: ["搴撳瓨绠$悊"], fallbackPath: "/inventoryManagement/stockManage" },
+];
+
+const normalizeMenuTitle = (title) => String(title || "").replace(/\s+/g, "").trim();
+
+const resolveRoutePath = (route, parentPath = "") => {
+  const currentPath = String(route?.path || "").trim();
+  if (!currentPath) return parentPath || "";
+  if (/^(https?:)?\/\//.test(currentPath)) return currentPath;
+  if (currentPath.startsWith("/")) return currentPath;
+  const basePath = parentPath && parentPath !== "/" ? parentPath.replace(/\/$/, "") : "";
+  return `${basePath}/${currentPath}`.replace(/\/+/g, "/");
+};
+
+const collectAccessibleRoutes = (routes = [], parentPath = "") => {
+  const items = [];
+  (routes || []).forEach((route) => {
+    if (!route) return;
+    const fullPath = resolveRoutePath(route, parentPath);
+    const title = route.meta?.title ?? route.title ?? "";
+    if (title && fullPath && !String(route.redirect || "").includes("noRedirect")) {
+      items.push({
+        title: normalizeMenuTitle(title),
+        path: fullPath,
+      });
+    }
+    if (Array.isArray(route.children) && route.children.length > 0) {
+      items.push(...collectAccessibleRoutes(route.children, fullPath));
+    }
+  });
+  return items;
+};
+
+const accessibleMenuRoutes = computed(() => {
+  const routePool =
+    permissionStore.defaultRoutes?.length > 0
+      ? permissionStore.defaultRoutes
+      : permissionStore.sidebarRouters?.length > 0
+        ? permissionStore.sidebarRouters
+        : permissionStore.routes;
+  return collectAccessibleRoutes(routePool || []);
+});
+
+const quickEntries = computed(() =>
+  quickEntryConfigs
+    .map((item) => {
+      const targetRoute = accessibleMenuRoutes.value.find((route) =>
+        item.titles.some((title) => route.title === normalizeMenuTitle(title))
+      );
+      const resolvedPath = targetRoute?.path || "";
+      return resolvedPath
+        ? {
+            label: item.label,
+            icon: item.icon,
+            path: resolvedPath,
+          }
+        : null;
+    })
+    .filter(Boolean)
+);
+
+const updateNowTime = () => {
+  nowTime.value = dayjs().format("YYYY-MM-DD HH:mm:ss");
+};
+
+const formatNumber = (value) => {
+  const num = Number(value || 0);
+  return num.toLocaleString(undefined, {
+    minimumFractionDigits: 2,
+    maximumFractionDigits: 2,
+  });
+};
+
+const formatAmount = (value) => {
+  const num = Number(value || 0);
+  return num.toLocaleString(undefined, {
+    minimumFractionDigits: 2,
+    maximumFractionDigits: 2,
+  });
+};
+
+const trendText = (value) => {
+  const num = Number(value || 0);
+  const flag = num >= 0 ? "鈫�" : "鈫�";
+  return `${flag} ${Math.abs(num).toFixed(1)}%`;
+};
+
+const ratioNumber = (numerator, denominator) => {
+  const n = Number(numerator || 0);
+  const d = Number(denominator || 0);
+  if (!d) return 0;
+  return (n / d) * 100;
+};
+
+const ratioText = (numerator, denominator) => `${ratioNumber(numerator, denominator).toFixed(1)}%`;
+
+const clampPercent = (val) => Math.max(0, Math.min(100, Number(val || 0)));
+
+const getOrderStatusText = (status) => {
+  const mapping = {
+    in_progress: "杩涜涓�",
+    completed: "宸插畬鎴�",
+    paused: "鏆傚仠",
+  };
+  return mapping[status] || "鏈煡";
+};
+
+const getOrderStatusType = (status) => {
+  const mapping = {
+    in_progress: "success",
+    completed: "primary",
+    paused: "warning",
+  };
+  return mapping[status] || "info";
+};
+
+const getBusinessData = async () => {
+  const res = await getBusiness();
+  businessInfo.value = { ...res.data };
+};
+
+const analysisCustomer = async () => {
+  const res = await analysisCustomerContractAmounts();
+  sum.value = res.data.sum;
+  yny.value = res.data.yny;
+  chain.value = res.data.chain;
+  materialPieSeries.value[0].data = (res.data.item || []).map((item, index) => ({
+    ...item,
+    rate: Number(item.rate || 0),
+    itemStyle: { color: piePalette[index % piePalette.length] },
+  }));
+};
+
+const todoInfoS = async () => {
+  const res = await homeTodos();
+  todoList.value = res.data || [];
+};
+
+const statisticsReceivable = async () => {
+  const res = await statisticsReceivablePayable({ type: 1 });
+  barSeries.value[0].data = [
+    { value: res.data.payableMoney, itemStyle: { color: barColors2[0] } },
+    { value: res.data.receivableMoney, itemStyle: { color: barColors2[1] } },
+  ];
+};
+
+const qualityStatisticsInfo = async () => {
+  const res = await qualityInspectionStatistics({ type: qualityRange.value });
+  xAxis1.value[0].data = [];
+  barSeries1.value[0].data = [];
+  barSeries1.value[1].data = [];
+  barSeries1.value[2].data = [];
+  (res.data.item || []).forEach((item) => {
+    xAxis1.value[0].data.push(item.date);
+    barSeries1.value[0].data.push(item.supplierNum);
+    barSeries1.value[1].data.push(item.processNum);
+    barSeries1.value[2].data.push(item.factoryNum);
+  });
+  qualityStatisticsObject.value.supplierNum = res.data.supplierNum;
+  qualityStatisticsObject.value.processNum = res.data.processNum;
+  qualityStatisticsObject.value.factoryNum = res.data.factoryNum;
+};
+
+const getAmountHalfYearNum = async () => {
+  const res = await getAmountHalfYear();
+  const monthName = [];
+  const receiptAmount = [];
+  const invoiceAmount = [];
+  (res.data || []).forEach((item) => {
+    monthName.push(item.month);
+    receiptAmount.push(item.receiptAmount);
+    invoiceAmount.push(item.invoiceAmount);
+  });
+
+  xAxis2.value[0].data = monthName.map((item) => item.replace(/~/g, "\n~"));
+  lineSeries.value[0].data = invoiceAmount;
+  lineSeries.value[1].data = receiptAmount;
+};
+
+const getProcessList = async () => {
+  const res = await list();
+  processOptions.value = res.data.records || [];
+};
+
+const refreshProcessStats = async () => {
+  const res = await processDataProductionStatistics({
+    type: processRange.value,
+    processIds: selectedProcessIds.value.length > 0 ? selectedProcessIds.value.join(",") : null,
+  });
+  processChartData.value = (res.data || []).map((item) => ({
+    name: item.processName,
+    input: item.totalInput,
+    scrap: item.totalScrap,
+    output: item.totalOutput,
+  }));
+  processYAxis.value[0].data = processChartData.value.map((item) => item.name);
+  activeProcessIndex.value = 0;
+};
+
+const openProcessDialog = () => {
+  tempProcessIds.value = [...selectedProcessIds.value];
+  processDialogVisible.value = true;
+};
+
+const handleProcessDialogConfirm = () => {
+  selectedProcessIds.value = [...tempProcessIds.value];
+  processDialogVisible.value = false;
+  refreshProcessStats();
+};
+
+const resetProcessFilter = () => {
+  selectedProcessIds.value = [];
+  tempProcessIds.value = [];
+  refreshProcessStats();
+};
+
+const handleChartClick = (params) => {
+  if (params && params.dataIndex !== undefined) {
+    activeProcessIndex.value = params.dataIndex;
+  }
+};
+
+const goToQuick = (path) => {
+  if (!path) return;
+  router.push(path).catch(() => {});
+};
+
+onMounted(() => {
+  updateNowTime();
+  clockTimer = setInterval(updateNowTime, 1000);
+  getBusinessData();
+  analysisCustomer();
+  todoInfoS();
+  statisticsReceivable();
+  qualityStatisticsInfo();
+  getAmountHalfYearNum();
+  getProcessList();
+  refreshProcessStats();
+});
+
+onUnmounted(() => {
+  if (clockTimer) {
+    clearInterval(clockTimer);
+  }
+});
+</script>
+
+<style scoped>
+.dashboard-cockpit {
+  min-height: calc(100vh - var(--topbar-height) - var(--tagsbar-height));
+  width: 100%;
+  min-width: 0;
+  padding: 0;
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
+  overflow-x: clip;
+	margin-top: 10px;
+}
+
+.digital-number {
+  font-family: "DIN Alternate Bold", "Segoe UI", "PingFang SC", sans-serif;
+  letter-spacing: 0;
+}
+
+.cockpit-panel {
+  position: relative;
+  background: rgba(255, 255, 255, 0.9);
+  border: 1px solid rgba(148, 163, 184, 0.18);
+  border-radius: 16px;
+  box-shadow: 0 12px 32px rgba(15, 23, 42, 0.06);
+  backdrop-filter: blur(12px);
+  padding: 16px;
+}
+
+.welcome-panel {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  min-height: 92px;
+  padding: 18px 22px;
+  background:
+    radial-gradient(circle at 8% 20%, rgba(59, 130, 246, 0.12), transparent 32%),
+    linear-gradient(135deg, rgba(255, 255, 255, 0.94), rgba(239, 246, 255, 0.88));
+}
+
+.welcome-user {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+}
+
+.avatar {
+  width: 52px;
+  height: 52px;
+  border: 1px solid rgba(147, 197, 253, 0.42);
+  background: linear-gradient(145deg, #ffffff, #eef5ff);
+  box-shadow: 0 8px 20px rgba(37, 99, 235, 0.14);
+}
+
+.avatar :deep(img) {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+
+.avatar :deep(.el-icon) {
+  font-size: 24px;
+  color: #3b82f6;
+}
+
+.welcome-title {
+  font-size: 28px;
+  font-weight: 700;
+  color: #1e3a5f;
+  line-height: 1.08;
+}
+
+.welcome-subtitle {
+  margin-top: 6px;
+  color: #64748b;
+  font-size: 14px;
+}
+
+.welcome-meta {
+  text-align: right;
+}
+
+.meta-time {
+  font-size: 28px;
+  color: #1f3658;
+  font-weight: 700;
+}
+
+.meta-extra {
+  margin-top: 6px;
+  display: flex;
+  justify-content: flex-end;
+  gap: 14px;
+  color: #64748b;
+  font-size: 13px;
+}
+
+.meta-tip {
+  margin-top: 4px;
+  color: #7a8ca6;
+  font-size: 13px;
+}
+
+.top-row {
+  display: block;
+}
+
+.stats-grid {
+  display: grid;
+  grid-template-columns: repeat(4, minmax(0, 1fr));
+  gap: 14px;
+}
+
+.stat-card {
+  position: relative;
+  border-radius: 18px;
+  padding: 18px 20px 22px;
+  min-height: 182px;
+  height: auto;
+  overflow: hidden;
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  box-shadow: 0 10px 26px rgba(15, 23, 42, 0.06);
+  transition: transform 0.22s ease, box-shadow 0.22s ease;
+}
+
+.stat-card:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 18px 40px rgba(37, 99, 235, 0.1);
+}
+
+.stat-card.sales {
+  background: linear-gradient(135deg, #ffffff 0%, #eaf3ff 100%);
+}
+
+.stat-card.purchase {
+  background: linear-gradient(135deg, #ffffff 0%, #e8fffb 100%);
+}
+
+.stat-card.inventory {
+  background: linear-gradient(135deg, #ffffff 0%, #f2edff 100%);
+}
+
+.stat-card.production {
+  background: linear-gradient(135deg, #ffffff 0%, #fff4e6 100%);
+}
+
+.stat-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: flex-start;
+  position: relative;
+  z-index: 2;
+}
+
+.stat-title {
+  font-size: 16px;
+  font-weight: 700;
+}
+
+.stat-card.sales .stat-title {
+  color: #1d4ed8;
+}
+
+.stat-card.purchase .stat-title {
+  color: #0f766e;
+}
+
+.stat-card.inventory .stat-title {
+  color: #6d28d9;
+}
+
+.stat-card.production .stat-title {
+  color: #c2410c;
+}
+
+.stat-desc {
+  margin-top: 6px;
+  color: #64748b;
+  font-size: 13px;
+}
+
+.stat-icon-orb {
+  width: 52px;
+  height: 52px;
+  border-radius: 50%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 22px;
+  color: #fff;
+}
+
+.stat-card.sales .stat-icon-orb {
+  background: linear-gradient(135deg, #2563eb, #60a5fa);
+  box-shadow: 0 10px 24px rgba(37, 99, 235, 0.32);
+}
+
+.stat-card.purchase .stat-icon-orb {
+  background: linear-gradient(135deg, #14b8a6, #5eead4);
+  box-shadow: 0 10px 24px rgba(20, 184, 166, 0.3);
+}
+
+.stat-card.inventory .stat-icon-orb {
+  background: linear-gradient(135deg, #7c3aed, #a78bfa);
+  box-shadow: 0 10px 24px rgba(124, 58, 237, 0.28);
+}
+
+.stat-card.production .stat-icon-orb {
+  background: linear-gradient(135deg, #f97316, #fdba74);
+  box-shadow: 0 10px 24px rgba(249, 115, 22, 0.3);
+}
+
+.stat-value {
+  margin-top: 14px;
+  font-size: 30px;
+  line-height: 1.08;
+  font-weight: 700;
+  color: #0f172a;
+  position: relative;
+  z-index: 2;
+}
+
+.stat-footer {
+  margin-top: 8px;
+  color: #64748b;
+  font-size: 13px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  position: relative;
+  z-index: 2;
+}
+
+.stat-trend {
+  margin-top: 6px;
+  color: #0ea5a4;
+  font-size: 13px;
+  line-height: 1.25;
+  font-weight: 600;
+  position: relative;
+  z-index: 2;
+}
+
+.stat-wave {
+  position: absolute;
+  left: 10px;
+  right: 10px;
+  bottom: 6px;
+  height: 30px;
+  opacity: 0.62;
+  z-index: 1;
+  pointer-events: none;
+  background:
+    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 340 40' preserveAspectRatio='none'%3E%3Cpath d='M0 31C20 16 44 36 66 24C87 12 107 31 129 18C148 8 169 28 193 16C214 5 237 25 259 14C280 3 306 19 340 8' fill='none' stroke='%236ea4ee' stroke-width='1.5'/%3E%3C/svg%3E")
+      center / 100% 100% no-repeat;
+}
+
+.todo-panel {
+  padding: 12px;
+}
+
+.panel-title-row {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  gap: 12px;
+}
+
+.panel-title {
+  font-size: 18px;
+  font-weight: 700;
+  color: #1f3658;
+  position: relative;
+  padding-left: 12px;
+}
+
+.panel-title::before {
+  content: "";
+  position: absolute;
+  left: 0;
+  top: 50%;
+  transform: translateY(-50%);
+  width: 4px;
+  height: 18px;
+  border-radius: 4px;
+  background: linear-gradient(180deg, #2563eb, #38bdf8);
+}
+
+.panel-more {
+  font-size: 14px;
+  color: #2563eb;
+  cursor: pointer;
+}
+
+.todo-list {
+  margin: 10px 0 0;
+  padding: 0;
+  list-style: none;
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+  max-height: 230px;
+  overflow-y: auto;
+}
+
+.todo-item {
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  border-radius: 12px;
+  background: #f7fbff;
+  padding: 10px 12px;
+}
+
+.todo-head {
+  display: flex;
+  justify-content: space-between;
+  gap: 10px;
+  color: #334155;
+  font-size: 13px;
+}
+
+.todo-desc {
+  margin-top: 6px;
+  color: #64748b;
+  font-size: 12px;
+  line-height: 1.45;
+}
+
+.todo-no {
+  color: #1f3658;
+  font-weight: 600;
+}
+
+.panel-empty {
+  min-height: 140px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: var(--text-tertiary);
+}
+
+.main-grid {
+  display: grid;
+  grid-template-columns: minmax(0, 1fr) 400px;
+  gap: 16px;
+  align-items: start;
+}
+
+.left-column,
+.right-column {
+  display: flex;
+  flex-direction: column;
+  gap: 16px;
+  min-width: 0;
+}
+
+.process-panel {
+  padding-bottom: 12px;
+}
+
+.panel-actions {
+  display: flex;
+  gap: 8px;
+  align-items: center;
+  flex-wrap: wrap;
+}
+
+.process-body {
+  margin-top: 10px;
+  display: grid;
+  grid-template-columns: minmax(0, 1fr) 232px;
+  gap: 12px;
+  align-items: stretch;
+  min-height: 0;
+}
+
+.process-chart {
+  position: relative;
+  border: 1px solid rgba(148, 163, 184, 0.24);
+  border-radius: 14px;
+  background:
+    linear-gradient(180deg, rgba(255, 255, 255, 0.92), rgba(244, 249, 255, 0.9)),
+    repeating-linear-gradient(
+      to right,
+      rgba(148, 163, 184, 0.07) 0,
+      rgba(148, 163, 184, 0.07) 1px,
+      transparent 1px,
+      transparent 48px
+    ),
+    repeating-linear-gradient(
+      to bottom,
+      rgba(148, 163, 184, 0.06) 0,
+      rgba(148, 163, 184, 0.06) 1px,
+      transparent 1px,
+      transparent 34px
+    );
+  overflow: hidden;
+  padding: 10px;
+}
+
+.process-chart.empty :deep(canvas) {
+  opacity: 0.2;
+}
+
+.chart-empty {
+  position: absolute;
+  inset: 0;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  gap: 8px;
+  color: #64748b;
+  font-size: 14px;
+  text-align: center;
+  pointer-events: auto;
+  padding: 12px;
+}
+
+.chart-empty .el-icon {
+  color: #2563eb;
+  font-size: 28px;
+}
+
+.chart-empty-title {
+  font-size: 16px;
+  font-weight: 700;
+  color: #334155;
+}
+
+.chart-empty-desc {
+  font-size: 13px;
+  color: #64748b;
+}
+
+.chart-empty-actions {
+  margin-top: 4px;
+  display: flex;
+  gap: 8px;
+}
+
+.process-aside {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.process-legend,
+.process-card {
+  border: 1px solid rgba(148, 163, 184, 0.22);
+  border-radius: 12px;
+  background: rgba(255, 255, 255, 0.84);
+  padding: 10px 12px;
+}
+
+.process-card {
+  min-height: 74px;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+}
+
+.process-legend {
+  min-height: 74px;
+  display: flex;
+  flex-direction: column;
+  gap: 6px;
+  justify-content: center;
+}
+
+.process-legend-item {
+  color: #475569;
+  font-size: 12px;
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.dot {
+  width: 10px;
+  height: 10px;
+  border-radius: 3px;
+  display: inline-block;
+}
+
+.dot-blue {
+  background: #2563eb;
+}
+
+.dot-orange {
+  background: #f59e0b;
+}
+
+.dot-cyan {
+  background: #14b8a6;
+}
+
+.process-name {
+  color: #2563eb;
+  font-weight: 700;
+  font-size: 14px;
+  line-height: 1.2;
+  margin-bottom: 2px;
+}
+
+.process-label {
+  font-size: 12px;
+  color: #64748b;
+}
+
+.process-value {
+  margin-top: 4px;
+  font-size: 24px;
+  color: #0f172a;
+  font-weight: 700;
+}
+
+.chart-row {
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  gap: 16px;
+}
+
+.contract-summary {
+  display: grid;
+  grid-template-columns: 1fr 190px;
+  gap: 12px;
+  align-items: center;
+  margin-top: 8px;
+}
+
+.contract-card {
+  border-radius: 14px;
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  background: #f8fbff;
+  padding: 12px;
+}
+
+.contract-name {
+  color: #64748b;
+  font-size: 13px;
+}
+
+.contract-main {
+  margin-top: 8px;
+  font-size: 34px;
+  font-weight: 700;
+  color: #0f172a;
+}
+
+.contract-compare {
+  margin-top: 8px;
+  font-size: 13px;
+  color: #64748b;
+  display: flex;
+  gap: 10px;
+}
+
+.rise {
+  color: #0ea5a4;
+  font-weight: 600;
+}
+
+.contract-list {
+  margin: 8px 0 0;
+  padding: 0;
+  list-style: none;
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.contract-list li {
+  display: grid;
+  grid-template-columns: 12px minmax(0, 1fr) 56px auto;
+  align-items: center;
+  gap: 8px;
+  color: #475569;
+  font-size: 13px;
+}
+
+.legend-dot {
+  width: 8px;
+  height: 8px;
+  border-radius: 50%;
+}
+
+.contract-item-name {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.contract-item-rate {
+  text-align: right;
+  color: #64748b;
+}
+
+.contract-item-value {
+  color: #1f3658;
+  text-align: right;
+}
+
+.quality-cards {
+  margin: 8px 0 10px;
+  display: grid;
+  grid-template-columns: repeat(3, minmax(0, 1fr));
+  gap: 10px;
+}
+
+.quality-card {
+  border-radius: 12px;
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  padding: 10px 12px;
+  color: #475569;
+  font-size: 13px;
+}
+
+.quality-card.one {
+  background: linear-gradient(135deg, #ffffff, #edf4ff);
+}
+
+.quality-card.two {
+  background: linear-gradient(135deg, #ffffff, #ebfffc);
+}
+
+.quality-card.three {
+  background: linear-gradient(135deg, #ffffff, #fff3e6);
+}
+
+.quality-card span {
+  color: #0f172a;
+  font-weight: 700;
+  margin-left: 6px;
+}
+
+.realtime-grid {
+  margin-top: 10px;
+  display: grid;
+  grid-template-columns: repeat(3, minmax(0, 1fr));
+  gap: 10px;
+}
+
+.realtime-item {
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  border-radius: 12px;
+  background: #f8fbff;
+  padding: 10px 8px;
+  text-align: center;
+}
+
+.realtime-value {
+  font-size: 26px;
+  color: #0f172a;
+  font-weight: 700;
+}
+
+.realtime-label {
+  margin-top: 8px;
+  font-size: 12px;
+  color: #475569;
+}
+
+.realtime-delta {
+  margin-top: 4px;
+  font-size: 12px;
+}
+
+.realtime-delta.up {
+  color: #0ea5a4;
+}
+
+.realtime-delta.down {
+  color: #f59e0b;
+}
+
+.warning-list {
+  margin-top: 10px;
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+  max-height: 300px;
+  overflow-y: auto;
+}
+
+.warning-item {
+  display: grid;
+  grid-template-columns: 10px minmax(0, 1fr) 72px;
+  align-items: center;
+  gap: 10px;
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  border-radius: 12px;
+  background: #f8fbff;
+  padding: 10px;
+}
+
+.warning-dot {
+  width: 8px;
+  height: 8px;
+  border-radius: 50%;
+  display: block;
+}
+
+.warning-dot.device {
+  background: #ef4444;
+}
+
+.warning-dot.quality {
+  background: #f59e0b;
+}
+
+.warning-dot.material {
+  background: #3b82f6;
+}
+
+.warning-title {
+  color: #334155;
+  font-size: 13px;
+  font-weight: 600;
+}
+
+.warning-desc {
+  color: #64748b;
+  font-size: 12px;
+  margin-top: 4px;
+}
+
+.warning-time {
+  color: #64748b;
+  font-size: 12px;
+  text-align: right;
+}
+
+.order-panel {
+  min-height: 0;
+}
+
+.quick-panel {
+  min-height: 0;
+}
+
+.table-progress {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+
+.table-progress span {
+  font-size: 12px;
+  color: #475569;
+}
+
+.quick-grid {
+  margin-top: 10px;
+  display: grid;
+  grid-template-columns: repeat(2, minmax(0, 1fr));
+  grid-auto-rows: 58px;
+  gap: 10px;
+}
+
+.quick-item {
+  border: 1px solid rgba(148, 163, 184, 0.22);
+  background: rgba(255, 255, 255, 0.92);
+  border-radius: 12px;
+  color: #334155;
+  display: flex;
+  align-items: center;
+  gap: 8px;
+  padding: 0 10px;
+  font-size: 12px;
+  cursor: pointer;
+  transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
+}
+
+.plan-panel {
+  min-height: 236px;
+}
+
+.quality-panel {
+  min-height: 0;
+}
+
+.receipt-panel {
+  min-height: 340px;
+}
+
+.plan-list {
+  margin: 10px 0 0;
+  padding: 0;
+  list-style: none;
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.plan-item {
+  border: 1px solid rgba(148, 163, 184, 0.18);
+  border-radius: 12px;
+  background: #f8fbff;
+  padding: 10px 12px;
+}
+
+.plan-main {
+  display: flex;
+  justify-content: space-between;
+  gap: 10px;
+  align-items: center;
+}
+
+.plan-order {
+  font-size: 13px;
+  color: #1f3658;
+  font-weight: 600;
+}
+
+.plan-name {
+  font-size: 13px;
+  color: #334155;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.plan-meta {
+  margin-top: 6px;
+  display: flex;
+  justify-content: space-between;
+  gap: 8px;
+  font-size: 12px;
+  color: #64748b;
+}
+
+.quick-item:hover {
+  transform: translateY(-2px);
+  border-color: rgba(96, 165, 250, 0.45);
+  box-shadow: 0 14px 28px rgba(37, 99, 235, 0.1);
+}
+
+.quick-icon {
+  width: 30px;
+  height: 30px;
+  border-radius: 8px;
+  background: linear-gradient(135deg, #2563eb, #38bdf8);
+  display: inline-flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 16px;
+  color: #fff;
+}
+
+.quick-item:nth-child(2) .quick-icon,
+.quick-item:nth-child(6) .quick-icon {
+  background: linear-gradient(135deg, #14b8a6, #5eead4);
+}
+
+.quick-item:nth-child(3) .quick-icon,
+.quick-item:nth-child(5) .quick-icon {
+  background: linear-gradient(135deg, #7c3aed, #a78bfa);
+}
+
+.quick-item:nth-child(4) .quick-icon,
+.quick-item:nth-child(7) .quick-icon {
+  background: linear-gradient(135deg, #f97316, #fdba74);
+}
+
+.process-selection-wrapper {
+  max-height: 400px;
+  overflow-y: auto;
+  padding: 8px;
+}
+
+.process-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(130px, 1fr));
+  gap: 10px;
+}
+
+:deep(.el-checkbox.is-bordered) {
+  margin-left: 0 !important;
+  width: 100%;
+}
+
+:deep(.el-radio-button__inner) {
+  border-radius: 10px !important;
+  background: #f8fbff;
+  border-color: rgba(148, 163, 184, 0.22) !important;
+  color: #475569 !important;
+}
+
+:deep(.el-radio-button__original-radio:checked + .el-radio-button__inner) {
+  background: linear-gradient(135deg, #2f80ff, #38bdf8) !important;
+  border-color: transparent !important;
+  color: #fff !important;
+}
+
+:deep(.el-progress-circle__track) {
+  stroke: rgba(148, 163, 184, 0.3);
+}
+
+:deep(.el-progress-bar__outer) {
+  background-color: rgba(148, 163, 184, 0.2);
+}
+
+:deep(.order-panel .el-progress-bar__inner) {
+  background: linear-gradient(90deg, #2563eb, #38bdf8) !important;
+}
+
+:deep(.order-panel .el-table) {
+  border-radius: 14px;
+}
+
+:deep(.order-panel .el-table th.el-table__cell) {
+  background: #f2f7ff !important;
+}
+
+:deep(.order-panel .el-table__body tr:hover > td.el-table__cell) {
+  background: #f8fbff !important;
+}
+
+:deep(.order-panel .el-tag--success) {
+  color: #0f766e;
+  background: #e9fdf7;
+  border-color: #b7f2e0;
+}
+
+:deep(.order-panel .el-tag--warning) {
+  color: #b45309;
+  background: #fff6e8;
+  border-color: #fde0b8;
+}
+
+:deep(.order-panel .el-tag--primary) {
+  color: #2563eb;
+  background: #eaf2ff;
+  border-color: #b8d2ff;
+}
+
+@media (max-width: 1600px) {
+  .main-grid {
+    grid-template-columns: minmax(0, 1fr) 380px;
+  }
+}
+
+@media (max-width: 1366px) {
+  .main-grid {
+    grid-template-columns: minmax(0, 1fr) 340px;
+  }
+
+  .stats-grid {
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+  }
+}
+
+@media (max-width: 1200px) {
+  .main-grid {
+    grid-template-columns: 1fr;
+  }
+
+  .right-column {
+    display: grid;
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+    gap: 14px;
+  }
+
+  .chart-row {
+    grid-template-columns: 1fr;
+  }
+
+  .process-body {
+    grid-template-columns: 1fr;
+  }
+
+  .realtime-grid {
+    grid-template-columns: repeat(3, minmax(0, 1fr));
+  }
+
+  .quality-cards {
+    grid-template-columns: 1fr;
+  }
+}
+
+@media (max-width: 768px) {
+  .welcome-panel {
+    flex-direction: column;
+    align-items: flex-start;
+    gap: 10px;
+  }
+
+  .welcome-meta {
+    text-align: left;
+  }
+
+  .meta-extra {
+    justify-content: flex-start;
+  }
+
+  .stats-grid {
+    grid-template-columns: repeat(2, minmax(0, 1fr));
+  }
+
+  .right-column {
+    grid-template-columns: 1fr;
+  }
+
+  .realtime-grid {
+    grid-template-columns: 1fr;
+  }
+}
+</style>

--
Gitblit v1.9.3