feat(frontend): add P2 quality gates

This commit is contained in:
yml2213
2026-05-15 17:35:50 +08:00
parent a65c0713fb
commit 787b01749c
62 changed files with 4907 additions and 1355 deletions
@@ -1,27 +1,79 @@
<script setup lang="ts">
import { formatStatusWithRaw } from '@/utils/admin-display'
const props = withDefaults(defineProps<{
status: string
showRaw?: boolean
}>(), {
showRaw: true,
})
const props = withDefaults(
defineProps<{
status: string
showRaw?: boolean
}>(),
{
showRaw: true,
},
)
type ElTagType = 'success' | 'primary' | 'warning' | 'danger' | 'info'
function resolveType(status: string): ElTagType {
const normalized = String(status || '').trim().toLowerCase()
const normalized = String(status || '')
.trim()
.toLowerCase()
if (['paid', 'link_generated', 'redeemed', 'available', 'delivered', 'success', 'active', 'system_bound', 'binding_completed', 'completed'].includes(normalized)) {
if (
[
'paid',
'link_generated',
'redeemed',
'available',
'delivered',
'success',
'active',
'system_bound',
'binding_completed',
'completed',
].includes(normalized)
) {
return 'success'
}
if (['claimed', 'role_confirmed', 'redeeming', 'reserved', 'processing', 'admin', 'support', 'waiting_user_claim', 'link_opened', 'binding_confirmed', 'binding_in_progress', 'user_binding', 'pending', 'waiting', 'waiting_binding'].includes(normalized)) {
if (
[
'claimed',
'role_confirmed',
'redeeming',
'reserved',
'processing',
'admin',
'support',
'waiting_user_claim',
'link_opened',
'binding_confirmed',
'binding_in_progress',
'user_binding',
'pending',
'waiting',
'waiting_binding',
].includes(normalized)
) {
return 'primary'
}
if (['waiting_inventory', 'retry_pending', 'manual_review', 'invalid', 'expired', 'operator', 'pending_binding', 'binding_exception', 'not_started', 'consumed', 'skipped', 'pending_binding_prepare', 'dispatched_pending_return'].includes(normalized)) {
if (
[
'waiting_inventory',
'retry_pending',
'manual_review',
'invalid',
'expired',
'operator',
'pending_binding',
'binding_exception',
'not_started',
'consumed',
'skipped',
'pending_binding_prepare',
'dispatched_pending_return',
].includes(normalized)
) {
return 'warning'
}
@@ -97,7 +149,11 @@ function resolveLabel(status: string) {
</script>
<template>
<el-tag :type="resolveType(props.status)" size="small" :title="props.showRaw ? undefined : props.status">
<el-tag
:type="resolveType(props.status)"
size="small"
:title="props.showRaw ? undefined : props.status"
>
{{ resolveLabel(props.status) }}
</el-tag>
</template>
@@ -72,7 +72,11 @@ const emit = defineEmits<{
</div>
<div
v-else-if="['logged_in', 'ready_to_redeem', 'redeeming', 'redeemed'].includes(String(props.sessionStatus || ''))"
v-else-if="
['logged_in', 'ready_to_redeem', 'redeeming', 'redeemed'].includes(
String(props.sessionStatus || ''),
)
"
class="status-state success-state"
>
<strong>已完成登录</strong>
@@ -93,7 +97,9 @@ const emit = defineEmits<{
<div class="auth-copy">
<p class="scan-hint">
{{ props.hasSession ? props.scanInstruction : `已选择${props.loginTypeLabel},等待开始初始化` }}
{{
props.hasSession ? props.scanInstruction : `已选择${props.loginTypeLabel},等待开始初始化`
}}
</p>
<p
v-if="props.qrCopyEnabled && props.qrImage && props.sessionStatus === 'waiting_scan'"