Procházet zdrojové kódy

fix: 统一任务状态定义,筹备中任务在列表中可见

- 去掉草稿状态,TaskStatusPrepare 从4改为0
- 首页/大厅/任务列表/详情接口查询条件使用状态常量
- 筹备中任务包含在列表查询结果中
urban před 2 týdny
rodič
revize
64fd225eaf

+ 1 - 0
src/locales/en.json

@@ -150,6 +150,7 @@
     "normal": "Normal",
     "hard": "Hard",
     "remaining": "Remaining",
+    "preparing": "Coming Soon",
     "claimed": "Claimed",
     "deadline": "Deadline",
     "reviewTime": "Review Time",

+ 1 - 0
src/locales/id.json

@@ -150,6 +150,7 @@
     "normal": "Normal",
     "hard": "Sulit",
     "remaining": "Tersisa",
+    "preparing": "Segera Hadir",
     "claimed": "Diklaim",
     "deadline": "Batas waktu",
     "reviewTime": "Waktu peninjauan",

+ 1 - 0
src/locales/vi.json

@@ -150,6 +150,7 @@
     "normal": "Bình thường",
     "hard": "Khó",
     "remaining": "Còn lại",
+    "preparing": "Sắp ra mắt",
     "claimed": "Đã nhận",
     "deadline": "Thời hạn",
     "reviewTime": "Thời gian xét duyệt",

+ 1 - 0
src/locales/zh.json

@@ -150,6 +150,7 @@
     "normal": "普通",
     "hard": "困难",
     "remaining": "剩余数量",
+    "preparing": "筹备中",
     "claimed": "已领取",
     "deadline": "截止时间",
     "reviewTime": "审核时间",

+ 19 - 2
src/views/hall/index.vue

@@ -33,9 +33,10 @@
       <div class="task-list">
         <div
           class="task-card"
+          :class="{ 'task-preparing': task.status === 0 }"
           v-for="task in taskList"
           :key="task.id"
-          @click="goTaskDetail(task.id)"
+          @click="task.status !== 0 && goTaskDetail(task.id)"
         >
           <div class="task-content">
             <div class="task-cover" v-if="task.cover">
@@ -45,7 +46,8 @@
               <div class="task-title">{{ task.title }}</div>
               <div class="task-footer">
                 <span class="price">+{{ formatReward(task.rewardAmount ?? task.price) }}</span>
-                <span class="remaining">{{ $t('task.remaining') }}: {{ task.remainCount ?? (task.maxNum - task.applyNum) }}</span>
+                <span class="remaining" v-if="task.status !== 0">{{ $t('task.remaining') }}: {{ task.remainCount ?? (task.maxNum - task.applyNum) }}</span>
+                <span class="preparing-tag" v-else>{{ $t('task.preparing') }}</span>
               </div>
             </div>
           </div>
@@ -315,9 +317,24 @@ onMounted(() => {
             font-size: min(2.933vw, 14px);
             color: var(--text-secondary, rgba(255, 255, 255, 0.5));
           }
+
+          .preparing-tag {
+            display: inline-block;
+            padding: 1px 8px;
+            background: rgba(255, 152, 0, 0.2);
+            color: #ff9800;
+            border-radius: 8px;
+            font-size: min(2.8vw, 12px);
+          }
         }
       }
     }
+
+    &.task-preparing {
+      opacity: 0.45;
+      cursor: not-allowed;
+      filter: grayscale(0.3);
+    }
   }
 }
 </style>

+ 20 - 2
src/views/home/index.vue

@@ -56,9 +56,10 @@
         <div class="task-list">
           <div
             class="task-card"
+            :class="{ 'task-preparing': task.status === 0 }"
             v-for="task in taskList"
             :key="task.id"
-            @click="goTaskDetail(task.id)"
+            @click="task.status !== 0 && goTaskDetail(task.id)"
           >
             <div class="task-icon">
               <img :src="task.cover || task.categoryIcon || defaultIcon" alt="" />
@@ -66,7 +67,8 @@
             <div class="task-info">
               <div class="task-title">{{ task.title }}</div>
               <div class="task-meta">
-                <span class="remaining">{{ $t('task.remaining') }}: {{ task.remainCount ?? (task.maxNum - task.applyNum) }}</span>
+                <span class="remaining" v-if="task.status !== 0">{{ $t('task.remaining') }}: {{ task.remainCount ?? (task.maxNum - task.applyNum) }}</span>
+                <span class="preparing-tag" v-else>{{ $t('task.preparing') }}</span>
               </div>
             </div>
             <div class="task-price">
@@ -353,6 +355,22 @@ onMounted(() => {
         color: var(--text-secondary, rgba(255, 255, 255, 0.5));
       }
     }
+
+    &.task-preparing {
+      opacity: 0.45;
+      cursor: not-allowed;
+      position: relative;
+      filter: grayscale(0.3);
+
+      .preparing-tag {
+        display: inline-block;
+        padding: 1px 8px;
+        background: rgba(255, 152, 0, 0.2);
+        color: #ff9800;
+        border-radius: 8px;
+        font-size: min(2.8vw, 12px);
+      }
+    }
   }
 
   .loading-view {

+ 14 - 4
src/views/task/list.vue

@@ -49,21 +49,22 @@
         >
           <div
             class="task-card"
+            :class="{ 'task-preparing': task.status === 0 }"
             v-for="task in taskList"
             :key="task.id"
-            @click="goDetail(task.id)"
+            @click="task.status !== 0 && goDetail(task.id)"
           >
             <div class="task-img">
               <img :src="task.cover || task.imageMaterial?.[0] || defaultIcon" />
-              <div class="task-tag" :class="getDifficultyClass(task.difficulty)">
-                {{ getDifficultyText(task.difficulty) }}
+              <div class="task-tag" :class="task.status === 0 ? 'preparing' : getDifficultyClass(task.difficulty)">
+                {{ task.status === 0 ? $t('task.preparing') : getDifficultyText(task.difficulty) }}
               </div>
             </div>
             <div class="task-info">
               <div class="task-title">{{ task.title }}</div>
               <div class="task-meta">
                 <span class="remaining">
-                  {{ $t('task.remaining') }}: {{ task.remainCount ?? task.remaining ?? 0 }}
+                  {{ task.status === 0 ? $t('task.preparing') : `${$t('task.remaining')}: ${task.remainCount ?? task.remaining ?? 0}` }}
                 </span>
               </div>
               <div class="task-price">+{{ formatReward(task.rewardAmount ?? task.price) }} USDT</div>
@@ -351,6 +352,9 @@ onMounted(() => {
       &.hard {
         background: #f44336;
       }
+      &.preparing {
+        background: rgba(255, 152, 0, 0.8);
+      }
     }
   }
 
@@ -384,5 +388,11 @@ onMounted(() => {
       color: var(--color-accent-light, #ffc300);
     }
   }
+
+  &.task-preparing {
+    opacity: 0.45;
+    cursor: not-allowed;
+    filter: grayscale(0.3);
+  }
 }
 </style>