diff --git a/src/app/(main)/users/page.tsx b/src/app/(main)/users/page.tsx index d53269b..01845e2 100644 --- a/src/app/(main)/users/page.tsx +++ b/src/app/(main)/users/page.tsx @@ -5,7 +5,7 @@ import type { Key } from 'react'; import { useRouter } from 'next/navigation'; import type { ColumnsType } from 'antd/es/table'; import type { SorterResult } from 'antd/es/table/interface'; -import { App, Button, DatePicker, Input, Select, Space, Table, Tag } from 'antd'; +import { App, Button, DatePicker, Input, Select, Space, Table, Tag, Tooltip } from 'antd'; import dayjs, { type Dayjs } from 'dayjs'; import { api, errMsg } from '@/lib/api'; import { canDo } from '@/lib/auth'; @@ -18,7 +18,7 @@ const { RangePicker } = DatePicker; const STATUS_COLOR: Record = { active: 'green', disabled: 'red', deleted: 'default' }; -type SortField = 'id' | 'created_at' | 'last_login_at'; +type SortField = 'id' | 'created_at' | 'last_active_at'; export default function UsersPage() { const router = useRouter(); @@ -61,8 +61,8 @@ export default function UsersPage() { register_channel: channel || undefined, created_from: regRange?.[0] ? regRange[0].startOf('day').toISOString() : undefined, created_to: regRange?.[1] ? regRange[1].endOf('day').toISOString() : undefined, - last_login_from: loginRange?.[0] ? loginRange[0].startOf('day').toISOString() : undefined, - last_login_to: loginRange?.[1] ? loginRange[1].endOf('day').toISOString() : undefined, + last_active_from: loginRange?.[0] ? loginRange[0].startOf('day').toISOString() : undefined, + last_active_to: loginRange?.[1] ? loginRange[1].endOf('day').toISOString() : undefined, }); const resetFilters = () => { @@ -235,12 +235,19 @@ export default function UsersPage() { render: (v: string) => formatUtcTime(v), }, { - title: '最近登录', - dataIndex: 'last_login_at', + // 最近活跃 = max(最近登录, 最近发起比价, 最近发起领券),与大盘 DAU/留存活跃口径一致(2026-07-05) + title: ( + + 最近活跃 + + ), + dataIndex: 'last_active_at', width: 160, sorter: true, - sortOrder: sortOrderOf('last_login_at'), - render: (v: string) => formatUtcTime(v), + // 关掉 antd 默认的「点击升序/降序」表头提示,否则与上面自定义口径 Tooltip 同时弹出互相遮挡 + showSorterTooltip: false, + sortOrder: sortOrderOf('last_active_at'), + render: (v: string | null, u: UserListItem) => formatUtcTime(v ?? u.last_login_at), }, { title: '操作', @@ -324,7 +331,7 @@ export default function UsersPage() { allowClear /> setLoginRange(v as [Dayjs, Dayjs] | null)} allowClear diff --git a/src/lib/types.ts b/src/lib/types.ts index 209c482..204b6aa 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -56,6 +56,8 @@ export interface UserListItem { wechat_openid: string | null; created_at: string; last_login_at: string; + // 最近活跃 = max(最近登录, 最近发起比价, 最近发起领券);与大盘 DAU/留存活跃口径一致 + last_active_at: string | null; } // 设备维度新手引导:一台设备(ANDROID_ID)聚合,走过引导的账号数 + 最近完成时间。