From dd8d5e2c42aedb1a993b86875584cad9afdac843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E9=A2=9C?= Date: Tue, 20 Jan 2026 15:02:48 +0800 Subject: [PATCH] =?UTF-8?q?mod(frontend):=20=E8=AE=A2=E9=98=85=E5=88=86?= =?UTF-8?q?=E7=BB=84=E4=B8=8B=E6=8B=89=E6=98=BE=E7=A4=BA=E5=A4=87=E6=B3=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 订阅管理/分配订阅:下拉项展示分组备注 - 兑换码/订阅类型:下拉项展示分组备注 - 复用 GroupOptionItem/GroupBadge 保持一致体验 --- frontend/src/views/admin/RedeemView.vue | 44 +++++++++++++++++-- .../src/views/admin/SubscriptionsView.vue | 44 +++++++++++++++++-- 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/frontend/src/views/admin/RedeemView.vue b/frontend/src/views/admin/RedeemView.vue index 50c55ba3..907c7541 100644 --- a/frontend/src/views/admin/RedeemView.vue +++ b/frontend/src/views/admin/RedeemView.vue @@ -238,7 +238,30 @@ v-model="generateForm.group_id" :options="subscriptionGroupOptions" :placeholder="t('admin.redeem.selectGroupPlaceholder')" - /> + > + + +
@@ -370,7 +393,7 @@ import { useAppStore } from '@/stores/app' import { useClipboard } from '@/composables/useClipboard' import { adminAPI } from '@/api/admin' import { formatDateTime } from '@/utils/format' -import type { RedeemCode, RedeemCodeType, Group } from '@/types' +import type { RedeemCode, RedeemCodeType, Group, GroupPlatform, SubscriptionType } from '@/types' import type { Column } from '@/components/common/types' import AppLayout from '@/components/layout/AppLayout.vue' import TablePageLayout from '@/components/layout/TablePageLayout.vue' @@ -378,12 +401,23 @@ import DataTable from '@/components/common/DataTable.vue' import Pagination from '@/components/common/Pagination.vue' import ConfirmDialog from '@/components/common/ConfirmDialog.vue' import Select from '@/components/common/Select.vue' +import GroupBadge from '@/components/common/GroupBadge.vue' +import GroupOptionItem from '@/components/common/GroupOptionItem.vue' import Icon from '@/components/icons/Icon.vue' const { t } = useI18n() const appStore = useAppStore() const { copyToClipboard: clipboardCopy } = useClipboard() +interface GroupOption { + value: number + label: string + description: string | null + platform: GroupPlatform + subscriptionType: SubscriptionType + rate: number +} + const showGenerateDialog = ref(false) const showResultDialog = ref(false) const generatedCodes = ref([]) @@ -395,7 +429,11 @@ const subscriptionGroupOptions = computed(() => { .filter((g) => g.subscription_type === 'subscription') .map((g) => ({ value: g.id, - label: g.name + label: g.name, + description: g.description, + platform: g.platform, + subscriptionType: g.subscription_type, + rate: g.rate_multiplier })) }) diff --git a/frontend/src/views/admin/SubscriptionsView.vue b/frontend/src/views/admin/SubscriptionsView.vue index d5a47788..e609d95d 100644 --- a/frontend/src/views/admin/SubscriptionsView.vue +++ b/frontend/src/views/admin/SubscriptionsView.vue @@ -466,7 +466,28 @@ v-model="assignForm.group_id" :options="subscriptionGroupOptions" :placeholder="t('admin.subscriptions.selectGroup')" - /> + > + + +

{{ t('admin.subscriptions.groupHint') }}

@@ -584,7 +605,7 @@ import { ref, reactive, computed, onMounted, onUnmounted } from 'vue' import { useI18n } from 'vue-i18n' import { useAppStore } from '@/stores/app' import { adminAPI } from '@/api/admin' -import type { UserSubscription, Group } from '@/types' +import type { UserSubscription, Group, GroupPlatform, SubscriptionType } from '@/types' import type { SimpleUser } from '@/api/admin/usage' import type { Column } from '@/components/common/types' import { formatDateOnly } from '@/utils/format' @@ -597,11 +618,21 @@ import ConfirmDialog from '@/components/common/ConfirmDialog.vue' import EmptyState from '@/components/common/EmptyState.vue' import Select from '@/components/common/Select.vue' import GroupBadge from '@/components/common/GroupBadge.vue' +import GroupOptionItem from '@/components/common/GroupOptionItem.vue' import Icon from '@/components/icons/Icon.vue' const { t } = useI18n() const appStore = useAppStore() +interface GroupOption { + value: number + label: string + description: string | null + platform: GroupPlatform + subscriptionType: SubscriptionType + rate: number +} + // User column display mode: 'email' or 'username' const userColumnMode = ref<'email' | 'username'>('email') const USER_COLUMN_MODE_KEY = 'subscription-user-column-mode' @@ -777,7 +808,14 @@ const groupOptions = computed(() => [ const subscriptionGroupOptions = computed(() => groups.value .filter((g) => g.subscription_type === 'subscription' && g.status === 'active') - .map((g) => ({ value: g.id, label: g.name })) + .map((g) => ({ + value: g.id, + label: g.name, + description: g.description, + platform: g.platform, + subscriptionType: g.subscription_type, + rate: g.rate_multiplier + })) ) const applyFilters = () => {