Files
admin/src/app/(root)/user/page.tsx
2026-01-06 16:34:52 +08:00

107 lines
3.5 KiB
TypeScript

"use client"
import { format } from "date-fns"
import { Suspense } from "react"
import { bindAdmin, getPageUsers } from "@/actions/user"
import { DataTable, useDataTable } from "@/components/data-table"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import { useFetch } from "@/hooks/data"
import type { User } from "@/models/user"
export default function UserPage() {
const table = useDataTable<User>((page, size) => getPageUsers({ page, size }))
const bind = useFetch((id: number) => bindAdmin({ id }), {
done: "用户已认领",
fail: "用户认领失败",
})
return (
<div>
<Suspense>
<DataTable<User>
{...table}
columns={[
{ header: "账号", accessorKey: "username" },
{ header: "手机", accessorKey: "phone" },
{ header: "邮箱", accessorKey: "email" },
{ header: "姓名", accessorKey: "name" },
{
header: "余额",
accessorKey: "balance",
cell: ({ row }) => {
const balance =
typeof row.original.balance === "string"
? parseFloat(row.original.balance)
: row.original.balance || 0
return (
<div className="flex gap-1">
<span
className={
balance > 0 ? "text-green-500" : "text-orange-500"
}
>
{balance.toFixed(2)}
</span>
</div>
)
},
},
{
header: "认证状态",
accessorKey: "id_type",
cell: ({ row }) => {
const status = row.original.id_type
return (
<Badge
variant={status === 1 ? "default" : "secondary"}
className={
status === 1
? "bg-green-100 text-green-800"
: "bg-gray-100 text-gray-800"
}
>
{status === 1 ? "已认证" : "未认证"}
</Badge>
)
},
},
{
header: "账号状态",
accessorKey: "status",
cell: ({ row }) => {
const status = row.original.status
return status === 1 ? "正常" : ""
},
},
{ header: "联系方式", accessorKey: "contact_wechat" },
{ header: "管理员", accessorKey: "admin_id" },
{
header: "最后登录时间",
accessorKey: "last_login",
cell: ({ row }) =>
format(new Date(row.original.last_login), "yyyy-MM-dd HH:mm"),
},
{
header: "创建时间",
accessorKey: "created_at",
cell: ({ row }) =>
format(new Date(row.original.created_at), "yyyy-MM-dd HH:mm"),
},
{
header: "操作",
cell: ctx => (
<Button
size={"sm"}
onClick={() => bind(ctx.row.original.id)}
disabled={ctx.row.original.admin_id !== null}
>
{ctx.row.original.admin_id !== null ? "已认领" : "认领"}
</Button>
),
},
]}
/>
</Suspense>
</div>
)
}