From bbf6d337c9641c0d1bf2c57f05310e59c104990b Mon Sep 17 00:00:00 2001
From: jhzh <1628036192@qq.com>
Date: Fri, 29 May 2026 15:04:43 +0800
Subject: [PATCH] 1

---
 src/components/Transform/perpetual-open/index.vue |  122 ++++++++++++++--------------------------
 1 files changed, 44 insertions(+), 78 deletions(-)

diff --git a/src/components/Transform/perpetual-open/index.vue b/src/components/Transform/perpetual-open/index.vue
index aa76ecb..160f4f6 100644
--- a/src/components/Transform/perpetual-open/index.vue
+++ b/src/components/Transform/perpetual-open/index.vue
@@ -364,19 +364,9 @@
             <div class="lever-popup-seg-item lever-popup-seg-right" :class="{ 'lever-popup-seg-active': leverPopupMargin === 0 }"
               @click="leverPopupMargin = 0">Part</div>
           </div>
-          <div class="lever-popup-row">
-            <div class="lever-popup-btn lever-popup-btn-minus" @click="leverPopupValue = Math.max(1, (leverPopupValue || 1) - 1)">−</div>
-            <input v-model.number="leverPopupValue" type="number" class="lever-popup-input" min="1" :max="maxLever"
-              @input="onLeverInput" />
-            <div class="lever-popup-btn lever-popup-btn-plus" @click="leverPopupValue = Math.min(maxLever, (leverPopupValue || 1) + 1)">+</div>
-          </div>
-          <div class="lever-popup-slider-wrap">
-            <span class="lever-popup-slider-label">1X</span>
-            <div class="lever-popup-slider-inner">
-              <van-slider v-model="leverPopupValue" :min="1" :max="maxLever" :step="1" class="lever-popup-slider"
-                bar-height="6px" active-color="#7c3aed" />
-            </div>
-            <span class="lever-popup-slider-label">{{ maxLever }}X</span>
+          <div class="lever-popup-presets">
+            <div v-for="lv in leverPresetList" :key="lv" class="lever-popup-preset-item"
+              :class="{ 'lever-popup-preset-active': leverPopupValue === lv }" @click="leverPopupValue = lv">{{ lv }}X</div>
           </div>
           <div class="lever-popup-confirm" @click="confirmLeverPopup">Confirm</div>
         </div>
@@ -566,7 +556,7 @@
       return max
     },
     maxLever() {
-      return 100 // 杠杆倍率固定 1~100,不从接口获取
+      return Math.max(...this.leverPresetList)
     },
     leverDisplayMode() {
       return this.locationVal === 1 ? 'Cross' : 'Part'
@@ -636,6 +626,7 @@
       locationTitle: this.$t('全仓'),
       locationVal: 1,
       showLeverPopup: false,
+      leverPresetList: [30, 50, 100, 200, 300],
       leverPopupValue: 100,
       leverPopupMargin: 1, // 1=全仓 Cross, 0=逐仓 Part
     }
@@ -816,7 +807,7 @@
     },
     handleChoose(item) {
       this.showOptions = !this.showOptions
-      this.form.lever_rate = item.lever_rate
+      this.form.lever_rate = this.snapLeverToPreset(item.lever_rate)
       console.log('handleChoose')
       this.handleInitSliderOption()
     },
@@ -873,24 +864,32 @@
       this.locationShow = false;
     },
     openLeverPopup() {
-      this.leverPopupValue = this.form.lever_rate || 1;
+      this.leverPopupValue = this.snapLeverToPreset(this.form.lever_rate);
       this.leverPopupMargin = this.locationVal !== undefined ? this.locationVal : 1;
       this.showLeverPopup = true;
     },
