From a79d67f8a9a9fa02f9d25f987b9611af965c484f Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期四, 22 十月 2026 18:41:01 +0800
Subject: [PATCH] 修改了风格

---
 src/assets/styles/index.scss                                 |    9 
 src/views/project/organallocation/index0.vue                 |    3 
 src/layout/index.vue                                         |   16 
 src/views/project/donatefinishcheck/index.vue                |   15 
 src/views/project/reimbursementpayee/index.vue               |    3 
 src/store/modules/settings.js                                |    3 
 src/views/monitor/logininfor/index.vue                       |    3 
 src/views/monitor/operlog/index.vue                          |    3 
 src/assets/styles/ruoyi.scss                                 |   11 
 src/views/project/travelexpensecheck/index.vue               |    3 
 src/views/system/costmaintenance/index.vue                   |    1 
 src/views/project/donateorganstatics/index.vue               |    1 
 src/views/project/reimbursement/index.vue                    |    3 
 src/views/monitor/job/log.vue                                |    3 
 src/views/project/donateorgan/index.vue                      |    3 
 src/assets/styles/tokens.scss                                |   98 +++
 src/settings.js                                              |   89 --
 src/utils/theme.js                                           |  172 +++++
 src/assets/styles/tokens.css                                 |   91 ++
 src/assets/styles/element-variables.scss                     |   68 +
 src/views/tool/gen/index.vue                                 |    3 
 src/views/project/reimbursementdetail/index.vue              |    3 
 src/views/project/DonationEvaluation/index.vue               |    1 
 src/views/system/role/index.vue                              |    3 
 src/views/project/tallage/index.vue                          |    1 
 src/views/project/statistics/applyStatistics/index.vue       |    1 
 src/views/system/menu/index.vue                              |    3 
 src/views/project/ethicalReview/index.vue                    |    1 
 src/views/project/donateconsolationfund/index.vue            |    1 
 src/views/system/dict/data.vue                               |    3 
 src/views/tool/gen/importTable.vue                           |    3 
 src/views/project/fund/officeExpenseApply/index.vue          |    1 
 src/views/project/fundcheck/performanceCheck/index.vue       |    3 
 src/views/project/organization/index.vue                     |    1 
 src/views/project/donateannexrequirement/index.vue           |    3 
 src/assets/styles/variables.scss                             |   22 
 src/views/project/donatefollowup/index.vue                   |    1 
 public/index.html                                            |    2 
 src/assets/styles/sidebar.scss                               |   46 +
 src/views/system/dept/index.vue                              |    3 
 src/views/system/medicalevalustion/index.vue                 |    3 
 src/views/project/documentfiles/index.vue                    |    1 
 src/views/project/unitCost/index.vue                         |    3 
 src/views/system/student/index.vue                           |    3 
 src/views/project/fundcheck/medicalCostCheck/index.vue       |    3 
 src/components/ThemePicker/index.vue                         |   21 
 src/views/project/donatefinish/index.vue                     |    1 
 src/views/project/itemexpense/index.vue                      |    3 
 src/views/project/donatebaseinfo/index.vue                   |  111 +-
 src/views/project/financesubject/index.vue                   |    3 
 src/views/system/class/index.vue                             |    3 
 src/views/project/donateannex/index.vue                      |    1 
 src/views/project/relativesconfirmation/index.vue            |    1 
 src/views/project/funddetail/index.vue                       |    3 
 src/views/system/role/authUser.vue                           |    3 
 src/views/project/organallocation/index.vue                  |    1 
 src/views/project/tallage/computingBill/index.vue            |    1 
 src/views/project/donationdetails/index.vue                  |  141 +++-
 src/views/system/post/index.vue                              |    3 
 src/views/project/donorcharge/donorcharge/index.vue          |    3 
 src/main.js                                                  |   11 
 src/views/project/DonationProcess/index.vue                  |   15 
 src/views/system/grade/index.vue                             |    3 
 src/views/system/notice/index.vue                            |    3 
 src/views/project/externalperson/index.vue                   |    3 
 src/assets/styles/theme-runtime.scss                         |  270 ++++++++
 src/layout/components/Settings/index.vue                     |   49 +
 src/views/system/dict/index.vue                              |    3 
 src/views/project/unitCost/particulars/index.vue             |    1 
 src/views/project/travelexpensedeal/index.vue                |    1 
 src/views/system/config/index.vue                            |    3 
 src/views/project/fundcheck/ethicalExpertFeeCheck/index.vue  |    3 
 src/views/project/statistics/caseStatistics/index.vue        |    1 
 src/views/project/donatereview/index.vue                     |   15 
 src/views/project/donorcharge/organcharge/index.vue          |    3 
 src/views/system/role/selectUser.vue                         |    3 
 src/views/project/statistics/performanceStaristics/index.vue |    1 
 src/views/project/travelexpenseapply/index.vue               |    3 
 src/views/project/donationwitness/index.vue                  |    1 
 src/views/project/fundflow/index.vue                         |    3 
 src/views/monitor/job/index.vue                              |    3 
 src/views/project/fund/medicalCostApply/index.vue            |    1 
 src/views/project/statistics/chargeStatistics/index.vue      |    1 
 src/views/project/fund/index.vue                             |    3 
 src/views/monitor/online/index.vue                           |    3 
 src/views/project/fund/performanceApply/index.vue            |    1 
 src/views/project/fundcheck/officeExpenseCheck/index.vue     |    3 
 src/views/project/medicalevaluation/index.vue                |    1 
 src/views/project/fundflowrule/index.vue                     |    1 
 src/views/project/fundstatistics/index.vue                   |    3 
 src/views/system/user/index.vue                              |    3 
 src/views/project/fund/applyDetail/index.vue                 |   19 
 src/views/project/fund/expertFeeApply/index.vue              |    1 
 src/views/project/fund/ethicalExpertFeeApply/index.vue       |    1 
 src/assets/styles/element-override.scss                      |  365 +++++++++++
 src/views/project/fundcheck/expertFeeCheck/index.vue         |    3 
 src/views/project/distributedetail/index.vue                 |    3 
 97 files changed, 1,517 insertions(+), 308 deletions(-)

diff --git a/public/index.html b/public/index.html
index 925455c..257b020 100644
--- a/public/index.html
+++ b/public/index.html
@@ -174,7 +174,7 @@
     }
 
     #loader-wrapper .load_title {
-      font-family: 'Open Sans';
+      font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;
       color: #FFF;
       font-size: 19px;
       width: 100%;
