用户管理最近登录列改为最近活跃,展示、排序、筛选同步换口径
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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<string, string> = { 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: (
|
||||
<Tooltip title="进入 App(登录)/ 发起比价 / 发起领券,取最近一次">
|
||||
最近活跃
|
||||
</Tooltip>
|
||||
),
|
||||
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
|
||||
/>
|
||||
<RangePicker
|
||||
placeholder={['最近登录起', '最近登录止']}
|
||||
placeholder={['最近活跃起', '最近活跃止']}
|
||||
value={loginRange}
|
||||
onChange={(v) => setLoginRange(v as [Dayjs, Dayjs] | null)}
|
||||
allowClear
|
||||
|
||||
@@ -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)聚合,走过引导的账号数 + 最近完成时间。
|
||||
|
||||
Reference in New Issue
Block a user