-    onLeverInput() {
-      let v = parseInt(this.leverPopupValue, 10);
-      if (isNaN(v) || v < 1) this.leverPopupValue = 1;
-      else if (v > this.maxLever) this.leverPopupValue = this.maxLever;
-      else this.leverPopupValue = v;
+    snapLeverToPreset(v) {
+      const list = this.leverPresetList;
+      const n = parseInt(v, 10);
+      if (isNaN(n) || n <= 0) return 100;
+      if (list.includes(n)) return n;
+      let best = list[0];
+      let bestD = Infinity;
+      for (const x of list) {
+        const d = Math.abs(x - n);
+        if (d < bestD || (d === bestD && x < best)) {
+          bestD = d;
+          best = x;
+        }
+      }
+      return best;
     },
     onLeverPopupClosed() {
-      this.leverPopupValue = this.form.lever_rate || 1;
+      this.leverPopupValue = this.snapLeverToPreset(this.form.lever_rate);
       this.leverPopupMargin = this.locationVal !== undefined ? this.locationVal : 1;
     },
     confirmLeverPopup() {
-      let val = parseInt(this.leverPopupValue, 10);
-      if (isNaN(val) || val < 1) val = 1;
-      if (val > this.maxLever) val = this.maxLever;
+      const val = this.snapLeverToPreset(this.leverPopupValue);
       this.form.lever_rate = val;
       this.locationVal = this.leverPopupMargin;
       this.locationTitle = this.leverPopupMargin === 1 ? this.$t('全仓') : this.$t('逐仓');
@@ -1461,66 +1460,33 @@
   font-weight: 600;
   box-shadow: 0 1px 6px rgba(0,0,0,0.06);
 }
-.lever-popup-row {
-  display: flex;
-  align-items: stretch;
+.lever-popup-presets {
   margin-top: 30px;
-  border-radius: 15px;
-  overflow: hidden;
-  border: 1px solid #eee;
-}
-.lever-popup-btn {
-  width: 78px;
-  min-width: 78px;
-  background: #f7f7f7;
   display: flex;
-  align-items: center;
-  justify-content: center;
-  font-size: 43px;
-  color: #333;
-  cursor: pointer;
-  font-weight: 400;
+  flex-wrap: wrap;
+  gap: 18px;
+  justify-content: flex-start;
 }
-.lever-popup-btn-minus { border-radius: 15px 0 0 15px; }
-.lever-popup-btn-plus { border-radius: 0 15px 15px 0; }
-.lever-popup-input {
-  flex: 1;
-  min-width: 0;
+.lever-popup-preset-item {
+  flex: 1 1 calc(33.33% - 12px);
+  min-width: calc(33.33% - 12px);
+  box-sizing: border-box;
+  padding: 21px 12px;
   text-align: center;
-  border: none;
-  font-size: 35px;
+  font-size: 30px;
   font-weight: 600;
+  color: #868e9a;
+  background: #f7f7f7;
+  border-radius: 15px;
+  border: 2px solid transparent;
+  cursor: pointer;
+  transition: background 0.2s, color 0.2s, border-color 0.2s;
+}
+.lever-popup-preset-item.lever-popup-preset-active {
   color: #1e1e1e;
   background: #fff;
-  padding: 21px 12px;
-}
-.lever-popup-input:focus { outline: none; }
-.lever-popup-slider-wrap {
-  margin-top: 36px;
-  display: flex;
-  align-items: center;
-  gap: 18px;
-}
-.lever-popup-slider-label {
-  font-size: 23px;
-  color: #868e9a;
-  flex-shrink: 0;
-}
-.lever-popup-slider-inner {
-  flex: 1;
-  min-width: 0;
-}
-.lever-popup-slider :deep(.van-slider__bar) {
-  height: 6px;
-  background: linear-gradient(90deg, #7c3aed 0%, #5b21b6 100%) !important;
-  border-radius: 3px;
-}
-.lever-popup-slider :deep(.van-slider__button) {
-  width: 30px;
-  height: 30px;
-  background: #666;
-  border: none;
-  box-shadow: 0 1px 4px rgba(0,0,0,0.2);
+  border-color: #7c3aed;
+  box-shadow: 0 1px 8px rgba(124, 58, 237, 0.15);
 }
 .lever-popup-confirm {
   margin-top: 42px;

--
Gitblit v1.9.3