refactor: 移除佣金比例字段,将developer统一为admin

This commit is contained in:
2026-05-01 08:08:11 +08:00
parent c5d1dc4b04
commit 4ed00f29e2
235 changed files with 9082 additions and 8952 deletions
+48 -48
View File
@@ -174,11 +174,11 @@ async function handleDelete() {
try {
await api.delete(`/dev/finance/records/${deleteTarget.value.id}?type=${deleteTarget.value.type}`)
toast.success(t('developer.finance.deleteSuccess'))
toast.success(t('admin.finance.deleteSuccess'))
fetchRecords()
}
catch (error: any) {
toast.error(error.message || t('developer.finance.deleteFailed'))
toast.error(error.message || t('admin.finance.deleteFailed'))
}
finally {
deleteTarget.value = null
@@ -203,15 +203,15 @@ const columns: ColumnDef<FinanceRecord>[] = [
},
{
accessorKey: 'type',
header: () => t('developer.finance.columns.type'),
header: () => t('admin.finance.columns.type'),
cell: ({ row }) => {
const type = row.getValue('type') as string
return h(Badge, { variant: type === 'recharge' ? 'default' : 'secondary' }, () => type === 'recharge' ? t('developer.finance.types.recharge') : t('developer.finance.types.consumption'))
return h(Badge, { variant: type === 'recharge' ? 'default' : 'secondary' }, () => type === 'recharge' ? t('admin.finance.types.recharge') : t('admin.finance.types.consumption'))
},
},
{
accessorKey: 'amount',
header: () => t('developer.finance.columns.amount'),
header: () => t('admin.finance.columns.amount'),
cell: ({ row }) => {
const type = row.getValue('type') as string
const amount = row.getValue('amount') as number
@@ -221,7 +221,7 @@ const columns: ColumnDef<FinanceRecord>[] = [
},
{
accessorKey: 'user',
header: () => t('developer.finance.columns.user'),
header: () => t('admin.finance.columns.user'),
cell: ({ row }) => {
const user = row.original.user
return user?.username || '-'
@@ -229,7 +229,7 @@ const columns: ColumnDef<FinanceRecord>[] = [
},
{
accessorKey: 'detail',
header: () => t('developer.finance.columns.detail'),
header: () => t('admin.finance.columns.detail'),
cell: ({ row }) => {
const detail = row.getValue('detail') as string
return h('span', { class: 'max-w-[200px] truncate text-muted-foreground block' }, detail || '-')
@@ -237,13 +237,13 @@ const columns: ColumnDef<FinanceRecord>[] = [
},
{
accessorKey: 'status',
header: () => t('developer.finance.columns.status'),
header: () => t('admin.finance.columns.status'),
cell: ({ row }) => {
const status = row.getValue('status') as string
const map: Record<string, { label: string, variant: 'default' | 'secondary' | 'destructive' }> = {
success: { label: t('developer.finance.success'), variant: 'default' },
pending: { label: t('developer.finance.pending'), variant: 'secondary' },
failed: { label: t('developer.finance.failed'), variant: 'destructive' },
success: { label: t('admin.finance.success'), variant: 'default' },
pending: { label: t('admin.finance.pending'), variant: 'secondary' },
failed: { label: t('admin.finance.failed'), variant: 'destructive' },
}
const { label, variant } = map[status] || { label: status, variant: 'secondary' }
return h(Badge, { variant }, () => label)
@@ -251,14 +251,14 @@ const columns: ColumnDef<FinanceRecord>[] = [
},
{
accessorKey: 'created_at',
header: () => t('developer.finance.columns.time'),
header: () => t('admin.finance.columns.time'),
cell: ({ row }) => {
return h('span', { class: 'text-muted-foreground whitespace-nowrap' }, formatTime(row.getValue('created_at')))
},
},
{
id: 'actions',
header: () => t('developer.finance.columns.actions'),
header: () => t('admin.finance.columns.actions'),
cell: ({ row }) => {
return h(Button, {
variant: 'ghost',
@@ -293,7 +293,7 @@ const table = useVueTable({
async function confirmBatchDelete() {
const selectedRows = table.getSelectedRowModel().rows
if (selectedRows.length === 0) {
toast.error(t('developer.finance.delete'))
toast.error(t('admin.finance.delete'))
return
}
batchDeleteDialogOpen.value = true
@@ -304,11 +304,11 @@ async function handleBatchDelete() {
const ids = selectedRows.map(row => row.original.id)
try {
await api.post('/dev/finance/records/batch-delete', { ids })
toast.success(t('developer.finance.deleteSuccess'))
toast.success(t('admin.finance.deleteSuccess'))
fetchRecords()
}
catch (error: any) {
toast.error(error.message || t('developer.finance.deleteFailed'))
toast.error(error.message || t('admin.finance.deleteFailed'))
}
}
@@ -344,8 +344,8 @@ onMounted(() => {
<template>
<BasicPage
:title="t('developer.finance.title')"
:description="t('developer.finance.description')"
:title="t('admin.finance.title')"
:description="t('admin.finance.description')"
sticky
>
<div class="space-y-6">
@@ -353,7 +353,7 @@ onMounted(() => {
<UiCard>
<UiCardHeader class="flex flex-row items-center justify-between pb-2 space-y-0">
<UiCardTitle class="text-sm font-medium">
{{ t('developer.finance.rechargeCount') }}
{{ t('admin.finance.rechargeCount') }}
</UiCardTitle>
<Icon icon="lucide:arrow-down-left" class="size-4 text-muted-foreground" />
</UiCardHeader>
@@ -367,7 +367,7 @@ onMounted(() => {
<UiCard>
<UiCardHeader class="flex flex-row items-center justify-between pb-2 space-y-0">
<UiCardTitle class="text-sm font-medium">
{{ t('developer.finance.rechargeAmount') }}
{{ t('admin.finance.rechargeAmount') }}
</UiCardTitle>
<Icon icon="lucide:dollar-sign" class="size-4 text-muted-foreground" />
</UiCardHeader>
@@ -381,7 +381,7 @@ onMounted(() => {
<UiCard>
<UiCardHeader class="flex flex-row items-center justify-between pb-2 space-y-0">
<UiCardTitle class="text-sm font-medium">
{{ t('developer.finance.consumptionCount') }}
{{ t('admin.finance.consumptionCount') }}
</UiCardTitle>
<Icon icon="lucide:arrow-up-right" class="size-4 text-muted-foreground" />
</UiCardHeader>
@@ -395,7 +395,7 @@ onMounted(() => {
<UiCard>
<UiCardHeader class="flex flex-row items-center justify-between pb-2 space-y-0">
<UiCardTitle class="text-sm font-medium">
{{ t('developer.finance.consumptionAmount') }}
{{ t('admin.finance.consumptionAmount') }}
</UiCardTitle>
<Icon icon="lucide:credit-card" class="size-4 text-muted-foreground" />
</UiCardHeader>
@@ -409,7 +409,7 @@ onMounted(() => {
<UiCard>
<UiCardHeader class="flex flex-row items-center justify-between pb-2 space-y-0">
<UiCardTitle class="text-sm font-medium">
{{ t('developer.finance.profit') }}
{{ t('admin.finance.profit') }}
</UiCardTitle>
<Icon icon="lucide:trending-up" class="size-4 text-muted-foreground" />
</UiCardHeader>
@@ -423,9 +423,9 @@ onMounted(() => {
<UiCard>
<UiCardHeader>
<UiCardTitle>{{ t('developer.finance.transactionRecords') }}</UiCardTitle>
<UiCardTitle>{{ t('admin.finance.transactionRecords') }}</UiCardTitle>
<UiCardDescription>
{{ t('developer.finance.transactionRecordsDesc') }}
{{ t('admin.finance.transactionRecordsDesc') }}
</UiCardDescription>
</UiCardHeader>
<UiCardContent>
@@ -438,18 +438,18 @@ onMounted(() => {
@click="confirmBatchDelete"
>
<Icon icon="lucide:trash-2" class="mr-2 size-4" />
{{ t('developer.finance.batchDeleteBtn') }}
{{ t('admin.finance.batchDeleteBtn') }}
</UiButton>
</div>
<div class="flex flex-wrap items-center justify-between gap-2">
<div class="flex flex-wrap items-center gap-2">
<UiSelect v-model="appFilter" class="w-[140px]">
<UiSelectTrigger>
<UiSelectValue :placeholder="t('developer.finance.allApplications')" />
<UiSelectValue :placeholder="t('admin.finance.allApplications')" />
</UiSelectTrigger>
<UiSelectContent>
<UiSelectItem value="all">
{{ t('developer.finance.allApplications') }}
{{ t('admin.finance.allApplications') }}
</UiSelectItem>
<UiSelectItem v-for="app in applications" :key="app.id" :value="String(app.id)">
{{ app.name }}
@@ -459,43 +459,43 @@ onMounted(() => {
<UiSelect v-model="statusFilter" class="w-[120px]">
<UiSelectTrigger>
<UiSelectValue :placeholder="t('developer.finance.allStatus')" />
<UiSelectValue :placeholder="t('admin.finance.allStatus')" />
</UiSelectTrigger>
<UiSelectContent>
<UiSelectItem value="all">
{{ t('developer.finance.allStatus') }}
{{ t('admin.finance.allStatus') }}
</UiSelectItem>
<UiSelectItem value="success">
{{ t('developer.finance.success') }}
{{ t('admin.finance.success') }}
</UiSelectItem>
<UiSelectItem value="pending">
{{ t('developer.finance.pending') }}
{{ t('admin.finance.pending') }}
</UiSelectItem>
<UiSelectItem value="failed">
{{ t('developer.finance.failed') }}
{{ t('admin.finance.failed') }}
</UiSelectItem>
</UiSelectContent>
</UiSelect>
<DateTimePicker
v-model="dateRange.from"
:placeholder="t('developer.finance.startTime')"
:placeholder="t('admin.finance.startTime')"
class="w-[180px]"
/>
<span class="text-muted-foreground">{{ t('developer.finance.to') }}</span>
<span class="text-muted-foreground">{{ t('admin.finance.to') }}</span>
<DateTimePicker
v-model="dateRange.to"
:placeholder="t('developer.finance.endTime')"
:placeholder="t('admin.finance.endTime')"
class="w-[180px]"
/>
<UiButton variant="ghost" size="sm" @click="setQuickRange('today')">
{{ t('developer.finance.today') }}
{{ t('admin.finance.today') }}
</UiButton>
<UiButton variant="ghost" size="sm" @click="setQuickRange('week')">
{{ t('developer.finance.last7Days') }}
{{ t('admin.finance.last7Days') }}
</UiButton>
<UiButton variant="ghost" size="sm" @click="setQuickRange('month')">
{{ t('developer.finance.thisMonth') }}
{{ t('admin.finance.thisMonth') }}
</UiButton>
</div>
</div>
@@ -534,7 +534,7 @@ onMounted(() => {
>
<div class="flex flex-col items-center justify-center text-muted-foreground">
<Icon icon="lucide:inbox" class="size-12 mb-2 opacity-50" />
<span>{{ t('developer.finance.noRecords') }}</span>
<span>{{ t('admin.finance.noRecords') }}</span>
</div>
</TableCell>
</TableRow>
@@ -551,30 +551,30 @@ onMounted(() => {
<ConfirmDialog
v-model:open="deleteDialogOpen"
destructive
:confirm-button-text="t('developer.finance.delete')"
:cancel-button-text="t('developer.finance.cancel')"
:confirm-button-text="t('admin.finance.delete')"
:cancel-button-text="t('admin.finance.cancel')"
@confirm="handleDelete"
>
<template #title>
{{ t('developer.finance.delete') }}
{{ t('admin.finance.delete') }}
</template>
<template #description>
{{ t('developer.finance.deleteConfirm') }}
{{ t('admin.finance.deleteConfirm') }}
</template>
</ConfirmDialog>
<ConfirmDialog
v-model:open="batchDeleteDialogOpen"
destructive
:confirm-button-text="t('developer.finance.delete')"
:cancel-button-text="t('developer.finance.cancel')"
:confirm-button-text="t('admin.finance.delete')"
:cancel-button-text="t('admin.finance.cancel')"
@confirm="handleBatchDelete"
>
<template #title>
{{ t('developer.finance.batchDeleteBtn') }}
{{ t('admin.finance.batchDeleteBtn') }}
</template>
<template #description>
{{ t('developer.finance.batchDeleteConfirm', { count: table.getSelectedRowModel().rows.length }) }}
{{ t('admin.finance.batchDeleteConfirm', { count: table.getSelectedRowModel().rows.length }) }}
</template>
</ConfirmDialog>
</template>