diff --git a/apps/admin/app/dashboard/log/balance/page.tsx b/apps/admin/app/dashboard/log/balance/page.tsx index 4da735e..ef504ee 100644 --- a/apps/admin/app/dashboard/log/balance/page.tsx +++ b/apps/admin/app/dashboard/log/balance/page.tsx @@ -1,6 +1,8 @@ 'use client'; import { UserDetail } from '@/app/dashboard/user/user-detail'; +import { Display } from '@/components/display'; +import { OrderLink } from '@/components/order-link'; import { ProTable } from '@/components/pro-table'; import { filterBalanceLog } from '@/services/admin/log'; import { formatDate } from '@/utils/common'; @@ -10,9 +12,19 @@ import { useSearchParams } from 'next/navigation'; export default function BalanceLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + const today = new Date().toISOString().split('T')[0]; + + const getBalanceTypeText = (type: number) => { + const typeText = t(`type.${type}`); + if (typeText === `log.type.${type}`) { + return `${t('unknown')} (${type})`; + } + return typeText; + }; + const initialFilters = { - search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, user_id: sp.get('user_id') ? Number(sp.get('user_id')) : undefined, }; return ( @@ -25,10 +37,26 @@ export default function BalanceLogPage() { header: t('column.user'), cell: ({ row }) => , }, - { accessorKey: 'amount', header: t('column.amount') }, - { accessorKey: 'order_id', header: t('column.orderId') }, - { accessorKey: 'balance', header: t('column.balance') }, - { accessorKey: 'type', header: t('column.type') }, + { + accessorKey: 'amount', + header: t('column.amount'), + cell: ({ row }) => , + }, + { + accessorKey: 'order_id', + header: t('column.orderId'), + cell: ({ row }) => , + }, + { + accessorKey: 'balance', + header: t('column.balance'), + cell: ({ row }) => , + }, + { + accessorKey: 'type', + header: t('column.type'), + cell: ({ row }) => getBalanceTypeText(row.original.type), + }, { accessorKey: 'timestamp', header: t('column.time'), @@ -36,7 +64,6 @@ export default function BalanceLogPage() { }, ]} params={[ - { key: 'search' }, { key: 'date', type: 'date' }, { key: 'user_id', placeholder: t('column.userId') }, ]} @@ -44,7 +71,6 @@ export default function BalanceLogPage() { const { data } = await filterBalanceLog({ page: pagination.page, size: pagination.size, - search: filter?.search, date: (filter as any)?.date, user_id: (filter as any)?.user_id, }); diff --git a/apps/admin/app/dashboard/log/commission/page.tsx b/apps/admin/app/dashboard/log/commission/page.tsx index 1b55bd4..fdb1935 100644 --- a/apps/admin/app/dashboard/log/commission/page.tsx +++ b/apps/admin/app/dashboard/log/commission/page.tsx @@ -1,6 +1,8 @@ 'use client'; import { UserDetail } from '@/app/dashboard/user/user-detail'; +import { Display } from '@/components/display'; +import { OrderLink } from '@/components/order-link'; import { ProTable } from '@/components/pro-table'; import { filterCommissionLog } from '@/services/admin/log'; import { formatDate } from '@/utils/common'; @@ -10,9 +12,19 @@ import { useSearchParams } from 'next/navigation'; export default function CommissionLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + const today = new Date().toISOString().split('T')[0]; + + const getCommissionTypeText = (type: number) => { + const typeText = t(`type.${type}`); + if (typeText === `log.type.${type}`) { + return `${t('unknown')} (${type})`; + } + return typeText; + }; + const initialFilters = { - search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, user_id: sp.get('user_id') ? Number(sp.get('user_id')) : undefined, }; return ( @@ -25,9 +37,21 @@ export default function CommissionLogPage() { header: t('column.user'), cell: ({ row }) => , }, - { accessorKey: 'amount', header: t('column.amount') }, - { accessorKey: 'order_no', header: t('column.orderNo') }, - { accessorKey: 'type', header: t('column.type') }, + { + accessorKey: 'amount', + header: t('column.amount'), + cell: ({ row }) => , + }, + { + accessorKey: 'order_no', + header: t('column.orderNo'), + cell: ({ row }) => , + }, + { + accessorKey: 'type', + header: t('column.type'), + cell: ({ row }) => getCommissionTypeText(row.original.type), + }, { accessorKey: 'timestamp', header: t('column.time'), @@ -35,7 +59,6 @@ export default function CommissionLogPage() { }, ]} params={[ - { key: 'search' }, { key: 'date', type: 'date' }, { key: 'user_id', placeholder: t('column.userId') }, ]} @@ -43,7 +66,6 @@ export default function CommissionLogPage() { const { data } = await filterCommissionLog({ page: pagination.page, size: pagination.size, - search: filter?.search, date: (filter as any)?.date, user_id: (filter as any)?.user_id, }); diff --git a/apps/admin/app/dashboard/log/email/page.tsx b/apps/admin/app/dashboard/log/email/page.tsx index 7f5f1af..cdf7577 100644 --- a/apps/admin/app/dashboard/log/email/page.tsx +++ b/apps/admin/app/dashboard/log/email/page.tsx @@ -10,9 +10,12 @@ import { useSearchParams } from 'next/navigation'; export default function EmailLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + const today = new Date().toISOString().split('T')[0]; + const initialFilters = { search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, }; return ( @@ -20,11 +23,10 @@ export default function EmailLogPage() { initialFilters={initialFilters} columns={[ { - accessorKey: 'id', - header: t('column.id'), - cell: ({ row }) => {row.getValue('id')}, + accessorKey: 'platform', + header: t('column.platform'), + cell: ({ row }) => {row.getValue('platform')}, }, - { accessorKey: 'platform', header: t('column.platform') }, { accessorKey: 'to', header: t('column.to') }, { accessorKey: 'subject', header: t('column.subject') }, { @@ -36,7 +38,29 @@ export default function EmailLogPage() { ), }, - { accessorKey: 'status', header: t('column.status') }, + { + accessorKey: 'status', + header: t('column.status'), + cell: ({ row }) => { + const status = row.original.status; + const getStatusVariant = (status: any) => { + if (status === 1) { + return 'default'; + } else if (status === 0) { + return 'destructive'; + } + return 'outline'; + }; + + const getStatusText = (status: any) => { + if (status === 1) return t('sent'); + if (status === 0) return t('failed'); + return t('unknown'); + }; + + return {getStatusText(status)}; + }, + }, { accessorKey: 'created_at', header: t('column.time'), diff --git a/apps/admin/app/dashboard/log/gift/page.tsx b/apps/admin/app/dashboard/log/gift/page.tsx index 9f7451d..2d70ea4 100644 --- a/apps/admin/app/dashboard/log/gift/page.tsx +++ b/apps/admin/app/dashboard/log/gift/page.tsx @@ -1,6 +1,8 @@ 'use client'; -import { UserDetail } from '@/app/dashboard/user/user-detail'; +import { UserDetail, UserSubscribeDetail } from '@/app/dashboard/user/user-detail'; +import { Display } from '@/components/display'; +import { OrderLink } from '@/components/order-link'; import { ProTable } from '@/components/pro-table'; import { filterGiftLog } from '@/services/admin/log'; import { formatDate } from '@/utils/common'; @@ -10,9 +12,12 @@ import { useSearchParams } from 'next/navigation'; export default function GiftLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + // 获取今日日期作为默认值 + const today = new Date().toISOString().split('T')[0]; + const initialFilters = { - search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, user_id: sp.get('user_id') ? Number(sp.get('user_id')) : undefined, }; return ( @@ -25,10 +30,28 @@ export default function GiftLogPage() { header: t('column.user'), cell: ({ row }) => , }, - { accessorKey: 'subscribe_id', header: t('column.subscribeId') }, - { accessorKey: 'order_no', header: t('column.orderNo') }, - { accessorKey: 'amount', header: t('column.amount') }, - { accessorKey: 'balance', header: t('column.balance') }, + { + accessorKey: 'subscribe_id', + header: t('column.subscribe'), + cell: ({ row }) => ( + + ), + }, + { + accessorKey: 'order_no', + header: t('column.orderNo'), + cell: ({ row }) => , + }, + { + accessorKey: 'amount', + header: t('column.amount'), + cell: ({ row }) => , + }, + { + accessorKey: 'balance', + header: t('column.balance'), + cell: ({ row }) => , + }, { accessorKey: 'remark', header: t('column.remark') }, { accessorKey: 'timestamp', @@ -37,7 +60,6 @@ export default function GiftLogPage() { }, ]} params={[ - { key: 'search' }, { key: 'date', type: 'date' }, { key: 'user_id', placeholder: t('column.userId') }, ]} @@ -45,7 +67,6 @@ export default function GiftLogPage() { const { data } = await filterGiftLog({ page: pagination.page, size: pagination.size, - search: filter?.search, date: (filter as any)?.date, user_id: (filter as any)?.user_id, }); diff --git a/apps/admin/app/dashboard/log/login/page.tsx b/apps/admin/app/dashboard/log/login/page.tsx index 913a8ee..8af9309 100644 --- a/apps/admin/app/dashboard/log/login/page.tsx +++ b/apps/admin/app/dashboard/log/login/page.tsx @@ -6,19 +6,27 @@ import { ProTable } from '@/components/pro-table'; import { filterLoginLog } from '@/services/admin/log'; import { formatDate } from '@/utils/common'; import { Badge } from '@workspace/ui/components/badge'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@workspace/ui/components/tooltip'; import { useTranslations } from 'next-intl'; import { useSearchParams } from 'next/navigation'; export default function LoginLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + const today = new Date().toISOString().split('T')[0]; + const initialFilters = { - search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, user_id: sp.get('user_id') ? Number(sp.get('user_id')) : undefined, }; return ( - + header={{ title: t('title.login') }} initialFilters={initialFilters} columns={[ @@ -27,13 +35,35 @@ export default function LoginLogPage() { header: t('column.user'), cell: ({ row }) => , }, - { accessorKey: 'method', header: t('column.method') }, + { + accessorKey: 'method', + header: t('column.method'), + cell: ({ row }) => {row.original.method}, + }, { accessorKey: 'login_ip', header: t('column.ip'), cell: ({ row }) => , }, - { accessorKey: 'user_agent', header: t('column.userAgent') }, + { + accessorKey: 'user_agent', + header: t('column.userAgent'), + cell: ({ row }) => { + const userAgent = String(row.original.user_agent || ''); + return ( + + + +
{userAgent}
+
+ +

{userAgent}

+
+
+
+ ); + }, + }, { accessorKey: 'success', header: t('column.success'), @@ -50,7 +80,6 @@ export default function LoginLogPage() { }, ]} params={[ - { key: 'search' }, { key: 'date', type: 'date' }, { key: 'user_id', placeholder: t('column.userId') }, ]} @@ -58,7 +87,6 @@ export default function LoginLogPage() { const { data } = await filterLoginLog({ page: pagination.page, size: pagination.size, - search: filter?.search, date: (filter as any)?.date, user_id: (filter as any)?.user_id, }); diff --git a/apps/admin/app/dashboard/log/mobile/page.tsx b/apps/admin/app/dashboard/log/mobile/page.tsx index 6981389..1cc0481 100644 --- a/apps/admin/app/dashboard/log/mobile/page.tsx +++ b/apps/admin/app/dashboard/log/mobile/page.tsx @@ -9,9 +9,12 @@ import { useSearchParams } from 'next/navigation'; export default function MobileLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + const today = new Date().toISOString().split('T')[0]; + const initialFilters = { search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, }; return ( @@ -19,11 +22,10 @@ export default function MobileLogPage() { initialFilters={initialFilters} columns={[ { - accessorKey: 'id', - header: t('column.id'), - cell: ({ row }) => {row.getValue('id')}, + accessorKey: 'platform', + header: t('column.platform'), + cell: ({ row }) => {row.getValue('platform')}, }, - { accessorKey: 'platform', header: t('column.platform') }, { accessorKey: 'to', header: t('column.to') }, { accessorKey: 'subject', header: t('column.subject') }, { @@ -35,7 +37,29 @@ export default function MobileLogPage() { ), }, - { accessorKey: 'status', header: t('column.status') }, + { + accessorKey: 'status', + header: t('column.status'), + cell: ({ row }) => { + const status = row.original.status; + const getStatusVariant = (status: any) => { + if (status === 1) { + return 'default'; + } else if (status === 0) { + return 'destructive'; + } + return 'outline'; + }; + + const getStatusText = (status: any) => { + if (status === 1) return t('sent'); + if (status === 0) return t('failed'); + return t('unknown'); + }; + + return {getStatusText(status)}; + }, + }, { accessorKey: 'created_at', header: t('column.time'), diff --git a/apps/admin/app/dashboard/log/register/page.tsx b/apps/admin/app/dashboard/log/register/page.tsx index 3456a95..3c46b8f 100644 --- a/apps/admin/app/dashboard/log/register/page.tsx +++ b/apps/admin/app/dashboard/log/register/page.tsx @@ -5,19 +5,27 @@ import { IpLink } from '@/components/ip-link'; import { ProTable } from '@/components/pro-table'; import { filterRegisterLog } from '@/services/admin/log'; import { formatDate } from '@/utils/common'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@workspace/ui/components/tooltip'; import { useTranslations } from 'next-intl'; import { useSearchParams } from 'next/navigation'; export default function RegisterLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + const today = new Date().toISOString().split('T')[0]; + const initialFilters = { - search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, user_id: sp.get('user_id') ? Number(sp.get('user_id')) : undefined, }; return ( - + header={{ title: t('title.register') }} initialFilters={initialFilters} columns={[ @@ -26,14 +34,36 @@ export default function RegisterLogPage() { header: t('column.user'), cell: ({ row }) => , }, - { accessorKey: 'auth_method', header: t('column.method') }, + { + accessorKey: 'auth_method', + header: t('column.method'), + cell: ({ row }) => {row.original.auth_method}, + }, { accessorKey: 'identifier', header: t('column.identifier') }, { accessorKey: 'register_ip', header: t('column.ip'), cell: ({ row }) => , }, - { accessorKey: 'user_agent', header: t('column.userAgent') }, + { + accessorKey: 'user_agent', + header: t('column.userAgent'), + cell: ({ row }) => { + const userAgent = String(row.original.user_agent || ''); + return ( + + + +
{userAgent}
+
+ +

{userAgent}

+
+
+
+ ); + }, + }, { accessorKey: 'timestamp', header: t('column.time'), @@ -41,7 +71,6 @@ export default function RegisterLogPage() { }, ]} params={[ - { key: 'search' }, { key: 'date', type: 'date' }, { key: 'user_id', placeholder: t('column.userId') }, ]} @@ -49,7 +78,6 @@ export default function RegisterLogPage() { const { data } = await filterRegisterLog({ page: pagination.page, size: pagination.size, - search: filter?.search, date: (filter as any)?.date, user_id: (filter as any)?.user_id, }); diff --git a/apps/admin/app/dashboard/log/reset-subscribe/page.tsx b/apps/admin/app/dashboard/log/reset-subscribe/page.tsx index 77cae4d..c4407b9 100644 --- a/apps/admin/app/dashboard/log/reset-subscribe/page.tsx +++ b/apps/admin/app/dashboard/log/reset-subscribe/page.tsx @@ -1,6 +1,7 @@ 'use client'; -import { UserDetail } from '@/app/dashboard/user/user-detail'; +import { UserDetail, UserSubscribeDetail } from '@/app/dashboard/user/user-detail'; +import { OrderLink } from '@/components/order-link'; import { ProTable } from '@/components/pro-table'; import { filterResetSubscribeLog } from '@/services/admin/log'; import { formatDate } from '@/utils/common'; @@ -10,15 +11,17 @@ import { useSearchParams } from 'next/navigation'; export default function ResetSubscribeLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + const today = new Date().toISOString().split('T')[0]; + const initialFilters = { - search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, user_subscribe_id: sp.get('user_subscribe_id') ? Number(sp.get('user_subscribe_id')) : undefined, }; return ( - + header={{ title: t('title.resetSubscribe') }} initialFilters={initialFilters} columns={[ @@ -27,9 +30,19 @@ export default function ResetSubscribeLogPage() { header: t('column.user'), cell: ({ row }) => , }, - { accessorKey: 'user_subscribe_id', header: t('column.subscribeId') }, + { + accessorKey: 'user_subscribe_id', + header: t('column.subscribeId'), + cell: ({ row }) => ( + + ), + }, { accessorKey: 'type', header: t('column.type') }, - { accessorKey: 'order_no', header: t('column.orderNo') }, + { + accessorKey: 'order_no', + header: t('column.orderNo'), + cell: ({ row }) => , + }, { accessorKey: 'timestamp', header: t('column.time'), @@ -37,7 +50,6 @@ export default function ResetSubscribeLogPage() { }, ]} params={[ - { key: 'search' }, { key: 'date', type: 'date' }, { key: 'user_subscribe_id', placeholder: t('column.subscribeId') }, ]} @@ -45,7 +57,6 @@ export default function ResetSubscribeLogPage() { const { data } = await filterResetSubscribeLog({ page: pagination.page, size: pagination.size, - search: filter?.search, date: (filter as any)?.date, user_subscribe_id: (filter as any)?.user_subscribe_id, }); diff --git a/apps/admin/app/dashboard/log/server-traffic/page.tsx b/apps/admin/app/dashboard/log/server-traffic/page.tsx index 930879d..11ee1c7 100644 --- a/apps/admin/app/dashboard/log/server-traffic/page.tsx +++ b/apps/admin/app/dashboard/log/server-traffic/page.tsx @@ -2,24 +2,60 @@ import { ProTable } from '@/components/pro-table'; import { filterServerTrafficLog } from '@/services/admin/log'; +import { filterServerList } from '@/services/admin/server'; +import { useQuery } from '@tanstack/react-query'; +import { Button } from '@workspace/ui/components/button'; import { formatBytes } from '@workspace/ui/utils'; import { useTranslations } from 'next-intl'; +import Link from 'next/link'; import { useSearchParams } from 'next/navigation'; export default function ServerTrafficLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + const today = new Date().toISOString().split('T')[0]; + + const { data: servers = [] } = useQuery({ + queryKey: ['filterServerListAll'], + queryFn: async () => { + const { data } = await filterServerList({ page: 1, size: 999999999 }); + return data?.data?.list || []; + }, + }); + + const getServerName = (id?: number) => + id ? (servers.find((s) => s.id === id)?.name ?? `Server ${id}`) : 'Unknown'; + const initialFilters = { - search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, server_id: sp.get('server_id') ? Number(sp.get('server_id')) : undefined, }; return ( - + header={{ title: t('title.serverTraffic') }} initialFilters={initialFilters} + actions={{ + render: (row) => [ + , + ], + }} columns={[ - { accessorKey: 'server_id', header: t('column.serverId') }, + { + accessorKey: 'server_id', + header: t('column.server'), + cell: ({ row }) => ( + + {getServerName(row.original.server_id)} ({row.original.server_id}) + + ), + }, { accessorKey: 'upload', header: t('column.upload'), @@ -38,7 +74,6 @@ export default function ServerTrafficLogPage() { { accessorKey: 'date', header: t('column.date') }, ]} params={[ - { key: 'search' }, { key: 'date', type: 'date' }, { key: 'server_id', placeholder: t('column.serverId') }, ]} @@ -46,7 +81,6 @@ export default function ServerTrafficLogPage() { const { data } = await filterServerTrafficLog({ page: pagination.page, size: pagination.size, - search: filter?.search, date: (filter as any)?.date, server_id: (filter as any)?.server_id, }); diff --git a/apps/admin/app/dashboard/log/subscribe-traffic/page.tsx b/apps/admin/app/dashboard/log/subscribe-traffic/page.tsx index 4fbf546..a8dae56 100644 --- a/apps/admin/app/dashboard/log/subscribe-traffic/page.tsx +++ b/apps/admin/app/dashboard/log/subscribe-traffic/page.tsx @@ -1,34 +1,59 @@ 'use client'; -import { UserDetail } from '@/app/dashboard/user/user-detail'; +import { UserDetail, UserSubscribeDetail } from '@/app/dashboard/user/user-detail'; import { ProTable } from '@/components/pro-table'; import { filterUserSubscribeTrafficLog } from '@/services/admin/log'; +import { Button } from '@workspace/ui/components/button'; import { formatBytes } from '@workspace/ui/utils'; import { useTranslations } from 'next-intl'; +import Link from 'next/link'; import { useSearchParams } from 'next/navigation'; export default function SubscribeTrafficLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + // 获取今日日期作为默认值 + const today = new Date().toISOString().split('T')[0]; + const initialFilters = { - search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, user_id: sp.get('user_id') ? Number(sp.get('user_id')) : undefined, user_subscribe_id: sp.get('user_subscribe_id') ? Number(sp.get('user_subscribe_id')) : undefined, }; return ( - + header={{ title: t('title.subscribeTraffic') }} initialFilters={initialFilters} + actions={{ + render: (row) => [ + , + ], + }} columns={[ { accessorKey: 'user', header: t('column.user'), cell: ({ row }) => , }, - { accessorKey: 'subscribe_id', header: t('column.subscribeId') }, + { + accessorKey: 'subscribe_id', + header: t('column.subscribe'), + cell: ({ row }) => ( + + ), + }, { accessorKey: 'upload', header: t('column.upload'), @@ -50,7 +75,6 @@ export default function SubscribeTrafficLogPage() { }, ]} params={[ - { key: 'search' }, { key: 'date', type: 'date' }, { key: 'user_id', placeholder: t('column.userId') }, { key: 'user_subscribe_id', placeholder: t('column.subscribeId') }, @@ -59,7 +83,6 @@ export default function SubscribeTrafficLogPage() { const { data } = await filterUserSubscribeTrafficLog({ page: pagination.page, size: pagination.size, - search: filter?.search, date: (filter as any)?.date, user_id: (filter as any)?.user_id, user_subscribe_id: (filter as any)?.user_subscribe_id, diff --git a/apps/admin/app/dashboard/log/subscribe/page.tsx b/apps/admin/app/dashboard/log/subscribe/page.tsx index f4266c6..a60a98b 100644 --- a/apps/admin/app/dashboard/log/subscribe/page.tsx +++ b/apps/admin/app/dashboard/log/subscribe/page.tsx @@ -1,23 +1,31 @@ 'use client'; -import { UserDetail } from '@/app/dashboard/user/user-detail'; +import { UserDetail, UserSubscribeDetail } from '@/app/dashboard/user/user-detail'; import { IpLink } from '@/components/ip-link'; import { ProTable } from '@/components/pro-table'; import { filterSubscribeLog } from '@/services/admin/log'; import { formatDate } from '@/utils/common'; +import { + Tooltip, + TooltipContent, + TooltipProvider, + TooltipTrigger, +} from '@workspace/ui/components/tooltip'; import { useTranslations } from 'next-intl'; import { useSearchParams } from 'next/navigation'; export default function SubscribeLogPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + const today = new Date().toISOString().split('T')[0]; + const initialFilters = { - search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, user_id: sp.get('user_id') ? Number(sp.get('user_id')) : undefined, }; return ( - + header={{ title: t('title.subscribe') }} initialFilters={initialFilters} columns={[ @@ -26,14 +34,37 @@ export default function SubscribeLogPage() { header: t('column.user'), cell: ({ row }) => , }, - { accessorKey: 'user_subscribe_id', header: t('column.subscribeId') }, - { accessorKey: 'token', header: t('column.token') }, + { + accessorKey: 'user_subscribe_id', + header: t('column.subscribe'), + cell: ({ row }) => ( + + ), + }, { accessorKey: 'client_ip', header: t('column.ip'), cell: ({ row }) => , }, - { accessorKey: 'user_agent', header: t('column.userAgent') }, + { + accessorKey: 'user_agent', + header: t('column.userAgent'), + cell: ({ row }) => { + const userAgent = String(row.original.user_agent || ''); + return ( + + + +
{userAgent}
+
+ +

{userAgent}

+
+
+
+ ); + }, + }, { accessorKey: 'timestamp', header: t('column.time'), @@ -41,7 +72,6 @@ export default function SubscribeLogPage() { }, ]} params={[ - { key: 'search' }, { key: 'date', type: 'date' }, { key: 'user_id', placeholder: t('column.userId') }, ]} @@ -49,7 +79,6 @@ export default function SubscribeLogPage() { const { data } = await filterSubscribeLog({ page: pagination.page, size: pagination.size, - search: filter?.search, date: (filter as any)?.date, user_id: (filter as any)?.user_id, }); diff --git a/apps/admin/app/dashboard/log/traffic-details/page.tsx b/apps/admin/app/dashboard/log/traffic-details/page.tsx index 14df1ca..7b403e1 100644 --- a/apps/admin/app/dashboard/log/traffic-details/page.tsx +++ b/apps/admin/app/dashboard/log/traffic-details/page.tsx @@ -1,9 +1,11 @@ 'use client'; -import { UserDetail } from '@/app/dashboard/user/user-detail'; +import { UserDetail, UserSubscribeDetail } from '@/app/dashboard/user/user-detail'; import { ProTable } from '@/components/pro-table'; import { filterTrafficLogDetails } from '@/services/admin/log'; +import { filterServerList } from '@/services/admin/server'; import { formatDate } from '@/utils/common'; +import { useQuery } from '@tanstack/react-query'; import { formatBytes } from '@workspace/ui/utils'; import { useTranslations } from 'next-intl'; import { useSearchParams } from 'next/navigation'; @@ -11,9 +13,22 @@ import { useSearchParams } from 'next/navigation'; export default function TrafficDetailsPage() { const t = useTranslations('log'); const sp = useSearchParams(); + + const today = new Date().toISOString().split('T')[0]; + + const { data: servers = [] } = useQuery({ + queryKey: ['filterServerListAll'], + queryFn: async () => { + const { data } = await filterServerList({ page: 1, size: 999999999 }); + return data?.data?.list || []; + }, + }); + + const getServerName = (id?: number) => + id ? (servers.find((s) => s.id === id)?.name ?? `Server ${id}`) : 'Unknown'; + const initialFilters = { - search: sp.get('search') || undefined, - date: sp.get('date') || undefined, + date: sp.get('date') || today, server_id: sp.get('server_id') ? Number(sp.get('server_id')) : undefined, user_id: sp.get('user_id') ? Number(sp.get('user_id')) : undefined, subscribe_id: sp.get('subscribe_id') ? Number(sp.get('subscribe_id')) : undefined, @@ -23,13 +38,27 @@ export default function TrafficDetailsPage() { header={{ title: t('title.trafficDetails') }} initialFilters={initialFilters} columns={[ - { accessorKey: 'server_id', header: t('column.serverId') }, + { + accessorKey: 'server_id', + header: t('column.server'), + cell: ({ row }) => ( + + {getServerName(row.original.server_id)} ({row.original.server_id}) + + ), + }, { accessorKey: 'user_id', - header: t('column.userId'), + header: t('column.user'), cell: ({ row }) => , }, - { accessorKey: 'subscribe_id', header: t('column.subscribeId') }, + { + accessorKey: 'subscribe_id', + header: t('column.subscribe'), + cell: ({ row }) => ( + + ), + }, { accessorKey: 'upload', header: t('column.upload'), @@ -47,7 +76,6 @@ export default function TrafficDetailsPage() { }, ]} params={[ - { key: 'search' }, { key: 'date', type: 'date' }, { key: 'server_id', placeholder: t('column.serverId') }, { key: 'user_id', placeholder: t('column.userId') }, @@ -57,7 +85,6 @@ export default function TrafficDetailsPage() { const { data } = await filterTrafficLogDetails({ page: pagination.page, size: pagination.size, - search: (filter as any)?.search, date: (filter as any)?.date, server_id: (filter as any)?.server_id, user_id: (filter as any)?.user_id, diff --git a/apps/admin/app/dashboard/nodes/node-form.tsx b/apps/admin/app/dashboard/nodes/node-form.tsx index 07805c3..c54d81d 100644 --- a/apps/admin/app/dashboard/nodes/node-form.tsx +++ b/apps/admin/app/dashboard/nodes/node-form.tsx @@ -90,6 +90,7 @@ export default function NodeForm(props: { const serverId = form.watch('server_id'); const { data } = useQuery({ + enabled: open, queryKey: ['filterServerListAll'], queryFn: async () => { const { data } = await filterServerList({ page: 1, size: 999999999 }); @@ -99,6 +100,7 @@ export default function NodeForm(props: { const servers: ServerRow[] = data as ServerRow[]; const { data: tagsData } = useQuery({ + enabled: open, queryKey: ['queryNodeTag'], queryFn: async () => { const { data } = await queryNodeTag(); diff --git a/apps/admin/app/dashboard/ticket/page.tsx b/apps/admin/app/dashboard/ticket/page.tsx index 418365c..f4c30d7 100644 --- a/apps/admin/app/dashboard/ticket/page.tsx +++ b/apps/admin/app/dashboard/ticket/page.tsx @@ -13,7 +13,6 @@ import { Button } from '@workspace/ui/components/button'; import { Drawer, DrawerContent, - DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, @@ -168,10 +167,22 @@ export default function Page() { {ticket?.title} - {ticket?.description}
+ {/* 显示工单描述作为第一条用户消息 */} + {ticket?.description && ( +
+
+

{formatDate(ticket.created_at)}

+

+ {ticket.description} +

+
+
+ )} + + {/* 显示后续跟进消息 */} {ticket?.follow?.map((item) => (

{t('subscriptionInfo')}

@@ -69,42 +77,59 @@ export function UserSubscribeDetail({ id, enabled }: { id: number; enabled: bool
-
-

- {t('userInfo')} - {/* Removed link to legacy user detail page */} -

-
    -
  • - {t('userId')} - {data?.user_id} -
  • -
  • - {t('balance')} - - - -
  • -
  • - {t('giftAmount')} - - - -
  • -
  • - {t('commission')} - - - -
  • -
  • - {t('createdAt')} - {data?.user?.created_at && formatDate(data?.user?.created_at)} -
  • -
-
+ {!hoverCard && ( +
+

+ {t('userInfo')} + {/* Removed link to legacy user detail page */} +

+
    +
  • + {t('userId')} + {data?.user_id} +
  • +
  • + {t('balance')} + + + +
  • +
  • + {t('giftAmount')} + + + +
  • +
  • + {t('commission')} + + + +
  • +
  • + {t('createdAt')} + {data?.user?.created_at && formatDate(data?.user?.created_at)} +
  • +
+
+ )}
); + + if (hoverCard) { + return ( + + + + + {subscribeContent} + + ); + } + + return subscribeContent; } export function UserDetail({ id }: { id: number }) { diff --git a/apps/admin/components/order-link.tsx b/apps/admin/components/order-link.tsx new file mode 100644 index 0000000..052f567 --- /dev/null +++ b/apps/admin/components/order-link.tsx @@ -0,0 +1,17 @@ +import { Button } from '@workspace/ui/components/button'; +import Link from 'next/link'; + +interface OrderLinkProps { + orderId?: string | number; + className?: string; +} + +export function OrderLink({ orderId, className }: OrderLinkProps) { + if (!orderId) return --; + + return ( + + ); +} diff --git a/apps/admin/locales/cs-CZ/log.json b/apps/admin/locales/cs-CZ/log.json index be6b362..ec58e5e 100644 --- a/apps/admin/locales/cs-CZ/log.json +++ b/apps/admin/locales/cs-CZ/log.json @@ -15,9 +15,11 @@ "platform": "Platforma", "remark": "Poznámka", "resetAt": "Resetováno", + "server": "Server", "serverId": "ID serveru", "status": "Stav", "subject": "Předmět", + "subscribe": "Přihlásit se", "subscribeId": "ID předplatného", "success": "Úspěch", "time": "Čas", @@ -32,7 +34,9 @@ "userId": "ID uživatele" }, "datePlaceholder": "RRRR-MM-DD", + "detail": "Detail", "failed": "Neúspěšné", + "pending": "Čekající", "placeholder": { "serverName": "Název serveru", "toOrSubject": "Komu / Předmět", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ID uživatele / Číslo objednávky / ID předplatného", "userIdOrTokenOrIpOrUa": "ID uživatele / Token / IP / UA" }, + "sending": "Odesílání", + "sent": "Odesláno", "success": "Úspěch", "title": { "balance": "Protokol zůstatku", @@ -56,5 +62,14 @@ "subscribe": "Protokol předplatného", "subscribeTraffic": "Protokol provozu předplatného", "trafficDetails": "Podrobnosti o provozu" - } + }, + "type": { + "1": "Dobití", + "2": "Výběr", + "3": "Nákup", + "4": "Vrácení", + "5": "Odměna", + "6": "Provize" + }, + "unknown": "Neznámý" } diff --git a/apps/admin/locales/de-DE/log.json b/apps/admin/locales/de-DE/log.json index 9754b4f..78f712f 100644 --- a/apps/admin/locales/de-DE/log.json +++ b/apps/admin/locales/de-DE/log.json @@ -15,9 +15,11 @@ "platform": "Plattform", "remark": "Bemerkung", "resetAt": "Zurückgesetzt Am", + "server": "Server", "serverId": "Server-ID", "status": "Status", "subject": "Betreff", + "subscribe": "Abonnieren", "subscribeId": "Abonnement-ID", "success": "Erfolg", "time": "Zeit", @@ -32,7 +34,9 @@ "userId": "Benutzer-ID" }, "datePlaceholder": "JJJJ-MM-TT", + "detail": "Detail", "failed": "Fehlgeschlagen", + "pending": "Ausstehend", "placeholder": { "serverName": "Servername", "toOrSubject": "An / Betreff", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "Benutzer-ID / Bestell-Nr. / Abonnement-ID", "userIdOrTokenOrIpOrUa": "Benutzer-ID / Token / IP / UA" }, + "sending": "Wird gesendet", + "sent": "Gesendet", "success": "Erfolg", "title": { "balance": "Guthabenprotokoll", @@ -56,5 +62,14 @@ "subscribe": "Abonnementprotokoll", "subscribeTraffic": "Abonnementverkehrsprotokoll", "trafficDetails": "Verkehrsdetails" - } + }, + "type": { + "1": "Aufladen", + "2": "Abheben", + "3": "Kauf", + "4": "Rückerstattung", + "5": "Belohnung", + "6": "Provision" + }, + "unknown": "Unbekannt" } diff --git a/apps/admin/locales/en-US/log.json b/apps/admin/locales/en-US/log.json index ed21ec8..12c8838 100644 --- a/apps/admin/locales/en-US/log.json +++ b/apps/admin/locales/en-US/log.json @@ -16,6 +16,8 @@ "time": "Time", "userId": "User ID", "subscribeId": "Subscribe ID", + "subscribe": "Subscribe", + "server": "Server", "token": "Token", "amount": "Amount", "orderId": "Order ID", @@ -32,7 +34,9 @@ "identifier": "Identifier" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "Detail", "failed": "Failed", + "pending": "Pending", "placeholder": { "toOrSubject": "To / Subject", "userIdOrIpOrMethodOrUa": "User ID / IP / Method / UA", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "User ID / Order No. / Subscribe ID", "userIdOrOrderId": "User ID / Order ID" }, + "sending": "Sending", + "sent": "Sent", "success": "Success", "title": { "email": "Email Log", @@ -56,5 +62,14 @@ "resetSubscribe": "Reset Subscribe Log", "subscribeTraffic": "Subscribe Traffic Log", "trafficDetails": "Traffic Details" - } + }, + "type": { + "1": "Recharge", + "2": "Withdraw", + "3": "Purchase", + "4": "Refund", + "5": "Reward", + "6": "Commission" + }, + "unknown": "Unknown" } diff --git a/apps/admin/locales/en-US/servers.json b/apps/admin/locales/en-US/servers.json index aed8fbb..53d4d2b 100644 --- a/apps/admin/locales/en-US/servers.json +++ b/apps/admin/locales/en-US/servers.json @@ -94,7 +94,8 @@ "subscribeId": "Subscription ID", "subscription": "Subscription", "traffic": "Traffic", - "traffic_ratio": "Multiplier", + "traffic_ratio": "Ratio", + "transport": "Transport", "transport_title": "Transport", "udp_relay_mode": "UDP relay mode", "unitSecondsShort": "S", diff --git a/apps/admin/locales/es-ES/log.json b/apps/admin/locales/es-ES/log.json index 159ab3b..269d0e3 100644 --- a/apps/admin/locales/es-ES/log.json +++ b/apps/admin/locales/es-ES/log.json @@ -15,9 +15,11 @@ "platform": "Plataforma", "remark": "Observación", "resetAt": "Restablecido En", + "server": "Servidor", "serverId": "ID de Servidor", "status": "Estado", "subject": "Asunto", + "subscribe": "Suscribirse", "subscribeId": "ID de Suscripción", "success": "Éxito", "time": "Tiempo", @@ -32,7 +34,9 @@ "userId": "ID de Usuario" }, "datePlaceholder": "AAAA-MM-DD", + "detail": "Detalle", "failed": "Fallido", + "pending": "Pendiente", "placeholder": { "serverName": "Nombre del Servidor", "toOrSubject": "Para / Asunto", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ID de Usuario / No. de Pedido / ID de Suscripción", "userIdOrTokenOrIpOrUa": "ID de Usuario / Token / IP / UA" }, + "sending": "Enviando", + "sent": "Enviado", "success": "Éxito", "title": { "balance": "Registro de Saldo", @@ -56,5 +62,14 @@ "subscribe": "Registro de Suscripción", "subscribeTraffic": "Registro de Tráfico de Suscripción", "trafficDetails": "Detalles del Tráfico" - } + }, + "type": { + "1": "Recarga", + "2": "Retiro", + "3": "Compra", + "4": "Reembolso", + "5": "Recompensa", + "6": "Comisión" + }, + "unknown": "Desconocido" } diff --git a/apps/admin/locales/es-MX/log.json b/apps/admin/locales/es-MX/log.json index e877a97..ab19fb6 100644 --- a/apps/admin/locales/es-MX/log.json +++ b/apps/admin/locales/es-MX/log.json @@ -15,9 +15,11 @@ "platform": "Plataforma", "remark": "Comentario", "resetAt": "Restablecido En", + "server": "Servidor", "serverId": "ID de Servidor", "status": "Estado", "subject": "Asunto", + "subscribe": "Suscribirse", "subscribeId": "ID de Suscripción", "success": "Éxito", "time": "Tiempo", @@ -32,7 +34,9 @@ "userId": "ID de Usuario" }, "datePlaceholder": "AAAA-MM-DD", + "detail": "Detalle", "failed": "Fallido", + "pending": "Pendiente", "placeholder": { "serverName": "Nombre del Servidor", "toOrSubject": "Para / Asunto", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ID de Usuario / No. de Orden / ID de Suscripción", "userIdOrTokenOrIpOrUa": "ID de Usuario / Token / IP / UA" }, + "sending": "Enviando", + "sent": "Enviado", "success": "Éxito", "title": { "balance": "Registro de Saldo", @@ -56,5 +62,14 @@ "subscribe": "Registro de Suscripción", "subscribeTraffic": "Registro de Tráfico de Suscripción", "trafficDetails": "Detalles del Tráfico" - } + }, + "type": { + "1": "Recarga", + "2": "Retiro", + "3": "Compra", + "4": "Reembolso", + "5": "Recompensa", + "6": "Comisión" + }, + "unknown": "Desconocido" } diff --git a/apps/admin/locales/fa-IR/log.json b/apps/admin/locales/fa-IR/log.json index 14579ea..4f2c5c0 100644 --- a/apps/admin/locales/fa-IR/log.json +++ b/apps/admin/locales/fa-IR/log.json @@ -15,9 +15,11 @@ "platform": "پلتفرم", "remark": "یادداشت", "resetAt": "تاریخ بازنشانی", + "server": "سرور", "serverId": "شناسه سرور", "status": "وضعیت", "subject": "موضوع", + "subscribe": "اشتراک", "subscribeId": "شناسه اشتراک", "success": "موفقیت", "time": "زمان", @@ -32,7 +34,9 @@ "userId": "شناسه کاربر" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "جزئیات", "failed": "ناموفق", + "pending": "در حال انتظار", "placeholder": { "serverName": "نام سرور", "toOrSubject": "به / موضوع", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "شناسه کاربر / شماره سفارش / شناسه اشتراک", "userIdOrTokenOrIpOrUa": "شناسه کاربر / توکن / آی‌پی / UA" }, + "sending": "در حال ارسال", + "sent": "ارسال شده", "success": "موفقیت", "title": { "balance": "گزارش موجودی", @@ -56,5 +62,14 @@ "subscribe": "گزارش اشتراک", "subscribeTraffic": "گزارش ترافیک اشتراک", "trafficDetails": "جزئیات ترافیک" - } + }, + "type": { + "1": "شارژ", + "2": "برداشت", + "3": "خرید", + "4": "بازگشت", + "5": "پاداش", + "6": "کمیسیون" + }, + "unknown": "ناشناخته" } diff --git a/apps/admin/locales/fi-FI/log.json b/apps/admin/locales/fi-FI/log.json index 15da4db..d59df56 100644 --- a/apps/admin/locales/fi-FI/log.json +++ b/apps/admin/locales/fi-FI/log.json @@ -15,9 +15,11 @@ "platform": "Alusta", "remark": "Huomautus", "resetAt": "Nollattu", + "server": "Palvelin", "serverId": "Palvelimen ID", "status": "Tila", "subject": "Aihe", + "subscribe": "Tilaa", "subscribeId": "Tilauksen ID", "success": "Onnistui", "time": "Aika", @@ -32,7 +34,9 @@ "userId": "Käyttäjä ID" }, "datePlaceholder": "VVVV-KK-PP", + "detail": "Yksityiskohta", "failed": "Epäonnistui", + "pending": "Odottaa", "placeholder": { "serverName": "Palvelimen nimi", "toOrSubject": "Vastaanottaja / Aihe", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "Käyttäjä ID / Tilauksen nro / Tilauksen ID", "userIdOrTokenOrIpOrUa": "Käyttäjä ID / Token / IP / UA" }, + "sending": "Lähetetään", + "sent": "Lähetetty", "success": "Onnistui", "title": { "balance": "Saldo Lokit", @@ -56,5 +62,14 @@ "subscribe": "Tilauksen Lokit", "subscribeTraffic": "Tilauksen Liikenne Lokit", "trafficDetails": "Liikennetiedot" - } + }, + "type": { + "1": "Lataus", + "2": "Nosto", + "3": "Osto", + "4": "Hyvitys", + "5": "Palkinto", + "6": "Komissio" + }, + "unknown": "Tuntematon" } diff --git a/apps/admin/locales/fr-FR/log.json b/apps/admin/locales/fr-FR/log.json index 766307f..e4eb19a 100644 --- a/apps/admin/locales/fr-FR/log.json +++ b/apps/admin/locales/fr-FR/log.json @@ -15,9 +15,11 @@ "platform": "Plateforme", "remark": "Remarque", "resetAt": "Réinitialisé le", + "server": "Serveur", "serverId": "ID de Serveur", "status": "Statut", "subject": "Sujet", + "subscribe": "S'abonner", "subscribeId": "ID d'Abonnement", "success": "Succès", "time": "Temps", @@ -32,7 +34,9 @@ "userId": "ID Utilisateur" }, "datePlaceholder": "AAAA-MM-JJ", + "detail": "Détail", "failed": "Échoué", + "pending": "En attente", "placeholder": { "serverName": "Nom du Serveur", "toOrSubject": "À / Sujet", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ID Utilisateur / Numéro de Commande / ID d'Abonnement", "userIdOrTokenOrIpOrUa": "ID Utilisateur / Jeton / IP / UA" }, + "sending": "Envoi", + "sent": "Envoyé", "success": "Succès", "title": { "balance": "Journal des Soldes", @@ -56,5 +62,14 @@ "subscribe": "Journal des Abonnements", "subscribeTraffic": "Journal du Trafic d'Abonnement", "trafficDetails": "Détails du Trafic" - } + }, + "type": { + "1": "Recharge", + "2": "Retrait", + "3": "Achat", + "4": "Remboursement", + "5": "Récompense", + "6": "Commission" + }, + "unknown": "Inconnu" } diff --git a/apps/admin/locales/hi-IN/log.json b/apps/admin/locales/hi-IN/log.json index ee861c9..3b67773 100644 --- a/apps/admin/locales/hi-IN/log.json +++ b/apps/admin/locales/hi-IN/log.json @@ -15,9 +15,11 @@ "platform": "प्लेटफ़ॉर्म", "remark": "टिप्पणी", "resetAt": "रीसेट तिथि", + "server": "सर्वर", "serverId": "सर्वर आईडी", "status": "स्थिति", "subject": "विषय", + "subscribe": "सदस्यता लें", "subscribeId": "सदस्यता आईडी", "success": "सफलता", "time": "समय", @@ -32,7 +34,9 @@ "userId": "उपयोगकर्ता आईडी" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "विवरण", "failed": "असफल", + "pending": "लंबित", "placeholder": { "serverName": "सर्वर नाम", "toOrSubject": "को / विषय", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "उपयोगकर्ता आईडी / आदेश संख्या / सदस्यता आईडी", "userIdOrTokenOrIpOrUa": "उपयोगकर्ता आईडी / टोकन / आईपी / यूए" }, + "sending": "भेजना", + "sent": "भेजा गया", "success": "सफलता", "title": { "balance": "बैलेंस लॉग", @@ -56,5 +62,14 @@ "subscribe": "सदस्यता लॉग", "subscribeTraffic": "सदस्यता ट्रैफ़िक लॉग", "trafficDetails": "ट्रैफ़िक विवरण" - } + }, + "type": { + "1": "रिचार्ज", + "2": "निकासी", + "3": "खरीद", + "4": "वापसी", + "5": "इनाम", + "6": "आयोग" + }, + "unknown": "अज्ञात" } diff --git a/apps/admin/locales/hu-HU/log.json b/apps/admin/locales/hu-HU/log.json index 642817b..c24aea9 100644 --- a/apps/admin/locales/hu-HU/log.json +++ b/apps/admin/locales/hu-HU/log.json @@ -15,9 +15,11 @@ "platform": "Platform", "remark": "Megjegyzés", "resetAt": "Visszaállítva", + "server": "Szerver", "serverId": "Szerver azonosító", "status": "Állapot", "subject": "Tárgy", + "subscribe": "Feliratkozás", "subscribeId": "Előfizetési azonosító", "success": "Sikeres", "time": "Idő", @@ -32,7 +34,9 @@ "userId": "Felhasználói azonosító" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "Részletek", "failed": "Sikertelen", + "pending": "Függő", "placeholder": { "serverName": "Szerver neve", "toOrSubject": "Címzett / Tárgy", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "Felhasználói azonosító / Rendelés száma / Előfizetési azonosító", "userIdOrTokenOrIpOrUa": "Felhasználói azonosító / Token / IP / UA" }, + "sending": "Küldés alatt", + "sent": "Küldve", "success": "Sikeres", "title": { "balance": "Egyenleg napló", @@ -56,5 +62,14 @@ "subscribe": "Előfizetési napló", "subscribeTraffic": "Előfizetési forgalom napló", "trafficDetails": "Forgalmi részletek" - } + }, + "type": { + "1": "Újratöltés", + "2": "Kivét", + "3": "Vásárlás", + "4": "Visszatérítés", + "5": "Jutalom", + "6": "Jutalék" + }, + "unknown": "Ismeretlen" } diff --git a/apps/admin/locales/ja-JP/log.json b/apps/admin/locales/ja-JP/log.json index be9bb9c..c1257f9 100644 --- a/apps/admin/locales/ja-JP/log.json +++ b/apps/admin/locales/ja-JP/log.json @@ -15,9 +15,11 @@ "platform": "プラットフォーム", "remark": "備考", "resetAt": "リセット日時", + "server": "サーバー", "serverId": "サーバーID", "status": "ステータス", "subject": "件名", + "subscribe": "購読", "subscribeId": "サブスクリプションID", "success": "成功", "time": "時間", @@ -32,7 +34,9 @@ "userId": "ユーザーID" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "詳細", "failed": "失敗", + "pending": "保留中", "placeholder": { "serverName": "サーバー名", "toOrSubject": "宛先 / 件名", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ユーザーID / 注文番号 / サブスクリプションID", "userIdOrTokenOrIpOrUa": "ユーザーID / トークン / IP / UA" }, + "sending": "送信中", + "sent": "送信済み", "success": "成功", "title": { "balance": "残高ログ", @@ -56,5 +62,14 @@ "subscribe": "サブスクリプションログ", "subscribeTraffic": "サブスクリプショントラフィックログ", "trafficDetails": "トラフィック詳細" - } + }, + "type": { + "1": "チャージ", + "2": "引き出し", + "3": "購入", + "4": "返金", + "5": "報酬", + "6": "手数料" + }, + "unknown": "不明" } diff --git a/apps/admin/locales/ko-KR/log.json b/apps/admin/locales/ko-KR/log.json index b4227bf..63a592a 100644 --- a/apps/admin/locales/ko-KR/log.json +++ b/apps/admin/locales/ko-KR/log.json @@ -15,9 +15,11 @@ "platform": "플랫폼", "remark": "비고", "resetAt": "재설정일", + "server": "서버", "serverId": "서버 ID", "status": "상태", "subject": "제목", + "subscribe": "구독", "subscribeId": "구독 ID", "success": "성공", "time": "시간", @@ -32,7 +34,9 @@ "userId": "사용자 ID" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "상세", "failed": "실패", + "pending": "대기 중", "placeholder": { "serverName": "서버 이름", "toOrSubject": "받는 사람 / 제목", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "사용자 ID / 주문 번호 / 구독 ID", "userIdOrTokenOrIpOrUa": "사용자 ID / 토큰 / IP / UA" }, + "sending": "전송 중", + "sent": "전송 완료", "success": "성공", "title": { "balance": "잔액 로그", @@ -56,5 +62,14 @@ "subscribe": "구독 로그", "subscribeTraffic": "구독 트래픽 로그", "trafficDetails": "트래픽 세부정보" - } + }, + "type": { + "1": "충전", + "2": "출금", + "3": "구매", + "4": "환불", + "5": "보상", + "6": "수수료" + }, + "unknown": "알 수 없음" } diff --git a/apps/admin/locales/no-NO/log.json b/apps/admin/locales/no-NO/log.json index f8462c8..f6fdb14 100644 --- a/apps/admin/locales/no-NO/log.json +++ b/apps/admin/locales/no-NO/log.json @@ -15,9 +15,11 @@ "platform": "Plattform", "remark": "Merknad", "resetAt": "Tilbakestilt", + "server": "Server", "serverId": "Server-ID", "status": "Status", "subject": "Emne", + "subscribe": "Abonner", "subscribeId": "Abonnements-ID", "success": "Suksess", "time": "Tid", @@ -32,7 +34,9 @@ "userId": "Bruker-ID" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "Detalj", "failed": "Feilet", + "pending": "Venter", "placeholder": { "serverName": "Servernavn", "toOrSubject": "Til / Emne", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "Bruker-ID / Ordre nr. / Abonnements-ID", "userIdOrTokenOrIpOrUa": "Bruker-ID / Token / IP / UA" }, + "sending": "Sender", + "sent": "Sendt", "success": "Suksess", "title": { "balance": "Saldi-logg", @@ -56,5 +62,14 @@ "subscribe": "Abonnementslogg", "subscribeTraffic": "Abonnements trafikklogg", "trafficDetails": "Trafikkdetaljer" - } + }, + "type": { + "1": "Opplading", + "2": "Uttak", + "3": "Kjøp", + "4": "Refusjon", + "5": "Belønning", + "6": "Kommisjon" + }, + "unknown": "Ukjent" } diff --git a/apps/admin/locales/pl-PL/log.json b/apps/admin/locales/pl-PL/log.json index 2457e60..4e1251c 100644 --- a/apps/admin/locales/pl-PL/log.json +++ b/apps/admin/locales/pl-PL/log.json @@ -15,9 +15,11 @@ "platform": "Platforma", "remark": "Uwagi", "resetAt": "Zresetowano", + "server": "Serwer", "serverId": "ID Serwera", "status": "Status", "subject": "Temat", + "subscribe": "Subskrybuj", "subscribeId": "ID Subskrypcji", "success": "Sukces", "time": "Czas", @@ -32,7 +34,9 @@ "userId": "ID Użytkownika" }, "datePlaceholder": "RRRR-MM-DD", + "detail": "Szczegóły", "failed": "Niepowodzenie", + "pending": "Oczekujące", "placeholder": { "serverName": "Nazwa Serwera", "toOrSubject": "Do / Temat", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ID Użytkownika / Nr Zamówienia / ID Subskrypcji", "userIdOrTokenOrIpOrUa": "ID Użytkownika / Token / IP / UA" }, + "sending": "Wysyłanie", + "sent": "Wysłane", "success": "Sukces", "title": { "balance": "Dziennik Salda", @@ -56,5 +62,14 @@ "subscribe": "Dziennik Subskrypcji", "subscribeTraffic": "Dziennik Ruchu Subskrypcyjnego", "trafficDetails": "Szczegóły Ruchu" - } + }, + "type": { + "1": "Doładowanie", + "2": "Wypłata", + "3": "Zakup", + "4": "Zwrót", + "5": "Nagroda", + "6": "Prowizja" + }, + "unknown": "Nieznane" } diff --git a/apps/admin/locales/pt-BR/log.json b/apps/admin/locales/pt-BR/log.json index 02885c2..764aea0 100644 --- a/apps/admin/locales/pt-BR/log.json +++ b/apps/admin/locales/pt-BR/log.json @@ -15,9 +15,11 @@ "platform": "Plataforma", "remark": "Observação", "resetAt": "Reiniciado Em", + "server": "Servidor", "serverId": "ID do Servidor", "status": "Status", "subject": "Assunto", + "subscribe": "Inscrever-se", "subscribeId": "ID da Inscrição", "success": "Sucesso", "time": "Tempo", @@ -32,7 +34,9 @@ "userId": "ID do Usuário" }, "datePlaceholder": "AAAA-MM-DD", + "detail": "Detalhe", "failed": "Falhou", + "pending": "Pendente", "placeholder": { "serverName": "Nome do Servidor", "toOrSubject": "Para / Assunto", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ID do Usuário / Número do Pedido / ID da Inscrição", "userIdOrTokenOrIpOrUa": "ID do Usuário / Token / IP / UA" }, + "sending": "Enviando", + "sent": "Enviado", "success": "Sucesso", "title": { "balance": "Registro de Saldo", @@ -56,5 +62,14 @@ "subscribe": "Registro de Inscrição", "subscribeTraffic": "Registro de Tráfego de Inscrição", "trafficDetails": "Detalhes do Tráfego" - } + }, + "type": { + "1": "Recarga", + "2": "Retirada", + "3": "Compra", + "4": "Reembolso", + "5": "Recompensa", + "6": "Comissão" + }, + "unknown": "Desconhecido" } diff --git a/apps/admin/locales/ro-RO/log.json b/apps/admin/locales/ro-RO/log.json index caa3728..5949f0e 100644 --- a/apps/admin/locales/ro-RO/log.json +++ b/apps/admin/locales/ro-RO/log.json @@ -15,9 +15,11 @@ "platform": "Platformă", "remark": "Observație", "resetAt": "Resetat La", + "server": "Server", "serverId": "ID Server", "status": "Stare", "subject": "Subiect", + "subscribe": "Abonează-te", "subscribeId": "ID Abonament", "success": "Succes", "time": "Timp", @@ -32,7 +34,9 @@ "userId": "ID Utilizator" }, "datePlaceholder": "AAAA-LL-ZZ", + "detail": "Detaliu", "failed": "Eșuat", + "pending": "În așteptare", "placeholder": { "serverName": "Numele Serverului", "toOrSubject": "Către / Subiect", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ID Utilizator / Nr. Comandă / ID Abonament", "userIdOrTokenOrIpOrUa": "ID Utilizator / Token / IP / UA" }, + "sending": "Trimitere", + "sent": "Trimis", "success": "Succes", "title": { "balance": "Jurnal Sold", @@ -56,5 +62,14 @@ "subscribe": "Jurnal Abonare", "subscribeTraffic": "Jurnal Trafic Abonament", "trafficDetails": "Detalii Trafic" - } + }, + "type": { + "1": "Reîncărcare", + "2": "Retragere", + "3": "Achiziție", + "4": "Rambursare", + "5": "Recompensă", + "6": "Comision" + }, + "unknown": "Necunoscut" } diff --git a/apps/admin/locales/ru-RU/log.json b/apps/admin/locales/ru-RU/log.json index 291da53..69d4dd7 100644 --- a/apps/admin/locales/ru-RU/log.json +++ b/apps/admin/locales/ru-RU/log.json @@ -15,9 +15,11 @@ "platform": "Платформа", "remark": "Примечание", "resetAt": "Сброшено", + "server": "Сервер", "serverId": "ИД сервера", "status": "Статус", "subject": "Тема", + "subscribe": "Подписаться", "subscribeId": "ИД подписки", "success": "Успех", "time": "Время", @@ -32,7 +34,9 @@ "userId": "ИД пользователя" }, "datePlaceholder": "ГГГГ-ММ-ДД", + "detail": "Детали", "failed": "Неудача", + "pending": "В ожидании", "placeholder": { "serverName": "Имя сервера", "toOrSubject": "Кому / Тема", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ИД пользователя / Номер заказа / ИД подписки", "userIdOrTokenOrIpOrUa": "ИД пользователя / Токен / IP / UA" }, + "sending": "Отправка", + "sent": "Отправлено", "success": "Успех", "title": { "balance": "Журнал баланса", @@ -56,5 +62,14 @@ "subscribe": "Журнал подписки", "subscribeTraffic": "Журнал трафика подписки", "trafficDetails": "Детали трафика" - } + }, + "type": { + "1": "Пополнение", + "2": "Вывод", + "3": "Покупка", + "4": "Возврат", + "5": "Награда", + "6": "Комиссия" + }, + "unknown": "Неизвестно" } diff --git a/apps/admin/locales/th-TH/log.json b/apps/admin/locales/th-TH/log.json index 17e901b..517bebd 100644 --- a/apps/admin/locales/th-TH/log.json +++ b/apps/admin/locales/th-TH/log.json @@ -15,9 +15,11 @@ "platform": "แพลตฟอร์ม", "remark": "หมายเหตุ", "resetAt": "รีเซ็ตเมื่อ", + "server": "เซิร์ฟเวอร์", "serverId": "รหัสเซิร์ฟเวอร์", "status": "สถานะ", "subject": "หัวข้อ", + "subscribe": "สมัครสมาชิก", "subscribeId": "รหัสการสมัคร", "success": "สำเร็จ", "time": "เวลา", @@ -32,7 +34,9 @@ "userId": "รหัสผู้ใช้" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "รายละเอียด", "failed": "ล้มเหลว", + "pending": "รอดำเนินการ", "placeholder": { "serverName": "ชื่อเซิร์ฟเวอร์", "toOrSubject": "ถึง / หัวข้อ", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "รหัสผู้ใช้ / หมายเลขคำสั่ง / รหัสการสมัคร", "userIdOrTokenOrIpOrUa": "รหัสผู้ใช้ / โทเค็น / IP / UA" }, + "sending": "กำลังส่ง", + "sent": "ส่งแล้ว", "success": "สำเร็จ", "title": { "balance": "บันทึกยอดคงเหลือ", @@ -56,5 +62,14 @@ "subscribe": "บันทึกการสมัคร", "subscribeTraffic": "บันทึกการจราจรการสมัคร", "trafficDetails": "รายละเอียดการจราจร" - } + }, + "type": { + "1": "เติมเงิน", + "2": "ถอนเงิน", + "3": "ซื้อ", + "4": "คืนเงิน", + "5": "รางวัล", + "6": "ค่าคอมมิชชั่น" + }, + "unknown": "ไม่ทราบ" } diff --git a/apps/admin/locales/tr-TR/log.json b/apps/admin/locales/tr-TR/log.json index 98f65a8..2c5253b 100644 --- a/apps/admin/locales/tr-TR/log.json +++ b/apps/admin/locales/tr-TR/log.json @@ -15,9 +15,11 @@ "platform": "Platform", "remark": "Not", "resetAt": "Sıfırlama Tarihi", + "server": "Sunucu", "serverId": "Sunucu ID", "status": "Durum", "subject": "Konu", + "subscribe": "Abone Ol", "subscribeId": "Abone ID", "success": "Başarılı", "time": "Zaman", @@ -32,7 +34,9 @@ "userId": "Kullanıcı ID" }, "datePlaceholder": "YYYY-AA-GG", + "detail": "Detay", "failed": "Başarısız", + "pending": "Beklemede", "placeholder": { "serverName": "Sunucu Adı", "toOrSubject": "Kime / Konu", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "Kullanıcı ID / Sipariş No. / Abone ID", "userIdOrTokenOrIpOrUa": "Kullanıcı ID / Token / IP / UA" }, + "sending": "Gönderiliyor", + "sent": "Gönderildi", "success": "Başarılı", "title": { "balance": "Bakiye Kaydı", @@ -56,5 +62,14 @@ "subscribe": "Abone Kaydı", "subscribeTraffic": "Abone Trafik Kaydı", "trafficDetails": "Trafik Detayları" - } + }, + "type": { + "1": "Yükleme", + "2": "Çekim", + "3": "Alım", + "4": "İade", + "5": "Ödül", + "6": "Komisyon" + }, + "unknown": "Bilinmiyor" } diff --git a/apps/admin/locales/uk-UA/log.json b/apps/admin/locales/uk-UA/log.json index d882e58..69c52d9 100644 --- a/apps/admin/locales/uk-UA/log.json +++ b/apps/admin/locales/uk-UA/log.json @@ -15,9 +15,11 @@ "platform": "Платформа", "remark": "Примітка", "resetAt": "Скинуто о", + "server": "Сервер", "serverId": "ID сервера", "status": "Статус", "subject": "Тема", + "subscribe": "Підписатися", "subscribeId": "ID підписки", "success": "Успішно", "time": "Час", @@ -32,7 +34,9 @@ "userId": "ID користувача" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "Деталі", "failed": "Не вдалося", + "pending": "В очікуванні", "placeholder": { "serverName": "Назва сервера", "toOrSubject": "Кому / Тема", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ID користувача / Номер замовлення / ID підписки", "userIdOrTokenOrIpOrUa": "ID користувача / Токен / IP / UA" }, + "sending": "Відправка", + "sent": "Відправлено", "success": "Успішно", "title": { "balance": "Журнал балансу", @@ -56,5 +62,14 @@ "subscribe": "Журнал підписки", "subscribeTraffic": "Журнал трафіку підписки", "trafficDetails": "Деталі трафіку" - } + }, + "type": { + "1": "Поповнення", + "2": "Виведення", + "3": "Покупка", + "4": "Повернення", + "5": "Нагорода", + "6": "Комісія" + }, + "unknown": "Невідомо" } diff --git a/apps/admin/locales/vi-VN/log.json b/apps/admin/locales/vi-VN/log.json index f580f5c..744f275 100644 --- a/apps/admin/locales/vi-VN/log.json +++ b/apps/admin/locales/vi-VN/log.json @@ -15,9 +15,11 @@ "platform": "Nền tảng", "remark": "Ghi chú", "resetAt": "Đặt lại vào", + "server": "Máy chủ", "serverId": "ID máy chủ", "status": "Trạng thái", "subject": "Chủ đề", + "subscribe": "Đăng ký", "subscribeId": "ID đăng ký", "success": "Thành công", "time": "Thời gian", @@ -32,7 +34,9 @@ "userId": "ID người dùng" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "Chi tiết", "failed": "Thất bại", + "pending": "Đang chờ", "placeholder": { "serverName": "Tên máy chủ", "toOrSubject": "Đến / Chủ đề", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "ID người dùng / Số đơn hàng / ID đăng ký", "userIdOrTokenOrIpOrUa": "ID người dùng / Mã thông báo / IP / UA" }, + "sending": "Đang gửi", + "sent": "Đã gửi", "success": "Thành công", "title": { "balance": "Nhật ký Số dư", @@ -56,5 +62,14 @@ "subscribe": "Nhật ký Đăng ký", "subscribeTraffic": "Nhật ký Lưu lượng Đăng ký", "trafficDetails": "Chi tiết Lưu lượng" - } + }, + "type": { + "1": "Nạp tiền", + "2": "Rút tiền", + "3": "Mua hàng", + "4": "Hoàn tiền", + "5": "Phần thưởng", + "6": "Hoa hồng" + }, + "unknown": "Không xác định" } diff --git a/apps/admin/locales/zh-CN/log.json b/apps/admin/locales/zh-CN/log.json index 22eb4e0..3be7662 100644 --- a/apps/admin/locales/zh-CN/log.json +++ b/apps/admin/locales/zh-CN/log.json @@ -16,6 +16,8 @@ "time": "时间", "userId": "用户ID", "subscribeId": "订阅ID", + "subscribe": "订阅", + "server": "服务器", "token": "令牌", "amount": "金额", "orderId": "订单ID", @@ -32,7 +34,9 @@ "identifier": "标识" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "详情", "failed": "失败", + "pending": "等待中", "placeholder": { "toOrSubject": "收件人 / 主题", "userIdOrIpOrMethodOrUa": "用户ID / IP / 方式 / UA", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "用户ID / 订单号 / 订阅ID", "userIdOrOrderId": "用户ID / 订单ID" }, + "sending": "发送中", + "sent": "已发送", "success": "成功", "title": { "email": "邮件日志", @@ -56,5 +62,14 @@ "resetSubscribe": "重置订阅日志", "subscribeTraffic": "订阅流量日志", "trafficDetails": "流量明细" - } + }, + "type": { + "1": "充值", + "2": "提取", + "3": "购买", + "4": "退款", + "5": "奖励", + "6": "佣金" + }, + "unknown": "未知" } diff --git a/apps/admin/locales/zh-CN/servers.json b/apps/admin/locales/zh-CN/servers.json index 596af81..0c8c3e5 100644 --- a/apps/admin/locales/zh-CN/servers.json +++ b/apps/admin/locales/zh-CN/servers.json @@ -95,6 +95,7 @@ "subscription": "订阅", "traffic": "流量", "traffic_ratio": "倍率", + "transport": "传输方式", "transport_title": "传输方式", "udp_relay_mode": "UDP 转发模式", "unitSecondsShort": "S", diff --git a/apps/admin/locales/zh-HK/log.json b/apps/admin/locales/zh-HK/log.json index 0437c7b..4a621a5 100644 --- a/apps/admin/locales/zh-HK/log.json +++ b/apps/admin/locales/zh-HK/log.json @@ -15,9 +15,11 @@ "platform": "平台", "remark": "備註", "resetAt": "重置時間", + "server": "伺服器", "serverId": "伺服器ID", "status": "狀態", "subject": "主題", + "subscribe": "訂閱", "subscribeId": "訂閱ID", "success": "成功", "time": "時間", @@ -32,7 +34,9 @@ "userId": "用戶ID" }, "datePlaceholder": "YYYY-MM-DD", + "detail": "詳情", "failed": "失敗", + "pending": "待處理", "placeholder": { "serverName": "伺服器名稱", "toOrSubject": "收件人 / 主題", @@ -42,6 +46,8 @@ "userIdOrOrderNoOrSubscribeId": "用戶ID / 訂單號 / 訂閱ID", "userIdOrTokenOrIpOrUa": "用戶ID / 令牌 / IP / UA" }, + "sending": "發送中", + "sent": "已發送", "success": "成功", "title": { "balance": "餘額日誌", @@ -56,5 +62,14 @@ "subscribe": "訂閱日誌", "subscribeTraffic": "訂閱流量日誌", "trafficDetails": "流量詳情" - } + }, + "type": { + "1": "充值", + "2": "提現", + "3": "購買", + "4": "退款", + "5": "獎勵", + "6": "佣金" + }, + "unknown": "未知" }