diff --git a/src/assets/styles/element-override.scss b/src/assets/styles/element-override.scss
new file mode 100644
index 0000000..513143a
--- /dev/null
+++ b/src/assets/styles/element-override.scss
@@ -0,0 +1,365 @@
+// ============================================================
+// 缁勪欢榛樿澶栬锛堥潤鎬佷护鐗屽眰锛�
+// ------------------------------------------------------------
+// 鐩殑锛氫笉鏀逛换浣曚笟鍔¢〉闈㈡ā鏉匡紝鐢ㄥ叏灞�鏍峰紡鎶� Element 鐨勯粯璁よ鎰�
+//       缁熶竴鎴�"绱у噾銆佹竻鐖姐�佷笓涓�"鐨勪竴濂椼��
+// 閲嶇偣锛氳〃鏍硷紙鏂戦┈绾�/鍘荤珫绾�/琛ㄥご搴曡壊锛夈�佽〃鍗曘�佹寜閽�佸脊绐椼�佹爣绛俱��
+// 椤哄簭锛氬繀椤绘櫄浜� element-ui 涓� ruoyi.scss锛堣 main.js锛夈��
+// ============================================================
+
+// ---------- 鍏ㄥ眬鎺掔増 ----------
+body {
+  font-family: var(--opo-font-family-base);
+  font-size: var(--opo-font-size-base);
+  color: var(--opo-text-primary);
+  background-color: var(--opo-bg-page);
+}
+
+// 瑕嗙洊 index.scss 閲岀殑 label { font-weight: 700 }
+label {
+  font-weight: 400;
+}
+
+.app-container {
+  // 2026-10-22锛氱粺涓�鏀剁揣涓� 8/12/12锛堝師 12/16锛夛紝鍏ㄧ珯鍒楄〃椤典竴鑷�
+  padding: 8px 12px 12px;
+}
+
+// 鏁板瓧绫诲瓧娈碉紙閲戦/缂栧彿/韬唤璇侊級鍙敤姝ょ被鑾峰緱绛夊鏁板瓧
+.opo-number {
+  font-family: var(--opo-font-family-number);
+  font-variant-numeric: tabular-nums;
+}
+
+// ---------- 琛ㄦ牸 ----------
+// 2026-10-22锛氭暟鎹瀛楀彿涓庤〃澶寸粺涓�锛�14px / 甯歌瀛楅噸锛�
+// 娉ㄦ剰锛氬叏灞� size=small 浼氳姣忎釜琛ㄦ牸甯︿笂 .el-table--small锛�
+// Element 鐢ㄥ畠鎶婂瓧鍙峰啓鍥� 12px銆佸崟鍏冩牸 padding 鍐欏洖 8px锛�
+// 鎵�浠ヨ繖閲屽繀椤诲悓鏃舵彁楂橀�夋嫨鍣ㄧ壒寮傛�э紝鍚﹀垯浼氳鍘嬪洖鍘汇��
+.el-table,
+.el-table.el-table--small,
+.el-table.el-table--medium,
+.el-table.el-table--mini,
+.el-table.el-table--large {
+  color: var(--opo-text-primary);
+  font-size: var(--opo-font-size-sm);
+}
+
+.el-table {
+  th,
+  th.el-table__cell {
+    background-color: var(--opo-bg-thead) !important;
+    color: var(--opo-text-primary);
+    // 琛ㄥご涓嶅姞绮楋紙2026-10-22 鍙嶉锛�
+    font-weight: 400;
+    font-size: var(--opo-font-size-sm);
+    height: 40px;
+    padding: 0;
+  }
+
+  td,
+  td.el-table__cell,
+  &.el-table--small td.el-table__cell,
+  &.el-table--medium td.el-table__cell,
+  &.el-table--mini td.el-table__cell {
+    padding: 9px 0;
+    // 琛屽垎闅旂嚎锛�2026-10-22 鍐嶅姞娣变竴妗o級
+    border-bottom: 1px solid var(--opo-table-border, #c8cfd8);
+  }
+
+  // 琛ㄦ牸搴曢儴閭f潯绾�
+  &::before {
+    background-color: var(--opo-table-border, #c8cfd8);
+  }
+
+  // 甯﹁竟妗嗙殑琛ㄦ牸锛屽妗嗙嚎
+  &.el-table--border {
+    border-color: var(--opo-table-border, #c8cfd8);
+  }
+
+  .cell {
+    line-height: 23px;
+  }
+
+  // 琛ㄥご涓庡唴瀹瑰尯鐨勫垎闅旂嚎锛堟瘮琛岀嚎鍐嶆繁涓�鐐癸紝浣滀负鍒嗙晫锛�
+  .el-table__header-wrapper th {
+    border-bottom: 1px solid var(--opo-table-border-strong, #b7c0cc);
+  }
+
+  // 鏂戦┈绾癸細鐢� CSS 瀹炵幇锛屾棤闇�缁� 162 涓〃鏍奸�愪釜鍔� stripe 灞炴��
+  .el-table__body tr:nth-child(2n) > td,
+  .el-table__body tr:nth-child(2n) > td.el-table__cell {
+    background-color: var(--opo-bg-stripe);
+  }
+
+  // 榧犳爣琛岄珮浜紙瑕嗙洊鏂戦┈绾癸紱Element 榛樿 hover 鑹插亸鐏帮級
+  .el-table__body tr:hover > td,
+  .el-table__body tr:hover > td.el-table__cell {
+    background-color: var(--opo-primary-light-95, #f5f9fd);
+  }
+
+  // 鍘绘帀绔栫嚎锛歜order 灞炴�т粛淇濈暀鍦ㄦā鏉块噷锛岃繖閲屽彧璁╁畠鍦ㄨ瑙変笂娑堝け
+  &.el-table--border td,
+  &.el-table--border th,
+  &.el-table--border th.el-table__cell,
+  &.el-table--border td.el-table__cell {
+    border-right: none;
+  }
+
+  &.el-table--border::after,
+  &.el-table--group::after {
+    display: none;
+  }
+
+  .el-table__empty-text {
+    color: var(--opo-text-placeholder);
+    font-size: var(--opo-font-size-sm);
+  }
+}
+
+// 闇�瑕�"寮虹綉鏍肩嚎"鐨勬槑缁嗗綍鍏ヨ〃锛氭ā鏉夸笂鍔� class="table-bordered" 鍗冲彲鎭㈠
+.el-table.table-bordered {
+  border: 1px solid var(--opo-table-border, #c8cfd8);
+
+  td,
+  th,
+  td.el-table__cell,
+  th.el-table__cell {
+    border-right: 1px solid var(--opo-table-border, #c8cfd8);
+  }
+}
+
+// 琛ㄦ牸鍐呮寜閽洿绱у噾锛岄伩鍏嶆妸琛屾拺楂�
+.el-table .el-button--mini,
+.el-table .el-button--small {
+  padding: 5px 8px;
+}
+
+// ---------- 琛ㄥ崟 ----------
+// 鏌ヨ鏉′欢/琛ㄥ崟鏁翠綋鏀剁揣锛欵lement 榛樿 margin-bottom 22px锛岃璺濇槑鏄惧亸澶�
+.el-form-item {
+  margin-bottom: 12px;
+
+  &__label {
+    font-weight: 400;
+    color: var(--opo-text-regular);
+    // 鏍囩淇濇寔 14px锛氭煡璇㈠尯澶ч噺浣跨敤 label-width="68px"/"70px"锛�
+    // 鏍囩鑻ラ殢姝f枃鍗囧埌 16px锛�4 涓瓧锛堝"鎹愮尞妗堜緥"锛夊氨浼氭崲琛屻�佽楂樼炕鍊�
+    font-size: var(--opo-font-size-sm);
+    padding-right: 8px;
+    line-height: 32px;
+  }
+
+  &__content {
+    line-height: 32px;
+    min-height: 32px;
+  }
+
+  &.is-required:not(.is-no-asterisk) > .el-form-item__label:before {
+    color: var(--opo-danger);
+  }
+
+  &__error {
+    font-size: var(--opo-font-size-xs);
+    line-height: 1.4;
+    padding-top: 2px;
+  }
+}
+
+// 妯悜鎺掑垪鐨勬煡璇㈡潯浠跺啀绱у噾涓�妗�
+.el-form--inline .el-form-item {
+  margin-right: 12px;
+  margin-bottom: 8px;
+}
+
+// ---------- 绱у噾鏌ヨ鍖猴紙opt-in锛� ----------
+// 鐢ㄦ硶锛氱粰鏌ヨ鐢ㄧ殑 el-form 鍔� class="opo-query-form"锛堝垪琛ㄩ〉缁熶竴绾﹀畾锛�
+// 琛岃窛 8鈫�4px銆佹爣绛句笌鎺т欢瀵归綈銆佹渶鍚庝竴琛岋紙鎼滅储/閲嶇疆锛夊幓鎺変笅杈硅窛
+.opo-query-form {
+  // 鏌ヨ鏉′欢涓庝笅鏂�"鏂板/瀵煎嚭"宸ュ叿鏍忥紙瀵硅〃鏍肩殑鎿嶄綔锛変箣闂寸暀鍑洪棿璺�
+  margin-bottom: 12px;
+
+  .el-form-item {
+    margin-right: 8px;
+    margin-bottom: 4px;
+  }
+
+  .el-form-item__label {
+    line-height: 32px;
+    padding-right: 6px;
+  }
+
+  .el-form-item__content {
+    line-height: 32px;
+    min-height: 32px;
+  }
+
+  // 鏈�鍚庝竴琛岄�氬父鏄�"鎼滅储/閲嶇疆"锛屼笉鍐嶉澶栫暀鐧�
+  > .el-row:last-child .el-form-item {
+    margin-bottom: 0;
+  }
+}
+
+// 绱ц窡鏌ヨ鍖轰箣鍚庣殑宸ュ叿鏍忚锛堟柊澧�/瀵煎嚭锛夛細璐磋繎琛ㄦ牸锛屼笌鏌ヨ鍖虹敱 margin-bottom 闅斿紑
+.opo-query-form + .el-row.mb8 {
+  margin-bottom: 4px;
+}
+
+// 椤甸潰閲岀殑鏌ヨ鍖哄父鍖呭湪鍗$墖鎴� el-row 涓紝鍘绘帀澶氫綑鐨勫灞傜暀鐧�
+.el-card__body > .el-form:first-child,
+.el-card__body > .el-row:first-child .el-form {
+  margin-bottom: 0;
+}
+
+.el-input__inner,
+.el-textarea__inner {
+  border-radius: var(--opo-radius-base);
+  color: var(--opo-text-primary);
+
+  &::placeholder {
+    color: var(--opo-text-placeholder);
+  }
+}
+
+// ---------- 鎸夐挳 ----------
+.el-button {
+  border-radius: var(--opo-radius-base);
+  font-weight: 400;
+
+  [class*='el-icon-'] + span {
+    margin-left: 4px;
+  }
+}
+
+// 灏�/杩蜂綘鎸夐挳鐨勫瓧鍙峰湪 Element 閲屾槸纭紪鐮� 12px锛岄殢姝f枃涓�璧蜂笂璋冿紙2026-10-22 鍐嶅ぇ涓�鍙� 鈫� 16px锛�
+.el-button--small,
+.el-button--mini {
+  font-size: var(--opo-font-size-base);
+}
+
+// ---------- 寮圭獥 ----------
+.el-dialog {
+  border-radius: var(--opo-radius-lg);
+  box-shadow: var(--opo-shadow-lg);
+  overflow: hidden;
+
+  &__header {
+    padding: 16px 20px 12px;
+    border-bottom: 1px solid var(--opo-border-light);
+  }
+
+  &__title {
+    font-size: var(--opo-font-size-lg);
+    font-weight: 600;
+    color: var(--opo-text-primary);
+  }
+
+  &__body {
+    padding: 16px 20px;
+    color: var(--opo-text-regular);
+  }
+
+  &__footer {
+    padding: 12px 20px 16px;
+    border-top: 1px solid var(--opo-border-light);
+  }
+}
+
+.el-drawer__header {
+  padding: 16px 20px;
+  margin-bottom: 0;
+  border-bottom: 1px solid var(--opo-border-light);
+  color: var(--opo-text-primary);
+  font-weight: 600;
+}
+
+// ---------- 鏍囩 ----------
+.el-tag {
+  border-radius: var(--opo-radius-sm);
+  font-size: var(--opo-font-size-xs);
+}
+
+// ---------- 鍗$墖 ----------
+.el-card {
+  border-radius: var(--opo-radius-lg);
+  border-color: var(--opo-border-light);
+  box-shadow: var(--opo-shadow-sm) !important;
+
+  &__header {
+    padding: 14px 16px 10px;
+    border-bottom: 1px solid var(--opo-border-light);
+    font-weight: 600;
+    color: var(--opo-text-primary);
+  }
+
+  &__body {
+    padding: 12px 16px;
+  }
+}
+
+// ---------- 鍒嗛〉 ----------
+// Element 鎶婂垎椤垫枃瀛楀啓姝� 13px銆佸瓧閲� 700锛屽拰 16px 鐨勮〃鏍兼鏂囦笉鎼� 鈫� 缁熶竴 14px/甯歌
+.el-pagination {
+  font-weight: 400;
+  color: var(--opo-text-regular);
+  font-size: var(--opo-font-size-sm);
+
+  button,
+  span:not([class*='suffix']) {
+    font-size: var(--opo-font-size-sm);
+  }
+
+  .el-pager li {
+    font-size: var(--opo-font-size-sm);
+  }
+}
+
+.pagination-container {
+  margin-top: 12px;
+  height: auto;
+  padding: 8px 16px !important;
+}
+
+// ---------- 闈㈠寘灞� / 椤电 ----------
+.el-breadcrumb {
+  font-size: var(--opo-font-size-sm);
+
+  &__inner,
+  &__inner a {
+    font-weight: 400 !important;
+    color: var(--opo-text-secondary);
+  }
+
+  &__item:last-child .el-breadcrumb__inner {
+    color: var(--opo-text-primary);
+  }
+}
+
+// ---------- 鎻愮ず / 娑堟伅 ----------
+.el-message {
+  border-radius: var(--opo-radius-base);
+  box-shadow: var(--opo-shadow-md);
+}
+
+.el-tooltip__popper {
+  font-size: var(--opo-font-size-xs);
+}
+
+// ---------- 婊氬姩鏉★紙瑙傛劅缁嗚妭锛� ----------
+::-webkit-scrollbar {
+  width: 8px;
+  height: 8px;
+}
+
+::-webkit-scrollbar-thumb {
+  background-color: rgba(0, 0, 0, 0.18);
+  border-radius: var(--opo-radius-pill);
+
+  &:hover {
+    background-color: rgba(0, 0, 0, 0.28);
+  }
+}
+
+::-webkit-scrollbar-track {
+  background-color: transparent;
+}
diff --git a/src/assets/styles/element-variables.scss b/src/assets/styles/element-variables.scss
index 8b7a48e..39da0fb 100644
--- a/src/assets/styles/element-variables.scss
+++ b/src/assets/styles/element-variables.scss
@@ -1,23 +1,61 @@
 /**
-* I think element-ui's default theme color is too light for long-term use.
-* So I modified the default color and you can modify it to your liking.
-**/
+ * Element UI 涓婚鍙橀噺锛堢紪璇戞湡锛�
+ * ------------------------------------------------------------
+ * 鍝佺墝涓昏壊锛氬彇鑷� src/assets/logo/OPO_Logo.png 鍦嗙幆闈� #0E768F
+ * 鍗遍櫓鑹诧細  鍙栬嚜鍚屽浘蹇冨舰鐜孩 #CD1D4E锛堢櫧瀛楀姣斿害 5.41锛屼紭浜庡師 #F56C6C 鐨� 3.4锛�
+ *
+ * 璇存槑锛氳繖閲屽喅瀹�"缂栬瘧杩� CSS 鐨勯粯璁ょ毊鑲�"锛�
+ *      杩愯鏃舵崲鑲ょ敱 assets/styles/theme-runtime.scss + utils/theme.js 璐熻矗锛�
+ *      浜岃�呴�氳繃 CSS 鍙橀噺 --opo-primary* 琛旀帴銆�
+ */
 
-/* theme color */
-$--color-primary: #1890ff;
-$--color-success: #13ce66;
-$--color-warning: #ffba00;
-$--color-danger: #ff4949;
-// $--color-info: #1E1E1E;
+/* ---------- 涓婚鑹� ---------- */
+$--color-primary: #0E768F;
+$--color-success: #67C23A;
+$--color-warning: #E6A23C;
+$--color-danger: #CD1D4E;
+$--color-info: #909399;
+
+/* ---------- 鏂囧瓧 ---------- */
+$--color-text-primary: #1F2937;
+$--color-text-regular: #4B5563;
+$--color-text-secondary: #6B7280;
+$--color-text-placeholder: #9CA3AF;
+
+/* ---------- 杈规 ---------- */
+$--border-color-base: #E5E7EB;
+$--border-color-light: #F0F2F5;
+$--border-color-lighter: #F5F7FA;
+$--border-color-extra-light: #FAFBFC;
+
+/* ---------- 鑳屾櫙 ---------- */
+$--background-color-base: #F5F7FA;
+
+/* ---------- 鍦嗚 ---------- */
+$--border-radius-base: 4px;
+$--border-radius-small: 2px;
+
+/* ---------- 瀛楀彿锛�2026-10-22 鏁翠綋涓婅皟涓�鍙凤級 ---------- */
+$--font-size-extra-large: 22px;
+$--font-size-large: 20px;
+$--font-size-medium: 18px;
+$--font-size-base: 16px;
+$--font-size-small: 14px;
+$--font-size-extra-small: 13px;
+
+/* 鎸夐挳瀛楀彿榛樿鍦ㄥ皬灏哄閲岃纭紪鐮佹垚 12px锛屼竴骞朵笂璋� */
+$--button-font-size: 16px;
+$--button-medium-font-size: 16px;
+$--button-small-font-size: 14px;
+$--button-mini-font-size: 14px;
+
+/* 渚ц竟鏍忚彍鍗曞瓧鍙凤紙2026-10-22 鐢� 18px 鍥炶皟涓�鍙凤級 */
+$--menu-item-font-size: 16px;
 
 $--button-font-weight: 400;
 
-// $--color-text-regular: #1f2d3d;
-
-$--border-color-light: #dfe4ed;
-$--border-color-lighter: #e6ebf5;
-
-$--table-border:1px solid#dfe6ec;
+/* ---------- 琛ㄦ牸 ---------- */
+$--table-border: 1px solid #E5E7EB;
 
 /* icon font path, required */
 $--font-path: '~element-ui/lib/theme-chalk/fonts';
diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss
index 49eb8c9..0a7ad3e 100644
--- a/src/assets/styles/index.scss
+++ b/src/assets/styles/index.scss
@@ -10,11 +10,12 @@
   -moz-osx-font-smoothing: grayscale;
   -webkit-font-smoothing: antialiased;
   text-rendering: optimizeLegibility;
-  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+  font-family: $opo-font-family-base;
 }
 
+// 琛ㄥ崟鏍囩涓嶅啀鍏ㄥ眬鍔犵矖锛堝師鏉� 700 璁╂墍鏈夐〉闈㈡樉寰楀緢"閲�"锛�
 label {
-  font-weight: 700;
+  font-weight: 400;
 }
 
 html {
@@ -103,8 +104,8 @@
   border-radius: 2px;
   display: block;
   line-height: 32px;
-  font-size: 16px;
-  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+  font-size: $opo-font-size-lg;
+  font-family: $opo-font-family-base;
   color: #2c3e50;
   -webkit-font-smoothing: antialiased;
   -moz-osx-font-smoothing: grayscale;
diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss
index 8fe1961..cc33197 100644
--- a/src/assets/styles/ruoyi.scss
+++ b/src/assets/styles/ruoyi.scss
@@ -3,6 +3,9 @@
  * Copyright (c) 2019 ruoyi
  */
 
+/* 璁捐浠ょ墝锛堟湰鏂囦欢涓虹嫭绔嬪叆鍙o紝闇�鑷寮曞叆鍙橀噺锛� */
+@import './tokens.scss';
+
  /** 鍩虹閫氱敤 **/
 .pt5 {
 	padding-top: 5px;
@@ -75,10 +78,10 @@
 	.el-table__header-wrapper, .el-table__fixed-header-wrapper {
 		th {
 			word-break: break-word;
-			background-color: #f8f8f9;
-			color: #515a6e;
+			background-color: $opo-bg-thead;
+			color: $opo-text-primary;
 			height: 40px;
-			font-size: 13px;
+			font-size: $opo-font-size-sm;
 		}
 	}
 	.el-table__body-wrapper {
@@ -137,7 +140,7 @@
 /** 琛ㄦ牸鏇村鎿嶄綔涓嬫媺鏍峰紡 */
 .el-table .el-dropdown-link {
 	cursor: pointer;
-	color: #409EFF;
+	color: var(--opo-primary, #0E768F);
 	margin-left: 5px;
 }
 
diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss
index bb91f3f..f28a921 100644
--- a/src/assets/styles/sidebar.scss
+++ b/src/assets/styles/sidebar.scss
@@ -67,17 +67,23 @@
       width: 100% !important;
     }
 
+    // 鑿滃崟瀛楀彿锛氭瘮姝f枃澶т袱鍙凤紙姝f枃 16px 鈫� 鑿滃崟 18px锛�
+    .el-menu-item,
+    .el-submenu__title {
+      font-size: $opo-font-size-menu;
+    }
+
     .el-menu-item, .el-submenu__title {
       overflow: hidden !important;
       text-overflow: ellipsis !important;
       white-space: nowrap !important;
     }
 
-    // menu hover
+    // menu hover锛堟繁鑹插簳涓婄敤閫忕櫧锛屽師鏉� rgba(0,0,0,.06) 鍦ㄦ繁鑹蹭笂鐪嬩笉鍑烘潵锛�
     .submenu-title-noDropdown,
     .el-submenu__title {
       &:hover {
-        background-color: rgba(0, 0, 0, 0.06) !important;
+        background-color: rgba(255, 255, 255, 0.08) !important;
       }
     }
 
@@ -90,7 +96,7 @@
       min-width: $base-sidebar-width !important;
 
       &:hover {
-        background-color: rgba(0, 0, 0, 0.06) !important;
+        background-color: rgba(255, 255, 255, 0.08) !important;
       }
     }
 
@@ -101,6 +107,36 @@
       &:hover {
         background-color: $base-sub-menu-hover !important;
       }
+    }
+
+    // ---- 褰撳墠閫変腑鑿滃崟楂樹寒 ----
+    // 鍘熺姸锛欵lement 缂栬瘧鍑虹殑 .el-menu-item.is-active 鏄富鑹叉枃瀛楋紝
+    // 鍦ㄥ悓鏍锋槸闈掕壊鐨勬繁鑹蹭晶杈规爮涓婂嚑涔庣湅涓嶈 鈫� 鏀逛负"鍝佺墝闈掑疄搴� + 鐧藉瓧 + 宸︿晶浜潯"
+    & .el-menu-item.is-active {
+      position: relative;
+      color: #ffffff !important;
+      background-color: $opo-primary !important;
+      font-weight: 500;
+
+      &::before {
+        content: '';
+        position: absolute;
+        left: 0;
+        top: 0;
+        bottom: 0;
+        width: 3px;
+        background-color: #ffffff;
+      }
+
+      &:hover {
+        background-color: $opo-primary !important;
+      }
+    }
+
+    // 鐖剁骇鍒嗙粍鍙槸"鍖呭惈閫変腑椤�"锛岀敤寮变竴鐐圭殑搴曡壊锛岄伩鍏嶅拰鍙跺瓙椤逛竴鏍烽噸
+    & .el-submenu.is-active > .el-submenu__title {
+      background-color: rgba(255, 255, 255, 0.1) !important;
+      color: #ffffff !important;
     }
   }
 
@@ -198,8 +234,8 @@
   .nest-menu .el-submenu>.el-submenu__title,
   .el-menu-item {
     &:hover {
-      // you can use $subMenuHover
-      background-color: rgba(0, 0, 0, 0.06) !important;
+      // 娣辫壊鑿滃崟鐢ㄩ�忕櫧瑕嗙洊
+      background-color: rgba(255, 255, 255, 0.08) !important;
     }
   }
 
diff --git a/src/assets/styles/theme-runtime.scss b/src/assets/styles/theme-runtime.scss
new file mode 100644
index 0000000..233599c
--- /dev/null
+++ b/src/assets/styles/theme-runtime.scss
@@ -0,0 +1,270 @@
+// ============================================================
+// 杩愯鏃朵富棰樺眰锛圕SS 鍙橀噺娑堣垂鏂癸級
+// ------------------------------------------------------------
+// Element UI 2.x 鐨勪富棰樿壊鏄� SCSS 缂栬瘧鏈熷父閲忥紝鏃犳硶鍦ㄨ繍琛屾椂淇敼銆�
+// 鏈枃浠朵笉鏀� Element 婧愮爜锛屽彧"閲嶅啓鐢ㄥ埌涓昏壊鐨勯�夋嫨鍣�"锛屽�兼敼涓�
+// var(--opo-primary*)锛涜繖浜涘彉閲忕敱 utils/theme.js 鍦ㄥ垏鎹㈢毊鑲ゆ椂鍐欏叆
+// :root锛屽洜姝ゆ崲鑲ゆ棤闇�閲嶆柊缂栬瘧銆佹棤闇�鍒锋柊椤甸潰銆�
+//
+// 瑕嗙洊椤哄簭寰堝叧閿細鏈枃浠跺繀椤诲湪 element-ui 涓� ruoyi.scss 涔嬪悗寮曞叆
+// 锛堣 main.js 鐨� import 椤哄簭锛夈��
+// 瑕嗙洊鑼冨洿锛氭寜閽�/閾炬帴/杈撳叆/鍗曢�夊閫夊紑鍏�/Tabs/鍒嗛〉/琛ㄦ牸/姝ラ鏉�/
+//          鏃ユ湡/涓嬫媺/鍔犺浇/杩涘害锛屽叾浣欑粍浠舵寜闇�琛ュ厖銆�
+// ============================================================
+
+$opo-fallback: #0E768F;
+
+// ---------- 鎸夐挳 ----------
+.el-button--primary {
+  background-color: var(--opo-primary, #{$opo-fallback});
+  border-color: var(--opo-primary, #{$opo-fallback});
+  color: #fff;
+
+  &:hover,
+  &:focus {
+    background-color: var(--opo-primary-hover, #{$opo-fallback});
+    border-color: var(--opo-primary-hover, #{$opo-fallback});
+    color: #fff;
+  }
+
+  &:active {
+    background-color: var(--opo-primary-active, #{$opo-fallback});
+    border-color: var(--opo-primary-active, #{$opo-fallback});
+    color: #fff;
+  }
+
+  &.is-disabled,
+  &.is-disabled:hover,
+  &.is-disabled:focus,
+  &.is-disabled:active {
+    background-color: var(--opo-primary-light-5, #{$opo-fallback});
+    border-color: var(--opo-primary-light-5, #{$opo-fallback});
+    color: #fff;
+  }
+
+  &.is-plain {
+    background-color: var(--opo-primary-light-9, #fff);
+    border-color: var(--opo-primary-light-5, #{$opo-fallback});
+    color: var(--opo-primary, #{$opo-fallback});
+
+    &:hover,
+    &:focus,
+    &:active {
+      background-color: var(--opo-primary, #{$opo-fallback});
+      border-color: var(--opo-primary, #{$opo-fallback});
+      color: #fff;
+    }
+  }
+}
+
+.el-button--text {
+  color: var(--opo-primary, #{$opo-fallback});
+
+  &:hover,
+  &:focus {
+    color: var(--opo-primary-hover, #{$opo-fallback});
+  }
+
+  &.is-disabled,
+  &.is-disabled:hover {
+    color: var(--opo-primary-light-5, #{$opo-fallback});
+  }
+}
+
+// 榛樿鎸夐挳 hover 鏃堕�忓嚭鍝佺墝鑹诧紙鍘熸潵鏄竴鐗囩伆锛�
+.el-button--default:hover,
+.el-button--default:focus {
+  color: var(--opo-primary, #{$opo-fallback});
+  border-color: var(--opo-primary-light-5, #{$opo-fallback});
+  background-color: var(--opo-primary-light-9, #fff);
+}
+
+// ---------- 閾炬帴 ----------
+.el-link.el-link--primary {
+  color: var(--opo-primary, #{$opo-fallback});
+
+  &:hover {
+    color: var(--opo-primary-light-3, #{$opo-fallback});
+  }
+}
+
+// ---------- 杈撳叆绫� ----------
+.el-input__inner:focus,
+.el-textarea__inner:focus,
+.el-input__inner:hover {
+  border-color: var(--opo-primary-light-5, #{$opo-fallback});
+}
+
+.el-input__inner:focus,
+.el-textarea__inner:focus {
+  border-color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-select .el-input.is-focus .el-input__inner,
+.el-select .el-input__inner:focus {
+  border-color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-select-dropdown__item.selected {
+  color: var(--opo-primary, #{$opo-fallback});
+  font-weight: 600;
+}
+
+.el-input-number__decrease:hover,
+.el-input-number__increase:hover {
+  color: var(--opo-primary, #{$opo-fallback});
+}
+
+// ---------- 鍗曢�� / 澶嶉�� ----------
+.el-radio__input.is-checked .el-radio__inner,
+.el-checkbox__input.is-checked .el-checkbox__inner,
+.el-checkbox__input.is-indeterminate .el-checkbox__inner {
+  border-color: var(--opo-primary, #{$opo-fallback});
+  background-color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-radio__input.is-checked + .el-radio__label,
+.el-checkbox__input.is-checked + .el-checkbox__label {
+  color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-radio-button__orig-radio:checked + .el-radio-button__inner,
+.el-checkbox-button__orig-radio:checked + .el-checkbox-button__inner {
+  background-color: var(--opo-primary, #{$opo-fallback});
+  border-color: var(--opo-primary, #{$opo-fallback});
+  box-shadow: -1px 0 0 0 var(--opo-primary, #{$opo-fallback});
+  color: #fff;
+}
+
+// ---------- 寮�鍏� ----------
+.el-switch.is-checked .el-switch__core {
+  border-color: var(--opo-primary, #{$opo-fallback});
+  background-color: var(--opo-primary, #{$opo-fallback});
+}
+
+// ---------- Tabs ----------
+.el-tabs__item.is-active,
+.el-tabs__item:hover {
+  color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-tabs__active-bar {
+  background-color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-tabs--border-card > .el-tabs__header .el-tabs__item.is-active {
+  color: var(--opo-primary, #{$opo-fallback});
+  border-bottom-color: transparent;
+}
+
+// ---------- 鍒嗛〉 ----------
+.el-pager li.active,
+.el-pager li:hover {
+  color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-pagination.is-background .el-pager li:not(.disabled).active {
+  background-color: var(--opo-primary, #{$opo-fallback});
+  color: #fff;
+}
+
+.el-pagination button:hover {
+  color: var(--opo-primary, #{$opo-fallback});
+}
+
+// ---------- 琛ㄦ牸 ----------
+.el-table .ascending .sort-caret.ascending {
+  border-bottom-color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-table .descending .sort-caret.descending {
+  border-top-color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-table__body tr.current-row > td {
+  background-color: var(--opo-primary-light-9, #fff) !important;
+}
+
+.el-table--enable-row-hover .el-table__body tr:hover > td {
+  background-color: var(--opo-primary-light-95, #f5f9fd) !important;
+}
+
+// ---------- 姝ラ鏉� ----------
+.el-step__head.is-process {
+  color: var(--opo-primary, #{$opo-fallback});
+  border-color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-step__title.is-process {
+  color: var(--opo-primary, #{$opo-fallback});
+  font-weight: 600;
+}
+
+.el-step__head.is-finish {
+  color: var(--opo-primary, #{$opo-fallback});
+  border-color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-step__title.is-finish {
+  color: var(--opo-primary, #{$opo-fallback});
+}
+
+// ---------- 鏃ユ湡 / 鏃堕棿 ----------
+.el-date-table td.today span {
+  color: var(--opo-primary, #{$opo-fallback});
+  font-weight: 700;
+}
+
+.el-date-table td.current:not(.disabled) span {
+  background-color: var(--opo-primary, #{$opo-fallback});
+  color: #fff;
+}
+
+.el-date-table td.available:hover {
+  color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-date-picker__header-label.active,
+.el-date-picker__header-label:hover {
+  color: var(--opo-primary, #{$opo-fallback});
+}
+
+// ---------- 涓嬫媺 / 寮瑰嚭鑿滃崟锛堝彧浣滅敤浜庡脊鍑哄眰锛岄伩鍏嶅奖鍝嶆繁鑹蹭晶杈规爮锛� ----------
+.el-dropdown-menu__item:not(.is-disabled):hover,
+.el-dropdown-menu__item:focus {
+  color: var(--opo-primary, #{$opo-fallback});
+  background-color: var(--opo-primary-light-9, #fff);
+}
+
+.el-menu--popup .el-menu-item.is-active,
+.el-menu--popup .el-menu-item:hover {
+  color: var(--opo-primary, #{$opo-fallback});
+}
+
+// ---------- 绾ц仈 ----------
+.el-cascader .el-input.is-focus .el-input__inner {
+  border-color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-cascader-node.in-active-path,
+.el-cascader-node.is-active {
+  color: var(--opo-primary, #{$opo-fallback});
+}
+
+// ---------- 鍔犺浇 / 杩涘害 ----------
+.el-loading-spinner .path {
+  stroke: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-progress-bar__inner {
+  background-color: var(--opo-primary, #{$opo-fallback});
+}
+
+// ---------- 婊戝潡 ----------
+.el-slider__bar {
+  background-color: var(--opo-primary, #{$opo-fallback});
+}
+
+.el-slider__button {
+  border-color: var(--opo-primary, #{$opo-fallback});
+}
diff --git a/src/assets/styles/tokens.css b/src/assets/styles/tokens.css
new file mode 100644
index 0000000..c25caef
--- /dev/null
+++ b/src/assets/styles/tokens.css
@@ -0,0 +1,91 @@
+/* ============================================================
+ * 璁捐浠ょ墝 路 CSS 鑷畾涔夊睘鎬�
+ * 杩愯鏃舵崲鑲ゅ彧闇�鏀瑰姩 --opo-primary 鍙婂叾娲剧敓鑹查樁锛堢敱 utils/theme.js 娉ㄥ叆锛�
+ * 杩欓噷鐨勫�兼槸"鍝佺墝闈�"榛樿鍊硷紱JS 娉ㄥ叆鐨� inline style 浼氳鐩� :root
+ * ============================================================ */
+:root {
+  /* 鍝佺墝鑹诧紙榛樿锛歄PO_Logo 鍦嗙幆闈掞級 */
+  --opo-primary: #0E768F;
+  --opo-primary-hover: #0D6A81;
+  --opo-primary-active: #0B5E72;
+  --opo-primary-light-3: #569FB1;
+  --opo-primary-light-5: #87BBC7;
+  --opo-primary-light-7: #B7D6DD;
+  --opo-primary-light-8: #CFE4E9;
+  --opo-primary-light-9: #E7F1F4;
+  --opo-primary-light-95: #F3F8F9;
+  --opo-primary-dark-2: #0B5E72;
+
+  /* 璇箟鑹� */
+  --opo-success: #67C23A;
+  --opo-success-light: #F0F9EB;
+  --opo-warning: #E6A23C;
+  --opo-warning-light: #FDF6EC;
+  --opo-danger: #CD1D4E;
+  --opo-danger-light: #FBEBEF;
+  --opo-info: #909399;
+  --opo-info-light: #F4F4F5;
+
+  /* 涓�ц壊 */
+  --opo-text-primary: #1F2937;
+  --opo-text-regular: #4B5563;
+  --opo-text-secondary: #6B7280;
+  --opo-text-placeholder: #9CA3AF;
+  --opo-border-base: #E5E7EB;
+  --opo-border-light: #F0F2F5;
+  --opo-border-lighter: #F5F7FA;
+  --opo-bg-page: #F5F7FA;
+  --opo-bg-card: #FFFFFF;
+  --opo-bg-hover: #F5F9FD;
+  --opo-bg-stripe: #FAFBFC;
+  --opo-bg-thead: #F5F7FA;
+
+  /* 琛ㄦ牸妗嗙嚎锛堟瘮閫氱敤杈规鏇存繁锛� */
+  --opo-table-border: #C8CFD8;
+  --opo-table-border-strong: #B7C0CC;
+
+  /* 渚ц竟鏍� */
+  --opo-sidebar-bg: #0A4655;
+  --opo-sidebar-sub-bg: #083B47;
+  --opo-sidebar-hover: rgba(14, 118, 143, 0.28);
+  --opo-sidebar-text: rgba(255, 255, 255, 0.72);
+  --opo-sidebar-text-active: #FFFFFF;
+
+  /* 瀛楀彿锛�2026-10-22 鏁翠綋涓婅皟涓�鍙凤細姝f枃 14鈫�16锛� */
+  --opo-font-size-display: 34px;
+  --opo-font-size-h1: 26px;
+  --opo-font-size-h2: 20px;
+  --opo-font-size-lg: 18px;
+  --opo-font-size-base: 16px;
+  --opo-font-size-sm: 14px;
+  --opo-font-size-xs: 13px;
+  --opo-font-size-menu: 16px;
+
+  /* 瀛椾綋锛堜笉瑕佺敤 -apple-system 鎵撳ご锛學indows 涓婁細鍙樻垚 Segoe UI锛屾暟瀛楁樉灏忥級 */
+  --opo-font-family-base: "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "寰蒋闆呴粦",
+    "Helvetica Neue", Arial, sans-serif;
+  --opo-font-family-number: "DIN Alternate", "SF Mono", "Roboto Mono", Consolas, "Courier New", monospace;
+
+  /* 闂磋窛 */
+  --opo-space-1: 4px;
+  --opo-space-2: 8px;
+  --opo-space-3: 12px;
+  --opo-space-4: 16px;
+  --opo-space-5: 24px;
+  --opo-space-6: 32px;
+
+  /* 鍦嗚 */
+  --opo-radius-sm: 2px;
+  --opo-radius-base: 4px;
+  --opo-radius-lg: 8px;
+  --opo-radius-pill: 999px;
+
+  /* 闃村奖 */
+  --opo-shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.06);
+  --opo-shadow-md: 0 4px 12px rgba(16, 24, 40, 0.08);
+  --opo-shadow-lg: 0 12px 32px rgba(16, 24, 40, 0.12);
+
+  /* 鎺т欢楂樺害 */
+  --opo-control-height-small: 32px;
+  --opo-control-height-base: 36px;
+}
diff --git a/src/assets/styles/tokens.scss b/src/assets/styles/tokens.scss
new file mode 100644
index 0000000..852df0d
--- /dev/null
+++ b/src/assets/styles/tokens.scss
@@ -0,0 +1,98 @@
+// ============================================================
+// 璁捐浠ょ墝锛圖esign Tokens锛壜� SCSS 鍙橀噺
+// 鍝佺墝鑹插彇鑷� src/assets/logo/OPO_Logo.png 鍦嗙幆闈� #0E768F
+// 璇存槑瑙侊細鏂规-鍓嶇鐣岄潰瑙嗚浼樺寲鏂规.md
+// 绾﹀畾锛氫笟鍔℃牱寮忎竴寰嬪紩鐢ㄨ繖閲岀殑鍙橀噺锛岀姝㈠啀鍐欒8鑹插��
+// ============================================================
+
+// ---------- 鍝佺墝鑹诧紙闈掞級 ----------
+$opo-primary:          #0E768F;
+$opo-primary-hover:    #0D6A81;
+$opo-primary-active:   #0B5E72;
+$opo-primary-light-3:  #569FB1;
+$opo-primary-light-5:  #87BBC7;
+$opo-primary-light-7:  #B7D6DD;
+$opo-primary-light-8:  #CFE4E9;
+$opo-primary-light-9:  #E7F1F4;
+$opo-primary-light-95: #F3F8F9;
+$opo-primary-dark-2:   #0B5E72;
+
+// ---------- 璇箟鑹� ----------
+$opo-success:       #67C23A;
+$opo-success-light: #F0F9EB;
+$opo-warning:       #E6A23C;
+$opo-warning-light: #FDF6EC;
+$opo-danger:        #CD1D4E;
+$opo-danger-light:  #FBEBEF;
+$opo-info:          #909399;
+$opo-info-light:    #F4F4F5;
+
+// ---------- 涓�ц壊 ----------
+$opo-text-primary:     #1F2937;
+$opo-text-regular:     #4B5563;
+$opo-text-secondary:   #6B7280;
+$opo-text-placeholder: #9CA3AF;
+$opo-border-base:      #E5E7EB;
+$opo-border-light:     #F0F2F5;
+$opo-border-lighter:   #F5F7FA;
+$opo-bg-page:          #F5F7FA;
+$opo-bg-card:          #FFFFFF;
+$opo-bg-hover:         #F5F9FD;
+$opo-bg-stripe:        #FAFBFC;
+$opo-bg-thead:         #F5F7FA;
+
+// ---------- 琛ㄦ牸妗嗙嚎锛堟瘮閫氱敤杈规鏇存繁锛屼究浜庣湅娓呭垎鍒�/鍒嗚锛� ----------
+$opo-table-border:        #C8CFD8;
+$opo-table-border-strong: #B7C0CC;
+
+// ---------- 渚ц竟鏍忥紙涓庡搧鐗岄潚鍚屾棌锛� ----------
+$opo-sidebar-bg:          #0A4655;
+$opo-sidebar-sub-bg:      #083B47;
+$opo-sidebar-hover:       rgba(14, 118, 143, 0.28);
+$opo-sidebar-text:        rgba(255, 255, 255, 0.72);
+$opo-sidebar-text-active: #FFFFFF;
+
+// ---------- 瀛楀彿锛�2026-10-22 鏁翠綋涓婅皟涓�鍙凤細姝f枃 14鈫�16锛� ----------
+$opo-font-size-display: 34px;
+$opo-font-size-h1:      26px;
+$opo-font-size-h2:      20px;
+$opo-font-size-lg:      18px;
+$opo-font-size-base:    16px;
+$opo-font-size-sm:      14px;
+$opo-font-size-xs:      13px;
+$opo-font-size-menu:    16px;  // 渚ц竟鏍忚彍鍗曪紙2026-10-22 鐢� 18px 鍥炶皟涓�鍙凤級
+
+// ---------- 琛岄珮 ----------
+$opo-line-height-base:    22px;
+$opo-line-height-heading: 1.3;
+
+// ---------- 瀛椾綋 ----------
+// 娉ㄦ剰锛氫笉瑕佺敤 -apple-system / BlinkMacSystemFont 鎵撳ご鈥斺�擶indows 涓� Chrome 浼氳В鏋愭垚 Segoe UI锛�
+// 瀵艰嚧鏁板瓧/鑻辨枃璧� Segoe UI锛堟瘮涓枃缁嗐�佹樉灏忥級锛屼腑鏂囧洖閫�寰蒋闆呴粦锛屽悓涓�琛岄噷瀛楀彿瑙傛劅涓嶄竴鑷淬��
+// 杩欓噷鎸�"骞冲彴鏈夊垯鐢ㄣ�佹病鏈夊垯閫�鍒板井杞泤榛�"鐨勯『搴忥紝淇濊瘉涓嫳鏂囧悓鏃忋��
+$opo-font-family-base:   "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "寰蒋闆呴粦",
+                         "Helvetica Neue", Arial, sans-serif;
+$opo-font-family-number: "DIN Alternate", "SF Mono", "Roboto Mono", Consolas, "Courier New", monospace;
+
+// ---------- 闂磋窛锛�8 鐐规爡鏍硷級 ----------
+$opo-space-1: 4px;
+$opo-space-2: 8px;
+$opo-space-3: 12px;
+$opo-space-4: 16px;
+$opo-space-5: 24px;
+$opo-space-6: 32px;
+
+// ---------- 鍦嗚 ----------
+$opo-radius-sm:   2px;
+$opo-radius-base: 4px;
+$opo-radius-lg:   8px;
+$opo-radius-pill: 999px;
+
+// ---------- 闃村奖 ----------
+$opo-shadow-sm: 0 1px 2px rgba(16, 24, 40, 0.06);
+$opo-shadow-md: 0 4px 12px rgba(16, 24, 40, 0.08);
+$opo-shadow-lg: 0 12px 32px rgba(16, 24, 40, 0.12);
+
+// ---------- 鎺т欢楂樺害 ----------
+$opo-control-height-small:  32px;
+$opo-control-height-base:   36px;
diff --git a/src/assets/styles/variables.scss b/src/assets/styles/variables.scss
index 4ea177a..b85dc47 100644
--- a/src/assets/styles/variables.scss
+++ b/src/assets/styles/variables.scss
@@ -1,3 +1,6 @@
+// 璁捐浠ょ墝锛堥鑹�/瀛楀彿/闂磋窛/鍦嗚/闃村奖/瀛椾綋鐨勫敮涓�鏉ユ簮锛�
+@import './tokens.scss';
+
 // base color
 $blue:#324157;
 $light-blue:#3A71A8;
@@ -10,22 +13,21 @@
 
 // 榛樿鑿滃崟涓婚椋庢牸
 //鑿滃崟瀛椾綋棰滆壊
-$base-menu-color:#fff;
+$base-menu-color:$opo-sidebar-text;
 //閫夊畾瀛愬垪琛ㄦ椂鎵�鍦ㄥ垪琛ㄧ殑瀛椾綋棰滆壊
-// f4f4f5
-$base-menu-color-active:#fff;
-//鏁翠綋鑳屾櫙棰滆壊#0187B1
-$base-menu-background:#394d74;
+$base-menu-color-active:$opo-sidebar-text-active;
+//鏁翠綋鑳屾櫙棰滆壊锛堜笌鍝佺墝闈掑悓鏃忕殑娣遍潚锛�
+$base-menu-background:$opo-sidebar-bg;
 //鏍囬瀛椾綋棰滆壊
 $base-logo-title-color: #ffffff;
 //
 $base-menu-light-color:rgba(0,0,0,.70);
 $base-menu-light-background:#ffffff;
 $base-logo-light-title-color: #001529;
-//鍒楄〃鑳屾櫙棰滆壊1f2d3d
-$base-sub-menu-background:#394d74;
-//
-$base-sub-menu-hover:#a76ac3;
+//鍒楄〃鑳屾櫙棰滆壊
+$base-sub-menu-background:$opo-sidebar-sub-bg;
+//瀛愯彍鍗曟偓鍋滆壊锛堝師鏉ユ槸鏃犲叧鑱旂殑绱壊 #a76ac3锛�
+$base-sub-menu-hover:$opo-sidebar-hover;
 
 // 鑷畾涔夋殫鑹茶彍鍗曢鏍�
 /**
@@ -42,7 +44,7 @@
 $base-sub-menu-hover:#001528;
 */
 
-$base-sidebar-width: 200px;
+$base-sidebar-width: 220px;
 
 // the :export directive is the magic sauce for webpack
 // https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
diff --git a/src/components/ThemePicker/index.vue b/src/components/ThemePicker/index.vue
index 1714e1f..83e030e 100644
--- a/src/components/ThemePicker/index.vue
+++ b/src/components/ThemePicker/index.vue
@@ -1,7 +1,7 @@
 <template>
   <el-color-picker
     v-model="theme"
-    :predefine="['#409EFF', '#1890ff', '#304156','#212121','#11a983', '#13c2c2', '#6959CD', '#f5222d', ]"
+    :predefine="['#0E768F', '#CD1D4E', '#409EFF', '#1B8E70', '#7B61FF', '#E6843C', '#304156', '#212121']"
     class="theme-picker"
     popper-class="theme-picker-dropdown"
   />
@@ -42,8 +42,12 @@
 
   methods: {
     async setTheme(val) {
-      const oldVal = this.chalk ? this.theme : ORIGINAL_THEME
       if (typeof val !== 'string') return
+      // 鍏堥�氱煡澶栧眰锛氫富棰樿壊鐢� CSS 鍙橀噺灞傦紙utils/theme.js锛夌珛鍗崇敓鏁堛��
+      // 鍘熸潵鐨勫疄鐜拌绛� CDN 鎷夊彇 theme-chalk 瀹屾垚鍚庢墠 emit锛屽唴缃戞媺涓嶅埌 unpkg
+      // 鏃� Promise 姘镐笉 resolve锛屽鑷�"鏀逛富棰樻病鏈変换浣曞弽搴�"銆�
+      this.$emit('change', val)
+      const oldVal = this.chalk ? this.theme : ORIGINAL_THEME
       const themeCluster = this.getThemeCluster(val.replace('#', ''))
       const originalCluster = this.getThemeCluster(oldVal.replace('#', ''))
 
@@ -81,8 +85,6 @@
         if (typeof innerText !== 'string') return
         style.innerText = this.updateStyle(innerText, originalCluster, themeCluster)
       })
-
-      this.$emit('change', val)
     },
 
     updateStyle(style, oldCluster, newCluster) {
@@ -96,12 +98,19 @@
     getCSSString(url, variable) {
       return new Promise(resolve => {
         const xhr = new XMLHttpRequest()
+        const done = () => resolve()
         xhr.onreadystatechange = () => {
-          if (xhr.readyState === 4 && xhr.status === 200) {
-            this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '')
+          if (xhr.readyState === 4) {
+            if (xhr.status === 200) {
+              this[variable] = xhr.responseText.replace(/@font-face{[^}]+}/, '')
+            }
             resolve()
           }
         }
+        // 鍐呯綉/鏃犲缃戞椂蹇�熷け璐ワ紝閬垮厤 Promise 鎮寕瀵艰嚧鎹㈣偆鍗′綇
+        xhr.onerror = done
+        xhr.ontimeout = done
+        xhr.timeout = 4000
         xhr.open('GET', url)
         xhr.send()
       })
diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue
index 7cd2979..fc5d99f 100644
--- a/src/layout/components/Settings/index.vue
+++ b/src/layout/components/Settings/index.vue
@@ -36,6 +36,21 @@
           <span>涓婚棰滆壊</span>
           <theme-picker style="float: right;height: 26px;margin: -3px 8px 0 0;" @change="themeChange" />
         </div>
+
+        <div class="drawer-item">
+          <span>棰勮鐨偆</span>
+          <div class="opo-preset-list">
+            <span
+              v-for="p in presets"
+              :key="p.color"
+              class="opo-preset-item"
+              :class="{ 'is-active': isCurrent(p.color) }"
+              :style="{ backgroundColor: p.color }"
+              :title="p.name"
+              @click="themeChange(p.color)"
+            />
+          </div>
+        </div>
       </div>
 
       <el-divider/>
@@ -77,13 +92,15 @@
 
 <script>
 import ThemePicker from '@/components/ThemePicker'
+import { PRESETS, applyTheme, setStoredTheme } from '@/utils/theme'
 
 export default {
   components: { ThemePicker },
   data() {
     return {
       theme: this.$store.state.settings.theme,
-      sideTheme: this.$store.state.settings.sideTheme
+      sideTheme: this.$store.state.settings.sideTheme,
+      presets: PRESETS
     };
   },
   computed: {
@@ -147,12 +164,18 @@
     },
   },
   methods: {
+    isCurrent(color) {
+      return !!this.theme && String(this.theme).toUpperCase() === String(color).toUpperCase();
+    },
     themeChange(val) {
       this.$store.dispatch('settings/changeSetting', {
         key: 'theme',
         value: val
       })
       this.theme = val;
+      // 绔嬪嵆鐢熸晥骞惰浣忥細涓嶄緷璧� ThemePicker 浠� CDN 鎷夊彇 theme-chalk
+      applyTheme(val);
+      setStoredTheme(val);
     },
     handleTheme(val) {
       this.$store.dispatch('settings/changeSetting', {
@@ -252,5 +275,29 @@
     .drawer-switch {
       float: right
     }
+
+    // 棰勮鐨偆鑹插潡
+    .opo-preset-list {
+      display: flex;
+      align-items: center;
+      flex-wrap: wrap;
+      margin-top: 8px;
+    }
+
+    .opo-preset-item {
+      display: inline-block;
+      width: 22px;
+      height: 22px;
+      margin-right: 10px;
+      border-radius: 4px;
+      cursor: pointer;
+      border: 2px solid transparent;
+      box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.08);
+
+      &.is-active {
+        border-color: #1F2937;
+        box-shadow: 0 0 0 2px rgba(31, 41, 55, 0.18);
+      }
+    }
   }
 </style>
diff --git a/src/layout/index.vue b/src/layout/index.vue
index 214d86f..c56206e 100644
--- a/src/layout/index.vue
+++ b/src/layout/index.vue
@@ -1,5 +1,5 @@
 <template>
-  <div :class="classObj" class="app-wrapper" :style="{'--current-color': theme}">
+  <div :class="classObj" class="app-wrapper">
     <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside"/>
     <sidebar class="sidebar-container"/>
     <div :class="{hasTagsView:needTagsView}" class="main-container">
@@ -21,6 +21,7 @@
 import ResizeMixin from './mixin/ResizeHandler'
 import { mapState } from 'vuex'
 import variables from '@/assets/styles/variables.scss'
+import { applyTheme, setStoredTheme } from '@/utils/theme'
 
 export default {
   name: 'Layout',
@@ -54,7 +55,20 @@
       return variables;
     }
   },
+  created() {
+    // 杩涘叆 Layout 鏃跺簲鐢ㄥ綋鍓嶄富棰樿壊锛堝苟璁颁綇閫夋嫨锛�
+    this.applyCurrentTheme()
+  },
+  watch: {
+    theme(val) {
+      this.applyCurrentTheme()
+      setStoredTheme(val)
+    }
+  },
   methods: {
+    applyCurrentTheme() {
+      applyTheme(this.theme)
+    },
     handleClickOutside() {
       this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
     }
diff --git a/src/main.js b/src/main.js
index 60b8011..6ecaa60 100644
--- a/src/main.js
+++ b/src/main.js
@@ -10,10 +10,14 @@
 import Cookies from 'js-cookie'
 
 import Element from 'element-ui'
+import '@/assets/styles/tokens.css' // 璁捐浠ょ墝锛圕SS 鍙橀噺锛屼緵杩愯鏃舵崲鑲わ級
 import './assets/styles/element-variables.scss'
 
 import '@/assets/styles/index.scss' // global css
 import '@/assets/styles/ruoyi.scss' // ruoyi css
+// 杩愯鏃朵富棰樺眰 + 缁勪欢榛樿澶栬锛氬繀椤绘櫄浜� element-ui 涓� ruoyi.scss锛屽惁鍒欒鐩栦笉鐢熸晥
+import '@/assets/styles/theme-runtime.scss'
+import '@/assets/styles/element-override.scss'
 import App from './App'
 import store from './store'
 import router from './router'
@@ -27,6 +31,8 @@
 import { getConfigKey } from "@/api/system/config";
 import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";
 import dataV from '@jiaminghi/data-view';//dataV
+// 涓婚鑹茶繍琛屾椂锛圕SS 鍙橀噺娉ㄥ叆锛�
+import { applyTheme, getStoredTheme, DEFAULT_PRIMARY } from '@/utils/theme'
 // 鍒嗛〉缁勪欢
 import Pagination from "@/components/Pagination";
 // 鑷畾涔夎〃鏍煎伐鍏风粍浠�
@@ -102,9 +108,12 @@
  */
 
 Vue.use(Element, {
-  size: Cookies.get('size') || 'medium' // set element-ui default size
+  size: Cookies.get('size') || 'small' // set element-ui default size锛堝師 medium锛屾敼涓� small 鎻愬崌淇℃伅瀵嗗害锛�
 })
 
+// 鍚姩鍗冲簲鐢ㄥ凡淇濆瓨鐨勪富棰樿壊锛堢櫥褰曢〉绛変笉浣跨敤 Layout 鐨勯〉闈篃鑳界敓鏁堬級
+applyTheme(getStoredTheme() || DEFAULT_PRIMARY)
+
 Vue.config.productionTip = false
 
 new Vue({
diff --git a/src/settings.js b/src/settings.js
index 466d7a2..fe2d2d7 100644
--- a/src/settings.js
+++ b/src/settings.js
@@ -5,9 +5,10 @@
   sideTheme: 'theme-dark',
 
   /**
-   * 鏄惁绯荤粺甯冨眬閰嶇疆
+   * 鏄惁绯荤粺甯冨眬閰嶇疆锛堝彸涓嬭榻胯疆闈㈡澘锛�
+   * 鍘熶负 false锛屽鑷�"涓婚棰滆壊 / 棰勮鐨偆"鍏ュ彛瀵圭敤鎴蜂笉鍙 鈫� 鏀逛负 true
    */
-  showSettings: false,
+  showSettings: true,
 
   /**
    * 鏄惁鏄剧ず椤堕儴瀵艰埅
@@ -40,87 +41,5 @@
    * The default is only used in the production env
    * If you want to also use it in dev, you can pass ['production', 'development']
    */
-  errorLog: 'production',
-  // vscode榛樿鍚敤浜嗘牴鎹枃浠剁被鍨嬭嚜鍔ㄨ缃畉absize鐨勯�夐」
-
-  "editor.detectIndentation": false,
-
-  // 閲嶆柊璁惧畾tabsize
-
-  "editor.tabSize": 2,
-
-  // #姣忔淇濆瓨鐨勬椂鍊欒嚜鍔ㄦ牸寮忓寲
-
-  "editor.formatOnSave": true,
-
-  // #姣忔淇濆瓨鐨勬椂鍊欏皢浠g爜鎸塭slint鏍煎紡杩涜淇
-
-  "eslint.autoFixOnSave": true,
-
-  "tslint.autoFixOnSave": true,
-
-  // 娣诲姞 vue 鏀寔
-
-  "eslint.validate": [
-
-    "javascript",
-
-    "javascriptreact",
-
-    {
-
-      "language": "vue",
-
-      "autoFix": true
-
-    }
-
-  ],
-
-  // #鍘绘帀浠g爜缁撳熬鐨勫垎鍙�
-
-  "prettier.semi": true,
-
-  // #浣跨敤甯﹀紩鍙锋浛浠e弻寮曞彿
-
-  "prettier.singleQuote": true,
-
-  // #璁╁嚱鏁�(鍚�)鍜屽悗闈㈢殑鎷彿涔嬮棿鍔犱釜绌烘牸
-
-  "javascript.format.insertSpaceBeforeFunctionParenthesis": true,
-
-  // #杩欎釜鎸夌敤鎴疯嚜韬範鎯�夋嫨
-
-  "vetur.format.defaultFormatter.html": "js-beautify-html",
-
-  // #璁﹙ue涓殑js鎸夌紪杈戝櫒鑷甫鐨則s鏍煎紡杩涜鏍煎紡鍖�
-
-  "vetur.format.defaultFormatter.js": "vscode-typescript",
-
-  "vetur.format.defaultFormatterOptions": {
-
-    "js-beautify-html": {
-
-      "wrap_attributes": "force-aligned"
-
-      // #vue缁勪欢涓環tml浠g爜鏍煎紡鍖栨牱寮�
-
-    }
-
-  },
-
-  // 鏍煎紡鍖杝tylus, 闇�瀹夎Manta's Stylus Supremacy鎻掍欢
-
-  "stylusSupremacy.insertColons": false, // 鏄惁鎻掑叆鍐掑彿
-
-  "stylusSupremacy.insertSemicolons": false, // 鏄惁鎻掑叆鍒嗗ソ
-
-  "stylusSupremacy.insertBraces": false, // 鏄惁鎻掑叆澶ф嫭鍙�
-
-  "stylusSupremacy.insertNewLineAroundImports": false, // import涔嬪悗鏄惁鎹㈣
-
-  "stylusSupremacy.insertNewLineAroundBlocks": false,
-
-  "javascript.format.insertSpaceAfterConstructor": true // 涓や釜閫夋嫨鍣ㄤ腑鏄惁鎹㈣
+  errorLog: 'production'
 }
-
diff --git a/src/store/modules/settings.js b/src/store/modules/settings.js
index 5f36d8e..4252d2b 100644
--- a/src/store/modules/settings.js
+++ b/src/store/modules/settings.js
@@ -1,11 +1,12 @@
 import defaultSettings from '@/settings'
+import { DEFAULT_PRIMARY, getStoredTheme } from '@/utils/theme'
 
 const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings
 
 const storageSetting = JSON.parse(localStorage.getItem('layout-setting')) || ''
 const state = {
   title: '',
-  theme: storageSetting.theme || '#409EFF',
+  theme: storageSetting.theme || getStoredTheme() || DEFAULT_PRIMARY,
   sideTheme: storageSetting.sideTheme || sideTheme,
   showSettings: showSettings,
   topNav:  storageSetting.topNav === undefined ? topNav : storageSetting.topNav,
diff --git a/src/utils/theme.js b/src/utils/theme.js
new file mode 100644
index 0000000..3a778f9
--- /dev/null
+++ b/src/utils/theme.js
@@ -0,0 +1,172 @@
+/**
+ * 涓婚鑹茶繍琛屾椂璁$畻涓庡簲鐢�
+ * ---------------------------------------------------------------
+ * 鑳屾櫙锛欵lement UI 2.x 鐨勪富棰樿壊鏄� SCSS 缂栬瘧鏈熷父閲忥紝杩愯鏃舵棤娉曟敼鍔紱
+ *      鍘熸湁 ThemePicker 渚濊禆 unpkg CDN 鎷夊彇 theme-chalk 鍐嶅瓧绗︿覆鏇挎崲锛�
+ *      鍐呯綉鐜鎷変笉鍒� CSS锛屽鑷�"鏀逛富棰樻病鍙嶅簲"銆�
+ * 鍋氭硶锛氱敱浠绘剰涓昏壊鎺ㄥ嚭涓�濂楄壊闃讹紙hover / active / light-3~95锛夛紝
+ *      鍐欏叆 :root 鐨� CSS 鍙橀噺锛泃heme-runtime.scss 鐢� var() 娑堣垂杩欎簺鍙橀噺锛�
+ *      浠庤�屽疄鐜�"涓�娆$紪璇戙�佽繍琛屾椂鎹㈣偆銆侀〉闈笉鍒锋柊"銆�
+ */
+
+/** 榛樿涓昏壊锛歄PO_Logo.png 鍦嗙幆闈� */
+export const DEFAULT_PRIMARY = '#0E768F'
+
+/** localStorage 閿紙涓庡竷灞�璁剧疆鍒嗗紑锛岄伩鍏嶄簰鐩歌鐩栵級 */
+const STORAGE_KEY = 'opo-theme'
+
+/** 棰勮鐨偆 */
+export const PRESETS = [
+  { name: '鍝佺墝闈�', color: '#0E768F' },
+  { name: '鐜孩', color: '#CD1D4E' },
+  { name: 'Element 钃�', color: '#409EFF' },
+  { name: '鍙惰娊缁�', color: '#1B8E70' },
+  { name: '绱�', color: '#7B61FF' },
+  { name: '姗�', color: '#E6843C' }
+]
+
+const WHITE = [255, 255, 255]
+const BLACK = [0, 0, 0]
+
+function clamp(v) {
+  return Math.max(0, Math.min(255, Math.round(v)))
+}
+
+/** #abc / #aabbcc 鈫� [r,g,b]锛涢潪娉曡繑鍥� null */
+export function hexToRgb(hex) {
+  if (typeof hex !== 'string') return null
+  let h = hex.trim().replace(/^#/, '')
+  if (h.length === 3) {
+    h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2]
+  }
+  if (!/^[0-9a-fA-F]{6}$/.test(h)) return null
+  return [parseInt(h.slice(0, 2), 16), parseInt(h.slice(2, 4), 16), parseInt(h.slice(4, 6), 16)]
+}
+
+/** [r,g,b] 鈫� #RRGGBB */
+export function rgbToHex(rgb) {
+  return (
+    '#' +
+    rgb
+      .map(function (v) {
+        const s = clamp(v).toString(16)
+        return s.length === 1 ? '0' + s : s
+      })
+      .join('')
+      .toUpperCase()
+  )
+}
+
+/**
+ * 娣疯壊锛歸eight 涓虹洰鏍囪壊鍗犳瘮锛�0~1锛�
+ * mix([14,118,143], WHITE, 0.3) 鈮� 30% 鐧� + 70% 涓昏壊
+ */
+export function mix(rgb, target, weight) {
+  const w = Math.max(0, Math.min(1, weight))
+  return [
+    clamp(rgb[0] * (1 - w) + target[0] * w),
+    clamp(rgb[1] * (1 - w) + target[1] * w),
+    clamp(rgb[2] * (1 - w) + target[2] * w)
+  ]
+}
+
+function channelLum(v) {
+  const c = v / 255
+  return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4)
+}
+
+/** 鐩稿浜害锛圵CAG锛� */
+export function luminance(rgb) {
+  return 0.2126 * channelLum(rgb[0]) + 0.7152 * channelLum(rgb[1]) + 0.0722 * channelLum(rgb[2])
+}
+
+/** 涓庣櫧鑹茬殑瀵规瘮搴︼紝鐢ㄤ簬鍒ゆ柇鐧藉瓧鏄惁鍙 */
+export function contrastWithWhite(rgb) {
+  return 1.05 / (luminance(rgb) + 0.05)
+}
+
+/**
+ * 鐢变富鑹叉帹鍏ㄥ鑹查樁
+ * 娣辫壊涓昏壊锛堜寒搴︿綆锛塰over 鐢�"鍔犳繁"锛屾祬鑹蹭富鑹� hover 鐢�"鍙樻祬"锛�
+ * 淇濊瘉 hover 鎬佺殑鐧藉瓧瀵规瘮搴︿笉浼氭帀涓嬪幓銆�
+ */
+export function buildScale(primary) {
+  const base = hexToRgb(primary) || hexToRgb(DEFAULT_PRIMARY)
+  const isDark = luminance(base) < 0.4
+
+  const hover = isDark ? mix(base, BLACK, 0.1) : mix(base, WHITE, 0.2)
+  const active = isDark ? mix(base, BLACK, 0.2) : mix(base, WHITE, 0.32)
+
+  return {
+    primary: rgbToHex(base),
+    hover: rgbToHex(hover),
+    active: rgbToHex(active),
+    light3: rgbToHex(mix(base, WHITE, 0.3)),
+    light5: rgbToHex(mix(base, WHITE, 0.5)),
+    light7: rgbToHex(mix(base, WHITE, 0.7)),
+    light8: rgbToHex(mix(base, WHITE, 0.8)),
+    light9: rgbToHex(mix(base, WHITE, 0.9)),
+    light95: rgbToHex(mix(base, WHITE, 0.95)),
+    dark2: rgbToHex(mix(base, BLACK, 0.2)),
+    isDark: isDark,
+    contrastWithWhite: Number(contrastWithWhite(base).toFixed(2))
+  }
+}
+
+/** 鎶婅壊闃跺啓鍏� :root 鐨� CSS 鍙橀噺锛坱heme-runtime.scss 娑堣垂锛� */
+export function applyTheme(primary) {
+  const scale = buildScale(primary || DEFAULT_PRIMARY)
+  if (typeof document === 'undefined') return scale
+
+  const root = document.documentElement
+  const map = {
+    '--opo-primary': scale.primary,
+    '--opo-primary-hover': scale.hover,
+    '--opo-primary-active': scale.active,
+    '--opo-primary-light-3': scale.light3,
+    '--opo-primary-light-5': scale.light5,
+    '--opo-primary-light-7': scale.light7,
+    '--opo-primary-light-8': scale.light8,
+    '--opo-primary-light-9': scale.light9,
+    '--opo-primary-light-95': scale.light95,
+    '--opo-primary-dark-2': scale.dark2
+  }
+  Object.keys(map).forEach(function (k) {
+    root.style.setProperty(k, map[k])
+  })
+  // 渚涗釜鍒渶瑕佺煡閬�"褰撳墠鏄惁娣辫壊涓昏壊"鐨勫満鏅娇鐢�
+  root.setAttribute('data-opo-dark-primary', scale.isDark ? '1' : '0')
+  return scale
+}
+
+/** 璇诲彇涓婃閫夋嫨鐨勪富鑹� */
+export function getStoredTheme() {
+  try {
+    return localStorage.getItem(STORAGE_KEY)
+  } catch (e) {
+    return null
+  }
+}
+
+/** 璁颁綇閫夋嫨 */
+export function setStoredTheme(color) {
+  try {
+    localStorage.setItem(STORAGE_KEY, color)
+  } catch (e) {
+    /* 蹇界暐闅愮妯″紡绛夊紓甯� */
+  }
+}
+
+export default {
+  DEFAULT_PRIMARY: DEFAULT_PRIMARY,
+  PRESETS: PRESETS,
+  applyTheme: applyTheme,
+  buildScale: buildScale,
+  getStoredTheme: getStoredTheme,
+  setStoredTheme: setStoredTheme,
+  hexToRgb: hexToRgb,
+  rgbToHex: rgbToHex,
+  mix: mix,
+  luminance: luminance,
+  contrastWithWhite: contrastWithWhite
+}
diff --git a/src/views/monitor/job/index.vue b/src/views/monitor/job/index.vue
index 06b939d..616c9e1 100644
--- a/src/views/monitor/job/index.vue
+++ b/src/views/monitor/job/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="浠诲姟鍚嶇О" prop="jobName">
         <el-input
           v-model="queryParams.jobName"
diff --git a/src/views/monitor/job/log.vue b/src/views/monitor/job/log.vue
index 44efe5f..e7130a9 100644
--- a/src/views/monitor/job/log.vue
+++ b/src/views/monitor/job/log.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="浠诲姟鍚嶇О" prop="jobName">
         <el-input
           v-model="queryParams.jobName"
diff --git a/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue
index 6341419..bff4736 100644
--- a/src/views/monitor/logininfor/index.vue
+++ b/src/views/monitor/logininfor/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="鐧诲綍鍦板潃" prop="ipaddr">
         <el-input
           v-model="queryParams.ipaddr"
diff --git a/src/views/monitor/online/index.vue b/src/views/monitor/online/index.vue
index 509fbe5..902666a 100644
--- a/src/views/monitor/online/index.vue
+++ b/src/views/monitor/online/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
       <el-form-item label="鐧诲綍鍦板潃" prop="ipaddr">
         <el-input
           v-model="queryParams.ipaddr"
diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue
index 0aee4a6..cf405c7 100644
--- a/src/views/monitor/operlog/index.vue
+++ b/src/views/monitor/operlog/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="绯荤粺妯″潡" prop="title">
         <el-input
           v-model="queryParams.title"
diff --git a/src/views/project/DonationEvaluation/index.vue b/src/views/project/DonationEvaluation/index.vue
index ffd55b7..33fc4c2 100644
--- a/src/views/project/DonationEvaluation/index.vue
+++ b/src/views/project/DonationEvaluation/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/DonationProcess/index.vue b/src/views/project/DonationProcess/index.vue
index ad48d97..bc7925a 100644
--- a/src/views/project/DonationProcess/index.vue
+++ b/src/views/project/DonationProcess/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
@@ -690,16 +691,10 @@
         this.queryParams.reporterno = this.reportervalue;
       }
 
-      if (this.starttime != "") {
-        this.queryParams.starttime = this.starttime;
-      } else {
-        this.queryParams.starttime = "";
-      }
-      if (this.endtime != "") {
-        this.queryParams.endtime = this.endtime;
-      } else {
-        this.queryParams.endtime = "";
-      }
+      // 鏈�夋椂闂磋寖鍥存椂浼� null锛氱┖涓蹭細璁╁悗绔嫾鍑� `donatetime >= ''`锛�
+      // MySQL 涓ユ牸妯″紡浼氭姤 Incorrect DATETIME value: ''锛堣 CHANGELOG 2026-10-22锛�
+      this.queryParams.starttime = this.starttime || null;
+      this.queryParams.endtime = this.endtime || null;
       console.log(this.queryParams);
 
       listDonationProcess(this.queryParams).then(response => {
diff --git a/src/views/project/distributedetail/index.vue b/src/views/project/distributedetail/index.vue
index 60f494f..a488757 100644
--- a/src/views/project/distributedetail/index.vue
+++ b/src/views/project/distributedetail/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="鏀剁泭浜哄鍚� 瀹跺睘鎴栦笓瀹�" prop="beneficiaryname">
         <el-input
           v-model="queryParams.beneficiaryname"
diff --git a/src/views/project/documentfiles/index.vue b/src/views/project/documentfiles/index.vue
index a916524..fe30533 100644
--- a/src/views/project/documentfiles/index.vue
+++ b/src/views/project/documentfiles/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/donateannex/index.vue b/src/views/project/donateannex/index.vue
index 9a28fff..4c3e9ce 100644
--- a/src/views/project/donateannex/index.vue
+++ b/src/views/project/donateannex/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/donateannexrequirement/index.vue b/src/views/project/donateannexrequirement/index.vue
index 71adb2b..d234df4 100644
--- a/src/views/project/donateannexrequirement/index.vue
+++ b/src/views/project/donateannexrequirement/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-row>
         <el-col :span="6">
           <el-form-item label="闄勪欢缂栧彿" prop="annexno">
diff --git a/src/views/project/donatebaseinfo/index.vue b/src/views/project/donatebaseinfo/index.vue
index 919e3c0..c524778 100644
--- a/src/views/project/donatebaseinfo/index.vue
+++ b/src/views/project/donatebaseinfo/index.vue
@@ -3,16 +3,17 @@
     <el-form
       :model="queryParams"
       ref="queryForm"
+      class="opo-query-form"
       :inline="true"
       v-show="showSearch"
       label-width="70px"
     >
       <el-row :gutter="8">
         <el-col :span="5">
-          <el-form-item label="濮撳悕" prop="name">
+          <el-form-item label="鎹愮尞鑰�" prop="name">
             <el-input
               v-model="queryParams.name"
-              placeholder="璇疯緭鍏ュ鍚�"
+              placeholder="璇疯緭鍏ユ崘鐚�呭鍚�"
               clearable
               size="small"
               @keyup.enter.native="handleQuery"
@@ -46,24 +47,25 @@
             </el-select>
           </el-form-item>
         </el-col>
-        <el-col :span="9">
-          <el-form-item label="妗堜緥鏃堕棿">
-            <el-date-picker
-              style="width: 100%"
-              v-model="selecttime"
-              type="monthrange"
-              range-separator="鑷�"
-              start-placeholder="寮�濮嬫湀浠�"
-              end-placeholder="缁撴潫鏈堜唤"
-              value-format="yyyy-MM-dd"
-              @change="getTimeList"
+       <el-col :span="6">
+          <el-form-item label="鎶ュ憡浜�">
+            <el-select
+              v-model="queryParams.reporterno"
+              placeholder="璇烽�夋嫨鎶ュ憡浜�"
             >
-            </el-date-picker>
+              <el-option
+                v-for="item in reportlist"
+                :key="item.index"
+                :label="item.reportername"
+                :value="item.reporterno"
+              >
+              </el-option>
+            </el-select>
           </el-form-item>
         </el-col>
       </el-row>
       <el-row :gutter="8">
-        <el-col :span="5">
+        <el-col :span="6">
           <el-form-item label="鎹愮尞杩涘害" prop="workflow">
             <el-select
               v-model="queryParams.workflow"
@@ -80,23 +82,23 @@
             </el-select>
           </el-form-item>
         </el-col>
-        <el-col :span="5">
-          <el-form-item label="鎶ュ憡浜�">
-            <el-select
-              v-model="queryParams.reporterno"
-              placeholder="璇烽�夋嫨鎶ュ憡浜�"
+         <el-col :span="9">
+          <el-form-item label="妗堜緥鏃堕棿">
+            <el-date-picker
+              style="width: 100%"
+              v-model="selecttime"
+              type="monthrange"
+              range-separator="鑷�"
+              start-placeholder="寮�濮嬫湀浠�"
+              end-placeholder="缁撴潫鏈堜唤"
+              value-format="yyyy-MM-dd"
+              @change="getTimeList"
             >
-              <el-option
-                v-for="item in reportlist"
-                :key="item.index"
-                :label="item.reportername"
-                :value="item.reporterno"
-              >
-              </el-option>
-            </el-select>
+            </el-date-picker>
           </el-form-item>
         </el-col>
-        <el-col :span="5">
+        
+        <el-col :span="6">
           <el-form-item label="鏄惁缁堟">
             <el-select
               v-model="queryParams.terminationCase"
@@ -112,19 +114,8 @@
             </el-select>
           </el-form-item>
         </el-col>
-        <el-col :span="9">
-          <el-form-item label="绫嶈疮">
-            <div>
-              <li_area_select
-                ref="areaSelect"
-                v-model="searchAddress"
-              ></li_area_select>
-            </div>
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-row>
-        <el-col :span="4">
+        <!-- 鎼滅储/閲嶇疆绱ц窡鏌ヨ鏉′欢锛堜笌"妗堜緥璇勪及"椤典竴鑷达級 -->
+        <el-col :span="6">
           <el-form-item>
             <el-button
               type="primary"
@@ -206,7 +197,7 @@
         label="鎹愮尞缂栧彿"
         align="center"
         prop="donorno"
-        width="200"
+        width="100"
       />
       <el-table-column label="濮撳悕" align="center" prop="name" width="100" />
       <el-table-column label="鎬у埆" align="center" prop="sex" width="100">
@@ -233,9 +224,9 @@
       <el-table-column
         label="鍖荤枟鏈烘瀯"
         align="center"
-        prop="treatmenthospitalname"
+        prop="treatmenthospitalname" width="220"
       />
-      <el-table-column label="琛�鍨�" align="center" prop="bloodtype" width="100">
+      <el-table-column label="琛�鍨�" align="center" prop="bloodtype" width="80">
         <template slot-scope="scope">
           <dict-tag
             :options="dict.type.sys_BloodType"
@@ -263,7 +254,7 @@
         prop="reportername"
         width="100"
       />
-      <!--
+      
          <el-table-column
         label="鐜版墍鍦ㄥ湴甯�"
         align="center"
@@ -283,7 +274,7 @@
           />
         </template>
       </el-table-column>
-      -->
+     
       <el-table-column
         label="鎹愮尞杩涘害"
         align="center"
@@ -304,7 +295,7 @@
         label="鎿嶄綔"
         align="center"
         class-name="small-padding fixed-width"
-        fixed="right"
+        fixed="right" width="200"
       >
         <template slot-scope="scope">
           <el-button
@@ -1663,19 +1654,16 @@
         this.queryParams.reportno = this.reportervalue;
       }
 
-      if (this.starttime != "") {
-        this.queryParams.starttime = this.starttime;
-      } else {
-        this.queryParams.starttime = "";
-      }
-      if (this.endtime != "") {
-        this.queryParams.endtime = this.endtime;
-      } else {
-        this.queryParams.endtime = "";
-      }
-      this.queryParams.residenceprovince = this.$refs.areaSelect.getSheng();
-      this.queryParams.residencecity = this.$refs.areaSelect.getShi();
-      this.queryParams.residencetown = this.$refs.areaSelect.getQu();
+      // 鏈�夋嫨鏃堕棿鑼冨洿鏃跺繀椤讳紶 null锛氫紶绌轰覆浼氳鍚庣鎷煎嚭 `donatetime >= ''`锛�
+      // MySQL 涓ユ牸妯″紡浼氭姤 Incorrect DATETIME value: ''锛屽鑷村垪琛ㄦ煡涓嶅嚭鏉ャ��
+      // request.js 鍙細鎷兼帴闈� null/undefined 鐨勫弬鏁帮紝鎵�浠� null 绛変簬"涓嶅甫璇ユ潯浠�"銆�
+      this.queryParams.starttime = this.starttime || null;
+      this.queryParams.endtime = this.endtime || null;
+      // 鏌ヨ鏉′欢閲岀殑"绫嶈疮"宸茬Щ闄わ紝涓嶅啀浠� areaSelect 缁勪欢鍙栧�硷紱
+      // 缃┖浠ユ竻鎺夊彲鑳芥畫鐣欑殑鏃ф潯浠讹紙鍙傛暟涓� null 鏃朵笉浼氳鎷艰繘璇锋眰锛�
+      this.queryParams.residenceprovince = null;
+      this.queryParams.residencecity = null;
+      this.queryParams.residencetown = null;
       console.log(this.queryParams);
 
       listDonatebaseinfo(this.queryParams).then(response => {
@@ -2086,6 +2074,7 @@
 </script>
 
 <style scoped>
+/* 鏌ヨ鍖鸿璺濄�侀〉闈㈠唴杈硅窛銆佸伐鍏锋爮闂磋窛宸叉彁鍗囦负鍏ㄥ眬瑙勫垯锛�.opo-query-form / .app-container锛夛紝姝ゅ涓嶅啀鍗曠嫭瑕嗙洊 */
 ::v-deep .el-dialog__header {
   padding-top: 40px !important;
   margin: auto !important;
diff --git a/src/views/project/donateconsolationfund/index.vue b/src/views/project/donateconsolationfund/index.vue
index 22abef0..d9c91ff 100644
--- a/src/views/project/donateconsolationfund/index.vue
+++ b/src/views/project/donateconsolationfund/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/donatefinish/index.vue b/src/views/project/donatefinish/index.vue
index b0d1554..bb31efb 100644
--- a/src/views/project/donatefinish/index.vue
+++ b/src/views/project/donatefinish/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/donatefinishcheck/index.vue b/src/views/project/donatefinishcheck/index.vue
index 9741462..6682c90 100644
--- a/src/views/project/donatefinishcheck/index.vue
+++ b/src/views/project/donatefinishcheck/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
@@ -897,16 +898,10 @@
       // this.queryParams.residenceprovince = this.$refs.areaSelect.getSheng();
       // this.queryParams.residencecity = this.$refs.areaSelect.getShi();
       // this.queryParams.residencetown = this.$refs.areaSelect.getQu();
-       if (this.starttime != "") {
-        this.queryParams.starttime = this.starttime;
-      } else {
-        this.queryParams.starttime = "";
-      }
-      if (this.endtime != "") {
-        this.queryParams.endtime = this.endtime;
-      } else {
-        this.queryParams.endtime = "";
-      }
+      // 鏈�夋椂闂磋寖鍥存椂浼� null锛氱┖涓蹭細璁╁悗绔嫾鍑� `donatetime >= ''`锛�
+      // MySQL 涓ユ牸妯″紡浼氭姤 Incorrect DATETIME value: ''锛堣 CHANGELOG 2026-10-22锛�
+      this.queryParams.starttime = this.starttime || null;
+      this.queryParams.endtime = this.endtime || null;
       // this.queryParams.residenceprovince = this.$refs.areaSelect.getSheng();
       // this.queryParams.residencecity = this.$refs.areaSelect.getShi();
       // this.queryParams.residencetown = this.$refs.areaSelect.getQu();
diff --git a/src/views/project/donatefollowup/index.vue b/src/views/project/donatefollowup/index.vue
index 82b584e..f3348f8 100644
--- a/src/views/project/donatefollowup/index.vue
+++ b/src/views/project/donatefollowup/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/donateorgan/index.vue b/src/views/project/donateorgan/index.vue
index 37d40cf..c12c2ad 100644
--- a/src/views/project/donateorgan/index.vue
+++ b/src/views/project/donateorgan/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="70px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="70px">
       <el-row>
         <el-col :span="6">
           <el-form-item label="鍣ㄥ畼鍚嶇О" prop="organno">
diff --git a/src/views/project/donateorganstatics/index.vue b/src/views/project/donateorganstatics/index.vue
index ca1fe68..fd9b8ca 100644
--- a/src/views/project/donateorganstatics/index.vue
+++ b/src/views/project/donateorganstatics/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/donatereview/index.vue b/src/views/project/donatereview/index.vue
index 9c80c62..6fb27c5 100644
--- a/src/views/project/donatereview/index.vue
+++ b/src/views/project/donatereview/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
@@ -1115,16 +1116,10 @@
       // this.queryParams.residenceprovince = this.$refs.areaSelect.getSheng();
       // this.queryParams.residencecity = this.$refs.areaSelect.getShi();
       // this.queryParams.residencetown = this.$refs.areaSelect.getQu();
-       if (this.starttime != "") {
-        this.queryParams.starttime = this.starttime;
-      } else {
-        this.queryParams.starttime = "";
-      }
-      if (this.endtime != "") {
-        this.queryParams.endtime = this.endtime;
-      } else {
-        this.queryParams.endtime = "";
-      }
+      // 鏈�夋椂闂磋寖鍥存椂浼� null锛氱┖涓蹭細璁╁悗绔嫾鍑� `donatetime >= ''`锛�
+      // MySQL 涓ユ牸妯″紡浼氭姤 Incorrect DATETIME value: ''锛堣 CHANGELOG 2026-10-22锛�
+      this.queryParams.starttime = this.starttime || null;
+      this.queryParams.endtime = this.endtime || null;
       listDonatebaseinfo(this.queryParams).then((response) => {
         console.log("getlist", response.rows);
         this.donatebaseinfoList = response.rows;
diff --git a/src/views/project/donationdetails/index.vue b/src/views/project/donationdetails/index.vue
index 8715e59..eb9f29e 100644
--- a/src/views/project/donationdetails/index.vue
+++ b/src/views/project/donationdetails/index.vue
@@ -3,7 +3,7 @@
     <div class="left-course" :class="{ 'left-collapsed': isLeftCollapsed }">
       <div class="postfilx">
         <div class="title">
-          宸ヤ綔杩涚▼
+          妗堜緥杩涚▼
           <el-button
             class="collapse-btn"
             @click="toggleLeftCollapse"
@@ -3485,7 +3485,12 @@
       this.isLeftCollapsed = !this.isLeftCollapsed;
     },
     /** 淇濆瓨涓昏〃鎸夐挳 */
-    submitForm() {
+    submitForm(fromProcess) {
+      // 淇濆瓨闃查噸锛氶潪"娴佺▼鎺ㄨ繘"瑙﹀彂鐨勪繚瀛橈紝2 绉掑唴鐨勯噸澶嶇偣鍑荤洿鎺ュ拷鐣ワ紙闃叉閲嶅鎻掑叆锛�
+      if (!fromProcess && !this.canSave()) {
+        this.$modal.msgWarning("璇峰嬁閲嶅鎻愪氦");
+        return;
+      }
       this.$refs["form"].validate(valid => {
         console.log("鎻愪氦鐨勬暟鎹滑锛�", this.form);
         if (valid) {
@@ -3495,14 +3500,21 @@
             "YYYY-MM-DD HH:mm:ss"
           );
 
-          this.form.diseasetype = this.form.diseasetype.join(",");
-
-          this.form.infectious = this.form.infectious.join(",");
-          this.form.selfwill = this.form.selfwill.join(",");
-          this.form.othercases = this.form.othercases.join(",");
-          this.form.infosources = this.form.infosources.join(",");
-          this.form.kinship = this.form.kinship.join(",");
-          this.form.patientstate = this.form.patientstate.join(",");
+          // 澶氶�夊瓧娈佃浆瀛楃涓诧細骞傜瓑澶勭悊锛堝凡鏄瓧绗︿覆鏃朵繚鎸佸師鏍凤級锛�
+          // 閬垮厤"淇濆瓨鎴愬姛鍚庢湭閲嶆柊鍔犺浇鍐嶆淇濆瓨"鏃舵姏 join is not a function
+          [
+            "diseasetype",
+            "infectious",
+            "selfwill",
+            "othercases",
+            "infosources",
+            "kinship",
+            "patientstate"
+          ].forEach(key => {
+            if (Array.isArray(this.form[key])) {
+              this.form[key] = this.form[key].join(",");
+            }
+          });
           this.form.registerprovince = this.$refs.registerSelect.getSheng();
           this.form.registerprovincename = this.registerAddresss.sheng;
 
@@ -3584,6 +3596,11 @@
     },
     // 淇濆瓨浜岀骇琛ㄦ寜閽�
     Savethedetails() {
+      // 淇濆瓨闃查噸锛�2 绉掑唴鐨勯噸澶嶇偣鍑荤洿鎺ュ拷鐣ワ紙闃叉閲嶅鎻掑叆锛�
+      if (!this.canSave()) {
+        this.$modal.msgWarning("璇峰嬁閲嶅鎻愪氦");
+        return;
+      }
       console.log(this.actives);
       if (this.actives == 1) {
         this.medicineform.infoid = this.infoid;
@@ -3594,14 +3611,19 @@
               updateMedicalevaluation(this.medicineform).then(response => {
                 this.$modal.msgSuccess("鍖诲璇勪及淇℃伅淇敼鎴愬姛");
                 this.$modal.closeLoading();
+                this.Processvalidation();
               });
             } else {
               addMedicalevaluation(this.medicineform).then(response => {
+                // 鍥炲~涓婚敭锛氬惁鍒欎笅娆′繚瀛樹粛璧�"鏂板"锛屼細浜х敓閲嶅琛�
+                if (response && response.data && response.data.id) {
+                  this.medicineform.id = response.data.id;
+                }
                 this.$modal.msgSuccess("鍖诲璇勪及淇℃伅鏂板鎴愬姛");
                 this.$modal.closeLoading();
+                this.Processvalidation();
               });
             }
-            this.Processvalidation();
           }
         });
       } else if (this.actives == 2) {
@@ -3621,17 +3643,22 @@
               updateRelativesconfirmation(this.affirmform).then(response => {
                 this.$modal.msgSuccess("鎹愮尞纭淇℃伅淇敼鎴愬姛");
                 this.$modal.closeLoading();
+                this.Processvalidation();
               });
             } else {
               this.affirmform.residenceprovincename = this.defultAddresss.sheng;
               this.affirmform.residencecityname = this.defultAddresss.shi;
               this.affirmform.residencetownname = this.defultAddresss.qu;
               addRelativesconfirmation(this.affirmform).then(response => {
+                // 鍥炲~涓婚敭锛氬惁鍒欎笅娆′繚瀛樹粛璧�"鏂板"锛屼細浜х敓閲嶅琛�
+                if (response && response.data && response.data.id) {
+                  this.affirmform.id = response.data.id;
+                }
                 this.$modal.msgSuccess("鎹愮尞纭淇℃伅鏂板鎴愬姛");
                 this.$modal.closeLoading();
+                this.Processvalidation();
               });
             }
-            this.Processvalidation();
           }
         });
       } else if (this.actives == 3) {
@@ -3644,15 +3671,20 @@
               updateEthicalreviewopinions(this.ethicform).then(res => {
                 this.$modal.msgSuccess("浼︾悊瀹℃煡淇℃伅淇敼鎴愬姛");
                 this.$modal.closeLoading();
+                this.Processvalidation();
               });
             } else {
               //addDonateflowchart(this.ethicform).then(response => {
               addEthicalreviewopinions(this.ethicform).then(res => {
+                // 鍥炲~涓婚敭锛氬惁鍒欎笅娆′繚瀛樹粛璧�"鏂板"锛屼細浜х敓閲嶅琛�
+                if (res && res.data && res.data.id) {
+                  this.ethicform.id = res.data.id;
+                }
                 this.$modal.msgSuccess("浼︾悊瀹℃煡淇℃伅鏂板鎴愬姛");
                 this.$modal.closeLoading();
+                this.Processvalidation();
               });
             }
-            this.Processvalidation();
           }
         });
       } else if (this.actives == 4) {
@@ -3672,6 +3704,12 @@
             }
           });
           saveDonateorgan(this.allocateddata).then(res => {
+            // 鍥炲~涓婚敭锛氬悗绔凡鎸�"鍚屼竴妗堜緥鍚屼竴鍣ㄥ畼"鍋� upsert锛屽洖濉悗鍓嶇涓嶄細鍐嶈鍒や负鏂板
+            if (res && res.data && res.data.length === this.allocateddata.length) {
+              res.data.forEach((row, i) => {
+                this.allocateddata[i].id = row.id;
+              });
+            }
             if (res.code == 200) {
               this.$modal.msgSuccess("鍣ㄥ畼鎹愮尞鍒嗛厤淇℃伅淇濆瓨鎴愬姛锛�");
               this.$modal.closeLoading();
@@ -3720,7 +3758,12 @@
                 });
                 //淇濆瓨鍣ㄥ畼鑾峰彇琛ㄦ暟鎹�
                 saveDonationwitnessorgan(this.procureddata).then(res => {
-                  if (res == 200) {
+                  if (res && res.data && res.data.length === this.procureddata.length) {
+                    res.data.forEach((row, i) => {
+                      this.procureddata[i].id = row.id;
+                    });
+                  }
+                  if (res.code == 200) {
                     this.$modal.msgSuccess("鎹愮尞鍣ㄥ畼鑾峰彇淇℃伅淇濆瓨鎴愬姛锛�");
                   }
                   this.$modal.closeLoading();
@@ -3729,6 +3772,10 @@
             } else {
               addDonationwitness(this.witnessform).then(response => {
                 if (response.code === 200) {
+                  // 鍥炲~涓婚敭锛氬惁鍒欎笅娆′繚瀛樹粛璧�"鏂板"
+                  if (response.data && response.data.id) {
+                    this.witnessform.id = response.data.id;
+                  }
                   this.$modal.msgSuccess("鑾峰彇瑙佽瘉淇℃伅鏂板鎴愬姛");
                   this.form.donationcategory = this.witnessform.donationcategory;
                   let data = JSON.parse(JSON.stringify(this.form));
@@ -3747,7 +3794,12 @@
                   });
                   //淇濆瓨鍣ㄥ畼鑾峰彇琛ㄦ暟鎹�
                   saveDonationwitnessorgan(this.procureddata).then(res => {
-                    if (res == 200) {
+                    if (res && res.data && res.data.length === this.procureddata.length) {
+                      res.data.forEach((row, i) => {
+                        this.procureddata[i].id = row.id;
+                      });
+                    }
+                    if (res.code == 200) {
                       this.$modal.msgSuccess("鎹愮尞鍣ㄥ畼鑾峰彇淇℃伅淇濆瓨鎴愬姛锛�");
                     }
                     this.$modal.closeLoading();
@@ -3782,7 +3834,12 @@
               updateDonatecompletioninfo(this.accomplishform).then(response => {
                 this.$modal.msgSuccess("瀹屾垚鐧昏淇℃伅淇敼鎴愬姛");
                 saveDonatecomporgan(this.transplantdata).then(res => {
-                  if (res == 200) {
+                  if (res && res.data && res.data.length === this.transplantdata.length) {
+                    res.data.forEach((row, i) => {
+                      this.transplantdata[i].id = row.id;
+                    });
+                  }
+                  if (res.code == 200) {
                     this.$modal.msgSuccess("鎹愮尞鍣ㄥ畼鐧昏淇℃伅淇濆瓨鎴愬姛锛�");
                   } else {
                     this.$modal.msgSuccess(res.msg);
@@ -3792,8 +3849,17 @@
               });
             } else {
               addDonatecompletioninfo(this.accomplishform).then(response => {
+                // 鍥炲~涓婚敭锛氬惁鍒欎笅娆′繚瀛樹粛璧�"鏂板"
+                if (response && response.data && response.data.id) {
+                  this.accomplishform.id = response.data.id;
+                }
                 this.$modal.msgSuccess("瀹屾垚鐧昏鎴愬姛");
                 saveDonatecomporgan(this.transplantdata).then(res => {
+                  if (res && res.data && res.data.length === this.transplantdata.length) {
+                    res.data.forEach((row, i) => {
+                      this.transplantdata[i].id = row.id;
+                    });
+                  }
                   if (res.code == 200) {
                     this.$modal.msgSuccess("鎹愮尞鍣ㄥ畼鐧昏淇℃伅淇濆瓨鎴愬姛锛�");
                   } else {
@@ -4130,6 +4196,15 @@
         console.log("宸插埌杈炬渶澶у��");
       }
     },
+    // 淇濆瓨闃查噸锛�2 绉掑唴閲嶅鐐瑰嚮瑙嗕负閲嶅鎻愪氦
+    canSave() {
+      const now = Date.now();
+      if (this.saveLockAt && now - this.saveLockAt < 2000) {
+        return false;
+      }
+      this.saveLockAt = now;
+      return true;
+    },
     // 鏇存敼杩涚▼鏁堥獙
     Processvalidation() {
       if (this.form.workflow + 1 == this.actives) {
@@ -4137,15 +4212,12 @@
           this.form.workflow++;
         } else {
         }
-        this.submitForm();
-        // this.GetAttacheddata();
+        // 鐢�"淇濆瓨浜岀骇琛�"瑙﹀彂鐨勪繚瀛橈紝涓嶅弬涓庨槻閲嶏紙鍚﹀垯浼氳 canSave 鎷︽帀锛�
+        this.submitForm(true);
       } else if (this.form.workflow > this.actives) {
-        this.submitForm();
-        // Modifydonationattachment(this.donatelist).then(res => {});
-        // this.GetAttacheddata();
+        this.submitForm(true);
       } else {
-        this.submitForm();
-        // this.$modal.msgWarning("璇峰厛瀹屾垚鍓嶉儴姝ラ");
+        this.submitForm(true);
         return;
       }
     },
@@ -4462,7 +4534,7 @@
 <style lang="scss" scoped>
 .particularsdiv {
   display: flex;
-  background-color: #f5f7fa;
+  background-color: var(--opo-bg-page, #f5f7fa);
   height: 100vh;
   overflow: hidden;
   transition: all 0.3s ease;
@@ -4476,7 +4548,7 @@
     margin: 0;
     padding: 0;
     height: 100%;
-    box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
+    box-shadow: 2px 0 8px rgba(16, 24, 40, 0.08);
     transition: all 0.3s ease;
     position: relative;
     z-index: 100;
@@ -4511,7 +4583,7 @@
       flex-direction: column;
 
       .title {
-        background: #22a2c3;
+        background: var(--opo-primary, #0e768f);
         margin-bottom: 0;
         padding: 15px 10px;
         color: #fff;
@@ -4608,7 +4680,7 @@
   }
 }
 
-// 姝ラ鏍峰紡浼樺寲
+// 姝ラ鏍峰紡浼樺寲锛堥厤鑹茬粺涓�鍒扮郴缁熷搧鐗岃壊锛歵eal #0E768F锛�
 ::v-deep .el-steps {
   &.el-steps--vertical {
     height: 100%;
@@ -4618,27 +4690,28 @@
 
       .el-step__head {
         &.is-finish {
-          color: #22a2c3;
-          border-color: #22a2c3;
+          color: var(--opo-primary, #0e768f);
+          border-color: var(--opo-primary, #0e768f);
         }
       }
 
       .el-step__title {
-        font-size: 14px;
+        font-size: var(--opo-font-size-sm);
         font-weight: 600;
 
         &.is-finish {
-          color: #22a2c3;
+          color: var(--opo-primary, #0e768f);
         }
       }
 
       .el-step__description {
-        font-size: 12px;
-        color: #666;
+        font-size: var(--opo-font-size-xs);
+        // 鎻忚堪鏂囧瓧缁熶竴鐢ㄤ腑鎬х伆锛岄伩鍏嶆暣鍧楅潰鏉胯鍝佺墝鑹叉饭娌�
+        color: var(--opo-text-secondary, #6b7280);
         line-height: 1.5;
 
         &.is-finish {
-          color: #22a2c3;
+          color: var(--opo-text-regular, #4b5563);
         }
 
         p {
diff --git a/src/views/project/donationwitness/index.vue b/src/views/project/donationwitness/index.vue
index 0f34c2a..828e00f 100644
--- a/src/views/project/donationwitness/index.vue
+++ b/src/views/project/donationwitness/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/donorcharge/donorcharge/index.vue b/src/views/project/donorcharge/donorcharge/index.vue
index 40ef3a3..969d259 100644
--- a/src/views/project/donorcharge/donorcharge/index.vue
+++ b/src/views/project/donorcharge/donorcharge/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px">
       <el-form-item label="鎹愮尞濮撳悕" prop="name">
         <el-input v-model="queryParams.name" placeholder="璇疯緭鍏ュ鍚�" clearable size="small"
           @keyup.enter.native="handleQuery" />
diff --git a/src/views/project/donorcharge/organcharge/index.vue b/src/views/project/donorcharge/organcharge/index.vue
index e0eabc3..32d8dc2 100644
--- a/src/views/project/donorcharge/organcharge/index.vue
+++ b/src/views/project/donorcharge/organcharge/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="鍣ㄥ畼缂栫爜" prop="organcode">
         <el-input
           v-model="queryParams.organcode"
diff --git a/src/views/project/ethicalReview/index.vue b/src/views/project/ethicalReview/index.vue
index ee7d272..ab43674 100644
--- a/src/views/project/ethicalReview/index.vue
+++ b/src/views/project/ethicalReview/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/externalperson/index.vue b/src/views/project/externalperson/index.vue
index af8db6b..cbc851f 100644
--- a/src/views/project/externalperson/index.vue
+++ b/src/views/project/externalperson/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
 
       <el-form-item label="璐﹀彿绫诲埆" prop="usertype">
         <el-select v-model="queryParams.usertype" placeholder="璇烽�夋嫨璐﹀彿绫诲埆" clearable size="small">
diff --git a/src/views/project/financesubject/index.vue b/src/views/project/financesubject/index.vue
index 210c95c..026c0bc 100644
--- a/src/views/project/financesubject/index.vue
+++ b/src/views/project/financesubject/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="椤圭洰绫诲瀷" prop="itemtype">
         <el-select v-model="queryParams.itemtype" placeholder="璇烽�夋嫨椤圭洰绫诲瀷" clearable size="small">
           <el-option v-for="dict in dict.type.sys_ConsolationType" :key="dict.value" :label="dict.label"
diff --git a/src/views/project/fund/applyDetail/index.vue b/src/views/project/fund/applyDetail/index.vue
index 640f424..e12ef3a 100644
--- a/src/views/project/fund/applyDetail/index.vue
+++ b/src/views/project/fund/applyDetail/index.vue
@@ -832,9 +832,10 @@
         return callback();
       }
       const regex = /^[1-9]\d{5}(19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}([0-9]|X)$/;
-      if (regex.test(value)) {
-      } else {
-        callback(new Error("韬唤璇佸彿鐮佹牸寮忛敊璇�"));
+      // 2026-10-19锛氭牸寮忎笉鍚堟硶绔嬪嵆鏃╅��銆傚師鏉ュ啓鎴� if/else 浣� else 閲屾病鏈� return锛�
+      // 浼氱户缁線涓嬭蛋寮傛鏌ラ噸锛屽鑷� callback 琚皟鐢ㄤ袱娆°��"韬唤璇佸彿鐮佹牸寮忛敊璇�"琚悗缁粨鏋滆鐩栥��
+      if (!regex.test(value)) {
+        return callback(new Error("韬唤璇佸彿鐮佹牸寮忛敊璇�"));
       }
 
       // 2. 璋冪敤鍚庣鎺ュ彛杩涜閲嶅鎬ф牎楠�
@@ -967,6 +968,10 @@
       },
 
       dialogrules: {
+        // 2026-10-19锛氳处鎴峰悕绉帮紙璐︽埛鏉ユ簮=浠庤处鎴峰簱 鏃剁殑涓嬫媺锛変篃鏄繀杈撻」
+        accountname: [
+          { required: true, message: "璇烽�夋嫨璐︽埛鍚嶇О", trigger: "change" }
+        ],
         usertype: [
           { required: true, message: "璇疯緭鍏ヨ处鎴风被鍨�", trigger: "blur" }
         ],
@@ -976,6 +981,10 @@
         unitTaxNo: [{ required: true, message: "璇疯緭鍏ョ◣鍙�", trigger: "blur" }],
         idcardno: [
           {
+            // 2026-10-19锛氬姞 required 鏍囪鍙负璁� el-form-item 鏍囧嚭蹇呰緭鏄熷彿锛圗lement 鐨� isRequired 鍙 rule.required锛夈��
+            // 鏈鍒欏甫 validator锛宎sync-validator 鐨� getValidationMethod 浼氱洿鎺ヨ繑鍥炶 validator銆佽烦杩囧唴寤� required 妫�鏌ワ紝
+            // 鎵�浠ユ牎楠岃涓轰笌鏀瑰姩鍓嶅畬鍏ㄤ竴鑷达紱鍙﹀**涓嶈兘鍔� message**锛屽惁鍒欎細瑕嗙洊涓嬮潰鑷畾涔� validator 鐨勬姤閿欐枃妗堛��
+            required: true,
             // 璐︽埛绫诲瀷閫夋嫨"鍗曚綅鏈烘瀯"鏃朵笉闇�瑕佽韩浠借瘉鍙�
             validator: (rule, value, callback) => {
               if (this.hasUserType(this.accountselectform.usertype, "org")) {
@@ -3348,6 +3357,10 @@
     //涓撳/鍖荤枟鏈烘瀯/璐圭敤鎶ラ攢鏈烘瀯閫夋嫨
     confirmSelectionDialog() {
       this.$refs["accountselectform"].validate(valid => {
+        // 2026-10-19锛氬師鏉ユ病鏈夊垽鏂� valid锛屾牎楠屽け璐ヤ篃鐓ф牱寰�涓嬭蛋銆佺収鏍蜂繚瀛橈紙鏄熷彿/绾㈠瓧褰㈠悓铏氳锛�
+        if (!valid) {
+          return;
+        }
         let tempIndex = this.accountselectform.index;
         if (this.selectionType == "account") {
           if (this.accountfrom == "1") {
diff --git a/src/views/project/fund/ethicalExpertFeeApply/index.vue b/src/views/project/fund/ethicalExpertFeeApply/index.vue
index ccc17ff..c511f23 100644
--- a/src/views/project/fund/ethicalExpertFeeApply/index.vue
+++ b/src/views/project/fund/ethicalExpertFeeApply/index.vue
@@ -2,6 +2,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/fund/expertFeeApply/index.vue b/src/views/project/fund/expertFeeApply/index.vue
index 1f11134..283c508 100644
--- a/src/views/project/fund/expertFeeApply/index.vue
+++ b/src/views/project/fund/expertFeeApply/index.vue
@@ -13,6 +13,7 @@
           </el-row>
           <div>
             <el-form
+              class="opo-query-form"
               :model="queryParams"
               ref="queryForm"
               :inline="true"
diff --git a/src/views/project/fund/index.vue b/src/views/project/fund/index.vue
index 06e5d2c..8d366b8 100644
--- a/src/views/project/fund/index.vue
+++ b/src/views/project/fund/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="鎹愮尞鑰呯紪鍙�" prop="donorno">
         <el-input v-model="queryParams.donorno" placeholder="璇疯緭鍏ユ崘鐚�呯紪鍙�" clearable size="small"
           @keyup.enter.native="handleQuery" />
diff --git a/src/views/project/fund/medicalCostApply/index.vue b/src/views/project/fund/medicalCostApply/index.vue
index d1212ab..152bdac 100644
--- a/src/views/project/fund/medicalCostApply/index.vue
+++ b/src/views/project/fund/medicalCostApply/index.vue
@@ -13,6 +13,7 @@
           </el-row>
           <div>
             <el-form
+              class="opo-query-form"
               :model="queryParams"
               ref="queryForm"
               :inline="true"
diff --git a/src/views/project/fund/officeExpenseApply/index.vue b/src/views/project/fund/officeExpenseApply/index.vue
index ef04b6d..dc6fc04 100644
--- a/src/views/project/fund/officeExpenseApply/index.vue
+++ b/src/views/project/fund/officeExpenseApply/index.vue
@@ -2,6 +2,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/fund/performanceApply/index.vue b/src/views/project/fund/performanceApply/index.vue
index dae46f7..84ab9c7 100644
--- a/src/views/project/fund/performanceApply/index.vue
+++ b/src/views/project/fund/performanceApply/index.vue
@@ -2,6 +2,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/fundcheck/ethicalExpertFeeCheck/index.vue b/src/views/project/fundcheck/ethicalExpertFeeCheck/index.vue
index 7668f97..4b31bfd 100644
--- a/src/views/project/fundcheck/ethicalExpertFeeCheck/index.vue
+++ b/src/views/project/fundcheck/ethicalExpertFeeCheck/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
       <el-row>
         <el-col :span="5">
           <el-form-item label="鎹愮尞妗堜緥" prop="donorname" style="float: left">
diff --git a/src/views/project/fundcheck/expertFeeCheck/index.vue b/src/views/project/fundcheck/expertFeeCheck/index.vue
index 8eb7723..4bddc41 100644
--- a/src/views/project/fundcheck/expertFeeCheck/index.vue
+++ b/src/views/project/fundcheck/expertFeeCheck/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
       <el-row>
         <el-col :span="5">
           <el-form-item label="鎹愮尞妗堜緥" prop="donorname" style="float: left">
diff --git a/src/views/project/fundcheck/medicalCostCheck/index.vue b/src/views/project/fundcheck/medicalCostCheck/index.vue
index 223b927..415efc9 100644
--- a/src/views/project/fundcheck/medicalCostCheck/index.vue
+++ b/src/views/project/fundcheck/medicalCostCheck/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
       <el-row align="left">
         <el-col :span="5">
           <el-form-item label="鎹愮尞妗堜緥" prop="donorname" style="float: left">
diff --git a/src/views/project/fundcheck/officeExpenseCheck/index.vue b/src/views/project/fundcheck/officeExpenseCheck/index.vue
index d0d58e0..68a8220 100644
--- a/src/views/project/fundcheck/officeExpenseCheck/index.vue
+++ b/src/views/project/fundcheck/officeExpenseCheck/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
       <el-row align="left">
         <el-col :span="5">
           <el-form-item label="鎹愮尞妗堜緥" prop="donorname" style="float: left">
diff --git a/src/views/project/fundcheck/performanceCheck/index.vue b/src/views/project/fundcheck/performanceCheck/index.vue
index af44667..a91e77e 100644
--- a/src/views/project/fundcheck/performanceCheck/index.vue
+++ b/src/views/project/fundcheck/performanceCheck/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px">
       <el-row align="left">
         <el-col :span="5">
           <el-form-item label="棰勫鐘舵��" prop="checkstatus" style="float: left">
diff --git a/src/views/project/funddetail/index.vue b/src/views/project/funddetail/index.vue
index 5c18378..bca48aa 100644
--- a/src/views/project/funddetail/index.vue
+++ b/src/views/project/funddetail/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="涓撳濮撳悕" prop="beneficiaryname">
         <el-input v-model="queryParams.beneficiaryname" placeholder="璇疯緭鍏ヤ笓瀹跺鍚�" clearable size="small"
           @keyup.enter.native="handleQuery" />
diff --git a/src/views/project/fundflow/index.vue b/src/views/project/fundflow/index.vue
index 7752932..446e86c 100644
--- a/src/views/project/fundflow/index.vue
+++ b/src/views/project/fundflow/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <!-- <el-form-item label="璐圭敤缂栧彿锛屽樊鏃呰垂鍏宠仈琛╯ervice_reimbursement ID; 璐圭敤鍏宠仈璐圭敤琛╯ervice_fund鐨処D" prop="fundid">
         <el-input
           v-model="queryParams.fundid"
diff --git a/src/views/project/fundflowrule/index.vue b/src/views/project/fundflowrule/index.vue
index 402cf69..1c5541f 100644
--- a/src/views/project/fundflowrule/index.vue
+++ b/src/views/project/fundflowrule/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/fundstatistics/index.vue b/src/views/project/fundstatistics/index.vue
index 35195cc..585ce95 100644
--- a/src/views/project/fundstatistics/index.vue
+++ b/src/views/project/fundstatistics/index.vue
@@ -3,7 +3,8 @@
   <div class="app-container">
     <el-col :span="24" v-if="showType == 'list'">
       <el-card shadow="never">
-        <el-form :model="queryParams" ref="queryForm" :inline="true">
+        <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true">
           <el-form-item label="濮撳悕" prop="name">
             <el-input
               v-model="queryParams.name"
diff --git a/src/views/project/itemexpense/index.vue b/src/views/project/itemexpense/index.vue
index 80656b9..17442ab 100644
--- a/src/views/project/itemexpense/index.vue
+++ b/src/views/project/itemexpense/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="鏈嶅姟椤圭洰ID" prop="itemid">
         <el-input
           v-model="queryParams.itemid"
diff --git a/src/views/project/medicalevaluation/index.vue b/src/views/project/medicalevaluation/index.vue
index 0532b93..aed7410 100644
--- a/src/views/project/medicalevaluation/index.vue
+++ b/src/views/project/medicalevaluation/index.vue
@@ -2,6 +2,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/organallocation/index.vue b/src/views/project/organallocation/index.vue
index 8c47d83..8060a6f 100644
--- a/src/views/project/organallocation/index.vue
+++ b/src/views/project/organallocation/index.vue
@@ -3,6 +3,7 @@
   <div class="app-container">
     <!-- 鎼滅储鏉′欢 -->
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/organallocation/index0.vue b/src/views/project/organallocation/index0.vue
index 45b48df..5805f7e 100644
--- a/src/views/project/organallocation/index0.vue
+++ b/src/views/project/organallocation/index0.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="70px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="70px">
       <el-row>
         <el-col :span="6">
           <el-form-item label="鎹愮尞鑰�" prop="name">
diff --git a/src/views/project/organization/index.vue b/src/views/project/organization/index.vue
index bed5e39..9cf2ee0 100644
--- a/src/views/project/organization/index.vue
+++ b/src/views/project/organization/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/reimbursement/index.vue b/src/views/project/reimbursement/index.vue
index 232e0c3..925099e 100644
--- a/src/views/project/reimbursement/index.vue
+++ b/src/views/project/reimbursement/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="鍒涘缓鑰�" prop="createBy">
         <el-input
           v-model="queryParams.createBy"
diff --git a/src/views/project/reimbursementdetail/index.vue b/src/views/project/reimbursementdetail/index.vue
index be5864d..1fbc503 100644
--- a/src/views/project/reimbursementdetail/index.vue
+++ b/src/views/project/reimbursementdetail/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="鍒涘缓浜�" prop="createBy">
         <el-input
           v-model="queryParams.createBy"
diff --git a/src/views/project/reimbursementpayee/index.vue b/src/views/project/reimbursementpayee/index.vue
index 9d5d82e..efa84e1 100644
--- a/src/views/project/reimbursementpayee/index.vue
+++ b/src/views/project/reimbursementpayee/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="璧勯噾鐢宠涓昏〃ID" prop="rbid">
         <el-input
           v-model="queryParams.rbid"
diff --git a/src/views/project/relativesconfirmation/index.vue b/src/views/project/relativesconfirmation/index.vue
index a3a839d..16d116d 100644
--- a/src/views/project/relativesconfirmation/index.vue
+++ b/src/views/project/relativesconfirmation/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/statistics/applyStatistics/index.vue b/src/views/project/statistics/applyStatistics/index.vue
index 8e32401..0be6121 100644
--- a/src/views/project/statistics/applyStatistics/index.vue
+++ b/src/views/project/statistics/applyStatistics/index.vue
@@ -2,6 +2,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/statistics/caseStatistics/index.vue b/src/views/project/statistics/caseStatistics/index.vue
index caaa5de..919800e 100644
--- a/src/views/project/statistics/caseStatistics/index.vue
+++ b/src/views/project/statistics/caseStatistics/index.vue
@@ -2,6 +2,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/statistics/chargeStatistics/index.vue b/src/views/project/statistics/chargeStatistics/index.vue
index 61a46fd..c12a510 100644
--- a/src/views/project/statistics/chargeStatistics/index.vue
+++ b/src/views/project/statistics/chargeStatistics/index.vue
@@ -2,6 +2,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/statistics/performanceStaristics/index.vue b/src/views/project/statistics/performanceStaristics/index.vue
index 715eb80..b1b8b35 100644
--- a/src/views/project/statistics/performanceStaristics/index.vue
+++ b/src/views/project/statistics/performanceStaristics/index.vue
@@ -2,6 +2,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/tallage/computingBill/index.vue b/src/views/project/tallage/computingBill/index.vue
index feacc6f..dbf2747 100644
--- a/src/views/project/tallage/computingBill/index.vue
+++ b/src/views/project/tallage/computingBill/index.vue
@@ -298,6 +298,7 @@
             <el-row :gutter="20">
               <!--鐢ㄦ埛鏁版嵁-->
               <el-form
+                class="opo-query-form"
                 :model="patientqueryParams"
                 ref="queryForm"
                 size="small"
diff --git a/src/views/project/tallage/index.vue b/src/views/project/tallage/index.vue
index ee2da76..1d1c38c 100644
--- a/src/views/project/tallage/index.vue
+++ b/src/views/project/tallage/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/travelexpenseapply/index.vue b/src/views/project/travelexpenseapply/index.vue
index aebd6af..66ca263 100644
--- a/src/views/project/travelexpenseapply/index.vue
+++ b/src/views/project/travelexpenseapply/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-row>
         <!--
         <el-col :span="6">
diff --git a/src/views/project/travelexpensecheck/index.vue b/src/views/project/travelexpensecheck/index.vue
index 23aecba..8cbfa53 100644
--- a/src/views/project/travelexpensecheck/index.vue
+++ b/src/views/project/travelexpensecheck/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="80px">
       <el-row>
         <el-col :span="5">
           <el-form-item label="鎹愮尞妗堜緥" prop="name">
diff --git a/src/views/project/travelexpensedeal/index.vue b/src/views/project/travelexpensedeal/index.vue
index 13bbf91..90705e9 100644
--- a/src/views/project/travelexpensedeal/index.vue
+++ b/src/views/project/travelexpensedeal/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/project/unitCost/index.vue b/src/views/project/unitCost/index.vue
index 11d4e41..1793730 100644
--- a/src/views/project/unitCost/index.vue
+++ b/src/views/project/unitCost/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px">
       <el-form-item label="鍖荤枟鏈烘瀯" prop="name">
         <el-input v-model="queryParams.name" placeholder="璇疯緭鍏ュ尰鐤楁満鏋�" clearable size="small"
           @keyup.enter.native="handleQuery" />
diff --git a/src/views/project/unitCost/particulars/index.vue b/src/views/project/unitCost/particulars/index.vue
index 2031714..2c237ca 100644
--- a/src/views/project/unitCost/particulars/index.vue
+++ b/src/views/project/unitCost/particulars/index.vue
@@ -329,6 +329,7 @@
             <el-row :gutter="20">
               <!--鐢ㄦ埛鏁版嵁-->
               <el-form
+                class="opo-query-form"
                 :model="patientqueryParams"
                 ref="queryForm"
                 size="small"
diff --git a/src/views/system/class/index.vue b/src/views/system/class/index.vue
index 0d5542a..01dc17e 100644
--- a/src/views/system/class/index.vue
+++ b/src/views/system/class/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="鐝骇鍚嶇О" prop="className">
         <el-input
           v-model="queryParams.className"
diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue
index efb6961..8bfda52 100644
--- a/src/views/system/config/index.vue
+++ b/src/views/system/config/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="鍙傛暟鍚嶇О" prop="configName">
         <el-input
           v-model="queryParams.configName"
diff --git a/src/views/system/costmaintenance/index.vue b/src/views/system/costmaintenance/index.vue
index 633105e..d4e0e74 100644
--- a/src/views/system/costmaintenance/index.vue
+++ b/src/views/system/costmaintenance/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
     <el-form
+      class="opo-query-form"
       :model="queryParams"
       ref="queryForm"
       :inline="true"
diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue
index f9c7741..bde65df 100644
--- a/src/views/system/dept/index.vue
+++ b/src/views/system/dept/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
       <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName">
         <el-input
           v-model="queryParams.deptName"
diff --git a/src/views/system/dict/data.vue b/src/views/system/dict/data.vue
index 422c1b7..a592515 100644
--- a/src/views/system/dict/data.vue
+++ b/src/views/system/dict/data.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="瀛楀吀鍚嶇О" prop="dictType">
         <el-select v-model="queryParams.dictType" size="small">
           <el-option
diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue
index 5aedf1e..ec5bf40 100644
--- a/src/views/system/dict/index.vue
+++ b/src/views/system/dict/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="瀛楀吀鍚嶇О" prop="dictName">
         <el-input
           v-model="queryParams.dictName"
diff --git a/src/views/system/grade/index.vue b/src/views/system/grade/index.vue
index 02720d5..9792303 100644
--- a/src/views/system/grade/index.vue
+++ b/src/views/system/grade/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="骞寸骇鍚嶇О" prop="gradeName">
         <el-input
           v-model="queryParams.gradeName"
diff --git a/src/views/system/medicalevalustion/index.vue b/src/views/system/medicalevalustion/index.vue
index a6bafe1..ee80ff6 100644
--- a/src/views/system/medicalevalustion/index.vue
+++ b/src/views/system/medicalevalustion/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="濮撳悕" prop="name">
         <el-input
           v-model="queryParams.name"
diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue
index a89e1ee..72938e4 100644
--- a/src/views/system/menu/index.vue
+++ b/src/views/system/menu/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
       <el-form-item label="鑿滃崟鍚嶇О" prop="menuName">
         <el-input
           v-model="queryParams.menuName"
diff --git a/src/views/system/notice/index.vue b/src/views/system/notice/index.vue
index 22b2ad5..c0c2c9b 100644
--- a/src/views/system/notice/index.vue
+++ b/src/views/system/notice/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="鍏憡鏍囬" prop="noticeTitle">
         <el-input
           v-model="queryParams.noticeTitle"
diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue
index e206968..db21544 100644
--- a/src/views/system/post/index.vue
+++ b/src/views/system/post/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="宀椾綅缂栫爜" prop="postCode">
         <el-input
           v-model="queryParams.postCode"
diff --git a/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue
index 624f689..f41b830 100644
--- a/src/views/system/role/authUser.vue
+++ b/src/views/system/role/authUser.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-     <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
+     <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
       <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
         <el-input
           v-model="queryParams.userName"
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
index 6fc0f99..79a481a 100644
--- a/src/views/system/role/index.vue
+++ b/src/views/system/role/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
       <el-form-item label="瑙掕壊鍚嶇О" prop="roleName">
         <el-input
           v-model="queryParams.roleName"
diff --git a/src/views/system/role/selectUser.vue b/src/views/system/role/selectUser.vue
index 3e0e124..a9d914e 100644
--- a/src/views/system/role/selectUser.vue
+++ b/src/views/system/role/selectUser.vue
@@ -1,7 +1,8 @@
 <template>
   <!-- 鎺堟潈鐢ㄦ埛 -->
   <el-dialog title="閫夋嫨鐢ㄦ埛" :visible.sync="visible" width="800px" top="5vh" append-to-body>
-    <el-form :model="queryParams" ref="queryForm" :inline="true">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true">
       <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
         <el-input
           v-model="queryParams.userName"
diff --git a/src/views/system/student/index.vue b/src/views/system/student/index.vue
index bd94eb2..6503cf2 100644
--- a/src/views/system/student/index.vue
+++ b/src/views/system/student/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="瀛︾敓鍚嶇О" prop="studentName">
         <el-input
           v-model="queryParams.studentName"
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index a3c0426..8a47b62 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -27,7 +27,8 @@
       </el-col>
       <!--鐢ㄦ埛鏁版嵁-->
       <el-col :span="20" :xs="24">
-        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+        <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
           <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName">
             <el-input
               v-model="queryParams.userName"
diff --git a/src/views/tool/gen/importTable.vue b/src/views/tool/gen/importTable.vue
index 068755f..3e29550 100644
--- a/src/views/tool/gen/importTable.vue
+++ b/src/views/tool/gen/importTable.vue
@@ -1,7 +1,8 @@
 <template>
   <!-- 瀵煎叆琛� -->
   <el-dialog title="瀵煎叆琛�" :visible.sync="visible" width="800px" top="5vh" append-to-body>
-    <el-form :model="queryParams" ref="queryForm" :inline="true">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true">
       <el-form-item label="琛ㄥ悕绉�" prop="tableName">
         <el-input
           v-model="queryParams.tableName"
diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue
index 646decf..ae8808a 100644
--- a/src/views/tool/gen/index.vue
+++ b/src/views/tool/gen/index.vue
@@ -1,6 +1,7 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form
+      class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="琛ㄥ悕绉�" prop="tableName">
         <el-input
           v-model="queryParams.tableName"

--
Gitblit v1.9.3